From d31791684475171675aafcd59f0ada48d5187045 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 15 Dec 2020 10:54:41 +0000 Subject: [PATCH 001/196] Removed jblas --- nearest_correlation_matrices/NcmNag.java | 237 +++++++++++++++-------- 1 file changed, 159 insertions(+), 78 deletions(-) diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index af3feb6..31f86f4 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -1,79 +1,103 @@ -import java.lang.Math; -import org.jblas.DoubleMatrix; -import org.jblas.Eigen; import com.nag.routines.G02.G02AA; -//import org.tc33.jheatchart.HeatChart; +import com.nag.routines.F01.F01CK; +import com.nag.routines.F08.F08NA; +import com.nag.routines.F06.F06RC; + +import java.lang.Math; +import java.util.Arrays; import java.io.File; import java.io.IOException; import java.io.FileWriter; -//import java.awt.Color; public class NcmNag { public static void main(String[] args) { - DoubleMatrix P = new DoubleMatrix( - new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 }, - { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 }, - { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 }, - { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN }, - { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 }, - { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 }, - { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 }, - { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN }, - { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 }, - { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } }); - - DoubleMatrix G = cor_bar(P); + double[][] P = new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 }, + { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 }, + { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 }, + { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN }, + { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 }, + { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 }, + { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 }, + { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN }, + { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 }, + { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } }; + + double[][] G = cor_bar(P); System.out.println("The approximate correlation matrix"); - printMatrix(G.toArray2()); + printMatrix(G); System.out.println(); + F08NA f08na = new F08NA(); + String jobvl = "N"; + String jobvr = "N"; + int n = G[0].length; + double[] G1d = convert2DTo1D(G); + int lda = G.length; + double[] wr = new double[n]; + double[] wi = new double[n]; + int ldvl = 1; + double[] vl = new double[ldvl]; + int ldvr = 1; + double[] vr = new double[ldvr]; + int lwork = 3 * n; + double[] work = new double[lwork]; + int info = 0; + f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + System.out.print("Sorted eigenvalues of G: "); - printVector(Eigen.symmetricEigenvalues(G).toArray()); + Arrays.sort(wr); + printVector(wr); System.out.println(); // Call NAG routine G02AA and print the result G02AA g02aa = new G02AA(); - int n = G.rows; + G1d = convert2DTo1D(G); + n = G.length; int ldg = n; int ldx = n; double errtol = 0.0; int maxits = 0; int maxit = 0; - double[] x_arr1d = new double[ldx * n]; + double[] X1d = new double[ldx * n]; int iter = 0; int feval = 0; double nrmgrd = 0.0; int ifail = 0; - g02aa.eval(G.toArray(), ldg, n, errtol, maxits, maxit, x_arr1d, ldx, iter, feval, nrmgrd, ifail); + g02aa.eval(G1d, ldg, n, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail); - double[][] x_arr2d = convert1DTo2D(x_arr1d, ldx); - DoubleMatrix X = new DoubleMatrix(x_arr2d); + double[][] X = convert1DTo2D(X1d, ldx); iter = g02aa.getITER(); System.out.println("Nearest correlation matrix"); - printMatrix(X.toArray2()); + printMatrix(X); System.out.println(); + jobvl = "N"; + jobvr = "N"; + n = X[0].length; + lda = X.length; + wr = new double[n]; + wi = new double[n]; + ldvl = 1; + vl = new double[ldvl]; + ldvr = 1; + vr = new double[ldvr]; + lwork = 3 * n; + work = new double[lwork]; + info = 0; + f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + System.out.print("Sorted eigenvalues of X: "); - printVector(Eigen.symmetricEigenvalues(X).toArray()); + Arrays.sort(wr); + printVector(wr); System.out.println(); - // HeatChart heatchart = new HeatChart(matrixAbs(X.sub(G)).toArray2()); - - // heatchart.setTitle("|G-X| for G02AA"); - // //heatchart.setXAxisLabel(String.format("Iterations: %d, ||G-X||F = %.4f", iter, X.sub(G).norm2())); - // //heatchart.setYAxisLabel("Y axis"); - // //heatchart.setChartMargin(40); - // heatchart.setHighValueColour(Color.BLUE); - - // heatchart.saveToFile(new File("|G-X| for G02AA.png")); - try { FileWriter writer = new FileWriter(new File("g02aa.d")); writer.write(iter + "\n"); @@ -91,7 +115,6 @@ public static void main(String[] args) { e.printStackTrace(); } - } /** @@ -100,22 +123,20 @@ public static void main(String[] args) { * @param P * @return */ - public static DoubleMatrix cov_bar(DoubleMatrix P) { + public static double[][] cov_bar(double[][] P) { - DoubleMatrix xi, xj; + double[] xi, xj; boolean[] xib, xjb, notp; - - int n = P.columns; + int n = P[0].length; + double[][] S = new double[n][n]; int notpFalseCount; - DoubleMatrix S = DoubleMatrix.zeros(n, n); - for (int i = 0; i < n; i++) { // Take the ith column - xi = P.getColumn(i); + xi = getMatrixColumn(P, i); for (int j = 0; j < i + 1; j++) { // Take the jth column, where j <= i - xj = P.getColumn(j); + xj = getMatrixColumn(P, j); // Set mask such that all NaNs are true xib = getNanMask(xi); @@ -123,8 +144,8 @@ public static DoubleMatrix cov_bar(DoubleMatrix P) { notp = addBoolArrOr(xib, xjb); - S.put(i, j, matrixMaskedDot(xi.sub(matrixMaskedMean(xi, notp)), (xj.sub(matrixMaskedMean(xj, notp))), - notp)); + S[i][j] = matrixMaskedDot(vectorSubScalar(xi, vectorMaskedMean(xi, notp)), + vectorSubScalar(xj, vectorMaskedMean(xj, notp)), notp); // Take the sum over !notp to normalize notpFalseCount = 0; @@ -133,11 +154,10 @@ public static DoubleMatrix cov_bar(DoubleMatrix P) { notpFalseCount++; } } - S.put(i, j, 1.0 / (notpFalseCount - 1) * S.get(i, j)); - S.put(j, i, S.get(i,j)); + S[i][j] = 1.0 / (notpFalseCount - 1) * S[i][j]; + S[j][i] = S[i][j]; } } - return S; } @@ -146,14 +166,31 @@ public static DoubleMatrix cov_bar(DoubleMatrix P) { * * @param P */ - public static DoubleMatrix cor_bar(DoubleMatrix P) { - DoubleMatrix S, D; + public static double[][] cor_bar(double[][] P) { + double[][] S, D; S = cov_bar(P); - D = DoubleMatrix.diag(getMatrixSQRT(S.diag()).rdiv(1.0)); - return D.mmul(S.mmul(D)); + D = getMatrixFromDiag(vectorRightDiv(vectorSqrt(getMatrixDiag(S)), 1.0)); + + F01CK f01ck = new F01CK(); + double[] S_ = new double[S.length * S[0].length]; + double[] S1d = convert2DTo1D(S); + double[] D1d = convert2DTo1D(D); + int n = S.length; + int p = n; + int m = n; + double[] z = new double[0]; + int iz = 0; + int opt = 1; + int ifail = 0; + f01ck.eval(S_, S1d, D1d, n, p, m, z, iz, opt, ifail); + + double[] D_ = new double[n * n]; + f01ck.eval(D_, D1d, S_, n, p, m, z, iz, opt, ifail); + + return convert1DTo2D(D_, n); } - public static double matrixMaskedDot(DoubleMatrix a, DoubleMatrix b, boolean[] mask) { + public static double matrixMaskedDot(double[] a, double[] b, boolean[] mask) { if ((a.length != b.length) || (a.length != mask.length) || (b.length != mask.length)) { System.out.println("Arrays a(" + a.length + "), b(" + b.length + ") and mask(" + mask.length + ") need to have the same length."); @@ -163,42 +200,77 @@ public static double matrixMaskedDot(DoubleMatrix a, DoubleMatrix b, boolean[] m double r = 0; for (int i = 0; i < a.length; i++) { if (!mask[i]) { - r += a.get(i) * b.get(i); + r += a[i] * b[i]; } } return r; } - public static DoubleMatrix getMatrixSQRT(DoubleMatrix a) { - DoubleMatrix t = new DoubleMatrix(); - t.copy(a); - for (int i = 0; i < t.rows; i++) { - for (int j = 0; j < t.columns; j++) { - t.put(i, j, Math.sqrt(t.get(i, j))); - } + public static double[] vectorSqrt(double[] a) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = Math.sqrt(a[i]); } return t; } - public static double matrixMaskedMean(DoubleMatrix a, boolean[] mask) { + public static double[] getMatrixDiag(double[][] a) { + double[] diag = new double[a.length]; + for (int i = 0; i < diag.length; i++) { + diag[i] = a[i][i]; + } + return diag; + } + + public static double[][] getMatrixFromDiag(double[] diag) { + double[][] t = new double[diag.length][diag.length]; + for (int i = 0; i < t.length; i++) { + t[i][i] = diag[i]; + } + return t; + } + + public static double[] vectorRightDiv(double[] a, double s) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = s / a[i]; + } + return t; + } + + public static double[] getMatrixColumn(double[][] a, int col) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = a[i][col]; + } + return t; + } + + public static double vectorMaskedMean(double[] a, boolean[] mask) { double sum = 0; int n = a.length; - for (int i = 0; i < a.length; i++) { if (mask[i]) { n--; } else { - sum += a.get(i); + sum += a[i]; } } - return sum / n; } - public static boolean[] getNanMask(DoubleMatrix a) { + public static double[] vectorSubScalar(double[] a, double s) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = a[i] - s; + } + return t; + } + + public static boolean[] getNanMask(double[] a) { boolean[] t = new boolean[a.length]; for (int i = 0; i < t.length; i++) { - if (Double.isNaN(a.get(i))) { + if (Double.isNaN(a[i])) { t[i] = true; } else { t[i] = false; @@ -220,15 +292,24 @@ public static boolean[] addBoolArrOr(boolean[] a, boolean[] b) { return t; } - public static DoubleMatrix matrixAbs(DoubleMatrix a) { - DoubleMatrix b = new DoubleMatrix(a.toArray2()); - - for (int i = 0; i < b.rows; i++) { - for (int j = 0; j < b.columns; j++) { - b.put(i, j, Math.abs(b.get(i, j))); + public static double[][] matrixAbs(double[][] a) { + double[][] b = new double[a.length][a[0].length]; + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = Math.abs(a[i][j]); } } + return b; + } + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } return b; } @@ -236,9 +317,9 @@ public static double[][] convert1DTo2D(double[] a, int n) { double[][] b = new double[n][a.length / n]; for (int i = 0; i < b.length; i++) { for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; + b[i][j] = a[i + j * n]; } - } + } return b; } From f7fb57db2748e218ce75c5ed367db99308308bb3 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 15 Dec 2020 13:40:51 +0000 Subject: [PATCH 002/196] Added G02AB to NcmNag --- nearest_correlation_matrices/NcmNag.java | 138 ++++++++++++++++++++--- nearest_correlation_matrices/g02aa.d | 2 +- nearest_correlation_matrices/g02ab.d | 10 ++ 3 files changed, 133 insertions(+), 17 deletions(-) create mode 100644 nearest_correlation_matrices/g02ab.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 31f86f4..e29187e 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -1,4 +1,5 @@ import com.nag.routines.G02.G02AA; +import com.nag.routines.G02.G02AB; import com.nag.routines.F01.F01CK; import com.nag.routines.F08.F08NA; import com.nag.routines.F06.F06RC; @@ -12,6 +13,9 @@ public class NcmNag { public static void main(String[] args) { + // Initialize our P matrix of observations + + // Define a 2-d array and use Double.NaN to set elements as NaNs double[][] P = new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 }, { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 }, { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 }, @@ -23,12 +27,16 @@ public static void main(String[] args) { { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 }, { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } }; + // Compute the approximate correlation matrix + double[][] G = cor_bar(P); System.out.println("The approximate correlation matrix"); printMatrix(G); System.out.println(); + // Compute the eigenvalues of our (indefinite) G. + F08NA f08na = new F08NA(); String jobvl = "N"; String jobvr = "N"; @@ -52,6 +60,10 @@ public static void main(String[] args) { System.out.println(); + // Nearest Correlation Matrices + + // Using G02AA to comput the nearest correlation matrix in the Frobenius norm + // Call NAG routine G02AA and print the result G02AA g02aa = new G02AA(); G1d = convert2DTo1D(G); @@ -69,7 +81,6 @@ public static void main(String[] args) { g02aa.eval(G1d, ldg, n, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail); double[][] X = convert1DTo2D(X1d, ldx); - iter = g02aa.getITER(); System.out.println("Nearest correlation matrix"); @@ -98,22 +109,82 @@ public static void main(String[] args) { System.out.println(); - try { - FileWriter writer = new FileWriter(new File("g02aa.d")); - writer.write(iter + "\n"); - writer.write(X.sub(G).norm2() + "\n"); - for (int i = 0; i < X.rows; i++) { - for (int j = 0; j < X.columns; j++) { - writer.write(matrixAbs(X.sub(G)).get(i, j) + " "); - } - writer.write("\n"); - } - writer.close(); + double[][] X_G = matrixSub(X, G); + F06RC f06rc = new F06RC(); + String norm = "F"; + String uplo = "U"; + n = X_G[0].length; + double[] X_G1d = convert2DTo1D(X_G); + lda = X_G.length; + work = new double[n]; + double X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); - } catch (IOException e) { - System.out.println(e.getMessage()); - e.printStackTrace(); - } + printDataToFile("g02aa.d", iter, X_G, X_G_norm); + + // Weighting rows and columns of elements + + // Use corrmat_nearest_bounded to compute the nearest correlation matrix with row and column weighting + + // Define an arrray of weights + double[] W = new double[] { 10, 10, 10, 1, 1, 1, 1, 1 }; + + // Set up and call the NAG routine using weights and a minimum eigenvalue + G02AB g02ab = new G02AB(); + G1d = convert2DTo1D(G); + ldg = G.length; + n = G[0].length; + String opt = "B"; + double alpha = 0.001; + errtol = 0.0; + maxits = 0; + maxit = 0; + ldx = n; + X1d = new double[ldx * n]; + iter = 0; + feval = 0; + nrmgrd = 0; + ifail = 0; + g02ab.eval(G1d, ldg, n, opt, alpha, W, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail); + + X = convert1DTo2D(X1d, ldx); + iter = g02ab.getITER(); + + System.out.println("Nearest correlation matrix using row and column weighting"); + printMatrix(X); + + System.out.println(); + + jobvl = "N"; + jobvr = "N"; + n = X[0].length; + lda = X.length; + wr = new double[n]; + wi = new double[n]; + ldvl = 1; + vl = new double[ldvl]; + ldvr = 1; + vr = new double[ldvr]; + lwork = 3 * n; + work = new double[lwork]; + info = 0; + f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + + System.out.print("Sorted eigenvalues of X: "); + Arrays.sort(wr); + printVector(wr); + + System.out.println(); + + X_G = matrixSub(X, G); + norm = "F"; + uplo = "U"; + n = X_G[0].length; + X_G1d = convert2DTo1D(X_G); + lda = X_G.length; + work = new double[n]; + X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); + + printDataToFile("g02ab.d", iter, X_G, X_G_norm); } @@ -190,6 +261,26 @@ public static double[][] cor_bar(double[][] P) { return convert1DTo2D(D_, n); } + private static void printDataToFile(String fileName, int iter, double[][] X_G, double X_G_norm) { + double[][] absX_G = matrixAbs(X_G); + try { + FileWriter writer = new FileWriter(new File(fileName)); + writer.write(iter + "\n"); + writer.write(X_G_norm + "\n"); + for (int i = 0; i < X_G.length; i++) { + for (int j = 0; j < X_G[0].length; j++) { + writer.write(absX_G[i][j] + " "); + } + writer.write("\n"); + } + writer.close(); + + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + public static double matrixMaskedDot(double[] a, double[] b, boolean[] mask) { if ((a.length != b.length) || (a.length != mask.length) || (b.length != mask.length)) { System.out.println("Arrays a(" + a.length + "), b(" + b.length + ") and mask(" + mask.length @@ -267,6 +358,21 @@ public static double[] vectorSubScalar(double[] a, double s) { return t; } + public static double[][] matrixSub(double[][] a, double[][] b) { + if (a.length != b.length) { + System.out.println("Arrays a(" + a.length + ") and b(" + b.length + ") need to have the same length."); + System.exit(-1); + } + + double[][] t = new double[a.length][a[0].length]; + for (int i = 0; i < t.length; i++) { + for (int j = 0; j < t[0].length; j++) { + t[i][j] = a[i][j] - b[i][j]; + } + } + return t; + } + public static boolean[] getNanMask(double[] a) { boolean[] t = new boolean[a.length]; for (int i = 0; i < t.length; i++) { diff --git a/nearest_correlation_matrices/g02aa.d b/nearest_correlation_matrices/g02aa.d index 0c6f7b6..cfc36c3 100644 --- a/nearest_correlation_matrices/g02aa.d +++ b/nearest_correlation_matrices/g02aa.d @@ -1,5 +1,5 @@ 3 -0.2959969817070776 +0.29599698170707767 0.0 0.013815700430991396 7.366710963886136E-4 0.036355403035060796 0.020347797081572264 0.018640792841438603 0.010277120331962028 0.03313079901499458 0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236557 0.015279544615574847 7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 diff --git a/nearest_correlation_matrices/g02ab.d b/nearest_correlation_matrices/g02ab.d new file mode 100644 index 0000000..8452e13 --- /dev/null +++ b/nearest_correlation_matrices/g02ab.d @@ -0,0 +1,10 @@ +4 +0.35242289412737055 +0.0 1.2127569472830668E-5 7.195785961366941E-6 0.0020380323174505888 3.353434369396486E-4 0.0014591400671755128 2.2543497516351596E-4 8.70026951811792E-4 +1.2127569472830668E-5 0.0 3.369772301364815E-6 0.0010287283953216153 2.060553508251295E-4 7.060499939423037E-4 1.297118899992733E-4 4.693987256225163E-4 +7.195785961394696E-6 3.3697723013925707E-6 0.0 3.160618061278653E-4 3.3451678969231846E-4 5.464856907405058E-4 1.323187488347921E-4 1.8281093738392595E-4 +0.0020380323174505888 0.0010287283953215876 3.1606180612789303E-4 2.220446049250313E-16 0.09562569837460166 0.10161736192678424 0.04974559326544381 0.14048758269561082 +3.353434369396495E-4 2.060553508251295E-4 3.3451678969231846E-4 0.09562569837460161 2.220446049250313E-16 0.009591829656776296 0.05135556336768282 0.11827727452119174 +0.0014591400671755128 7.060499939423037E-4 5.464856907405058E-4 0.10161736192678424 0.009591829656776296 2.220446049250313E-16 1.4712946889589712E-4 0.021750337132225628 +2.2543497516351596E-4 1.297118899992733E-4 1.323187488346811E-4 0.04974559326544381 0.05135556336768282 1.4712946889589712E-4 1.1102230246251565E-16 0.05672380746719485 +8.70026951811792E-4 4.6939872562246077E-4 1.8281093738381493E-4 0.14048758269561076 0.11827727452119163 0.021750337132225517 0.0567238074671948 2.220446049250313E-16 From 9007751d2441b7980fb39fafa139c674caa742a0 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 15 Dec 2020 14:11:59 +0000 Subject: [PATCH 003/196] Added G02AJ to NcmNag --- nearest_correlation_matrices/NcmNag.java | 103 +++++++++++++++++++++-- nearest_correlation_matrices/g02aj.d | 10 +++ 2 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 nearest_correlation_matrices/g02aj.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index e29187e..38fe116 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -1,5 +1,7 @@ import com.nag.routines.G02.G02AA; import com.nag.routines.G02.G02AB; +import com.nag.routines.G02.G02AJ; +import com.nag.routines.G02.G02AN; import com.nag.routines.F01.F01CK; import com.nag.routines.F08.F08NA; import com.nag.routines.F06.F06RC; @@ -62,7 +64,7 @@ public static void main(String[] args) { // Nearest Correlation Matrices - // Using G02AA to comput the nearest correlation matrix in the Frobenius norm + // Using G02AA to compute the nearest correlation matrix in the Frobenius norm // Call NAG routine G02AA and print the result G02AA g02aa = new G02AA(); @@ -123,7 +125,7 @@ public static void main(String[] args) { // Weighting rows and columns of elements - // Use corrmat_nearest_bounded to compute the nearest correlation matrix with row and column weighting + // Use G02AB to compute the nearest correlation matrix with row and column weighting // Define an arrray of weights double[] W = new double[] { 10, 10, 10, 1, 1, 1, 1, 1 }; @@ -186,6 +188,86 @@ public static void main(String[] args) { printDataToFile("g02ab.d", iter, X_G, X_G_norm); + // Weighting Individual Elements + + // Use G02AJ to compute the nearest correlation matrix with element-wise weighting + + // Set up a matrix of weights + n = P[0].length; + double[][] H = new double[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if ((i < 3) && (j < 3)) { + H[i][j] = 100.0; + } else { + H[i][j] = 1; + } + } + } + printMatrix(H); + + System.out.println(); + + // Call the NAG routine specifying a minimum eigenvalue + G02AJ g02aj = new G02AJ(); + G1d = convert2DTo1D(G); + ldg = G.length; + n = G[0].length; + alpha = 0.001; + double[] H1d = convert2DTo1D(H); + int ldh = H.length; + errtol = 0; + maxit = 0; + ldx = n; + X1d = new double[ldx * n]; + iter = 0; + double norm2 = 0; + ifail = 0; + g02aj.eval(G1d, ldg, n, alpha, H1d, ldh, errtol, maxit, X1d, ldx, iter, norm2, ifail); + + X = convert1DTo2D(X1d, ldx); + iter = g02aj.getITER(); + + System.out.println("Nearest correlation matrix using element-wise weighting"); + printMatrix(X); + + System.out.println(); + + jobvl = "N"; + jobvr = "N"; + n = X[0].length; + lda = X.length; + wr = new double[n]; + wi = new double[n]; + ldvl = 1; + vl = new double[ldvl]; + ldvr = 1; + vr = new double[ldvr]; + lwork = 3 * n; + work = new double[lwork]; + info = 0; + f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + + System.out.print("Sorted eigenvalues of X: "); + Arrays.sort(wr); + Arrays.sort(wi); + printComplexVector(wr, wi); + + System.out.println(); + + X_G = matrixSub(X, G); + norm = "F"; + uplo = "U"; + n = X_G[0].length; + X_G1d = convert2DTo1D(X_G); + lda = X_G.length; + work = new double[n]; + X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); + + printDataToFile("g02aj.d", iter, X_G, X_G_norm); + + + } /** @@ -261,7 +343,7 @@ public static double[][] cor_bar(double[][] P) { return convert1DTo2D(D_, n); } - private static void printDataToFile(String fileName, int iter, double[][] X_G, double X_G_norm) { + public static void printDataToFile(String fileName, int iter, double[][] X_G, double X_G_norm) { double[][] absX_G = matrixAbs(X_G); try { FileWriter writer = new FileWriter(new File(fileName)); @@ -432,7 +514,7 @@ public static double[][] convert1DTo2D(double[] a, int n) { public static void printMatrix(double[][] a) { for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[0].length; j++) { - System.out.printf("%7.4f ", a[i][j]); + System.out.printf("%8.4f ", a[i][j]); } System.out.println(); } @@ -440,14 +522,19 @@ public static void printMatrix(double[][] a) { public static void printVector(double[] a) { for (int i = 0; i < a.length; i++) { - System.out.printf("%7.4f ", a[i]); + System.out.printf("%8.4f ", a[i]); } System.out.println(); } - public static void printVector(boolean[] a) { - for (int i = 0; i < a.length; i++) { - System.out.printf("%5b ", a[i]); + public static void printComplexVector(double[] r, double[] i) { + if (r.length != i.length) { + System.out.println("Arrays r(" + r.length + ") and i(" + i.length + ") need to have the same length."); + System.exit(-1); + } + + for (int j = 0; j < r.length; j++) { + System.out.printf("%8.4f%+.4fj", r[j], i[j]); } System.out.println(); } diff --git a/nearest_correlation_matrices/g02aj.d b/nearest_correlation_matrices/g02aj.d new file mode 100644 index 0000000..ecba532 --- /dev/null +++ b/nearest_correlation_matrices/g02aj.d @@ -0,0 +1,10 @@ +137 +0.29813714558068405 +0.0 5.0774791747476566E-5 2.4257860863907688E-6 0.03883768090546469 0.01913091780902494 0.02182932325873077 0.009871667427618344 0.03391663346423762 +5.0774791747476566E-5 0.0 5.503563289266378E-7 0.01871022317530996 0.008532716981371091 0.011049620489291478 0.004524701072025905 0.01598436411198806 +2.4257860864185243E-6 5.503563289543933E-7 0.0 0.013678853424153398 0.02254722256391717 0.004645537805086086 0.0088138047601527 0.020155469272188364 +0.03883768090546469 0.01871022317530993 0.01367885342415337 2.220446049250313E-16 0.09025842648427793 0.012778743855946103 0.038178346548194964 0.10114967989476942 +0.01913091780902494 0.008532716981371091 0.02254722256391717 0.09025842648427787 2.220446049250313E-16 0.008578555196780191 0.04861770043460839 0.11827887145189964 +0.02182932325873077 0.011049620489291478 0.004645537805086086 0.012778743855946104 0.008578555196780191 2.220446049250313E-16 0.0017968276748464712 0.0033987779249069483 +0.009871667427618344 0.004524701072025905 0.008813804760152588 0.038178346548194964 0.04861770043460839 0.0017968276748464712 1.1102230246251565E-16 0.04880165619041976 +0.03391663346423762 0.015984364111988003 0.020155469272188253 0.10114967989476936 0.11827887145189953 0.0033987779249068373 0.04880165619041971 2.220446049250313E-16 From 692d133932071170d0750d82ce72807222ae3446 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 15 Dec 2020 14:20:50 +0000 Subject: [PATCH 004/196] Added G02AN to NcmNag --- nearest_correlation_matrices/NcmNag.java | 64 +++++++++++++++++++++++- nearest_correlation_matrices/g02an.d | 10 ++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 nearest_correlation_matrices/g02an.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 38fe116..60ab83f 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -266,7 +266,69 @@ public static void main(String[] args) { printDataToFile("g02aj.d", iter, X_G, X_G_norm); - + // Fixing a Block of Elements + + // Use G02AN to compute the nearest correlation matrix with fixed leading block + + // Call the NAG routine fixing the top 3-by-3 block + G02AN g02an = new G02AN(); + G1d = convert2DTo1D(G); + ldg = G.length; + n = G[0].length; + int k = 3; + errtol = 0; + double eigtol = 0; + ldx = n; + X1d = new double[ldx * n]; + alpha = 0.001; + iter = 0; + double eigmin = 0; + norm2 = 0; + ifail = 0; + g02an.eval(G1d, ldg, n, k, errtol, eigtol, X1d, ldx, alpha, iter, eigmin, norm2, ifail); + + X = convert1DTo2D(X1d, ldx); + iter = g02an.getITER(); + alpha = g02an.getALPHA(); + + System.out.println("Nearest correlation matrix with fixed leading block"); + printMatrix(X); + + System.out.println(); + + jobvl = "N"; + jobvr = "N"; + n = X[0].length; + lda = X.length; + wr = new double[n]; + wi = new double[n]; + ldvl = 1; + vl = new double[ldvl]; + ldvr = 1; + vr = new double[ldvr]; + lwork = 3 * n; + work = new double[lwork]; + info = 0; + f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + + System.out.print("Sorted eigenvalues of X: "); + Arrays.sort(wr); + printVector(wr); + + System.out.printf("Value of alpha returned: %.4f\n", alpha); + + System.out.println(); + + X_G = matrixSub(X, G); + norm = "F"; + uplo = "U"; + n = X_G[0].length; + X_G1d = convert2DTo1D(X_G); + lda = X_G.length; + work = new double[n]; + X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); + + printDataToFile("g02an.d", iter, X_G, X_G_norm); } diff --git a/nearest_correlation_matrices/g02an.d b/nearest_correlation_matrices/g02an.d new file mode 100644 index 0000000..264585c --- /dev/null +++ b/nearest_correlation_matrices/g02an.d @@ -0,0 +1,10 @@ +27 +0.6842232923771067 +0.0 0.0 0.0 0.11534559633486957 0.0012824395878200104 0.12238688028701034 0.014500765854245638 0.031829946184179364 +0.0 0.0 0.0 0.048787650504719254 0.08127435463151922 0.05467773570274814 0.057453523816818036 0.0849278682546235 +2.7755575615628914E-17 2.7755575615628914E-17 0.0 0.026536575688402134 0.15336648242727113 0.055367887554946565 0.12360320370123046 0.18035708804084039 +0.11534559633486957 0.04878765050471923 0.02653657568840216 2.220446049250313E-16 0.06090091010680207 0.0025226758036557776 0.1292057674820426 0.06429138896868497 +0.0012824395878200095 0.08127435463151922 0.15336648242727113 0.060900910106802014 2.220446049250313E-16 0.13321909433413714 0.06595534587259971 0.19905384725423392 +0.12238688028701034 0.05467773570274814 0.055367887554946565 0.0025226758036557793 0.13321909433413714 2.220446049250313E-16 0.009847716092804867 0.11943272126977661 +0.014500765854245638 0.057453523816818036 0.12360320370123035 0.1292057674820426 0.06595534587259971 0.009847716092804867 1.1102230246251565E-16 0.07976313672648783 +0.031829946184179364 0.08492786825462345 0.18035708804084027 0.06429138896868491 0.1990538472542338 0.1194327212697765 0.07976313672648788 2.220446049250313E-16 From c2b4daac835e06171509581077d00a6a4325365a Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 15 Dec 2020 14:23:30 +0000 Subject: [PATCH 005/196] Remvoed unneeded files for Ncm --- nearest_correlation_matrices/ncm_nag.pdf | Bin 147054 -> 0 bytes nearest_correlation_matrices/temp.ipynb | 92 ----------------------- nearest_correlation_matrices/temp.java | 25 ------ nearest_correlation_matrices/temp.txt | 1 - 4 files changed, 118 deletions(-) delete mode 100644 nearest_correlation_matrices/ncm_nag.pdf delete mode 100644 nearest_correlation_matrices/temp.ipynb delete mode 100644 nearest_correlation_matrices/temp.java delete mode 100644 nearest_correlation_matrices/temp.txt diff --git a/nearest_correlation_matrices/ncm_nag.pdf b/nearest_correlation_matrices/ncm_nag.pdf deleted file mode 100644 index 488174efc3320cc9e913fc9d6a8b57e2652d0d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147054 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

1wlTJzZ^gOa83N6d=)b=mNpF$dlKV;w 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 ESo(Dzk_mH=0;qyqq35MhKdzS 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

KR>0tgp2m6own#%J>Jz&tJG`TN` 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


u1CciQ@kz{=M%YBzd4@ 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 diff --git a/nearest_correlation_matrices/temp.ipynb b/nearest_correlation_matrices/temp.ipynb deleted file mode 100644 index 3ac42a2..0000000 --- a/nearest_correlation_matrices/temp.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "2.7.15-final" - }, - "orig_nbformat": 2, - "kernelspec": { - "name": "python2", - "display_name": "Python 2", - "language": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2, - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "np.set_printoptions(precision=4, suppress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "G_X = []\n", - "with open(\"g02aa.d\", 'r') as g02aa:\n", - " lines = [line.split() for line in g02aa]\n", - " itr = int(lines[0][0])\n", - " norm = float(lines[1][0])\n", - " G_X = lines[2:]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeUAAAG0CAYAAAAM4j8wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3XvcZXVd9//Xe04gRzlYGSBQYDkqnmDME/ITD5B3YHdQYN6CWWqCWVaGlqhoeZbsFg26JcjyBrRU1FFUzFREGg4KDkiOiDCiIYIoyjDM8Pn9sdbcbDbX3tdxuL4X83o+Husxe631/a7v91rXNfu9v+u0U1VIkqT5t2i+OyBJkjqGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCeJ0kqybEj1h2c5MNJvp/kziS3JPlikj9NssNm7NO7ktyWZOeh5bsnuSHJqiQPmKz/Q3V/L8k3k6xP8qPN1PUtRpLnJHnFfPejFe4P3d8Yyo1JcjLwWbrfzZ8CBwO/B1wF/A3wF5ux+XcCWwHHDfRnG+CjwF3A4VV1+1Q3luQXgdOALwNPA54+p73dMj0HMITu5v7Q/cqS+e6A7pbkrcDLgRdU1RlDqz+c5N3AzveqOEeq6jtJzgFeluTtwDrgn4BfBZ5SVTdMc5P7AouBM6vqS3PRxyRbVdUdc7GtuWp3vvq0ULm/pNEcKTciyePpRsZvnyCQAaiqy6vq85u5K28FHgQcC5wE/E/g+VV16XQ2kuQM4PP97Pn94e4zBtYfkuTCJLcnuTXJR5L8ytA2XtfXe0SS85LcBpwzps1H9Yf9f9hv9+okrxoqM6t2R60bWP6r/fKfJrkuyQv6ev8ryTf60wP/nuSXh9rcJ8n7k3y779s1Sd6bZKehfXoMsFvfViW5doq/j0392zfJJ/p+fCfJiUkWDZV9VJJz+9Mmtye5IMlTptvfKezLqbTz0P53emOSdf0+/WCSJbPZH1KrHCm349XA7cAb57MTVfW1JOcBfw3sBLymqv51Bpt6A3AJ8Hd0h8MvBX4AXTACnwA+B/wOsB3dB4AvJXl0VX13aFsfBd4HvIXuMPq9JFlB9yFgDfAnwFq6kfp+A2Xmst3hdQf1yz8I/APwduClwOlJ9u3XnwAsBd4FfAB4/MD2frHv8x8DtwC/RPc3sRJ4Ql/mDXQfmA4ADuuXTXfE+WHgH4GTgd8AXg9c3y8jyWOBLwKXAX8A/Ax4CfDZJE+sqkum0d9B99hf02jn48CPgD8EbgJ2A36dbkAxF/tDaktVOc3DBBRwbP96O7pDxR+coNySwek+6tvv9/376FT6P6bM0/tyBw0tvxj45uDPA+wN3Am8c2DZ6/r6L59Cn79AFy7bjCkz63ZHrRtY/vyBZTsBG4AfAjsMLP+jvuyeY/q6BHhyX+4xA8vPANbO4He6qX8vGFp+BfDpgfnz6a5fWDawbHG/7CMz6O+o/TVpO8Cufd3DxrQ7o/3h5NTq5OHrNvwy3QVW9zhEnGQ3usDYNK1Lsu1w5SRPHzh8N276/GQdSbIX3QVlALvP6qeaePvbAo8Fzq6qDZuWV9W3gQuAp05Q7cOTbHMb4EnAv1TVz+6jdket++TAtm8BbgS+UlU/Hijzjf7fPQb6tyzJq/tD3LfT/b6/2K++x+H1WfrE0PzXgYf0fXgA3X74IN1odkmSJUDoLj48cBb9/fBA3am280PgGuDNSf6gP+Ig3a95+LoNu/T/3jq0/Ed0h+YA3gtsVVU/naD+l4GHTaGdCQNrk3S3W32878eJwHuTPL2qPjuFbU/VTnRvvt+bYN33gT0nWD5R2eFtLqI7nHpftTtq3S1D8+tHLAPYemDZm4CX0R1O/zLwE7oPRf82VG62bh6av2Ng+zvTjVZf00/3kmRRVd01g/4O7q8pt5PkGXSj7TcBuyT5NvC2qnrv+B9TWpgM5Tb8oP/3HsHQB/DFAEn2pjsvdy/96PAbE62bqiSLgbPpztk9AfgvugvPXkk3epkrt9AdkvyFCdb9At3oaFhNYZt30fX9vmp3sj5N11HAP1XV/7umIMl2c9zGZH5Etx9Pobvq/l76QIbp93dwf025naq6Bnh+kgCPAo4H3pPk2qr65ER1pYXMw9dtWA18B/jdJNsPr+yv1N0FWLUZ+/AuunPAv11V3+jfFN8GPCPJo+eqkf6DxiXAkf0HAQCS7Ak8EfiPGWzzZ8CXgOf1h0bvk3bn2DZ0h4AHvWCCcncAE/6Ms9Xvoy/Shd+lVXXx8DSD/s62nU11qqq+yt33JD+i/3ez7Q9pPjhSbkB/mO444CPAJUneSTdSfQDdPcLPAzYCF26O9vu2jwOOq6rPDKw6k+7q3FcCz53DJl9Dd27z40neQ3eh2+vpDpu/Y4bb/DO6YL0wyTvoDmX/EvDoqnrZZmx3rnwKOCbJFXRXkP9Pug8Lw64Edk7yh3RHUdZV1RVz2I9X0F00d16S99Eddt6V7nz84qo6YZr9nXE7Sfaj+7B4dt/GYrpb9TbQXUEPm39/SPcpQ7kRVfWJJE+mu63kjcCOwI/prkY9C3h2Tf/hHZNK8iy6N753V9V7hvp0R5J3AW9M8uqqunYu2qyqTyV5NvBauntW19PdzvTKmf6MVbUqyZPoznH+b7oL575Df6vP5mp3Dr2M7pz3X/fzK4Gjgf8cKvd/gF+juxjvgXQ/415z1YmqujTJAXT76O/o/g5/QHcR4t/PoL+zaef7wHV0Ab473R0KVwD/o+6+ZWqz7g/pvpaquT41pqlIsun2lDPmuy8zsdD7L0kt8pyyJEljpHsS4NVJ1iQ5YYL1r0hyZZLLk5zfX6uyad0x6b6U55tJjpmsLUNZWuA23ec7Zsp891FaqPoLQ08BDgWWA0cnWT5U7DJg/6raD/gQ3eOKSfeNe6+le3rfCuC1GXoU7TBDWVrA+oe93DnJNNGDUSRNzQpgTVVdU1Xr6a7xOXywQFX9+8CDi77C3Q9eehbwmaq6uX+Y0GeAQ8Y15oVe86SqFvToZaH3/37kBu5+wMwoV98XHZHup3aje4TvJmu553Prh72Qu5/sN1Hdcc9TmF4o77rrrrXnnntNp0ozNi7wC9oWL/AjkOvunPB7JBaExYva3fePfNRjJy2TwKMe87j7oDebx0L+09+wceG+73z3+uu45eabmtz7i3fap2rD2AcUTlnd9r3VdFf2b3JaVZ02MD/RPpjwF5vkecD+3H10asp1N5lWKO+5515ccNG97utfEH58+/BzDhaWHR6wdL67MCtrvn/bfHdhxnbcZmHv+0UNf6iYiq2XLtyzbDfeunC/tOrIQ58yeaF5Uht+xlaP/v052da6L71hXVXtP6bIWgaeU093aPpet1AmeTrwl8BT6+7vC1/L3d8gt6nu58f1Z+H+tUuStPmtAvZNsneSZXSPmD13sECSxwCn0n2j2Y0Dq84Dnplkp/4Cr2f2y0bynLIkSSNU1YYkx9OF6WLg9KpaneQk4OKqOpfukcTbAR/sb3a4rqoOq6qbk7yBux+RfFJVDX8pzD0YypIkjVFVK+meWje47MSB108fU/d04PSptuXha0mSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJYyQ5JMnVSdYkOWGC9QcmuTTJhiRHDK17a5LVSa5K8ndJMq4tQ1mSpBGSLAZOAQ4FlgNHJ1k+VOw64FjgA0N1nwg8CdgPeARwAPDUce0tmZNeS5J0/7QCWFNV1wAkOQs4HLhyU4GqurZfd9dQ3QK2BpYBAZYC/z2uMUfKkiSNthtw/cD82n7ZpKrqQuDfge/103lVddW4OoayJGlLtmuSiwemFw2tn+gccE1lw0n2AR4G7E4X5E9LcuC4Oh6+liQtKFm6FUt322dOtrUObqqq/ccUWQvsMTC/O3DDFDf/m8BXquo2gCSfBH4N+MKoCo6UJUkabRWwb5K9kywDjgLOnWLd64CnJlmSZCndRV4evpYkaSaqagNwPHAeXaCeU1Wrk5yU5DCAJAckWQscCZyaZHVf/UPAt4ArgK8BX6uqj41rz8PXkiSNUVUrgZVDy04ceL2K7rD2cL2NwIun05YjZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRHTuvp6YxU/vv3OzdWXzWqHByyd7y5s0XbZftl8d2HGtl66eL67sEVbunjsl+o0beftFu7f/eJFC3e/L2SOlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJGiPJIUmuTrImyQkTrD8wyaVJNiQ5YmjdQ5J8OslVSa5Mste4tgxlSZJGSLIYOAU4FFgOHJ1k+VCx64BjgQ9MsIl/At5WVQ8DVgA3jmtvyWw7LEnS/dgKYE1VXQOQ5CzgcODKTQWq6tp+3V2DFfvwXlJVn+nL3TZZY46UJUlbsl2TXDwwvWho/W7A9QPza/tlU/FQ4EdJ/i3JZUne1o+8R3KkLElaUJYsXcIuD95lTrb1E7ipqvYfUyQTLKspbn4J8BTgMXSHuM+mO8z9vlEVHClLkjTaWmCPgfndgRumUfeyqrqmqjYAHwEeO66CoSxJ0mirgH2T7J1kGXAUcO406u6U5EH9/NMYOBc9EUNZkqQR+hHu8cB5wFXAOVW1OslJSQ4DSHJAkrXAkcCpSVb3dTcCfwacn+QKukPh/zCuPc8pS5I0RlWtBFYOLTtx4PUqusPaE9X9DLDfVNtypCxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1YlrfErU4YYcHLN1cfdH92KJkvrswYz+5/c757sKs7LzdsvnuwqzcubHmuwsztn7DXfPdhRmrhbvbFzRHypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkMZIckuTqJGuSnDDB+gOTXJpkQ5IjJli/Q5LvJnn3ZG0ZypIkjZBkMXAKcCiwHDg6yfKhYtcBxwIfGLGZNwD/MZX2DGVJkkZbAaypqmuqaj1wFnD4YIGquraqLgfuGq6c5HHAzwOfnkpjhrIkaUu2a5KLB6YXDa3fDbh+YH5tv2xSSRYB7wD+fKqdWTLVgpIktWDpssXsttsOc7Kta+Gmqtp/TJFMsKymuPmXAiur6vpkos3cm6EsSdJoa4E9BuZ3B26YYt0nAE9J8lJgO2BZktuq6l4Xi21iKEuSNNoqYN8kewPfBY4CnjuVilX1u5teJzkW2H9cIIPnlCVJGqmqNgDHA+cBVwHnVNXqJCclOQwgyQFJ1gJHAqcmWT3T9hwpS5I0RlWtBFYOLTtx4PUqusPa47ZxBnDGZG05UpYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGLJlO4XV33sWa79+2ufqyWe2y/bL57sKsLErmuwuzsuM2S+e7CzP25vOvne8uzMrLnrT3fHdhVr57y+3z3YUZO3XV9fPdhRn7/m13zHcXtkiOlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkjZHkkCRXJ1mT5IQJ1h+Y5NIkG5IcMbD80UkuTLI6yeVJfmeytgxlSZJGSLIYOAU4FFgOHJ1k+VCx64BjgQ8MLf8Z8PyqejhwCPC3SR44rr1p3acsSdIWZgWwpqquAUhyFnA4cOWmAlV1bb/ursGKVfVfA69vSHIj8CDgR6Mac6QsSdqS7Zrk4oHpRUPrdwMGnwKztl82LUlWAMuAb40r50hZkrSgbLV0MXv9wg5zsq0L4Kaq2n9MkYkep1jTaSPJg4H3A8dU1V3jyjpSliRptLXAHgPzuwM3TLVykh2ATwB/VVVfmay8oSxJ0mirgH2T7J1kGXAUcO5UKvblPwz8U1V9cCp1DGVJkkaoqg3A8cB5wFXAOVW1OslJSQ4DSHJAkrXAkcCpSVb31X8bOBA4NslX++nR49rznLIkSWNU1Upg5dCyEwder6I7rD1c75+Bf55OW46UJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiSNkeSQJFcnWZPkhAnWH5jk0iQbkhwxtO6YJN/sp2Mma8tQliRphCSLgVOAQ4HlwNFJlg8Vuw44FvjAUN2dgdcCjwdWAK9NstO49gxlSZJGWwGsqaprqmo9cBZw+GCBqrq2qi4H7hqq+yzgM1V1c1XdAnwGOGRcY0um07PFi8KO2yydTpVmbL108Xx3YVZ+cvud892FWXnz+dfOdxdm7ISD953vLszKujs3zncXZuX29Qu3/2t/+NP57sKMrd+wcPf7HNsNuH5gfi3dyHemdXcbV2FaoSxJ0nzbaski9vm5beZqc7smuXhg/rSqOm1gPhPUqSlue9p1DWVJ0pbspqraf8z6tcAeA/O7AzdMcdtrgYOG6n5+XAXPKUuSNNoqYN8keydZBhwFnDvFuucBz0yyU3+B1zP7ZSMZypIkjVBVG4Dj6cL0KuCcqlqd5KQkhwEkOSDJWuBI4NQkq/u6NwNvoAv2VcBJ/bKRPHwtSdIYVbUSWDm07MSB16voDk1PVPd04PSptuVIWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLEnSGEkOSXJ1kjVJTphg/VZJzu7XX5Rkr3750iRnJrkiyVVJXjVZW4ayJEkjJFkMnAIcCiwHjk6yfKjYC4Fbqmof4GTgLf3yI4GtquqRwOOAF28K7FEMZUmSRlsBrKmqa6pqPXAWcPhQmcOBM/vXHwIOThKggG2TLAEeAKwHfjyuMUNZkqTRdgOuH5hf2y+bsExVbQBuBXahC+ifAt8DrgPeXlU3j2tsydz0WZKk+8bWSxbxKw/aZq42t2uSiwfmT6uq0wbmM0GdGpofVWYFsBH4RWAn4ItJPltV14zqjKEsSdqS3VRV+49ZvxbYY2B+d+CGEWXW9oeqdwRuBp4LfKqq7gRuTHIBsD8wMpQ9fC1J0mirgH2T7J1kGXAUcO5QmXOBY/rXRwCfq6qiO2T9tHS2BX4N+Ma4xgxlSZJG6M8RHw+cB1wFnFNVq5OclOSwvtj7gF2SrAFeAWy6beoUYDvg63Th/o9Vdfm49jx8LUnSGFW1Elg5tOzEgdfr6G5/Gq5320TLx3GkLElSIwxlSZIaYShLktQIQ1mSpEZM60KvBBYtmugeaW1uO2+3bL67MCsve9Le892FGVt358b57sKsbL108Xx3YVb2e8iO892FGfuX5z9uvrswYwf+/bbz3YUtkiNlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZLGSHJIkquTrElywgTrt0pydr/+oiR7DazbL8mFSVYnuSLJ1uPaMpQlSRohyWLgFOBQYDlwdJLlQ8VeCNxSVfsAJwNv6esuAf4ZeElVPRw4CLhzXHuGsiRJo60A1lTVNVW1HjgLOHyozOHAmf3rDwEHJwnwTODyqvoaQFX9sKo2jmvMUJYkabTdgOsH5tf2yyYsU1UbgFuBXYCHApXkvCSXJnnlZI0tmZMuS5J0H9lq8SL22n7budrcrkkuHpg/rapOG5jPBHVqaH5UmSXAk4EDgJ8B5ye5pKrOH9UZQ1mStCW7qar2H7N+LbDHwPzuwA0jyqztzyPvCNzcL/+PqroJIMlK4LHAyFD28LUkSaOtAvZNsneSZcBRwLlDZc4FjulfHwF8rqoKOA/YL8k2fVg/FbhyXGOOlCVJGqGqNiQ5ni5gFwOnV9XqJCcBF1fVucD7gPcnWUM3Qj6qr3tLknfSBXsBK6vqE+PaM5QlSRqjqlYCK4eWnTjweh1w5Ii6/0x3W9SUePhakqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSI6b11Y0JbL10Yeb40sWZ7y7Myp0ba767MCvfveX2+e7CjN2+fuN8d2FW9nvIjvPdhVlJFu7/3a9ff+t8d2HGFvrf/UK1MBNWkqT7IUNZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLEnSGEkOSXJ1kjVJTphg/VZJzu7XX5Rkr6H1D0lyW5I/m6wtQ1mSpBGSLAZOAQ4FlgNHJ1k+VOyFwC1VtQ9wMvCWofUnA5+cSnuGsiRJo60A1lTVNVW1HjgLOHyozOHAmf3rDwEHJwlAkucA1wCrp9KYoSxJ0mi7AdcPzK/tl01Ypqo2ALcCuyTZFvgL4PVTbWzJrLoqSdJ9bPGisMv2y+Zqc7smuXhg/rSqOm1gPhPUqaH5UWVeD5xcVbf1A+dJGcqSpC3ZTVW1/5j1a4E9BuZ3B24YUWZtkiXAjsDNwOOBI5K8FXggcFeSdVX17lGNGcqSJI22Ctg3yd7Ad4GjgOcOlTkXOAa4EDgC+FxVFfCUTQWSvA64bVwgg6EsSdJIVbUhyfHAecBi4PSqWp3kJODiqjoXeB/w/iRr6EbIR820PUNZkqQxqmolsHJo2YkDr9cBR06yjddNpS2vvpYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGLJlO4Q0bixtvvWNz9WWz2nm7ZfPdhVlZv+Gu+e7CrJy66vr57sKMrf3hT+e7C7PyL89/3Hx3YVa+fv2t892FGXv0Xg+c7y7M2DbLFs93F7ZIjpQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJI2R5JAkVydZk+SECdZvleTsfv1FSfbqlz8jySVJruj/fdpkbRnKkiSNkGQxcApwKLAcODrJ8qFiLwRuqap9gJOBt/TLbwJ+o6oeCRwDvH+y9gxlSZJGWwGsqaprqmo9cBZw+FCZw4Ez+9cfAg5Okqq6rKpu6JevBrZOstW4xgxlSZJG2w0YfPrR2n7ZhGWqagNwK7DLUJnfAi6rqrFP4JrWE70kSZpvSxcv4kHbjx1wTseuSS4emD+tqk4bmM8EdWpofmyZJA+nO6T9zMk6YyhLkrZkN1XV/mPWrwX2GJjfHbhhRJm1SZYAOwI3AyTZHfgw8Pyq+tZknfHwtSRJo60C9k2yd5JlwFHAuUNlzqW7kAvgCOBzVVVJHgh8AnhVVV0wlcYMZUmSRujPER8PnAdcBZxTVauTnJTksL7Y+4BdkqwBXgFsum3qeGAf4DVJvtpPPzeuPQ9fS5I0RlWtBFYOLTtx4PU64MgJ6r0ReON02nKkLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliSpEYayJEmNMJQlSWqEoSxJUiMMZUmSGmEoS5LUCENZkqRGGMqSJDXCUJYkqRGGsiRJjTCUJUlqhKEsSVIjDGVJkhphKEuS1AhDWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIaYShLktQIQ1mSpEYYypIkNcJQliRpjCSHJLk6yZokJ0ywfqskZ/frL0qy18C6V/XLr07yrMnaMpQlSRohyWLgFOBQYDlwdJLlQ8VeCNxSVfsAJwNv6esuB44CHg4cAryn395IhrIkSaOtANZU1TVVtR44Czh8qMzhwJn96w8BBydJv/ysqrqjqr4NrOm3N5KhLEnSaLsB1w/Mr+2XTVimqjYAtwK7TLHuPSyZTs9WX37ZTct32+4706kjaX5t/6L57oEWqD3nuwOjfPWyS87bedslu87R5rZOcvHA/GlVddrAfCaoU0Pzo8pMpe49TCuUq+pB0ykvSdJcq6pD7sPm1gJ7DMzvDtwwoszaJEuAHYGbp1j3Hjx8LUnSaKuAfZPsnWQZ3YVb5w6VORc4pn99BPC5qqp++VH91dl7A/sC/zmusWmNlCVJ2pJU1YYkxwPnAYuB06tqdZKTgIur6lzgfcD7k6yhGyEf1dddneQc4EpgA3BcVW0c1166MJckSfPNw9eSJDXCUBZJzkjy8fnux+aQ5KAk1062rEULue+SZsZQvg8Nh1+Szyd5933Y/qj2Xg48775KaFq6AAAIk0lEQVTqx1QkOS7J5Ul+3E8XJnn2fdDuw/rf0/VJ1vf/firJb032JJ5ptpMkX0/yjqHlT05ye5IXz1Vbs5XkpUm+nWRdkkuSPGWS8q9Ksqr/vf0gyceSPGKozPZJ/jbJd/qf98tJDphgWw9Ocma/nXVJrkzy1Nn0T2qZoXw/0F8ROGNVdWtV/Wiu+jNH1gJ/ATwW2B/4HPCRJPttrgaTPAe4DNgKeD7dlZJH0F1B+df98jnRX5n518BLkuzat/8rwEeBd1bVqXPV1mwk+R3gXcDfAI8Bvgx8MslDxlQ7CHgP8ETgaXQXuHw2yc4DZf4P8Cy6K1YfCXy6L/P/HqyQ5IHABXT3ej4beBjwMuDGWfZPaldVOd1HE3AG8PGB1zU07UX3BvRK4FvA7cAVwPOGtvN54L3A24Ef0F2yfwjwReAWuqv/zgMeNtT2vdqboF9bAX8L/DewDvgK8OQJ2n8P3RvhTXRvkm8HFg2UObCvexvd020uAh4xy/13M/DiadY5CLh2CsseBawH/nLEdrIZ/h4WAf/V78efB64B3s/dF2BOqe+b+W/2IuAfhpZ9E3jTNLaxHbAR+I1+/gF0QX34ULlLgDcOzP8NcMHm7p+TU0uTI+X583LgQuAfgQf30/XAG+kebn4c3cPP3wScOsGh2+fRBfhT6EZ129KF6Qq6N+5bgY8NjKJHtTfsrcDvAL9HN/K4AvhUkgcPlftdujfWJwLHA3/c16O/ef6jwJfowu7xdKOZjf36Y5PU4DepjJNkcZKj6N7cvzyVOjPwLrqAfNNEK6tqzm9TqKq76ILnOGAlcC3wws3RVpJXJ7ltkukpQ3WWAY+jG8UO+jTd732qtqf7AHJLP7+E7taSdUPlbgeePDD/HOCi/tt3bkzy1STH988Unsv+Sc3wPuV5UlW3JlkP/Kyqvg+QZFvgFcAzq+qLfdFvJ1lB98b9iYFNfLuq/nRg/qrB7Sd5AfBjupD+0kTtDevb/0Pg96vqE/2yl9AdgjwO+KuB4ldW1Yn96/9K8gfAwcD/BXYAHgh8rKq+1Zf5xkDdW4GrgTtH7yFI8ki6DxJb0424f7OqrhhXZyaS7Ak8FTi2D0qSLAK+R/dhB+Bfq+qYEZuYjbOA/033BKCnVffA+2lJ8nLgz+mOWgB8pqr+fKjY3wPnTLKp7w7N70oXnv89tPy/gadPo4vvAr5K97ukqn6S5ELgr5J8Hfg+cDTwBLoH9m/yS8BL6b51583Ao+n2FcC757B/UjMM5bYspwugTyUZHC0tpRtFDbpkcCbJLwNvoBuVPohuZLIImM65tV/u27pg04Kq2ti/gQ5/VdnlQ/M3AD/X17k5yRnAeUnOB84HPlhVmx7Y/mHgw1Poz9V0b8QPBH4LODPJQVX19Wn8TFPxyP7fi4aWP6n/98t9X+4hyRuBv5xk2/9fVX1+zPq/o/t/uDOTPBN3jEcAf1xVHxpVoKpupjv8PxMTPed3Sn1N8k660e+T654PTfhfwOl01w5sBC6l+0D32IEyi+gezvCqfv6yJPvSfUAcvGBxxv2TWuPh67Zs+n38Bl0YbZoeDjxzqOxPh+Y/RhfGL6YL5sfQHV6ezkVgmx6ePtEb2vCy4VFuMfD3VFUv6PvxBeAwutH0pF/wfY8NVq2vqjVVtemN+avAn0xnG1O0ff/vhoG276qqNXSjzwcBX5ug3t/SXXw0bhr5SL0kr6W7kOyJdL/P42bY/0dy7w9Jw21N+/A13c++EfiFoeU/x71HpxO1eTLdCPhpVXXN4Lqq+lZVPZXulMQeVbWC7gPhtweKfY/uSUiDruLuD5qz6p/UIkfK82s93eG3Ta4E7gD2rKrPTXUjSXahC4Djqurf+2WP5d6/3+H2hq3pyzyZ7qKjTV/w/QTgA1PtzyZV9TW6MHtLkk/SXWl73nS3M2ARc3gF9IBNI+8nc8/Dp3D3KPpeoVxVN3H3IeNpSfJC4AS6UxWXJXkr8Jok76qqn01jOwF+Bfhgf3RldVX97gRFp334uqrWJ7kEeAbwwYFVzwD+dZJ+vYvuUYMHVdU3RpWrqp8CP02yE93V2K8cWH0B3c826KHAd2bbP6lVhvL8uhZY0V/wdBvd4cW3A2/v32y/QDeS+DXgrrrn14kNuoUuHP4gyfV039f5NgZGfqPa23QOFbo3yCTvBd6c5Ca6Ucuf0F0Z/J6p/lDpHrz+Yrpbib5Ld25wP7orxknym3QXVB1cVcPnMTdt481059CvpxvJPpfuArY5v1e5qq5I8lHgHf3FQ1+gG/nvR3eO/8aqWjtX7SX5dbr9+byBawf+AXg13X47eRqb24vuC9jvdY/voFkcvn4n3TN9/5MuJF8C/CJdyAOQ7rnAx1fVr/bzp9Adnn4OcEuSTSPZ26rqtr7Ms+g+ZH0D2Ifu7/VqugsRNzkZ+HKSvwTOpjv680d0+2nK/ZMWlPm+/HtLmhi49aiffyjdxS8/4563RL2Mu0fNPwA+AzxjoN7ngXcPbftpdCO+df2/z6IL3mPHtTfcL+55S9QdjL4larj9wW38PPBvdIF8B3Ad3VXdS/v1xw62P2ZffaevfyPwWeBZQ2Wmsp2DmNotUcvoRmmX9/vnx3SHnv8M2GkO/wYO6H8vfzLBuj/t99lWU+073amOMzfz3+1L6T7Q3UF3LcOBQ+tfR3+Bej8/fOvdpul1A2V+m+62vzvoDlO/G9hxgrafTXeUYh3d1fF/xNDtaZP1z8lpIU1+IYUWrCSvpzsn+6iqGj4qsKnMQcAZVbXXuGUtmkrfk7wa2FhVb5mHLkqaY17opYXs1+kOm04YyFuIR3Dvi6EkLVCeU9aCVZOcR90SVNVz57sPkuaOI2Xd311Ld458smUtupaF23dJM+A5ZUmSGuFIWZKkRhjKkiQ1wlCWJKkRhrIkSY0wlCVJaoShLElSIwxlSZIa8f8D1EH4kNg2KHsAAAAASUVORK5CYII=\n", - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" - }, - "metadata": {} - } - ], - "source": [ - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(np.array(G_X, dtype=np.float32), interpolation='none', cmap=plt.cm.Blues,\n", - " vmin=0, vmax=0.2)\n", - "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", - " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", - "cbar.mappable.set_clim([0, 0.2])\n", - "ax1.tick_params(axis='both', which='both', \n", - " bottom='off', top='off', left='off', right='off', \n", - " labelbottom='off', labelleft='off')\n", - "ax1.set_title(r'$|G-X|$ for corrmat_nearest', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", - " fontsize=14,\n", - ")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ] -} \ No newline at end of file diff --git a/nearest_correlation_matrices/temp.java b/nearest_correlation_matrices/temp.java deleted file mode 100644 index 3b0a2d8..0000000 --- a/nearest_correlation_matrices/temp.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.jblas.DoubleMatrix; - -public class temp { - public static void main(String[] args) { - DoubleMatrix P = new DoubleMatrix( - new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 }, - { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 }, - { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 }, - { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN }, - { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 }, - { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 }, - { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 }, - { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN }, - { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 }, - { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } }); - - //P.print(); - - DoubleMatrix x = new DoubleMatrix(new double[][]{{1d, 2d, 3d}, {4d, 5d, 6d}, {7d, 8d, 9d}}); - - //System.out.println(x.toString().replace(';', '\n')); - x.diag().div(1).print(); - x.diag().rdiv(1).print(); - } -} diff --git a/nearest_correlation_matrices/temp.txt b/nearest_correlation_matrices/temp.txt deleted file mode 100644 index 12d12c0..0000000 --- a/nearest_correlation_matrices/temp.txt +++ /dev/null @@ -1 +0,0 @@ -[59.875000, 42.734000, 47.938000, 60.359000, 54.016000, 69.625000, 61.500000, 62.125000; 53.188000, 49.000000, 39.500000, NaN, 34.750000, NaN, 83.000000, 44.500000; 55.750000, 50.000000, 38.938000, NaN, 30.188000, NaN, 70.875000, 29.938000; 65.500000, 51.063000, 45.563000, 69.313000, 48.250000, 62.375000, 85.250000, NaN; 69.938000, 47.000000, 52.313000, 71.016000, NaN, 59.359000, 61.188000, 48.219000; 61.500000, 44.188000, 53.438000, 57.000000, 35.313000, 55.813000, 51.500000, 62.188000; 59.230000, 48.210000, 62.190000, 61.390000, 54.310000, 70.170000, 61.750000, 91.080000; 61.230000, 48.700000, 60.300000, 68.580000, 61.250000, 70.340000, NaN, NaN; 52.900000, 52.690000, 54.230000, NaN, 68.170000, 70.600000, 57.870000, 88.640000; 57.370000, 59.040000, 59.870000, 62.090000, 61.620000, 66.470000, 65.370000, 85.840000] From a1caadc00586ff8895e0260237811820f28d8c70 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Tue, 15 Dec 2020 21:42:23 +0200 Subject: [PATCH 006/196] Updated gitignore --- .gitignore | 2 ++ nearest_correlation_matrices/ncm_nag.ipynb | 33 +++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 9af7884..17c8d35 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .class +myvenv +.ipynb_checkpoints diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 9797e34..203d782 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -266,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 29, "metadata": { "nbpresent": { "id": "af5081b7-3d9a-47f5-8dc1-69fcc57821c0" @@ -291,7 +291,7 @@ " # Apply the mask to xi\n", " xim = np.ma.masked_array(xi, mask=notp)\n", " # Apply the mask to xj\n", - " xjm = np.ma.masked_array(xj, mask=notp) \n", + " xjm = np.ma.masked_array(xj, mask=notp)\n", " S[i, j] = np.ma.dot(xim - np.mean(xim), xjm - np.mean(xjm))\n", " # Take the sum over ~notp to normalize\n", " S[i, j] = 1.0 / (sum(~notp) - 1) * S[i, j]\n", @@ -301,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 30, "metadata": { "nbpresent": { "id": "80b820b1-7c3b-4c96-a4a6-09b5ef00dacb" @@ -312,8 +312,8 @@ "def cor_bar(P):\n", " \"\"\"Returns an approximate sample correlation matrix\"\"\"\n", " S = cov_bar(P)\n", - " D = np.diag(1.0 / np.sqrt(np.diag(S)))\n", - " return D @ S @ D \n" + " D = np.diag(1.0 / np.sqrt(np.diag(S)))xi\n", + " return D @ S @ D " ] }, { @@ -329,7 +329,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 31, "metadata": { "nbpresent": { "id": "f417663e-badf-45d3-8f98-0647907657de" @@ -372,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 35, "metadata": { "nbpresent": { "id": "b1c83af0-e6ca-42cc-a0ca-50276ebe4f67" @@ -1118,6 +1118,25 @@ "\n", "**https://www.nag.com/nag-library-python ** \n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "``` java\n", + "public class Hello {\n", + " public static void main(String[] args) {\n", + " }\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 90d5760640609a1708df9a601387c416ed4cbe94 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Wed, 16 Dec 2020 16:31:31 +0200 Subject: [PATCH 007/196] Added G02AA to jupyter notebook --- nearest_correlation_matrices/G.d | 8 + nearest_correlation_matrices/G_eigen.d | 1 + nearest_correlation_matrices/NcmNag.java | 44 ++- nearest_correlation_matrices/X_G02AA.d | 8 + nearest_correlation_matrices/X_eigen_G02AA.d | 1 + nearest_correlation_matrices/g02aa.d | 16 +- nearest_correlation_matrices/g02ab.d | 18 +- nearest_correlation_matrices/g02aj.d | 18 +- nearest_correlation_matrices/ncm_nag.ipynb | 295 ++++++++++++++----- 9 files changed, 307 insertions(+), 102 deletions(-) create mode 100755 nearest_correlation_matrices/G.d create mode 100755 nearest_correlation_matrices/G_eigen.d create mode 100755 nearest_correlation_matrices/X_G02AA.d create mode 100755 nearest_correlation_matrices/X_eigen_G02AA.d diff --git a/nearest_correlation_matrices/G.d b/nearest_correlation_matrices/G.d new file mode 100755 index 0000000..5d286c9 --- /dev/null +++ b/nearest_correlation_matrices/G.d @@ -0,0 +1,8 @@ +1.0 -0.3250029917945835 0.18814425997629136 0.5759508639629596 0.00640355776080848 -0.6111098444919633 -0.07240613328341335 -0.15893528307270638 +-0.3250029917945835 1.0 0.20484152654833515 0.24360955555978517 0.40582420357130317 0.273020298287851 0.2868805375451461 0.4240671568750279 +0.1881442599762914 0.20484152654833518 1.0 -0.1325040936108396 0.7657991363667153 0.27646640778981524 -0.617183266829168 0.9005703206682636 +0.5759508639629596 0.24360955555978514 -0.13250409361083962 0.9999999999999998 0.30409424292463905 0.012596382998409861 0.645158339588759 -0.32102379456595537 +0.006403557760808479 0.40582420357130317 0.7657991363667153 0.304094242924639 1.0000000000000002 0.6651979348683132 -0.3293323685112022 0.9939281510877161 +-0.6111098444919633 0.273020298287851 0.27646640778981524 0.012596382998409863 0.6651979348683132 0.9999999999999998 0.049172233461315856 0.5963589524568644 +-0.07240613328341335 0.2868805375451461 -0.6171832668291679 0.645158339588759 -0.3293323685112022 0.049172233461315856 0.9999999999999999 -0.39827829557224775 +-0.15893528307270638 0.42406715687502783 0.9005703206682635 -0.3210237945659553 0.993928151087716 0.5963589524568643 -0.3982782955722478 1.0000000000000002 diff --git a/nearest_correlation_matrices/G_eigen.d b/nearest_correlation_matrices/G_eigen.d new file mode 100755 index 0000000..ffbb905 --- /dev/null +++ b/nearest_correlation_matrices/G_eigen.d @@ -0,0 +1 @@ +-0.24977745860993417 -0.015972279592768625 0.08945238623840102 0.2191673628508196 0.7072035937038217 1.7533864538965915 1.9610814370428227 3.53545850447024 diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 60ab83f..9178664 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -34,6 +34,7 @@ public static void main(String[] args) { double[][] G = cor_bar(P); System.out.println("The approximate correlation matrix"); printMatrix(G); + printMatrixToFile(G, "G.d"); System.out.println(); @@ -55,10 +56,11 @@ public static void main(String[] args) { double[] work = new double[lwork]; int info = 0; f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + Arrays.sort(wr); System.out.print("Sorted eigenvalues of G: "); - Arrays.sort(wr); printVector(wr); + printVectorToFile(wr, "G_eigen.d"); System.out.println(); @@ -87,6 +89,7 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix"); printMatrix(X); + printMatrixToFile(X, "X_G02AA.d"); System.out.println(); @@ -104,10 +107,11 @@ public static void main(String[] args) { work = new double[lwork]; info = 0; f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + Arrays.sort(wr); System.out.print("Sorted eigenvalues of X: "); - Arrays.sort(wr); printVector(wr); + printVectorToFile(wr, "X_eigen_G02AA.d"); System.out.println(); @@ -339,7 +343,6 @@ public static void main(String[] args) { * @return */ public static double[][] cov_bar(double[][] P) { - double[] xi, xj; boolean[] xib, xjb, notp; int n = P[0].length; @@ -349,6 +352,7 @@ public static double[][] cov_bar(double[][] P) { for (int i = 0; i < n; i++) { // Take the ith column xi = getMatrixColumn(P, i); + for (int j = 0; j < i + 1; j++) { // Take the jth column, where j <= i xj = getMatrixColumn(P, j); @@ -359,6 +363,7 @@ public static double[][] cov_bar(double[][] P) { notp = addBoolArrOr(xib, xjb); + // S[i][j] = (xi - mean(xi)) * (xj - mean(xj)) S[i][j] = matrixMaskedDot(vectorSubScalar(xi, vectorMaskedMean(xi, notp)), vectorSubScalar(xj, vectorMaskedMean(xj, notp)), notp); @@ -384,8 +389,10 @@ public static double[][] cov_bar(double[][] P) { public static double[][] cor_bar(double[][] P) { double[][] S, D; S = cov_bar(P); + // D = 1.0 / SQRT(S) D = getMatrixFromDiag(vectorRightDiv(vectorSqrt(getMatrixDiag(S)), 1.0)); + // S_ = S * D F01CK f01ck = new F01CK(); double[] S_ = new double[S.length * S[0].length]; double[] S1d = convert2DTo1D(S); @@ -399,6 +406,7 @@ public static double[][] cor_bar(double[][] P) { int ifail = 0; f01ck.eval(S_, S1d, D1d, n, p, m, z, iz, opt, ifail); + // D_ = D * S_ double[] D_ = new double[n * n]; f01ck.eval(D_, D1d, S_, n, p, m, z, iz, opt, ifail); @@ -582,6 +590,36 @@ public static void printMatrix(double[][] a) { } } + public static void printMatrixToFile(double[][] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(fileName)); + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + writer.write(a[i][j] + " "); + } + writer.write("\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + + public static void printVectorToFile(double[] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(fileName)); + for (int i = 0; i < a.length; i++) { + writer.write(a[i] + " "); + } + writer.write("\n"); + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + public static void printVector(double[] a) { for (int i = 0; i < a.length; i++) { System.out.printf("%8.4f ", a[i]); diff --git a/nearest_correlation_matrices/X_G02AA.d b/nearest_correlation_matrices/X_G02AA.d new file mode 100755 index 0000000..9d5299b --- /dev/null +++ b/nearest_correlation_matrices/X_G02AA.d @@ -0,0 +1,8 @@ +1.0 -0.3111872913635921 0.18888093107267998 0.5395954609278987 0.02675135484238073 -0.5924690516505247 -0.06212901295145131 -0.19206608208770093 +-0.3111872913635921 1.0 0.20502514288449164 0.22653323290889946 0.41483550652910844 0.28220348838267434 0.2915271505753827 0.40878761225945304 +0.18888093107267998 0.20502514288449164 1.0 -0.14679747104822682 0.7879600443535626 0.2727105118922599 -0.6084599950657016 0.880228639445601 +0.5395954609278987 0.22653323290889946 -0.14679747104822682 1.0 0.21370691586815335 0.0014877170535466597 0.606865984410564 -0.22076449149682695 +0.02675135484238073 0.41483550652910844 0.7879600443535626 0.21370691586815335 1.0 0.658027173714172 -0.2811733178595378 0.8762364775845148 +-0.5924690516505247 0.28220348838267434 0.2727105118922599 0.0014877170535466597 0.658027173714172 1.0 0.047885300489080775 0.593152378069519 +-0.06212901295145131 0.2915271505753827 -0.6084599950657016 0.606865984410564 -0.2811733178595378 0.047885300489080775 1.0 -0.446982409442484 +-0.19206608208770093 0.40878761225945304 0.880228639445601 -0.22076449149682695 0.8762364775845148 0.593152378069519 -0.446982409442484 1.0 diff --git a/nearest_correlation_matrices/X_eigen_G02AA.d b/nearest_correlation_matrices/X_eigen_G02AA.d new file mode 100755 index 0000000..2824faf --- /dev/null +++ b/nearest_correlation_matrices/X_eigen_G02AA.d @@ -0,0 +1 @@ +-6.173883426196985E-17 2.550377090501583E-17 0.038046493282210325 0.17308760612514437 0.6893558332540384 1.7117146722540244 1.9217270612302262 3.4660683338543565 diff --git a/nearest_correlation_matrices/g02aa.d b/nearest_correlation_matrices/g02aa.d index cfc36c3..55ed396 100644 --- a/nearest_correlation_matrices/g02aa.d +++ b/nearest_correlation_matrices/g02aa.d @@ -1,10 +1,10 @@ 3 -0.29599698170707767 -0.0 0.013815700430991396 7.366710963886136E-4 0.036355403035060796 0.020347797081572264 0.018640792841438603 0.010277120331962028 0.03313079901499458 -0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236557 0.015279544615574847 +0.2959969817070778 +0.0 0.013815700430991396 7.366710963886136E-4 0.03635540303506091 0.02034779708157225 0.018640792841438603 0.010277120331962035 0.03313079901499455 +0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236613 0.015279544615574847 7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 -0.036355403035060796 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.09038732705648564 0.01110866594486322 0.03829235517819496 0.10025930306912842 -0.020347797081572264 0.009011302957805278 0.022160907986847334 0.09038732705648558 2.220446049250313E-16 0.007170761154141281 0.048159050651664315 0.11769167350320131 -0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863223 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 -0.010277120331962028 0.004646613030236557 0.008723271763466323 0.03829235517819496 0.048159050651664315 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 -0.03313079901499458 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 +0.03635540303506091 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.0903873270564857 0.011108665944863202 0.03829235517819496 0.10025930306912842 +0.02034779708157225 0.009011302957805278 0.022160907986847334 0.09038732705648564 2.220446049250313E-16 0.007170761154141281 0.04815905065166437 0.11769167350320131 +0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863204 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 +0.010277120331962035 0.004646613030236613 0.008723271763466323 0.03829235517819496 0.04815905065166437 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 +0.03313079901499455 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/g02ab.d b/nearest_correlation_matrices/g02ab.d index 8452e13..85f882b 100644 --- a/nearest_correlation_matrices/g02ab.d +++ b/nearest_correlation_matrices/g02ab.d @@ -1,10 +1,10 @@ 4 -0.35242289412737055 -0.0 1.2127569472830668E-5 7.195785961366941E-6 0.0020380323174505888 3.353434369396486E-4 0.0014591400671755128 2.2543497516351596E-4 8.70026951811792E-4 -1.2127569472830668E-5 0.0 3.369772301364815E-6 0.0010287283953216153 2.060553508251295E-4 7.060499939423037E-4 1.297118899992733E-4 4.693987256225163E-4 -7.195785961394696E-6 3.3697723013925707E-6 0.0 3.160618061278653E-4 3.3451678969231846E-4 5.464856907405058E-4 1.323187488347921E-4 1.8281093738392595E-4 -0.0020380323174505888 0.0010287283953215876 3.1606180612789303E-4 2.220446049250313E-16 0.09562569837460166 0.10161736192678424 0.04974559326544381 0.14048758269561082 -3.353434369396495E-4 2.060553508251295E-4 3.3451678969231846E-4 0.09562569837460161 2.220446049250313E-16 0.009591829656776296 0.05135556336768282 0.11827727452119174 -0.0014591400671755128 7.060499939423037E-4 5.464856907405058E-4 0.10161736192678424 0.009591829656776296 2.220446049250313E-16 1.4712946889589712E-4 0.021750337132225628 -2.2543497516351596E-4 1.297118899992733E-4 1.323187488346811E-4 0.04974559326544381 0.05135556336768282 1.4712946889589712E-4 1.1102230246251565E-16 0.05672380746719485 -8.70026951811792E-4 4.6939872562246077E-4 1.8281093738381493E-4 0.14048758269561076 0.11827727452119163 0.021750337132225517 0.0567238074671948 2.220446049250313E-16 +0.3524228941273674 +0.0 1.2127569472830668E-5 7.195785961727763E-6 0.002038032317451921 3.353434369406643E-4 0.001459140067176179 2.2543497516450128E-4 8.700269518134296E-4 +1.2127569472830668E-5 0.0 3.3697723013370595E-6 0.0010287283953215043 2.0605535082529602E-4 7.060499939418041E-4 1.2971188999805205E-4 4.693987256226828E-4 +7.195785961755519E-6 3.369772301364815E-6 0.0 3.1606180612731016E-4 3.3451678969276255E-4 5.464856907395066E-4 1.3231874883401495E-4 1.8281093738581333E-4 +0.002038032317451921 0.0010287283953214765 3.160618061273379E-4 2.220446049250313E-16 0.09562569837460122 0.10161736192678256 0.0497455932654437 0.14048758269560868 +3.3534343694066517E-4 2.0605535082529602E-4 3.3451678969276255E-4 0.09562569837460116 2.220446049250313E-16 0.009591829656777184 0.05135556336768127 0.11827727452119219 +0.001459140067176179 7.060499939418041E-4 5.464856907395066E-4 0.10161736192678256 0.009591829656777184 2.220446049250313E-16 1.4712946889805512E-4 0.021750337132225628 +2.2543497516450128E-4 1.2971188999805205E-4 1.3231874883390393E-4 0.0497455932654437 0.05135556336768127 1.4712946889805512E-4 1.1102230246251565E-16 0.05672380746719463 +8.700269518134296E-4 4.693987256226273E-4 1.828109373857023E-4 0.14048758269560863 0.11827727452119208 0.021750337132225517 0.056723807467194576 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/g02aj.d b/nearest_correlation_matrices/g02aj.d index ecba532..ee927b2 100644 --- a/nearest_correlation_matrices/g02aj.d +++ b/nearest_correlation_matrices/g02aj.d @@ -1,10 +1,10 @@ 137 -0.29813714558068405 -0.0 5.0774791747476566E-5 2.4257860863907688E-6 0.03883768090546469 0.01913091780902494 0.02182932325873077 0.009871667427618344 0.03391663346423762 -5.0774791747476566E-5 0.0 5.503563289266378E-7 0.01871022317530996 0.008532716981371091 0.011049620489291478 0.004524701072025905 0.01598436411198806 -2.4257860864185243E-6 5.503563289543933E-7 0.0 0.013678853424153398 0.02254722256391717 0.004645537805086086 0.0088138047601527 0.020155469272188364 -0.03883768090546469 0.01871022317530993 0.01367885342415337 2.220446049250313E-16 0.09025842648427793 0.012778743855946103 0.038178346548194964 0.10114967989476942 -0.01913091780902494 0.008532716981371091 0.02254722256391717 0.09025842648427787 2.220446049250313E-16 0.008578555196780191 0.04861770043460839 0.11827887145189964 -0.02182932325873077 0.011049620489291478 0.004645537805086086 0.012778743855946104 0.008578555196780191 2.220446049250313E-16 0.0017968276748464712 0.0033987779249069483 -0.009871667427618344 0.004524701072025905 0.008813804760152588 0.038178346548194964 0.04861770043460839 0.0017968276748464712 1.1102230246251565E-16 0.04880165619041976 -0.03391663346423762 0.015984364111988003 0.020155469272188253 0.10114967989476936 0.11827887145189953 0.0033987779249068373 0.04880165619041971 2.220446049250313E-16 +0.29813714558068444 +0.0 5.0774791750307635E-5 2.425786085669124E-6 0.03883768090546136 0.019130917809027575 0.02182932325871967 0.00987166742762663 0.03391663346423357 +5.0774791750307635E-5 0.0 5.503563274000811E-7 0.018710223175318536 0.008532716981402788 0.011049620489332113 0.004524701071976667 0.015984364111987615 +2.4257860856968794E-6 5.503563274278367E-7 0.0 0.013678853424135107 0.022547222563915392 0.004645537805090194 0.008813804760212207 0.02015546927216605 +0.03883768090546136 0.018710223175318508 0.013678853424135079 2.220446049250313E-16 0.09025842648426527 0.012778743855939181 0.038178346548207065 0.10114967989476989 +0.019130917809027575 0.008532716981402788 0.022547222563915392 0.09025842648426521 2.220446049250313E-16 0.008578555196769533 0.04861770043459507 0.1182788714519033 +0.02182932325871967 0.011049620489332113 0.004645537805090194 0.012778743855939183 0.008578555196769533 2.220446049250313E-16 0.0017968276748671075 0.00339877792490062 +0.00987166742762663 0.004524701071976667 0.008813804760212096 0.038178346548207065 0.04861770043459507 0.0017968276748671075 1.1102230246251565E-16 0.04880165619044008 +0.03391663346423357 0.01598436411198756 0.020155469272165938 0.10114967989476983 0.11827887145190319 0.003398777924900509 0.048801656190440024 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 203d782..4a67786 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -188,12 +188,12 @@ } }, "source": [ - "### Import required modules and set print options" + "### Import required modules, set print options and define read_data_file function" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "nbpresent": { "id": "bbde4683-adc6-4094-891a-5487f24b873e" @@ -202,7 +202,7 @@ "outputs": [], "source": [ "import numpy as np\n", - "from naginterfaces.library import correg as nl_correg\n", + "#from naginterfaces.library import correg as nl_correg\n", "import matplotlib.pyplot as plt\n", "# Set the print precision\n", "np.set_printoptions(precision=4, suppress=True)" @@ -210,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -218,6 +218,38 @@ "%matplotlib inline" ] }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "def read_matrix_file(fname):\n", + " with open(fname) as fdata:\n", + " a = np.array([line.split() for line in fdata], dtype = np.float64)\n", + " return a" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "def read_data_file(fname):\n", + " with open(fname) as fdata:\n", + " for i, line in enumerate(fdata):\n", + " if i == 0:\n", + " itr = float(line)\n", + " elif i == 1:\n", + " norm = float(line)\n", + " elif i == 2:\n", + " a = np.array([float(lts) for lts in line.split()], dtype = np.float64)\n", + " else:\n", + " a = np.vstack([a, [float(lts) for lts in line.split()]])\n", + " return itr, norm, a" + ] + }, { "cell_type": "markdown", "metadata": { @@ -230,27 +262,26 @@ ] }, { - "cell_type": "code", - "execution_count": 3, + "cell_type": "markdown", "metadata": { "nbpresent": { "id": "ffa06d72-354c-45f8-95d8-95d411e89091" } }, - "outputs": [], "source": [ - "# Define a 2-d array and use np.nan to set elements as NaNs\n", - "P = np.array([[59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125],\n", - " [53.188, 49.000, 39.500, np.nan, 34.750, np.nan, 83.000, 44.500],\n", - " [55.750, 50.000, 38.938, np.nan, 30.188, np.nan, 70.875, 29.938],\n", - " [65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, np.nan],\n", - " [69.938, 47.000, 52.313, 71.016, np.nan, 59.359, 61.188, 48.219],\n", - " [61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188],\n", - " [59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080],\n", - " [61.230, 48.700, 60.300, 68.580, 61.250, 70.340, np.nan, np.nan],\n", - " [52.900, 52.690, 54.230, np.nan, 68.170, 70.600, 57.870, 88.640],\n", - " [57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840]])\n", - "m, n = P.shape" + "```java\n", + "// Define a 2-d array and use Double.NaN to set elements as NaNs\n", + "double[][] P = new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", + " { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 },\n", + " { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 },\n", + " { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN },\n", + " { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 },\n", + " { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 },\n", + " { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 },\n", + " { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN },\n", + " { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 },\n", + " { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } };\n", + "```" ] }, { @@ -265,55 +296,91 @@ ] }, { - "cell_type": "code", - "execution_count": 29, + "cell_type": "markdown", "metadata": { "nbpresent": { "id": "af5081b7-3d9a-47f5-8dc1-69fcc57821c0" } }, - "outputs": [], "source": [ - "def cov_bar(P):\n", - " \"\"\"Returns an approximate sample covariance matrix\"\"\"\n", - " # P.shape returns a tuple (m, n) that we unpack to _m and n\n", - " _m, n = P.shape # pylint: disable=unused-variable\n", - " # Initialize an n-by-n zero matrix\n", - " S = np.zeros((n, n))\n", - " for i in range(n): \n", - " # Take the ith column\n", - " xi = P[:, i]\n", - " for j in range(i+1):\n", - " # Take the jth column, where j <= i\n", - " xj = P[:, j] \n", - " # Set mask such that all NaNs are True\n", - " notp = np.isnan(xi) | np.isnan(xj) \n", - " # Apply the mask to xi\n", - " xim = np.ma.masked_array(xi, mask=notp)\n", - " # Apply the mask to xj\n", - " xjm = np.ma.masked_array(xj, mask=notp)\n", - " S[i, j] = np.ma.dot(xim - np.mean(xim), xjm - np.mean(xjm))\n", - " # Take the sum over ~notp to normalize\n", - " S[i, j] = 1.0 / (sum(~notp) - 1) * S[i, j]\n", - " S[j, i] = S[i, j]\n", - " return S" + "```java\n", + "public static double[][] cov_bar(double[][] P) {\n", + " double[] xi, xj;\n", + " boolean[] xib, xjb, notp;\n", + " int n = P[0].length;\n", + " double[][] S = new double[n][n];\n", + " int notpFalseCount;\n", + " \n", + " for (int i = 0; i < n; i++) {\n", + " // Take the ith column\n", + " xi = getMatrixColumn(P, i);\n", + " \n", + " for (int j = 0; j < i + 1; j++) {\n", + " // Take the jth column, where j <= i\n", + " xj = getMatrixColumn(P, j);\n", + " \n", + " // Set mask such that all NaNs are true\n", + " xib = getNanMask(xi);\n", + " xjb = getNanMask(xj);\n", + " \n", + " notp = addBoolArrOr(xib, xjb);\n", + " \n", + " // S[i][j] = (xi - mean(xi)) * (xj - mean(xj))\n", + " S[i][j] = matrixMaskedDot(vectorSubScalar(xi, vectorMaskedMean(xi, notp)),\n", + " vectorSubScalar(xj, vectorMaskedMean(xj, notp)), notp);\n", + " \n", + " // Take the sum over !notp to normalize\n", + " notpFalseCount = 0;\n", + " for (boolean b : notp) {\n", + " if (!b) {\n", + " notpFalseCount++;\n", + " }\n", + " }\n", + " S[i][j] = 1.0 / (notpFalseCount - 1) * S[i][j];\n", + " S[j][i] = S[i][j];\n", + " }\n", + " }\n", + " return S;\n", + "}\n", + "```" ] }, { - "cell_type": "code", - "execution_count": 30, + "cell_type": "markdown", "metadata": { "nbpresent": { "id": "80b820b1-7c3b-4c96-a4a6-09b5ef00dacb" } }, - "outputs": [], "source": [ - "def cor_bar(P):\n", - " \"\"\"Returns an approximate sample correlation matrix\"\"\"\n", - " S = cov_bar(P)\n", - " D = np.diag(1.0 / np.sqrt(np.diag(S)))xi\n", - " return D @ S @ D " + "```java\n", + "public static double[][] cor_bar(double[][] P) {\n", + " double[][] S, D;\n", + " S = cov_bar(P);\n", + " // D = 1.0 / SQRT(S)\n", + " D = getMatrixFromDiag(vectorRightDiv(vectorSqrt(getMatrixDiag(S)), 1.0));\n", + "\n", + " // S_ = S * D\n", + " F01CK f01ck = new F01CK();\n", + " double[] S_ = new double[S.length * S[0].length];\n", + " double[] S1d = convert2DTo1D(S);\n", + " double[] D1d = convert2DTo1D(D);\n", + " int n = S.length;\n", + " int p = n;\n", + " int m = n;\n", + " double[] z = new double[0];\n", + " int iz = 0;\n", + " int opt = 1;\n", + " int ifail = 0;\n", + " f01ck.eval(S_, S1d, D1d, n, p, m, z, iz, opt, ifail);\n", + " \n", + " // D_ = D * S_\n", + " double[] D_ = new double[n * n];\n", + " f01ck.eval(D_, D1d, S_, n, p, m, z, iz, opt, ifail);\n", + " \n", + " return convert1DTo2D(D_, n);\n", + "}\n", + "```" ] }, { @@ -327,13 +394,23 @@ "### Compute the *approximate* correlation matrix" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "double[][] G = cor_bar(P);\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 64, "metadata": { "nbpresent": { "id": "f417663e-badf-45d3-8f98-0647907657de" - } + }, + "scrolled": true }, "outputs": [ { @@ -353,7 +430,7 @@ } ], "source": [ - "G = cor_bar(P)\n", + "G = read_matrix_file(\"G.d\")\n", "print(\"The approximate correlation matrix \\n{}\".format(G))" ] }, @@ -370,9 +447,34 @@ "* We see below that our matrix $G$ is not a mathematically true correlation matrix." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "F08NA f08na = new F08NA();\n", + "String jobvl = \"N\";\n", + "String jobvr = \"N\";\n", + "int n = G[0].length;\n", + "double[] G1d = convert2DTo1D(G);\n", + "int lda = G.length;\n", + "double[] wr = new double[n];\n", + "double[] wi = new double[n];\n", + "int ldvl = 1;\n", + "double[] vl = new double[ldvl];\n", + "int ldvr = 1;\n", + "double[] vr = new double[ldvr];\n", + "int lwork = 3 * n;\n", + "double[] work = new double[lwork];\n", + "int info = 0;\n", + "f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "Arrays.sort(wr);\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 66, "metadata": { "nbpresent": { "id": "b1c83af0-e6ca-42cc-a0ca-50276ebe4f67" @@ -383,12 +485,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of G [-0.2498 -0.016 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355]\n" + "Sorted eigenvalues of G [[-0.2498 -0.016 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355]]\n" ] } ], "source": [ - "print(\"Sorted eigenvalues of G {}\".format(np.sort(np.linalg.eig(G)[0])))" + "G_eigen = read_matrix_file(\"G_eigen.d\")\n", + "print(\"Sorted eigenvalues of G {}\".format(G_eigen))" ] }, { @@ -440,9 +543,35 @@ "## Using corrmat_nearest to compute the nearest correlation matrix in the Frobenius norm" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "// Call NAG routine G02AA and print the result\n", + "G02AA g02aa = new G02AA();\n", + "G1d = convert2DTo1D(G);\n", + "n = G.length;\n", + "int ldg = n;\n", + "int ldx = n;\n", + "double errtol = 0.0;\n", + "int maxits = 0;\n", + "int maxit = 0;\n", + "double[] X1d = new double[ldx * n];\n", + "int iter = 0;\n", + "int feval = 0;\n", + "double nrmgrd = 0.0;\n", + "int ifail = 0;\n", + "g02aa.eval(G1d, ldg, n, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail);\n", + "\n", + "double[][] X = convert1DTo2D(X1d, ldx);\n", + "iter = g02aa.getITER();\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 67, "metadata": { "nbpresent": { "id": "9d1819cb-4c08-4d0b-8cbe-d9de4ab61a0f" @@ -466,14 +595,35 @@ } ], "source": [ - "# \"Call NAG routine library.correg.corrmat_nearest and print the result\n", - "X, itr, _, _ = nl_correg.corrmat_nearest(G)\n", + "X = read_matrix_file(\"X_G02AA.d\")\n", "print(\"Nearest correlation matrix\\n{}\".format(X))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "jobvl = \"N\";\n", + "jobvr = \"N\";\n", + "n = X[0].length;\n", + "lda = X.length;\n", + "wr = new double[n];\n", + "wi = new double[n];\n", + "ldvl = 1;\n", + "vl = new double[ldvl];\n", + "ldvr = 1;\n", + "vr = new double[ldvr];\n", + "lwork = 3 * n;\n", + "work = new double[lwork];\n", + "info = 0;\n", + "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 70, "metadata": { "nbpresent": { "id": "9737d750-04fe-4a91-933c-a799449e427e" @@ -484,21 +634,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [-0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ]\n" + "Sorted eigenvalues of X [[-0. 0. 0.038 0.1731 0.6894 1.7117 1.9217 3.4661]]\n" ] } ], "source": [ - "print(\"Sorted eigenvalues of X [{0}]\".format(\n", - " ''.join(\n", - " ['{:.4f} '.format(x) for x in np.sort(np.linalg.eig(X)[0])]\n", - " )\n", - "))" + "X_eigen = read_matrix_file(\"X_eigen_G02AA.d\")\n", + "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 79, "metadata": { "nbpresent": { "id": "85008295-2019-4aae-8de4-10440d7b1192" @@ -507,7 +654,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAHFCAYAAADbvnGdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debhddX32//edCWSQIaHWAgot1BoVUSPWqkjBATqAfR5owVrB2mKrWK3tZdE+RUU7OFS0Fa2pIjgiorRUoojTzwkxAREMSI2IENRCCKIgEBI+vz/WOmWzOcM+OXuzs8j7dV37yl5rfdf6fs46J/vea05VIUmSumPeuAuQJEmzY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhvcWLkklOW6KaYckOSfJj5PcleTmJF9O8ookDx5hTW9PcmuSXfvG75Hkh0lWJnnQTPX3zfvHSb6bZEOSn4yo9K1GkuckecW469hSuD70QGN4d1SSU4DP0vwO/wo4BPhj4ErgH4G/GWH3bwW2AV7SU892wH8CdwOHV9Xtgy4syS8By4GvAQcDzxhqtVun5wCG1T1cH3pAWTDuAjR7Sd4EvAx4QVWd3jf5nCTvABaPqv+q+kGSs4ATkrwZuBN4P/BrwNOq6kezXOS+wHzgjKr6yjBqTLJNVd05jGUNq99x1dRVri9pam55d0ySJ9Fsab9lkuAGoKouq6ovjLiUNwG/ALwAOBn4P8Dzq+qS2SwkyenAF9vBz7W72U/vmX5okguT3J7kliT/keQRfct4bTvfo5Ocn+RW4Kxp+nxse7jhpna5VyV5VV+bOfU71bSe8b/Wjr8tybVJXtDO90dJvtMelvhCkl/p63OfJB9I8v22tquTvCvJLn3r9Fhg97avSnLNgL+Pifr2TXJeW8cPkpyUZF5f28cmObc9XHN7kq8medps6x1gXQ7Sz6+2v9MbktzRrtOPJVkwl/Uhbanc8u6eVwO3A28YZxFV9a0k5wN/D+wC/F1VfXwzFvV64GLgX2h2w18C3AhNgALnAZ8H/gDYgeaLwleS7F9V1/ct6z+B9wJvpNl9fx9JDqD5srAG+EtgLc2W/349bYbZb/+0g9rxHwP+HXgL8GLgtCT7ttNPBBYCbwc+DDypZ3m/BFwHvBy4Gfhlmr+JFcCT2zavB3YDnggc3o6b7RbsOcD7gFOA3wVe1/b7PoAkjwe+DHwT+FPg58CfAZ9N8htVdfEs6u11r/U1i37Oa5f/58A6YHfgt2g2UIaxPqQtS1X52oJfQAHHte93AO4APjZJuwW9r/uptj9p6/vPQeqfps0z2nYH9Y1fBXy39+cB9gbuAt7aM+617fwvG6DmL9GEyXbTtJlzv1NN6xn//J5xuwAbgZuAB/eM/4u27cOnqXUB8NS23eN6xp8OrN2M3+lEfS/oG3858Jme4c/RnF+xqGfc/Hbcf2xGvVOtrxn7AZa08x4+Tb+btT58+dpSX+4275ZfpjlR7F67ppPsThMsE687kmzfP3OSZ/TsNpzu9cWZCkmyF/AP7eAec/qpJl/+9sDjgY9W1caJ8VX1feCrwNMnme2cGZa5HfAU4ENV9fP7qd+ppn2qZ9k3AzcAX6+qn/a0+U7775499S1K8up21/rtNL/vL7eT77Vbf47O6xv+NvCwtoYH0ayHj9FsHS9IsgAIzUmUB86h3nN65h20n5uAq4F/SvKn7R4M6QHN3ebdsqT995a+8T+h2SUI8C5gm6q6bZL5vwY8coB+Jg22CWkuQ/tkW8dJwLuSPKOqPjvAsge1C82H9GQnv/0YePgk42c6UW4Xmt2oa+/HfqeadnPf8IYpxgFs2zPuH4GX0uzG/xrwM5ovT5/oazdX6/uG7+xZ/q40W79/177uI8m8qrp7M+rtXV8D95PkmTRb7/8ILE7yfeDNVfWu6X9MqZsM7265sf33XgHSBvUqgCR70xw3vI92a/M7k00bVJL5wEdpjin+Os3u5b8CXkmzNTQsN9PsCv3FSab9IvcNF9r2My3zbpra769+Z6ppto4G3l9V/3vOQ5IdhtzHTH5Csx5PpbnK4D7a4IbZ19u7vgbup6quBp6fJMBjgROAdya5pqo+Ndm8Upe527xbVgM/AP4wyY79E9szkxcDK0dYw9tpjlEfVVVXtR+ebwaemWT/YXXSfiG5GDiq/cIAQJKHA7/BPWeoz2aZPwe+Ajyv3SV7v/Q7ZNvR7Hru9YJJ2t0JTPozzlW7jr5ME5KXVNWq/tdm1DvXfibmqaq6lHuu6X50++/I1oc0Dm55d0i7e/AlwH8AFyd5K/DfNB9KvwY8j2ZL5cJR9J/kBJozwl/ct4v8DJqzkV8JPHeIXf4dzbHXTyZ5J80Je6+j2V3/z5u5zL8G/j/gwiT/TLML/ZeB/avqpSPsd1g+DRyb5HKaM+b/D82Xin5XALsm+XOavTJ3VNXlQ6zjFTQn/52f5L00u7uX0JwvML+qTpxlvZvdT5L9aL5UfrTtYz5wHM1JgJ9vlzPq9SHdrwzvjqmq85I8leZymzcAOwE/pTn79pPA71fVd4fdb5JnA28D3tF/HLGq7kzyduD1SV5dVdcMo8+q+nSS3wZeQ3PN7waaLd9XVtUPN3OZK5M8heYY7L/SnAD4A9pLoEbV7xC9lOaY/N+3wyuAY4Bv9LV7D81hjX8Adqb5GfcaVhFVdUmSJ9Kso3+h+Tu8keZkyn/bjHrn0s+PgWtpgn4PmisyLgd+p+65lGyk60O6v6Vq2IfkNExJJi7bOX3ctWyOrtcvSVsij3lLktQxnQvvJMePu4a56HL9Xa4drH/iOulpXhlWrZP0vVWv+3Hqcu1dk+a2ylclWZPkxEmmvyLJFUkuS/K59kTYiWnHpnmy4neTHDtTX50Lb6Drf4hdrr/LtcNWXH97U527ZnhNdgOaYdlq1/0WoMu1d0Z7dcqpwGHAUuCYJEv7mn0TWFZV+wFn0zwjgjSPV34Nza2QDwBek777//fzhLUtXFWNbGvo/tD1+h9Afsg9N/KZylX3RyHSA9QBwJr2ngMkORM4guZKBwDq3g+M+jrNFUIAzwYuqKr17bwXAIcCH5mqs5GcsLZkyZJ6+MP3GvpyAW5cdyO7LdltJMsG2DTiE/huWreOxUuWzNxwM80f3Z7Pka97gDvumvR5IkNx8/p17LLrCNf9vNF+T1l/043sunh063+Efzoj/7uHbte/cdPoPnfW37SOXRePrvbrr7uWm9ev2yK/pM/fZZ+qjdPeMHJgdeuPVtNcyTBheVUtnxhIciRwaFX9STv8R8CTquqEyZaX5tHNP66qNyT5a2DbiZsZJfk74PaqestU9Yxky/vhD9+Lr150n/sndMJPb++/n0S3PPhBC8ddwpys+fGt4y5hs+20XbfX/bwRf/kYtW0XdvEoYOOGW7r7kLOjDnvazI3GpDb+nG32/5OhLOuOr7z+jqpaNoxlJXkesIw5HKrq7l+7JElbjuvpeYgQzT0H+h8fTJJnAH9L8xS8O2czby/DW5KkuVsJ7Jtk7ySLaO7rf25vgySPA95NE9w39Ew6H3hWkl3aE9We1Y6bkiesSZI0R1W1sb2F9Pk0t+g9rapWJzkZWFVV59I8B2IH4GPtlZnXVtXhVbU+yeu557kUJ0+cvDYVw1uSpCGoqhU0twDuHXdSz/tnTDPvacBpg/blbnNJkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMGCu8khya5KsmaJCeOuihJkjS1GcM7yXzgVOAwYClwTJKloy5MkiRNbpAt7wOANVV1dVVtAM4EjhhtWZIkaSqDhPfuwHU9w2vbcZIkaQyGdsJakuOTrEqy6sZ1Nw5rsZKkLdj6m9Yx8dnfvo4fd01bgwUDtLke2LNneI923L1U1XJgOcATnrCshlKdJGmLtuviJfxw7bXLxl3H1maQLe+VwL5J9k6yCDgaOHe0ZUmSpKnMuOVdVRuTnACcD8wHTquq1SOvTJIkTWqQ3eZU1QpgxYhrkSRJA/AOa5IkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkDcFMj89OcmCSS5JsTHJk37Q3JVmd5Mok/5Ik0/VleEuSNEcDPj77WuA44MN98/4G8BRgP+DRwBOBp0/X30A3aZEkSdP638dnAySZeHz2FRMNquqadtrdffMWsC2wCAiwEPif6Tpzy1uSpJktmeHpaZv9+OyquhD4AvCj9nV+VV053TxueUuSHpCycBsW7r7PUJZ1B6yrqpE8PS3JPsAjaZ7aCXBBkqdV1Zenmsctb0mS5m6gx2dP4feAr1fVrVV1K/Ap4MnTzWB4S5I0d3N5fPa1wNOTLEiykOZktWl3mxvekiTNUVVtBCYen30lcFZVrU5ycpLDAZI8Mcla4Cjg3UkmHq99NvA94HLgW8C3quq/puvPY96SJA3BZI/PrqqTet6v5J7j2r1tNgEvmk1fbnlLktQxhrckSR1jeEuS1DGGtyRJHTOSE9Y2VfHT2+8axaJH7sEPWjjuErZqi3dcNO4SNtu2C+ePu4St2sL50z7HYYu26w7d/bufP6+7673L3PKWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljZgzvJKcluSHJt++PgiRJ0vQG2fI+HTh0xHVIkqQBzRjeVfUlYP39UIskSRqAx7wlSeqYoYV3kuOTrEqy6qZ164a1WEnSFmz9TeuY+OxvX8ePu6atwdDCu6qWV9Wyqlq2eMmSYS1WkrQF23XxEiY++9vX8nHXNC5JDk1yVZI1SU6cZPqBSS5JsjHJkX3THpbkM0muTHJFkr2m68vd5pIkzVGS+cCpwGHAUuCYJEv7ml0LHAd8eJJFvB94c1U9EjgAuGG6/ga5VOwjwIXAI5KsTfLCmeaRJGkrcwCwpqqurqoNwJnAEb0NquqaqroMuLt3fBvyC6rqgrbdrVX18+k6WzBTNVV1zCx/AEmSHmiWJFnVM7y87xDB7sB1PcNrgScNuOxfBX6S5BPA3sBngROratNUM8wY3pIkddGChQtY/NDFQ1nWz2BdVS0bysLuawHwNOBxNLvWP0qze/29U83gMW9JkubuemDPnuE92nGDWAtc2u5y3wj8B/D46WYwvCVJmruVwL5J9k6yCDgaOHcW8+6cZLd2+GDgiulmMLwlSZqjdov5BOB84ErgrKpaneTkJIcDJHlikrXAUcC7k6xu590E/DXwuSSXAwH+fbr+POYtSdIQVNUKYEXfuJN63q+k2Z0+2bwXAPsN2pdb3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdcxInio2P+HBD1o4ikXrAW5eMu4SNtvPbr9r3CXMya47LBp3CXNy16YadwmbbcPGu8ddwmar7q72TnPLW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSRqCJIcmuSrJmiQnTjL9wCSXJNmY5MhJpj84ydok75ipL8NbkqQ5SjIfOBU4DFgKHJNkaV+za4HjgA9PsZjXA18apD/DW5KkuTsAWFNVV1fVBuBM4IjeBlV1TVVdBtzdP3OSJwAPAT4zSGeGtyRJM1uSZFXP6/i+6bsD1/UMr23HzSjJPOCfgb8etJgFgzaUJKlLFi6az+67P3goy7oG1lXVsqEs7L5eDKyoqrVJBpphxvBOsifwfprN+QKWV9Xb51KlJEkPMNcDe/YM79GOG8STgacleTGwA7Aoya1VdZ+T3iYMsuW9EfirqrokyY7AxUkuqKorBixKkqQHupXAvkn2pgnto4HnDjJjVf3hxPskxwHLpgtuGOCYd1X9qKouad//DLiSAffjS5K0NaiqjcAJwPk0OXlWVa1OcnKSwwGSPDHJWuAo4N1JVm9uf7M65p1kL+BxwEWTTDseOB5gz4c9bHPrkSR1yPqbbiTJqp5Ry6tq+dgKGqOqWgGs6Bt3Us/7lTS706dbxunA6TP1NXB4J9kB+Djw8qr66SQdLgeWAzzhCctq0OVKkrpr18W7sfa6a0d1IpemMNClYkkW0gT3h6rqE6MtSZIkTWfG8E5z3vp7gSur6q2jL0mSJE1nkC3vpwB/BByc5NL29VsjrkuSJE1hxmPeVfUVYLCrxiVJ0sh5e1RJkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljFoxioXfcdTdrfnzrKBY9cot3XDTuEuZkXjLuEuZkp+0WjruEzfZPn7tm3CXMyUufsve4S5iT62++fdwlbLZ3r7xu3CVsth/feue4S9gqueUtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiQNQZJDk1yVZE2SEyeZfmCSS5JsTHJkz/j9k1yYZHWSy5L8wUx9Gd6SJM1RkvnAqcBhwFLgmCRL+5pdCxwHfLhv/M+B51fVo4BDgbcl2Xm6/kZynbckSVuZA4A1VXU1QJIzgSOAKyYaVNU17bS7e2esqv/uef/DJDcAuwE/maozt7wlSZrZkiSrel7H903fHei9287adtysJDkAWAR8b7p2bnlLkh6Qtlk4n71+8cFDWdZXYV1VLRvKwqaQ5KHAB4Bjq+ru6dq65S1J0txdD+zZM7xHO24gSR4MnAf8bVV9fab2hrckSXO3Etg3yd5JFgFHA+cOMmPb/hzg/VV19iDzGN6SJM1RVW0ETgDOB64Ezqqq1UlOTnI4QJInJlkLHAW8O8nqdvbfBw4Ejktyafvaf7r+POYtSdIQVNUKYEXfuJN63q+k2Z3eP98HgQ/Opi+3vCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYGcM7ybZJvpHkW+0TT153fxQmSZImN8ilYncCB1fVrUkWAl9J8qlB7gAjSZKGb8bwrqoCbm0HF7avGmVRkiRpagMd804yP8mlwA3ABVV10WjLkiRJUxkovKtqU1XtT3NnmAOSPLq/TZLjJx6VdvP6dcOuU5K0Bbr9lvXM8KhMjcCsbo9aVT9J8gXgUODbfdOWA8sBHrXf492tLklbgQfttCs/u/GHI31Upu5rkLPNd0uyc/v+QcAzge+MujBJkjS5Qba8HwqckWQ+TdifVVWfHG1ZkiRpKoOcbX4Z8Lj7oRZJkjQA77AmSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkDUGSQ5NclWRNkhMnmX5gkkuSbExyZN+0Y5N8t30dO1NfhrckSXOUZD5wKnAYsBQ4JsnSvmbXAscBH+6bd1fgNcCTgAOA1yTZZbr+DG9JkubuAGBNVV1dVRuAM4EjehtU1TVVdRlwd9+8zwYuqKr1VXUzcAFw6HSdLRhe3feYPy/stN3CUSx65LZdOH/cJczJz26/a9wlzMk/fe6acZew2U48ZN9xlzAnd9y1adwlzMntG7pb/9qbbht3CZttw8burvch2x24rmd4Lc2W9ObOu/t0M4wkvCVJGrdtFsxjn1/YbliLW5JkVc/w8qpaPqyFz5bhLUnSzNZV1bJppl8P7NkzvEc7bhDXAwf1zfvF6WbwmLckSXO3Etg3yd5JFgFHA+cOOO/5wLOS7NKeqPasdtyUDG9JkuaoqjYCJ9CE7pXAWVW1OsnJSQ4HSPLEJGuBo4B3J1ndzrseeD3NF4CVwMntuCm521ySpCGoqhXAir5xJ/W8X0mzS3yyeU8DThu0L7e8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYgcM7yfwk30zyyVEWJEmSpjebLe+XAVeOqhBJkjSYgcI7yR7AbwPvGW05kiRpJoNueb8NeCVw91QNkhyfZFWSVetvunEoxUmStmwbfvYTJj7729fx465pa7BgpgZJfge4oaouTnLQVO2qajmwHGC//Z9QQ6tQkrTFWrTjzvz8ph8tG3cdW5tBtryfAhye5BrgTODgJB8caVWSJGlKM4Z3Vb2qqvaoqr2Ao4HPV9XzRl6ZJEmalNd5S5LUMTMe8+5VVV8EvjiSSiRJ0kDc8pYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkoYgyaFJrkqyJsmJk0zfJslH2+kXJdmrHb8wyRlJLk9yZZJXzdSX4S1J0hwlmQ+cChwGLAWOSbK0r9kLgZurah/gFOCN7fijgG2q6jHAE4AXTQT7VAxvSZLm7gBgTVVdXVUbaG4nfkRfmyOAM9r3ZwOHJAlQwPZJFgAPAjYAP52uM8NbkqS52x24rmd4bTtu0jZVtRG4BVhME+S3AT8CrgXeUlXrp+tsVndYkySpK7ZdMI9H7LbdsBa3JMmqnuHl7dM0h+EAYBPwS8AuwJeTfLaqrp5qBsNbkqSZrauq6R59ej2wZ8/wHu24ydqsbXeR7wTcBDwX+HRV3QXckOSrwDJgyvB2t7kkSXO3Etg3yd5JFtE8hfPcvjbnAse274+keUpn0ewqPxggyfbArwPfma4zw1uSpDlqj2GfAJwPXAmcVVWrk5yc5PC22XuBxUnWAK8AJi4nOxXYIclqmi8B76uqy6brz93mkiQNQVWtAFb0jTup5/0dNJeF9c9362Tjp+OWtyRJHWN4S5LUMYa3JEkdY3hLktQxIzlhLYF58zKKRWsGu+6waNwlzMlLn7L3uEvYbHfctWncJczJtgvnj7uEOdnvYTuNu4TN9qHnP2HcJWy2A/9t+3GXsFVyy1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI5ZMEijJNcAPwM2ARuratkoi5IkSVMbKLxbv1lV60ZWiSRJGoi7zSVJ6phBw7uAzyS5OMnxoyxIkiRNb9Dd5k+tquuT/AJwQZLvVNWXehu0oX48wO57PGzIZUqStkTrbryRJKt6Ri2vquVjK2grMdCWd1Vd3/57A3AOcMAkbZZX1bKqWrZ4yZLhVilJ2iIt2W03Jj7729dWG9xJDk1yVZI1SU6cZPo2ST7aTr8oyV490/ZLcmGS1UkuT7LtdH3NGN5Jtk+y48R74FnAt2f7Q0mS9ECVZD5wKnAYsBQ4JsnSvmYvBG6uqn2AU4A3tvMuAD4I/FlVPQo4CLhruv4G2fJ+CPCVJN8CvgGcV1WfHvgnkiTpge8AYE1VXV1VG4AzgSP62hwBnNG+Pxs4JEloNoovq6pvAVTVTVW1abrOZjzmXVVXA4+d3c8gSdJWZXfgup7htcCTpmpTVRuT3AIsBn4VqCTnA7sBZ1bVm6brbDbXeUuS1BnbzJ/HXjtuP6zFLRnhiXkLgKcCTwR+DnwuycVV9bnpZpAkSdNbN8PdRa8H9uwZ3qMdN1mbte1x7p2Am2i20r80cSO0JCuAxwNThrc3aZEkae5WAvsm2TvJIuBo4Ny+NucCx7bvjwQ+X1UFnA88Jsl2bag/Hbhius7c8pYkaY7aY9gn0ATxfOC0qlqd5GRgVVWdC7wX+ECSNcB6moCnqm5O8laaLwAFrKiq86brz/CWJGkIqmoFsKJv3Ek97+8Ajppi3g/SXC42EHebS5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdM5JHgiaw7cJufi9YOD/jLmFO7tpU4y5hTq6/+fZxl7DZbt+wadwlzMl+D9tp3CXMSdLd/7vfvu6WcZew2br+d99V3UxYSZK2Yoa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLkjQESQ5NclWSNUlOnGT6Nkk+2k6/KMlefdMfluTWJH89U1+GtyRJc5RkPnAqcBiwFDgmydK+Zi8Ebq6qfYBTgDf2TX8r8KlB+jO8JUmauwOANVV1dVVtAM4EjuhrcwRwRvv+bOCQJAFI8hzg+8DqQTozvCVJmrvdget6hte24yZtU1UbgVuAxUl2AP4GeN2gnS2YU6mSJG2h5s8Li3dcNKzFLUmyqmd4eVUtH9KyXwucUlW3thviMxoovJPsDLwHeDRQwB9X1YWbWaQkSV2zrqqWTTP9emDPnuE92nGTtVmbZAGwE3AT8CTgyCRvAnYG7k5yR1W9Y6rOBt3yfjvw6ao6MskiYLsB55MkaWuwEtg3yd40IX008Ny+NucCxwIXAkcCn6+qAp420SDJa4FbpwtuGCC8k+wEHAgcB9AeiN8w2M8iSdIDX1VtTHICcD4wHzitqlYnORlYVVXnAu8FPpBkDbCeJuA3yyBb3nsDNwLvS/JY4GLgZVV1W2+jJMcDxwPssefDNrceSVKH/GT9OkZ4LLhTqmoFsKJv3Ek97+8AjpphGa8dpK9BzjZfADweeFdVPQ64DbjPxedVtbyqllXVssVLlgzStySp43bedQkTn/3ta6sM7vvbIOG9FlhbVRe1w2fThLkkSRqDGcO7qn4MXJfkEe2oQ4ArRlqVJEma0qBnm78U+FB7pvnVwAtGV5IkSZrOQOFdVZcC013fJkmS7r9VBLUAABD9SURBVCfeHlWSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYBaNY6MZNxQ233DmKRY/crjssGncJc7Jh493jLmFO3r3yunGXsNnW3nTbuEuYkw89/wnjLmFOvn3dLeMuYbPtv9fO4y5hs223aP64S9gqueUtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiQNQZJDk1yVZE2SEyeZvk2Sj7bTL0qyVzv+mUkuTnJ5++/BM/VleEuSNEdJ5gOnAocBS4Fjkizta/ZC4Oaq2gc4BXhjO34d8LtV9RjgWOADM/VneEuSNHcHAGuq6uqq2gCcCRzR1+YI4Iz2/dnAIUlSVd+sqh+241cDD0qyzXSdGd6SJM3d7kDvXabWtuMmbVNVG4FbgMV9bf4vcElVTXuns5HcYU2SpHFbOH8eu+047QbsbCxJsqpneHlVLR/WwgGSPIpmV/qzZmpreEuSNLN1VbVsmunXA3v2DO/RjpuszdokC4CdgJsAkuwBnAM8v6q+N1Mx7jaXJGnuVgL7Jtk7ySLgaODcvjbn0pyQBnAk8PmqqiQ7A+cBJ1bVVwfpzPCWJGmO2mPYJwDnA1cCZ1XV6iQnJzm8bfZeYHGSNcArgInLyU4A9gFOSnJp+/qF6fpzt7kkSUNQVSuAFX3jTup5fwdw1CTzvQF4w2z6cstbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjpkxvJM8oufU9UuT/DTJy++P4iRJ0n3NeKlYVV0F7A//+9SU62nuAiNJksZgtrvNDwG+V1U/GEUxkiRpZrMN76OBj4yiEEmSNJiBw7u9V+vhwMemmH58klVJVq2/ad2w6pMkbcFuXHcjE5/97ev4cde0NZjN7VEPo3nG6P9MNrF9NNpygEc/9vE1hNokSVu43ZbsxrU/+MF0T9vSCMxmt/kxuMtckqSxGyi8k2wPPBP4xGjLkSRJMxlot3lV3QYsHnEtkiRpAN5hTZKkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSRqCJIcmuSrJmiQnTjJ9myQfbadflGSvnmmvasdfleTZM/VleEuSNEdJ5gOnAocBS4Fjkizta/ZC4Oaq2gc4BXhjO+9S4GjgUcChwDvb5U3J8JYkae4OANZU1dVVtQE4Eziir80RwBnt+7OBQ5KkHX9mVd1ZVd8H1rTLm5LhLUnS3O0OXNczvLYdN2mbqtoI3AIsHnDee1kwx2Intfqyb65buvsOPxjFsoElwLoRLfv+0OX6u1w7WP+0djx+VEsGXPfjNOraHz7CZc/Jpd+8+Pxdt1+wZEiL2zbJqp7h5VW1fEjLnrWRhHdV7TaK5QIkWVVVy0a1/FHrcv1drh2sf5y6XDt0u/4u1z5XVXXo/djd9cCePcN7tOMma7M2yQJgJ+CmAee9F3ebS5I0dyuBfZPsnWQRzQlo5/a1ORc4tn1/JPD5qqp2/NHt2eh7A/sC35ius5FseUuStDWpqo1JTgDOB+YDp1XV6iQnA6uq6lzgvcAHkqwB1tMEPG27s4ArgI3AS6pq03T9dTG8x3aMYUi6XH+XawfrH6cu1w7drr/LtXdKVa0AVvSNO6nn/R3AUVPM+/fA3w/aV5otdkmS1BUe85YkqWM6Fd4z3XpuS5bktCQ3JPn2uGuZrSR7JvlCkiuSrE7ysnHXNBtJtk3yjSTfaut/3bhrmq0k85N8M8knx13LbCW5JsnlSS7tu9Rmi5dk5yRnJ/lOkiuTPHncNQ0qySPadT7x+mmSl4+7Lg1HZ3abt7eK+2/gmTQXsK8EjqmqK8Za2ICSHAjcCry/qh497npmI8lDgYdW1SVJdgQuBp7ToXUfYPuqujXJQuArwMuq6utjLm1gSV4BLAMeXFW/M+56ZiPJNcCyqurcddJJzgC+XFXvac8g3q6qfjLuumar/fy8HnhSVY3qHhy6H3Vpy3uQW89tsarqSzRnF3ZOVf2oqi5p3/8MuJIZ7v6zJanGre3gwvbVjW+tQJI9gN8G3jPuWrYmSXYCDqQ5Q5iq2tDF4G4dAnzP4H7g6FJ4z/r2cRq+9ik4jwMuGm8ls9Pudr4UuAG4oKq6VP/bgFcCd4+7kM1UwGeSXJxktPdxG669gRuB97WHLN6TZPtxF7WZjgY+Mu4iNDxdCm+NWZIdgI8DL6+qn467ntmoqk1VtT/NnYsOSNKJQxdJfge4oaouHnctc/DUqno8zdOWXtIeQuqCBcDjgXdV1eOA24BOnWsD0O7uPxz42Lhr0fB0Kbxnffs4DU97rPjjwIeq6hPjrmdztbs9v0Dz2L0ueApweHvc+Ezg4CQfHG9Js1NV17f/3gCcwwxPS9qCrAXW9uylOZsmzLvmMOCSqvqfcRei4elSeA9y6zmNQHvC13uBK6vqreOuZ7aS7JZk5/b9g2hOevzOeKsaTFW9qqr2qKq9aP7mP19VzxtzWQNLsn17kiPtLudnAZ244qKqfgxcl+QR7ahDaO6A1TXH4C7zB5zO3GFtqlvPjbmsgSX5CHAQsCTJWuA1VfXe8VY1sKcAfwRc3h43Bnh1ezehLngocEZ7xu084Kyq6twlVx31EOCc5vsfC4APV9Wnx1vSrLwU+FC7wXA18IIx1zMr7RemZwIvGnctGq7OXComSZIaXdptLkmSMLwlSeocw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbw1K0lO7+IzpQeR5KD2NqTTjtsSdbl2SbNneG+h+kMyyReTvON+7H+q/l4GbFG350zykiSXJflp+7owyW/fD/0+sv09XZdkQ/vvBUmObe/mNqx+kuTbSd7aN/6pSW5PssXcPSvJi5N8P8kd7VPEnjZD+1clWdn+3m5M8l+9D41JsmOStyX5Qfuzfi3JEydZzkOTnNEu444kVyR5+lxqk7ZkhvdWpr3N42arqlu2wGcarwX+huahEcuAzwP/kWS/UXWY5DnAN4FtgOcD+wDPpnl4y6va8UNRzW0Q/x54UZIlbf+PAP4TeGtVvXtYfc1Fkj8A3g78A81jY78GfCrJw6aZ7SDgncBvAAcDG4HPJtm1nf4emvV6LPAY4DPt9P99HHB73/qvAqF57vkjaW5resMca5O2XFXlawt8AacDn+x5X32vvWg+rF4JfA+4HbgceF7fcr4IvAt4C82ziVfSPFHry8DNwHqa+8U/sq/v+/Q3SV3b0Dxr+n+AO4Cv0zz+sb//d9J8aK6j+UB9CzCvp82B7by3ArcA3wAePcf1tx540SznOQi4ZoBxjwU20NzffbLlZAR/D/OA/27X40No7rP9gdnWPuK/2YuAf+8b913gH2exjB2ATcDvAg+iCfMj+tpcDLyhZ/gfgK+OujZfvrakl1ve3fAy4ELgfTQP2XgocB3wBuCFwEuApcA/Au+eZJfx82iC/mk0W4nb04TuATQf8LcA/9WzVT5Vf/3eBPwB8Mc0WzOXA59O8tC+dn9I8yH8G8AJwMvb+UiygGYL8is0ofiktrZN7fTjklSSvWZeTZBkfpKjaULga4PMsxneDqysqn+YbGJVDf2BAVV1N01IvQRYAXyf5nc/dEleneTWGV5P65tnEfAEmi3jXp+h+b0PakeaLyo30zzIZD7NF8NetwNP7Rl+DnBRko8muSHJpUlOaJ+GN8zapC1GZ54qtjWrqluSbAB+Xs1jCieeFvQK4FlV9eW26feTHEDzAX9ezyK+X1V/1TN8Ze/yk7wA+ClNmH9lsv76tf3/OfAnVXVeO+7PaHZ9vgT4fz3Nr6iqk9r3/53kT2ker/gR4MHAzsB/VdX32ja9j+u8BbgKuGvqNQRJHkPzhWNbmi3436uqy6ebZ3MkeTjwdJrduBPj5gE/BrZrR328qo6dZPa5OhP4V5p1dnBVbZjtApK8gubvZl076ryq+tu+Zv8GnDXDoq7vG15CE7T9z4z+H+AZsyjx7cClwIVVtSnJhcD/S/JtmnV8DPBkYE3PPL8MvBg4BfgnYH+a9QTwjiHWJm0xDO/uWkoTVJ9O0rultxC4pq/txb0DSX4FeD3NVu5uNFs684DZHP/7lbavr06M6PmwXdrX9rK+4R8Cv9DOsz7J6cD5ST4HfA44u6qubaefA5wzQD1X0Xxo7wQcSfMI0IOqatjPjn5M++83+sZPbMF9ra3lXpK8AegPyX6/WVVfnGb6v9L8n10M3D1jpZN7NPCyqvr4VA2qaj3NYYf7VXtC3lNpDr1sakf/EXAazXkNm4BLaL70PaFn1nnAqqp6VTv8zST70nyJvN9O8pTuT+42766J393v0oTWxOtRwLP62t7WN/xJmtB+EU2AP45mt/acTmbr0b/buH+ruej526uqF7R1fAk4HLgqybNn1WHVhqpaU1UXtx/ilwJ/OevKZ7Zj++/Gnr7vrqo1wE006/Vbk8z3NpoTqaZ79X8h+F9JXgP8X5qtzttoDj9sjkfTrJspbc5uc5ot+U00x+N7PYRmi3laSU6h2ao+uKqunhhfVd+rqqfTHAbZs6oOoPnSeHXP7D8Cruhb5JXc82V0TrVJWyK3vLtjA82uvwlXAHcCD6+qzw+6kCSLgV8DXlxVX2jHPZ77/i3099fve22bp7TvaS+PejLw4UHrmVBV36IJvTcm+RTNbunzZ7ucHvMY4hnfPSa25J/KvXfdQhOMMEl4V9U67tlVPStJXgicSHOI5NIkbwL+Lsnbq+rns1hOgEcAH28PB19WVc+fpOmsd5tX1YYkFwPPBD7WM+mZNGfgT1fX22nOgfjNqvrOZG2q6jbgtiS70Jx9/sqeyV+l+bl6/Srwg7nWJm2pDO/uuAY4oD1x61aa3ZpvAd7Sfih/iWbr5NeBu6tq+RTLuZkmRP40yXXA7sCb6dmSnKq/9qQpoPkwTfIumrBdR3MC1V/SbM28c9AfKsneNHsAzqUJhF8G9qM5Q54kv0dzIt4hVdV/nHViGf9Ec4z/Opot4+fSnIg39Gu9q+ryJP8J/HN7ItSXaPYk7EdzLPmGqlo7rP6S/BbN+nxez7kN/w68mma9nTKLxe1Nc/7Bk6drNIfd5m8FPpDkGzSB+mfAL9F8GQAgyQnACVX1a+3wqTS7xp8D3JzkF9umt1bVre0emHk050HsQ/O3+h2akyknnAJ8LcnfAh+l2ZP0FzTraODapE4Z9+nuviZ/0XNJVjv8qzQnZP2ce18q9lLu2Qq/EbgAeGbPfF8E3tG37INptiDvaP99Nk1AHzddf/11ce9Lxe5k6kvF+vvvXcZDgE/QBPedwLU0Z7EvbKcf19v/NOvqB+38NwCfBZ7d12aQ5RzEYJeKLaLZ8rusXT8/pbkE77XALw7xb+CJ7e/lLyeZ9lftOttm0NppDkmcNuK/2xfTfPG7k+ZciwP7pr+W9oT8drj/ksSJ12vb6b9Ps2fnTprd4+8Adpqk39+m2eNxB80ldX9B3yV7M9Xmy1eXXqka+lUt0hYnyetoTmR7bFX172WYaHMQcHpV7TXduC3RILUneTVwV1W9eQwlShoiT1jT1uK3gJdMFdxbiUfTd5mgpG7ymLe2ClV1n/thb22q6rnjrkHScLjlLd3jGppj+DON2xJdQ3drlzRLHvOWJKlj3PKWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKlj/n+4Q8C1jenFHAAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -519,9 +666,11 @@ } ], "source": [ + "itr, norm, X_G = read_data_file(\"g02aa.d\")\n", + "\n", "# Plot the difference between G and X as a small shaded square for each element\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(X-G), interpolation='none', cmap=plt.cm.Blues, \n", + "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, \n", " vmin=0, vmax=0.2)\n", "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", @@ -531,7 +680,7 @@ " labelbottom='off', labelleft='off')\n", "ax1.set_title(r'$|G-X|$ for corrmat_nearest', fontsize=16)\n", "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\n", + " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", " fontsize=14,\n", ")\n", "plt.show()" From fbc6a813f61dd59b357eb8cb086e2d21c5a8c207 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Wed, 16 Dec 2020 16:51:49 +0200 Subject: [PATCH 008/196] Added G02AB to jupyter --- nearest_correlation_matrices/NcmNag.java | 4 +- nearest_correlation_matrices/X_G02AB.d | 8 ++ nearest_correlation_matrices/X_eigen_G02AB.d | 1 + nearest_correlation_matrices/ncm_nag.ipynb | 118 ++++++++++++------- 4 files changed, 87 insertions(+), 44 deletions(-) create mode 100755 nearest_correlation_matrices/X_G02AB.d create mode 100755 nearest_correlation_matrices/X_eigen_G02AB.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 9178664..383d8a1 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -157,6 +157,7 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix using row and column weighting"); printMatrix(X); + printMatrixToFile(X, "X_G02AB.d"); System.out.println(); @@ -174,10 +175,11 @@ public static void main(String[] args) { work = new double[lwork]; info = 0; f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + Arrays.sort(wr); System.out.print("Sorted eigenvalues of X: "); - Arrays.sort(wr); printVector(wr); + printVectorToFile(wr, "X_eigen_G02AB.d"); System.out.println(); diff --git a/nearest_correlation_matrices/X_G02AB.d b/nearest_correlation_matrices/X_G02AB.d new file mode 100755 index 0000000..383aa7b --- /dev/null +++ b/nearest_correlation_matrices/X_G02AB.d @@ -0,0 +1,8 @@ +1.0 -0.32499086422511064 0.18813706419032963 0.5739128316455077 0.006738901197749145 -0.6096507044247871 -0.07218069830824884 -0.1598053100245198 +-0.32499086422511064 1.0 0.20483815677603381 0.24258082716446366 0.40603025892212846 0.2737263482817928 0.28701024943514414 0.4235977581494052 +0.18813706419032963 0.20483815677603381 1.0 -0.13218803180471228 0.766133653156408 0.27591992209907573 -0.617050948080334 0.9003875097308778 +0.5739128316455077 0.24258082716446366 -0.13218803180471228 1.0 0.20846854455003783 -0.0890209789283727 0.5954127463233153 -0.18053621187034669 +0.006738901197749145 0.40603025892212846 0.766133653156408 0.20846854455003783 1.0 0.6556061052115361 -0.2779768051435209 0.875650876566524 +-0.6096507044247871 0.2737263482817928 0.27591992209907573 -0.0890209789283727 0.6556061052115361 1.0 0.0490251039924178 0.5746086153246388 +-0.07218069830824884 0.28701024943514414 -0.617050948080334 0.5954127463233153 -0.2779768051435209 0.0490251039924178 1.0 -0.4550021030394424 +-0.1598053100245198 0.4235977581494052 0.9003875097308778 -0.18053621187034669 0.875650876566524 0.5746086153246388 -0.4550021030394424 1.0 diff --git a/nearest_correlation_matrices/X_eigen_G02AB.d b/nearest_correlation_matrices/X_eigen_G02AB.d new file mode 100755 index 0000000..b9f32aa --- /dev/null +++ b/nearest_correlation_matrices/X_eigen_G02AB.d @@ -0,0 +1 @@ +9.999999999997552E-4 9.99999999999841E-4 0.030520719790230445 0.1646165705339852 0.676371387352591 1.771620208378711 1.8909924571529526 3.4638786567915307 diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 4a67786..1067fcf 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -99,7 +99,7 @@ "* We compute each covariance with observations that are available for *both* the *i*th and *j*th variable.\n", "\n", "\n", - "* For example NAG routine **library.correg.coeffs_pearson_miss_case**.\n", + "* For example NAG routine **G02BB**.\n", "\n", "\n", "* We then compute the correlation matrix as before.\n", @@ -188,7 +188,7 @@ } }, "source": [ - "### Import required modules, set print options and define read_data_file function" + "### Import required modules, set print options and define the read_file functions" ] }, { @@ -527,7 +527,7 @@ "* It is globally and quadratically (fast!) convergent.\n", "\n", "\n", - "* This is implemented in NAG routine **library.correg.corrmat_nearest**.\n", + "* This is implemented in NAG routine **G02AA**.\n", "\n", "\n" ] @@ -540,7 +540,7 @@ } }, "source": [ - "## Using corrmat_nearest to compute the nearest correlation matrix in the Frobenius norm" + "## Using G02AA to compute the nearest correlation matrix in the Frobenius norm" ] }, { @@ -571,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 82, "metadata": { "nbpresent": { "id": "9d1819cb-4c08-4d0b-8cbe-d9de4ab61a0f" @@ -645,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 88, "metadata": { "nbpresent": { "id": "85008295-2019-4aae-8de4-10440d7b1192" @@ -654,7 +654,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -678,7 +678,7 @@ "ax1.tick_params(axis='both', which='both', \n", " bottom='off', top='off', left='off', right='off', \n", " labelbottom='off', labelleft='off')\n", - "ax1.set_title(r'$|G-X|$ for corrmat_nearest', fontsize=16)\n", + "ax1.set_title(r'$|G-X|$ for G02AA', fontsize=16)\n", "plt.xlabel(\n", " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", " fontsize=14,\n", @@ -718,7 +718,7 @@ "* Perhaps we wish to preserve part of the correlation matrix?\n", "\n", "\n", - "* We could solve the *weighted* problem, NAG routine **library.correg.corrmat_nearest_bounded**\n", + "* We could solve the *weighted* problem, NAG routine **G02AB**\n", "\n", "\n", "$$ \\Large \\|W^{\\frac{1}{2}} (G-X) W^{\\frac{1}{2}} \\|_F$$ \n", @@ -739,31 +739,48 @@ } }, "source": [ - "### Use corrmat_nearest_bounded to compute the nearest correlation matrix with row and column weighting" + "### Use G02AB to compute the nearest correlation matrix with row and column weighting" ] }, { - "cell_type": "code", - "execution_count": 11, + "cell_type": "markdown", "metadata": { "nbpresent": { - "id": "0f8ff272-e0f6-417e-8e2e-650964663d0f" + "id": "0a7c5d11-13ec-4f52-b222-c6540fcdd67c" } }, - "outputs": [], "source": [ - "# Define an array of weights\n", - "W = np.array([10, 10, 10, 1, 1, 1, 1, 1], dtype = np.float64)" + "```java\n", + "// Define an arrray of weights\n", + "double[] W = new double[] { 10, 10, 10, 1, 1, 1, 1, 1 };\n", + "\n", + "// Set up and call the NAG routine using weights and a minimum eigenvalue\n", + "G02AB g02ab = new G02AB();\n", + "G1d = convert2DTo1D(G);\n", + "ldg = G.length;\n", + "n = G[0].length;\n", + "String opt = \"B\";\n", + "double alpha = 0.001;\n", + "errtol = 0.0;\n", + "maxits = 0;\n", + "maxit = 0;\n", + "ldx = n;\n", + "X1d = new double[ldx * n];\n", + "iter = 0;\n", + "feval = 0;\n", + "nrmgrd = 0;\n", + "ifail = 0;\n", + "g02ab.eval(G1d, ldg, n, opt, alpha, W, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail);\n", + "\n", + "X = convert1DTo2D(X1d, ldx);\n", + "iter = g02ab.getITER();\n", + "```" ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "nbpresent": { - "id": "0a7c5d11-13ec-4f52-b222-c6540fcdd67c" - } - }, + "execution_count": 84, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -782,41 +799,54 @@ } ], "source": [ - "# Set up and call the NAG routine using weights and a minimum eigenvalue\n", - "opt = 'B'\n", - "alpha = 0.001\n", - "X, itr, _, _ = nl_correg.corrmat_nearest_bounded(G, opt, alpha, W)\n", + "X = read_matrix_file(\"X_G02AB.d\")\n", "print(\"Nearest correlation matrix using row and column weighting\\n{}\".format(X))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "jobvl = \"N\";\n", + "jobvr = \"N\";\n", + "n = X[0].length;\n", + "lda = X.length;\n", + "wr = new double[n];\n", + "wi = new double[n];\n", + "ldvl = 1;\n", + "vl = new double[ldvl];\n", + "ldvr = 1;\n", + "vr = new double[ldvr];\n", + "lwork = 3 * n;\n", + "work = new double[lwork];\n", + "info = 0;\n", + "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "Arrays.sort(wr);\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "nbpresent": { - "id": "4db463c7-773f-41ec-84a0-ece179fa37da" - } - }, + "execution_count": 86, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 1.8910 3.4639 ]\n" + "Sorted eigenvalues of X [[0.001 0.001 0.0305 0.1646 0.6764 1.7716 1.891 3.4639]]\n" ] } ], "source": [ - "print(\"Sorted eigenvalues of X [{0}]\".format(\n", - " ''.join(\n", - " ['{:.4f} '.format(x) for x in np.sort(np.linalg.eig(X)[0])]\n", - " )\n", - "))" + "X_eigen = read_matrix_file(\"X_eigen_G02AB.d\")\n", + "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 89, "metadata": { "nbpresent": { "id": "f769cb44-ca59-43ad-a0b6-29e394f2557e" @@ -825,7 +855,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -837,8 +867,10 @@ } ], "source": [ + "itr, norm, X_G = read_data_file(\"g02ab.d\")\n", + "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(X-G), interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", + "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", " vmax=0.2)\n", "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", @@ -847,9 +879,9 @@ " bottom='off', top='off', left='off', right='off', \n", " labelbottom='off', labelleft='off')\n", "\n", - "ax1.set_title(r'$|G-X|$ for corrmat_nearest_bounded', fontsize=16)\n", + "ax1.set_title(r'$|G-X|$ for G02AB', fontsize=16)\n", "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\n", + " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", " fontsize=14,\n", ") \n", "plt.show()" From 15681f1ed5c4f1a5db2f2a45f6daed7e4bbed826 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Wed, 16 Dec 2020 17:58:47 +0200 Subject: [PATCH 009/196] Added G02AJ to Jupyter Notebook --- nearest_correlation_matrices/H_G02AJ.d | 8 ++ nearest_correlation_matrices/NcmNag.java | 20 +-- nearest_correlation_matrices/X_G02AJ.d | 8 ++ nearest_correlation_matrices/X_eigen_G02AJ.d | 1 + nearest_correlation_matrices/ncm_nag.ipynb | 127 ++++++++++++++----- 5 files changed, 115 insertions(+), 49 deletions(-) create mode 100755 nearest_correlation_matrices/H_G02AJ.d create mode 100755 nearest_correlation_matrices/X_G02AJ.d create mode 100755 nearest_correlation_matrices/X_eigen_G02AJ.d diff --git a/nearest_correlation_matrices/H_G02AJ.d b/nearest_correlation_matrices/H_G02AJ.d new file mode 100755 index 0000000..06b2a26 --- /dev/null +++ b/nearest_correlation_matrices/H_G02AJ.d @@ -0,0 +1,8 @@ +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 383d8a1..613044d 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -211,6 +211,7 @@ public static void main(String[] args) { } } printMatrix(H); + printMatrixToFile(H, "H_G02AJ.d"); System.out.println(); @@ -236,6 +237,7 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix using element-wise weighting"); printMatrix(X); + printMatrixToFile(X, "X_G02AJ.d"); System.out.println(); @@ -253,11 +255,11 @@ public static void main(String[] args) { work = new double[lwork]; info = 0; f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + Arrays.sort(wr); System.out.print("Sorted eigenvalues of X: "); - Arrays.sort(wr); - Arrays.sort(wi); - printComplexVector(wr, wi); + printVector(wr); + printVectorToFile(wr, "X_eigen_G02AJ.d"); System.out.println(); @@ -628,16 +630,4 @@ public static void printVector(double[] a) { } System.out.println(); } - - public static void printComplexVector(double[] r, double[] i) { - if (r.length != i.length) { - System.out.println("Arrays r(" + r.length + ") and i(" + i.length + ") need to have the same length."); - System.exit(-1); - } - - for (int j = 0; j < r.length; j++) { - System.out.printf("%8.4f%+.4fj", r[j], i[j]); - } - System.out.println(); - } } diff --git a/nearest_correlation_matrices/X_G02AJ.d b/nearest_correlation_matrices/X_G02AJ.d new file mode 100755 index 0000000..a8d3ca0 --- /dev/null +++ b/nearest_correlation_matrices/X_G02AJ.d @@ -0,0 +1,8 @@ +1.0 -0.3250537665863338 0.1881418341902057 0.5371131830574982 0.025534475569836054 -0.5892805212332436 -0.06253446585578672 -0.19285191653693995 +-0.3250537665863338 1.0 0.20484097619200775 0.22489933238446663 0.41435692055270595 0.28406991877718313 0.29140523861712275 0.40808279276304027 +0.1881418341902057 0.20484097619200775 1.0 -0.1461829470349747 0.7883463589306307 0.27182086998472504 -0.6083694620689558 0.8804148513960975 +0.5371131830574982 0.22489933238446663 -0.1461829470349747 1.0 0.21383581644037378 -1.8236085752931886E-4 0.606979993040552 -0.21987411467118548 +0.025534475569836054 0.41435692055270595 0.7883463589306307 0.21383581644037378 1.0 0.6566193796715437 -0.2807146680766071 0.8756492796358128 +-0.5892805212332436 0.28406991877718313 0.27182086998472504 -1.8236085752931886E-4 0.6566193796715437 1.0 0.04737540578644875 0.5929601745319638 +-0.06253446585578672 0.29140523861712275 -0.6083694620689558 0.606979993040552 -0.2807146680766071 0.04737540578644875 1.0 -0.44707995176268783 +-0.19285191653693995 0.40808279276304027 0.8804148513960975 -0.21987411467118548 0.8756492796358128 0.5929601745319638 -0.44707995176268783 1.0 diff --git a/nearest_correlation_matrices/X_eigen_G02AJ.d b/nearest_correlation_matrices/X_eigen_G02AJ.d new file mode 100755 index 0000000..10d308d --- /dev/null +++ b/nearest_correlation_matrices/X_eigen_G02AJ.d @@ -0,0 +1 @@ +9.999999999997702E-4 9.999999999999124E-4 0.037510930964740785 0.1733826335965124 0.6881675924398503 1.7105895508241635 1.9223622895788683 3.465987002595862 diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 1067fcf..4f9f571 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -618,12 +618,13 @@ "work = new double[lwork];\n", "info = 0;\n", "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "Arrays.sort(wr);\n", "```" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 95, "metadata": { "nbpresent": { "id": "9737d750-04fe-4a91-933c-a799449e427e" @@ -915,7 +916,7 @@ "* However, this is a more “difficult” problem, and more computationally expensive. \n", "\n", "\n", - "* This is implemented in the NAG routine **library.correg.corrmat_h_weight**.\n", + "* This is implemented in the NAG routine **G02AJ**.\n", "\n", "\n" ] @@ -928,12 +929,32 @@ } }, "source": [ - "### Use corrmat_h_weight to compute the nearest correlation matrix with element-wise weighting" + "### Use G02AJ to compute the nearest correlation matrix with element-wise weighting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "// Set up a matrix of weights\n", + "n = P[0].length;\n", + "double[][] H = new double[n][n];\n", + "for (int i = 0; i < n; i++) {\n", + " for (int j = 0; j < n; j++) {\n", + " if ((i < 3) && (j < 3)) {\n", + " H[i][j] = 100.0;\n", + " } else {\n", + " H[i][j] = 1;\n", + " }\n", + " }\n", + "}\n", + "```" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 90, "metadata": { "nbpresent": { "id": "d477130b-e56d-4bab-b0bd-3a1ddf2c328d" @@ -953,26 +974,47 @@ " [ 1., 1., 1., 1., 1., 1., 1., 1.]])" ] }, - "execution_count": 15, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Set up a matrix of weights\n", - "H = np.ones([n, n])\n", - "H[:3, :3] = 100\n", + "H = read_matrix_file(\"H_G02AJ.d\")\n", "H" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "// Call the NAG routine specifying a minimum eigenvalue\n", + "G02AJ g02aj = new G02AJ();\n", + "G1d = convert2DTo1D(G);\n", + "ldg = G.length;\n", + "n = G[0].length;\n", + "alpha = 0.001;\n", + "double[] H1d = convert2DTo1D(H);\n", + "int ldh = H.length;\n", + "errtol = 0;\n", + "maxit = 0;\n", + "ldx = n;\n", + "X1d = new double[ldx * n];\n", + "iter = 0;\n", + "double norm2 = 0;\n", + "ifail = 0;\n", + "g02aj.eval(G1d, ldg, n, alpha, H1d, ldh, errtol, maxit, X1d, ldx, iter, norm2, ifail);\n", + "\n", + "X = convert1DTo2D(X1d, ldx);\n", + "iter = g02aj.getITER();\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "nbpresent": { - "id": "59164e07-d021-4b2f-8dc8-c526c7e4223c" - } - }, + "execution_count": 91, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -991,40 +1033,55 @@ } ], "source": [ - "# \"Call the NAG routine specifying a minimum eigenvalue \n", - "alpha = 0.001\n", - "X, itr, _ = nl_correg.corrmat_h_weight(G, alpha, H, maxit=200)\n", + "X = read_matrix_file(\"X_G02AJ.d\")\n", "print(\"Nearest correlation matrix using element-wise weighting\\n{}\".format(X))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "jobvl = \"N\";\n", + "jobvr = \"N\";\n", + "n = X[0].length;\n", + "lda = X.length;\n", + "wr = new double[n];\n", + "wi = new double[n];\n", + "ldvl = 1;\n", + "vl = new double[ldvl];\n", + "ldvr = 1;\n", + "vr = new double[ldvr];\n", + "lwork = 3 * n;\n", + "work = new double[lwork];\n", + "info = 0;\n", + "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "Arrays.sort(wr);\n", + "Arrays.sort(wi);\n", + "```" + ] + }, { "cell_type": "code", - "execution_count": 17, - "metadata": { - "nbpresent": { - "id": "a5652370-f1f9-4b64-b5e6-9d5869e82366" - } - }, + "execution_count": 124, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [0.0010-0.0000j 0.0010+0.0000j 0.0375+0.0000j 0.1734+0.0000j 0.6882+0.0000j 1.7106+0.0000j 1.9224+0.0000j 3.4660+0.0000j ]\n" + "Sorted eigenvalues of X [[0.001 0.001 0.0375 0.1734 0.6882 1.7106 1.9224 3.466 ]]\n" ] } ], "source": [ - "print(\"Sorted eigenvalues of X [{0}]\".format(\n", - " ''.join(\n", - " ['{:.4f} '.format(x) for x in np.sort(np.linalg.eig(X)[0])]\n", - " )\n", - "))" + "X_eigen = read_matrix_file(\"X_eigen_G02AJ.d\")\n", + "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 125, "metadata": { "nbpresent": { "id": "e07e5a46-5f1d-49ef-9ae7-20b944efd9fb" @@ -1033,7 +1090,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1045,8 +1102,10 @@ } ], "source": [ + "itr, norm, X_G = read_data_file(\"g02ab.d\")\n", + "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(X-G), interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", + "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", " vmax=0.2)\n", "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", @@ -1055,9 +1114,9 @@ " bottom='off', top='off', left='off', right='off', \n", " labelbottom='off', labelleft='off')\n", "\n", - "ax1.set_title(r'$|G-X|$ for corrmat_h_weight', fontsize=16)\n", + "ax1.set_title(r'$|G-X|$ for G02AJ', fontsize=16)\n", "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\n", + " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", " fontsize=14,\n", ") \n", "plt.show()" From 55a721af9826df8a4f8fb083fae7bf3f9914ab4e Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Wed, 16 Dec 2020 18:19:36 +0200 Subject: [PATCH 010/196] Added G02AN to Jupyter Notebook --- nearest_correlation_matrices/NcmNag.java | 5 +- nearest_correlation_matrices/X_G02AN.d | 8 ++ nearest_correlation_matrices/X_eigen_G02AN.d | 1 + nearest_correlation_matrices/alpha_G02AN.d | 1 + nearest_correlation_matrices/ncm_nag.ipynb | 125 +++++++++++++------ 5 files changed, 101 insertions(+), 39 deletions(-) create mode 100755 nearest_correlation_matrices/X_G02AN.d create mode 100755 nearest_correlation_matrices/X_eigen_G02AN.d create mode 100755 nearest_correlation_matrices/alpha_G02AN.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 613044d..291862b 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -301,6 +301,7 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix with fixed leading block"); printMatrix(X); + printMatrixToFile(X, "X_G02AN.d"); System.out.println(); @@ -318,12 +319,14 @@ public static void main(String[] args) { work = new double[lwork]; info = 0; f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); + Arrays.sort(wr); System.out.print("Sorted eigenvalues of X: "); - Arrays.sort(wr); printVector(wr); + printVectorToFile(wr, "X_eigen_G02AN.d"); System.out.printf("Value of alpha returned: %.4f\n", alpha); + printVectorToFile(new double[]{alpha}, "alpha_G02AN.d"); System.out.println(); diff --git a/nearest_correlation_matrices/X_G02AN.d b/nearest_correlation_matrices/X_G02AN.d new file mode 100755 index 0000000..9197e94 --- /dev/null +++ b/nearest_correlation_matrices/X_G02AN.d @@ -0,0 +1,8 @@ +1.0 -0.3250029917945835 0.18814425997629136 0.46060526762809 0.00512111817298847 -0.4887229642049529 -0.05790536742916771 -0.12710533688852702 +-0.3250029917945835 1.0 0.20484152654833515 0.1948219050550659 0.32454984893978395 0.21834256258510287 0.22942701372832805 0.3391392886204044 +0.18814425997629136 0.20484152654833515 1.0 -0.10596751792243746 0.6124326539394441 0.22109852023486867 -0.49358006312793756 0.7202132326274232 +0.46060526762809 0.1948219050550659 -0.10596751792243746 1.0 0.24319333281783698 0.010073707194754084 0.5159525721067164 -0.2567324055972704 +0.00512111817298847 0.32454984893978395 0.6124326539394441 0.24319333281783698 1.0 0.5319788405341761 -0.26337702263860246 0.7948743038334822 +-0.4887229642049529 0.21834256258510287 0.22109852023486867 0.010073707194754084 0.5319788405341761 1.0 0.03932451736851099 0.4769262311870878 +-0.05790536742916771 0.22942701372832805 -0.49358006312793756 0.5159525721067164 -0.26337702263860246 0.03932451736851099 1.0 -0.3185151588457599 +-0.12710533688852702 0.3391392886204044 0.7202132326274232 -0.2567324055972704 0.7948743038334822 0.4769262311870878 -0.3185151588457599 1.0 diff --git a/nearest_correlation_matrices/X_eigen_G02AN.d b/nearest_correlation_matrices/X_eigen_G02AN.d new file mode 100755 index 0000000..26ccdd2 --- /dev/null +++ b/nearest_correlation_matrices/X_eigen_G02AN.d @@ -0,0 +1 @@ +1.4134713692893524E-9 0.13753724988136337 0.2743711328835331 0.3803668326795735 0.7768482873688412 1.6263475038033162 1.768932428977788 3.0355965629921156 diff --git a/nearest_correlation_matrices/alpha_G02AN.d b/nearest_correlation_matrices/alpha_G02AN.d new file mode 100755 index 0000000..ca71ea2 --- /dev/null +++ b/nearest_correlation_matrices/alpha_G02AN.d @@ -0,0 +1 @@ +0.20026985555887222 diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 4f9f571..a35ca6f 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -1135,7 +1135,7 @@ "* We probably really wish to *fix* our leading block of true correlations, so it does not change at all.\n", "\n", "\n", - "* We have the NAG routine **library.correg.corrmat_shrinking**.\n", + "* We have the NAG routine **G02AN**.\n", "\n", "\n", "* This routine fixes a leading block, which we require to be positive definite.\n", @@ -1170,17 +1170,41 @@ } }, "source": [ - "### Use corrmat_shrinking to compute the nearest correlation matrix with fixed leading block" + "### Use G02AN to compute the nearest correlation matrix with fixed leading block" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "// Call the NAG routine fixing the top 3-by-3 block\n", + "G02AN g02an = new G02AN();\n", + "G1d = convert2DTo1D(G);\n", + "ldg = G.length;\n", + "n = G[0].length;\n", + "int k = 3;\n", + "errtol = 0;\n", + "double eigtol = 0;\n", + "ldx = n;\n", + "X1d = new double[ldx * n];\n", + "alpha = 0.001;\n", + "iter = 0;\n", + "double eigmin = 0;\n", + "norm2 = 0;\n", + "ifail = 0; \n", + "g02an.eval(G1d, ldg, n, k, errtol, eigtol, X1d, ldx, alpha, iter, eigmin, norm2, ifail);\n", + "\n", + "X = convert1DTo2D(X1d, ldx);\n", + "iter = g02an.getITER();\n", + "alpha = g02an.getALPHA();\n", + "```" ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "nbpresent": { - "id": "9e7248c0-f11a-4cd7-8454-3545797ad928" - } - }, + "execution_count": 127, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -1199,12 +1223,54 @@ } ], "source": [ - "# Call the NAG routine fixing the top 3-by-3 block\n", - "k = 3\n", - "X, alpha, itr, _, _ = nl_correg.corrmat_shrinking(G, k)\n", + "X = read_matrix_file(\"X_G02AN.d\")\n", "print(\"Nearest correlation matrix with fixed leading block \\n{}\".format(X))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```java\n", + "jobvl = \"N\";\n", + "jobvr = \"N\";\n", + "n = X[0].length;\n", + "lda = X.length;\n", + "wr = new double[n];\n", + "wi = new double[n];\n", + "ldvl = 1;\n", + "vl = new double[ldvl];\n", + "ldvr = 1;\n", + "vr = new double[ldvr];\n", + "lwork = 3 * n;\n", + "work = new double[lwork];\n", + "info = 0;\n", + "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", + "Arrays.sort(wr);\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sorted eigenvalues of X [[0. 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356]]\n", + "Value of alpha returned: [0.2003]\n" + ] + } + ], + "source": [ + "X_eigen = read_matrix_file(\"X_eigen_G02AN.d\")\n", + "print(\"Sorted eigenvalues of X {}\".format(X_eigen))\n", + "alpha = read_matrix_file(\"alpha_G02AN.d\")\n", + "print(\"Value of alpha returned: {}\".format(alpha[0]))" + ] + }, { "cell_type": "code", "execution_count": 20, @@ -1234,7 +1300,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 134, "metadata": { "nbpresent": { "id": "4dfd2936-1a71-4f33-b4df-8f271e6caae4" @@ -1243,7 +1309,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAHFCAYAAADbvnGdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAw5UlEQVR4nO3dedxcdX33/9ebBBBQAQE3FsGCS6QuEKPWBYSioQvY3w23YFWwWmyF1la9LWqLFi2t1orct9gaFcUVKGpFjSJudaliAiIYEA2LkLhAWA0IMfD5/XHOpcNwLXPlmmFy4PV8POaROed8zzmfa2Yy7/meNVWFJEnqjk3GXYAkSZodw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvLXBklSSI6eYtn+STyX5eZJfJ7khyTeSvCrJA0dY00lJ1iZ5UN/4nZL8NMmyJFvMVH/fvH+W5MdJ1iW5cTSV32V9T0tyWpJV7Tpvbut+c5KHTdJ+5yRnJrmpbfvJJLv0tTkkySeS/CTJr5JcmuSfkzxgmjre275GJ04x/ch2+o1Jtu2bNr+d9qYNfBkkTcPw1tC1X/Zfovl8vRrYH/gz4BLgn4G/G+Hq3wFsDhzdU8+WwKeBO4GDqupXgy4sycOBJcD/APsBvz/Uau++vlcD3wJ2AP6+Xd9hwNnAUcApfe23BL4CPAY4AngRsAfw1SRb9TR9DXAH8HpgMfDvwF8C5yS52/dA+wPnf7eDL0gyf5qyt2a076mkflXlw8cGPYACjuwb9zaakDxyinkeDzx7xHV9FPgFcD8gwJnALcBeM9U/ybL2advtN8T6Np9i/LPb1+7EKaZvNcnr/UqaUN69Z9xuwHrgVT3jdphkeS+e6m8DDm+nfa79948maXNkO+3s9vV9SM+0+e20N437c+rDx73xYc9bQ5PkKTQ97bdX1Qcna1NVF1bVV0dcytuABwMvAY4H/j/gxVV1/mwWkuSDwNfawS+3m4E/2DN9cZJvt5uhb0ryX0ke3beMN7Xz7Znk7CRrgTOmWOXfAWuYohdbVbdM8roeBHynqlb2tLuCpvd+cM+4aydZ5LL23x0nmXYEcANNQP+qHZ7KW9p//36aNpKGyPDWML2e5ov+LTM1HKWq+j5Nb/CfaALluKr6xAYs6s3AX7fPjwae1o4jyWKaXula4Pk0m6D3BL6ZZLIw/DTw3zRhe7d9yO1m6X2Ac6pq3SxqfBzwg0nGrwAWzDDvPu2/l/TV8nCazfWnt6H/X8Af9+/X7vEz4F3AUUkeMWDdkubA8NZQJLk/8Fzg81V1c9+0+b2Pe6ikM4FtgbOqaoN+TFTVZfw22C6uqu+046D5gXI5cGBVnVVVHwMOALah2frQ7/9W1QlV9ZWq+tok07ej2cx/Vf+EGV6/B9H0kPtdT/P3T6r9gXE88KWqWt43+YXAPOBD7fCpNMcRPH+q5QFvpfnh9sZp2kgaEsNbw/JImi/4u2yabkPi1z2P2/oOpJpo9/vt5uWZHl+bqZAkuwIntIM7ze3PmnT5WwF70fRM10+M79lcvc8ks31qA9f1UO76+v16rj+A2h9an6bZL/6SSZocAfy4qr7dDn8J+CnTbDqvquuBfwNe3L/rQNLwGd4alu3bf2/qG38j8OT2sZymB3vLJPP/D/DYAR4vnq6I9jS0z7Z1/CWwV5JhHyG+Lc2BcD+bZNrPaXrD/SZr2+s64DZgl77xa/jt6/feSea7gcl72JP2yNujyD9D82PruVW1qm/6QprN7Z9Msk2SbYAHAJ8EnprkUdP8DSfS9PiPn6aNpCG4pzZh6t5v4oCou+zzbIN6OUCS3Wh6fHdTVbcCP5xLAUnmAafTHID1VODHNJuwX0vTexyWG2iOpH7oJNMeShNg/Wq6BVbV+iRfBw5IstnEfu+2Zz/x+v3RJLOuoNnv3W8BcHHviCSb0uxOWAgcUFUXTTLfRO/675j8wLkXM8WBaVW1Nsk/0/TA/3WyNpKGw563hmUF8BPgTye78EeS36HZr7usf9oQnURzoNWhVXVpVd1JEyIHJHnisFbS/iA5Dzi0/cEAQHuw1u/x2yPUZ+ttNFsw3jqLec6i6RE/sqeOXYGnt9Mmxm1CcwrdfsDzquo7/QtKshnNKWLn0py21v+4AHhRkkxTz7uB1Yz5oEXp3s6et4aiqu5McjTNkcnnJXkH8CNgC5oLiLyQ5hzmb0+5kDlIcgzNEeGvqKreXvapwD/S9L5fMMRV/gPN0eafTfJu4P7tem6i6XnOWlV9OcmxwL8keTzNAWNX0BzI9iiai7Xcwl178e8FjgE+neTv22lvBq4G3tPT7mTgUJoj8G9J8tSeaavazed/SPMD69WTHVSX5D00F3fZF5j0dL+quj3J8TQXtpE0Iva8NTRV9TngGTRHaL+F5nStDwF/QrMf+jHtaVxDleS5wDuBd1XVv/fVdDtNj/zQtkc6FFX1BZqw24bmvO3/oPm7n1FVP53Dct8GPJNmH/gJNJv7z6TZnH06sEdV3dHT/haa3vSPgA/T9K6voLnwytqeRR/Y/vsGmh9QvY+XtdOOAH4J/OcU5X2cmc/5BvgAzS4LSSOSqml3xUlTSlLAS6a6IMvGruv1S7rvsuctSVLHdC68kxw17hrmosv1d7l2sP5x6nLt0O36u1x717SXTL40ycr2+JX+6a9KcnGSC5N8ufeKhEmOSHP3wh8nmWnXVPfCm+bOSl3W5fq7XDtY/zh1uXbodv1drr0z2jNPTqY5vmQBcHiS/ksUfw9YWFWPpzmW5W3tvA+iuTrhU4BFwBunuRwx4NHmmoOqmu6UoY1e1+uXtFFZBKysqssBkpxGc3Og31xvoe+mTN+hOQsHmktLn9NeqZAk59DcuvfjU61sJOG9/fbb1yMesesoFs3Ou+zC3nsv7OxRdl2u/56o/fLrbh3Zsrd40EPZdtcFI6t/t+22HNWigeb132uEr/9l10524bvhuN+2D2XrXR470s/OriN8/XfaeRee8KS9R1b/HXeO7qV5+I47s+cT9hrZClZffRU3XL9mo/whPG/b3avWD+c7pdb+bAXNVRAnLKmq3lMid6Q5RXPCKpqe9FReCnx+mnknu8HRb4wkvB/xiF351rn99zqQZvaCU88bdwkb7KMv3mvcJczJ85acO+4S5uRDL9p73CVssBtumc2N5DYuhyx+5rhLmFKtv5XNn/iymRsO4LZvvvm2qlo4jGUleSHNlQ4nuw/CQLq4z1uSpI3NamDnnuGd2nF30d5r4Q3AQe11KAaet5fhLUnS3C0D9kiyW3up4cPouUQxQJIn0Vz58KCquqZn0tnAc5Js2x6o9px23JQ8YE2SpDlqby50DE3ozgNOqaoV7eWCl1fVWTT3Wrg/8J/tLQKuqqqDqur6JG/mt/d+OH7i4LWpGN6SJA1BVS0FlvaNO67n+ZS3J66qU4BTBl2Xm80lSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6piBwjvJ4iSXJlmZ5NhRFyVJkqY2Y3gnmQecDBwILAAOT7Jg1IVJkqTJDdLzXgSsrKrLq2odcBpw8GjLkiRJUxkkvHcEru4ZXtWOu4skRyVZnmT5tWuuHVZ9kqSN2A3XrWHiu799HDXumu4L5g9rQVW1BFgCsPfeC2tYy5Ukbby23W57Vq+6auG467ivGaTnvRrYuWd4p3acJEkag0HCexmwR5LdkmwGHAacNdqyJEnSVGbcbF5V65McA5wNzANOqaoVI69MkiRNaqB93lW1FFg64lokSdIAvMKaJEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5I0BDPdgTPJs5Kcn2R9kkP6pr0tyYoklyT5v0ky3boMb0mS5mjAO3BeBRwJfKxv3t8Dng48HtgTeDKwz3TrG9q1zSVJug/7zR04AZJM3IHz4okGVXVlO+3OvnkLuB+wGRBgU+AX063MnrckSTPbfoa7pw10B87JVNW3ga8CP2sfZ1fVJdPNY89bknSvlE03Z9Mddx/Ksm6DNVU1krunJdkdeCzNjb8AzknyzKr6xlTz2POWJGnu5nIHzj8BvlNVa6tqLfB54GnTzWB4S5I0d3O5A+dVwD5J5ifZlOZgtWk3mxvekiTNUVWtBybuwHkJcEZVrUhyfJKDAJI8Ockq4FDgPUkm7tB5JnAZcBHwfeD7VfWZ6dbnPm9JkoZgsjtwVtVxPc+X8dv92r1t7gBePpt12fOWJKljDG9JkjrG8JYkqWMMb0mSOsYD1rRRee0+vzPuEjbYku9cOe4S5uR1v7/HuEuYkwtX3zjuEjbYBb+4edwlbLAbb/v1uEu4T7LnLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1zIzhneSUJNck+cE9UZAkSZreID3vDwKLR1yHJEka0IzhXVVfB66/B2qRJEkDGNo+7yRHJVmeZPm1a64d1mIlSRuxW266nonv/vZx1Lhrui8YWnhX1ZKqWlhVC3fYfodhLVaStBHbausHMfHd3z6WjLumcUmyOMmlSVYmOXaS6c9Kcn6S9UkO6Zu2S5IvJrkkycVJdp1uXR5tLknSHCWZB5wMHAgsAA5PsqCv2VXAkcDHJlnEh4B/rarHAouAa6Zb3/y5FixJklgErKyqywGSnAYcDFw80aCqrmyn3dk7Yxvy86vqnLbd2plWNsipYh8Hvg08OsmqJC8d+E+RJOneYfsZ9u3vCFzdM7yqHTeIRwE3Jvlkku8l+de2Jz+lGXveVXX4gCuXJGmjMX/T+Wz3sO2GsqxfwpqqWjiUhd3dfOCZwJNoNq2fTrN5/f1TzeA+b0mS5m41sHPP8E7tuEGsAi6oqsuraj3wX8Be081geEuSNHfLgD2S7JZkM+Aw4KxZzLtNkolTtfajZ1/5ZAxvSZLmqO0xHwOcDVwCnFFVK5Icn+QggCRPTrIKOBR4T5IV7bx3AK8BvpzkIiDAe6dbn0ebS5I0BFW1FFjaN+64nufLaDanTzbvOcDjB12XPW9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrGu4ppo/LgrTcfdwkb7N9OumjcJczJqUc/fdwlzMlbv7xy3CVssG8tXTbuEjbY7T+/adwl3CfZ85YkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZKGIMniJJcmWZnk2EmmPyvJ+UnWJzlkkukPTLIqybtmWpfhLUnSHCWZB5wMHAgsAA5PsqCv2VXAkcDHpljMm4GvD7I+w1uSpLlbBKysqsurah1wGnBwb4OqurKqLgTu7J85yd7AQ4AvDrIyw1uSpJltn2R5z+Oovuk7Alf3DK9qx80oySbAvwGvGbSY+YM2lCSpSzbdbB477vjAoSzrSlhTVQuHsrC7ewWwtKpWJRlohhnDO8nOwIdouvMFLKmqk+ZSpSRJ9zKrgZ17hndqxw3iacAzk7wCuD+wWZK1VXW3g94mDNLzXg+8uqrOT/IA4Lwk51TVxQMWJUnSvd0yYI8ku9GE9mHACwaZsar+dOJ5kiOBhdMFNwywz7uqflZV57fPfwlcwoDb8SVJui+oqvXAMcDZNDl5RlWtSHJ8koMAkjw5ySrgUOA9SVZs6Ppmtc87ya7Ak4BzJ5l2FHAUwM677LKh9UiSOqTWrSXJ8p5RS6pqydgKGqOqWgos7Rt3XM/zZTSb06dbxgeBD860roHDO8n9gU8Af1NVN0+ywiXAEoC9915Ygy5XktRd2ez+3Pmr60d1IJemMNCpYkk2pQnuj1bVJ0dbkiRJms6M4Z3muPX3A5dU1TtGX5IkSZrOID3vpwMvAvZLckH7+IMR1yVJkqYw4z7vqvomMNhZ45IkaeS8PKokSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQx80ex0Muvu5UXnHreKBY9cq/d53fGXcKcPHjrzcddwpw8fNstxl3CBvuPlz913CXMyaJHPmjcJczJ7bffMe4SNtjH/+XQcZewwV5z+PvHXcJ9kj1vSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliRpCJIsTnJpkpVJjp1k+rOSnJ9kfZJDesY/Mcm3k6xIcmGS58+0LsNbkqQ5SjIPOBk4EFgAHJ5kQV+zq4AjgY/1jb8VeHFVPQ5YDLwzyTbTrW8k53lLknQfswhYWVWXAyQ5DTgYuHiiQVVd2U67s3fGqvpRz/OfJrkG2AG4caqV2fOWJGlm2ydZ3vM4qm/6jsDVPcOr2nGzkmQRsBlw2XTt7HlLku6VNt90Hrs+9IFDWda3YE1VLRzKwqaQ5GHAh4EjqurO6dra85Ykae5WAzv3DO/UjhtIkgcCnwPeUFXfmam94S1J0twtA/ZIsluSzYDDgLMGmbFt/yngQ1V15iDzGN6SJM1RVa0HjgHOBi4BzqiqFUmOT3IQQJInJ1kFHAq8J8mKdvb/DTwLODLJBe3jidOtz33ekiQNQVUtBZb2jTuu5/kyms3p/fN9BPjIbNZlz1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYGcM7yf2SfDfJ99vblf3jPVGYJEma3CDned8O7FdVa5NsCnwzyecHuXybJEkavhnDu6oKWNsObto+apRFSZKkqQ20zzvJvCQXANcA51TVuZO0OWriVmm3//KGIZcpSdoY3XzDdcxwq0yNwECXR62qO4AnJtkG+FSSPavqB31tlgBLALbddYE9c0m6D3jgtttxzU9XjfRWmbq7WR1tXlU3Al8FFo+kGkmSNKNBjjbfoe1xk2QL4ADghyOuS5IkTWGQzeYPA05NMo8m7M+oqs+OtixJkjSVQY42vxB40j1QiyRJGoBXWJMkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliRpCJIsTnJpkpVJjp1k+rOSnJ9kfZJD+qYdkeTH7eOImdZleEuSNEdJ5gEnAwcCC4DDkyzoa3YVcCTwsb55HwS8EXgKsAh4Y5Jtp1uf4S1J0twtAlZW1eVVtQ44DTi4t0FVXVlVFwJ39s37XOCcqrq+qm4AzgEWT7ey+cOr+7d2225LPvrivUax6JFb8p0rx13CnPzbSReNu4Q5+Y+XP3XcJWyw/R7z4HGXMCf7vv2/x13CnPyfAx817hI22OFHnjDuEjbY7Vf8bNwlbCx2BK7uGV5F05Pe0Hl3nG6GkYS3JEnjtvn8Tdj9wVsOa3HbJ1neM7ykqpYMa+GzZXhLkjSzNVW1cJrpq4Gde4Z3ascNYjWwb9+8X5tuBvd5S5I0d8uAPZLslmQz4DDgrAHnPRt4TpJt2wPVntOOm5LhLUnSHFXVeuAYmtC9BDijqlYkOT7JQQBJnpxkFXAo8J4kK9p5rwfeTPMDYBlwfDtuSm42lyRpCKpqKbC0b9xxPc+X0WwSn2zeU4BTBl2XPW9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOmbg8E4yL8n3knx2lAVJkqTpzabn/UrgklEVIkmSBjNQeCfZCfhD4H2jLUeSJM1k0J73O4HXAndO1SDJUUmWJ1m+Zs21w6hNkrSRq/W/YuK7v30cNe6a7gvmz9QgyR8B11TVeUn2napdVS0BlgDstffCGlaBkqSNV+ZvwZ3rfrlw3HXc1wzS8346cFCSK4HTgP2SfGSkVUmSpCnNGN5V9bqq2qmqdgUOA75SVS8ceWWSJGlSnuctSVLHzLjPu1dVfQ342kgqkSRJA7HnLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUnSECRZnOTSJCuTHDvJ9M2TnN5OPzfJru34TZOcmuSiJJcked1M6zK8JUmaoyTzgJOBA4EFwOFJFvQ1eylwQ1XtDpwIvLUdfyiweVX9LrA38PKJYJ+K4S1J0twtAlZW1eVVtY7mXiAH97U5GDi1fX4msH+SAAVslWQ+sAWwDrh5upXN6gprkiR1xf3mb8Kjd9hyWIvbPsnynuEl7d00J+wIXN0zvAp4St8yftOmqtYnuQnYjibIDwZ+BmwJ/G1VXT9dMYa3JEkzW1NVo7r16SLgDuDhwLbAN5J8qaoun2oGN5tLkjR3q4Gde4Z3asdN2qbdRL41cB3wAuALVfXrqroG+BYw7Q8Fw1uSpLlbBuyRZLckm9HcQvusvjZnAUe0zw+hucV2AVcB+wEk2Qp4KvDD6VZmeEuSNEdVtR44BjgbuAQ4o6pWJDk+yUFts/cD2yVZCbwKmDid7GTg/klW0PwI+EBVXTjd+tznLUnSEFTVUmBp37jjep7fRnNaWP98aycbPx173pIkdYzhLUlSxxjekiR1zEj2eV927S08b8m5o1j0yL3u9/cYdwlzcurRTx93CXOy6JEPGncJG2zft//3uEuYk6+9Zp9xlzAnt96+ftwlbLD9X/6icZewwb55wpfGXcJ9kj1vSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKlj5g/SKMmVwC+BO4D1VbVwlEVJkqSpDRTerWdX1ZqRVSJJkgbiZnNJkjpm0PAu4ItJzkty1GQNkhyVZHmS5evW3ji0AiVJG691a29k4ru/fUyaERquQTebP6OqVid5MHBOkh9W1dd7G1TVEmAJwNa7PLaGXKckaSO02f234dbrfuZxUPewgXreVbW6/fca4FPAolEWJUlS1yRZnOTSJCuTHDvJ9M2TnN5OPzfJrj3THp/k20lWJLkoyf2mW9eM4Z1kqyQPmHgOPAf4waz/KkmS7qWSzANOBg4EFgCHJ1nQ1+ylwA1VtTtwIvDWdt75wEeAv6iqxwH7Ar+ebn2D9LwfAnwzyfeB7wKfq6ovDPwXSZJ077cIWFlVl1fVOuA04OC+NgcDp7bPzwT2TxKaTvGFVfV9gKq6rqrumG5lM+7zrqrLgSfM7m+QJGm8Np+3Cbs+YKthLW77JMt7hpe0x3pN2BG4umd4FfCUvmX8pk1VrU9yE7Ad8CigkpwN7ACcVlVvm66Y2ZznLUnSfdWaEV6gbD7wDODJwK3Al5OcV1VfnmoGz/OWJGnuVgM79wzv1I6btE27n3tr4DqaXvrXq2pNVd0KLAX2mm5lhrckSXO3DNgjyW5JNgMOA87qa3MWcET7/BDgK1VVwNnA7ybZsg31fYCLp1uZm80lSZqjdh/2MTRBPA84papWJDkeWF5VZwHvBz6cZCVwPU3AU1U3JHkHzQ+AApZW1eemW5/hLUnSEFTVUppN3r3jjut5fhtw6BTzfoTmdLGBuNlckqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOGcldxXbdbks+9KK9R7Hokbtw9Y3jLmFO3vrlleMuYU5uv/2OcZewwf7PgY8adwlzcuvt68ddwpxsuXl3b5K4eM8dxl3CBrtwi+6+7l1mz1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUkagiSLk1yaZGWSYyeZvnmS09vp5ybZtW/6LknWJnnNTOsyvCVJmqMk84CTgQOBBcDhSRb0NXspcENV7Q6cCLy1b/o7gM8Psj7DW5KkuVsErKyqy6tqHXAacHBfm4OBU9vnZwL7JwlAkucBVwArBlnZ/GFULEnSxmbeJmG7B2w2rMVtn2R5z/CSqlrSM7wjcHXP8CrgKX3L+E2bqlqf5CZguyS3AX8HHADMuMkcBgzvJNsA7wP2BAr4s6r69iDzSpJ0L7CmqhaOaNlvAk6sqrVtR3xGg/a8TwK+UFWHJNkM2HLD6pMk6V5pNbBzz/BO7bjJ2qxKMh/YGriOpod+SJK3AdsAdya5rareNdXKZgzvJFsDzwKOBGi35a8b8I+RJOm+YBmwR5LdaEL6MOAFfW3OAo4Avg0cAnylqgp45kSDJG8C1k4X3DDYAWu7AdcCH0jyvSTvS7JVf6MkRyVZnmT59detGWCxkqSuW3vj9Ux897ePo8Zd0zhU1XrgGOBs4BLgjKpakeT4JAe1zd5Ps497JfAq4G6nkw1qkM3m84G9gL+qqnOTnNSu8B/6Cl8CLAF4wpP2rg0tSJLUHfff5kFc//PVo9oX3ClVtRRY2jfuuJ7ntwGHzrCMNw2yrkF63quAVVV1bjt8Jk2YS5KkMZgxvKvq58DVSR7djtofuHikVUmSpCkNerT5XwEfbY80vxx4yehKkiRJ0xkovKvqAsB9GpIkbQS8PKokSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQx80ex0DvuLG64Zd0oFj1yF/zi5nGXMCffWrps3CXMycf/5dBxl7DBDj/yhHGXMCf7v/xF4y5hThbvucO4S9hgL3vKbuMuYYN9YKvNx13CfZI9b0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mShiDJ4iSXJlmZ5NhJpm+e5PR2+rlJdm3HH5DkvCQXtf/uN9O6DG9JkuYoyTzgZOBAYAFweJIFfc1eCtxQVbsDJwJvbcevAf64qn4XOAL48EzrM7wlSZq7RcDKqrq8qtYBpwEH97U5GDi1fX4msH+SVNX3quqn7fgVwBZJpr36zUiusCZJ0rhtOm8TdnjA0K4At32S5T3DS6pqSc/wjsDVPcOrgKf0LeM3bapqfZKbgO1oet4T/hdwflXdPl0xhrckSTNbU1ULR7mCJI+j2ZT+nJnautlckqS5Ww3s3DO8Uztu0jZJ5gNbA9e1wzsBnwJeXFWXzbQyw1uSpLlbBuyRZLckmwGHAWf1tTmL5oA0gEOAr1RVJdkG+BxwbFV9a5CVGd6SJM1RVa0HjgHOBi4BzqiqFUmOT3JQ2+z9wHZJVgKvAiZOJzsG2B04LskF7ePB063Pfd6SJA1BVS0FlvaNO67n+W3A3e57XFVvAd4ym3XZ85YkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljZgzvJI/uOXT9giQ3J/mbe6A2SZI0iRlPFauqS4Enwm/umrKa5iowkiRpDGa72Xx/4LKq+skoipEkSTObbXgfBnx8sglJjkqyPMnyG65bM1kTSdK9zLVrrmXiu799HDXumu4LBr7CWnut1oOA1002vb012hKAPZ+wVw2lOknSRm2H7Xfgqp/8ZKR329LdzabnfSDNPUZ/MapiJEnSzGYT3oczxSZzSZJ0zxkovJNsBRwAfHK05UiSpJkMtM+7qm4BthtxLZIkaQBeYU2SpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUkagiSLk1yaZGWSYyeZvnmS09vp5ybZtWfa69rxlyZ57kzrMrwlSZqjJPOAk4EDgQXA4UkW9DV7KXBDVe0OnAi8tZ13AXAY8DhgMfDudnlTMrwlSZq7RcDKqrq8qtYBpwEH97U5GDi1fX4msH+StONPq6rbq+oKYGW7vCmlqoZaPUCSa4GfDH3Bje2BNSNa9j2hy/V3uXaw/nHqcu3Q7fpHXfsjqmqHES5/gyX5As3fPwz3A27rGV5SVUt61nUIsLiqXtYOvwh4SlUd09PmB22bVe3wZcBTgDcB36mqj7Tj3w98vqrOnKqY+UP6o+5ilG9kkuVVtXBUyx+1Ltff5drB+sepy7VDt+vvcu1zVVWLx13DqLjZXJKkuVsN7NwzvFM7btI2SeYDWwPXDTjvXRjekiTN3TJgjyS7JdmM5gC0s/ranAUc0T4/BPhKNfuuzwIOa49G3w3YA/judCsbyWbzEVsyc5ONWpfr73LtYP3j1OXaodv1d7n2zqiq9UmOAc4G5gGnVNWKJMcDy6vqLOD9wIeTrASupwl42nZnABcD64Gjq+qO6dY3kgPWJEnS6LjZXJKkjjG8JUnqmE6F90yXntuYJTklyTXteX6dkmTnJF9NcnGSFUleOe6aZiPJ/ZJ8N8n32/r/cdw1zVaSeUm+l+Sz465ltpJcmeSiJBckWT7uemYjyTZJzkzywySXJHnauGsaVJJHt6/5xOPmJH8z7ro0HJ3Z591eKu5HwAHAKpoj+w6vqovHWtiAkjwLWAt8qKr2HHc9s5HkYcDDqur8JA8AzgOe16HXPsBWVbU2yabAN4FXVtV3xlzawJK8ClgIPLCq/mjc9cxGkiuBhVXVuYucJDkV+EZVva89gnjLqrpxzGXNWvv9uZrmoiGjuoCW7kFd6nkPcum5jVZVfZ3m6MLOqaqfVdX57fNfApcAO463qsFVY207uGn76MavViDJTsAfAu8bdy33JUm2Bp5Fc4QwVbWui8Hd2h+4zOC+9+hSeO8IXN0zvIoOBci9RXsXnCcB5465lFlpNztfAFwDnFNVXar/ncBrgTvHXMeGKuCLSc5LctS4i5mF3YBrgQ+0uyzel2SrcRe1gQ4DPj7uIjQ8XQpvjVmS+wOfAP6mqm4edz2zUVV3VNUTaa5ctChJJ3ZdJPkj4JqqOm/ctczBM6pqL5q7LR3d7kLqgvnAXsC/V9WTgFuATh1rA9Bu7j8I+M9x16Lh6VJ4z/rycRqedl/xJ4CPVtUnx13Phmo3e36V5rZ7XfB04KB2v/FpwH5JPjLekmanqla3/14DfIoZ7pa0EVkFrOrZSnMmTZh3zYHA+VX1i3EXouHpUngPcuk5jUB7wNf7gUuq6h3jrme2kuyQZJv2+RY0Bz3+cKxFDaiqXldVO1XVrjSf+a9U1QvHXNbAkmzVHuRIu8n5OUAnzrioqp8DVyd5dDtqf5orYHXN4bjJ/F6nM5dHnerSc2Mua2BJPg7sC2yfZBXwxqp6/3irGtjTgRcBF7X7jQFeX1VLx1fSrDwMOLU94nYT4Iyq6twpVx31EOBTze8/5gMfq6ovjLekWfkr4KNth+Fy4CVjrmdW2h9MBwAvH3ctGq7OnComSZIaXdpsLkmSMLwlSeocw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbzv45J8sIv3iB6nJPu2lyuddtzGqMu1S/otw/se0h+SSb6W5F334PqnWt8rgY3qcptJXpdkWZKbk1yb5DP9NxJJcmWSmuTxuQGW/4okVyS5rb3T1TNH99dAkse27//VSda1/56T5Ij2qm/DWk+S/CDJO/rGPyPJr5JsNFfZ2tD3IMnDkpzafi5uS3Jxkn16ps9L8uaeZV+R5C1J7nY1yfZzVv3/Lwb5/EnjZnh3XHvZxg1WVTdthPco3hd4N/B7wH7AeuBLSR7U0+bJNJc9nXjsRXPryTOmW3CS5wMnASfQ3Nr0f4DPJ9lluH/Cb9b3POB7wObAi4HdgefS3OTlde34oajmcon/BLw8yfbt+h8NfBp4R1W9Z1jrmosNfQ/a69N/CwjN/c0fS3P50mt6mv0dcDTw18BjaH6cHk3zWvcu66nAUcCFk6xqX2b+/EnjVVU+7oEH8EHgsz3Pq++xK82X0muBy4BfARcBL+xbzteAfwfeTnOv4WU0d8j6BnADcD3N9d8f27fuu61vkro2p7l39C+A24Dv0NzOsX/976b54l1D88X5dmCTnjbPauddC9wEfBfYcw6v3f2BO4A/nqbNG4AbgS1mWNa5wHv7xv0Y+OdZ1LMvcOUA454ArKO5Dvxky8kIPmebAD9q35+H0FyP+8OzrX3E/xc26D1o/6ZvzdDms8CpfeNOnfiMt8Nbt//Hnt1+nt8118+fDx/39MOe93i8Evg28AF+23O8GngL8FKansIC4J+B9yT5w775X0gT9M+k6c1tRRO6i2i+iG8CPtPTK59qff3eBjwf+DOaHtFFwBeSPKyv3Z/S9EZ+DzgG+Jt2PtrNk58GvkkTXk9pa7ujnX5ku6ly15lepB4PoAmlGyab2N717KXAR6rqV1MtpH099ga+2Dfpi+3fMmwnAcuq6oTJJlbV0G8sUFV30oTc0cBS4Aqa12bokrw+ydoZHs/sm2cu78HzgHOTnJ7kmiQXJDmmff8nfBN4dpLHtOtbQNN77r2JzhLgzKr66oB/6rSfP2kcOnNXsXuTqropyTrg1mpuOzhx959XAc+pqm+0Ta9Isojmi7h3X+4VVfXqnuFLepef5CXAzTRh/s3J1tevXf9fAi+rqs+14/6C5ovvaODve5pfXFXHtc9/lOTPaW6X+HHggcA2wGeq6rK2Te/tN28CLgV+PeULdHcnARfQ/ACZzAHAbsB7Z1jO9jR3pOu/r/EvgN+fRT0zSvIIYB/giJ5xmwA/B7ZsR32iqo6YZPa5Og34fzTvxX5VtW62C0jyKprP45p21Oeq6g19zf6DGXZTAKv7hufyHjwSeAVwIvAvwBNp/k6Aif3Wb6UJ24uT3EHzHfdPVfVugPazujuzO85jps+fdI8zvDceC4D70fR0e3tkmwJX9rU9r3cgye8Ab6bp5e5A00vYBJjNftzfadf1rYkRVXVHkm+3tfXq30/4U+DB7TzXJ/kgcHaSLwNfpunlXNVO/xTwqUGLag++egbN5vs7pmj25zQ93O8Putx7wO+2/363b/xE7/J/aH7E3EWSt9DsApjOs6vqa9NM/380/7e3A+6csdLJ7Qm8sqo+MVWDqrqeZjfNPWUTYHlVTey//l6SPWh+XE6E9/Nptka9AFhBE/AnJbmCpld+As1naaAfjwN+/qR7nJvNNx4T78Uf03zhTDweBzynr+0tfcOfpQntl9ME+JNoNmvP6WC2Hv2bd/u/+Iqez1JVvaSt4+vAQcClSZ4725UmORE4nKb3ePkUbR4MHMzMvW5oepF30OwL7vUQmh7xMD2g/Xf9xIiqurOqVgLX0bxfk/3YeCfNgVjTPfp/EPxGkjcC/wt4Gs3n5JgNrH9Pmt7mlDZkszlzew9+BlzcN+4S7voj9V+Bt1fVaVV1UVV9GHgHzQFrT6Pp+a9Isj7JepqtI69oh+9y8OAgnz9pXOx5j886ms2HEy4GbgceUVVfGXQhSbajOar2FRP78JLsxd3f2/719busbfP09jntaUxPAz42aD0T2l7w94G3Jvk8zebjswedP8lJNL2oZ1fVD6dpeiTN6/bxAWpal+Q8ms3s/9kz6QCao7+H6Qftv88AVvZNmzjt6G7hXVVr+O2m6llJ8lLgWJpdLxckeRvwD0lOqqpbZ7GcAI8GPtHuTr6wql48SdNZbzaf43vwrbauXo8CftIzvCXt8RU97qD5cflfwPK+aR+gOVjuBJrPPzCrz580Fob3+FwJLGoP3FpLs/nx7cDb2y/Pr9Mc5fpU4M6qWjLFcm6g+bL/8yRXAzvS9D7W97W72/rag5sAqKpbkvw7TdiuoTnQ6W9pekTvHvSPSrIbzRaAs2i+uB8JPJ7mCHmS/AnNgXj7V1X//tCJZZwMvIjmAKUbkjy0nbS2qtb2tAvwMuC03vE9048Bjqmqx/SMfgfw4STfpQmDvwAeThNEQ1NVFyX5NPBv7UFaX6fZQvF4mn3J11TVqmGtL8kf0LxPL+w5ZuK9wOtp3o8TZ7G43WiOa3jadI3msNl8xvdgivfuROB/krwBOJ1mC9Nf0/yNEz4DHNtuJl/RtnkV8KFqTom8sbeQJLfQ/F/4Qc+4gT5/0liN+3D3+8qDnlOy2uFH0RwAcyt3PVXsr/htL/xa4BzggJ75vkbfqS00B5X9gOb0rh/QnEe8FjhyuvX118VdTxW7nalPFetff+8yHgJ8kia4bweuojmKfdN2+pG965/iteo/rW3i8aa+ds9uxy+aYjlvoj2ou2/8K2h+zNxOc/zAs/qmT1sjg58qthnNqX8Xtq/7zTSn9r0JeOgQP1tPbt/vv51k2qvb92LzQWun2dVxyoj/P8z0Hkz13v0hzRaL22hOiftrek65o9ld8U6a3vivaE6VOwG43xR1TPZ5Hujz58PHOB+pGvrZKlKnJflH4BDgCVXVvwWDJPsCH6yqXacbtzEapPYkrwd+XVX/eo8XKGkgHrAm3d0fAEdPFtz3EXvSd/qhpI2L+7ylPlX15HHXME5V9YJx1yBpeva8pdm7kma/6kzjNkZX0t3aJbXc5y1JUsfY85YkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9Jkjrm/wcqfAy6tlkN2AAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -1255,8 +1321,10 @@ } ], "source": [ + "itr, norm, X_G = read_data_file(\"g02an.d\")\n", + "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(abs(X-G), interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", + "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", " vmax=0.2)\n", "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True),\n", " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", @@ -1265,9 +1333,9 @@ " bottom='off', top='off', left='off', right='off', \n", " labelbottom='off', labelleft='off')\n", "\n", - "ax1.set_title(r'$|G-X|$ for corrmat_shrinking', fontsize=16)\n", + "ax1.set_title(r'$|G-X|$ for G02AN', fontsize=16)\n", "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, np.linalg.norm(X-G)),\n", + " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", " fontsize=14,\n", ") \n", "plt.show()" @@ -1283,7 +1351,7 @@ "source": [ "# Fixing Arbitrary Elements\n", "\n", - "* The routine **library.correg.corrmat_target** fixes arbitrary elements by finding the smallest α, such that *X* is a true correlation matrix in:\n", + "* The routine **G02AP** fixes arbitrary elements by finding the smallest α, such that *X* is a true correlation matrix in:\n", "\n", "\n", "$$ X = \\large \\alpha T+(1-\\alpha)G, \\quad T = H \\circ G, \\quad h_{ij} \\in [0,1] $$\n", @@ -1353,30 +1421,11 @@ "collapsed": true }, "source": [ - "# More on using the NAG Library for *Python*:\n", + "# More on using the NAG Library for *Java*:\n", "\n", "\n", - "**https://www.nag.com/nag-library-python ** \n" + "**https://www.nag.com/content/nag-library-for-java** \n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "``` java\n", - "public class Hello {\n", - " public static void main(String[] args) {\n", - " }\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 1ffe316ed4ef0e9644cce62fccfcb1a39ac05e35 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Thu, 17 Dec 2020 11:34:13 +0200 Subject: [PATCH 011/196] Moved data files to data folder and added final touches to Ncm --- nearest_correlation_matrices/NcmNag.java | 20 ++- nearest_correlation_matrices/Readme.md | 3 +- nearest_correlation_matrices/{ => data}/G.d | 0 .../{g02aa.d => data/G02AA.d} | 0 .../{g02ab.d => data/G02AB.d} | 0 .../{g02aj.d => data/G02AJ.d} | 0 .../{g02an.d => data/G02AN.d} | 0 .../{ => data}/G_eigen.d | 0 .../{ => data}/H_G02AJ.d | 0 .../{ => data}/X_G02AA.d | 0 .../{ => data}/X_G02AB.d | 0 .../{ => data}/X_G02AJ.d | 0 .../{ => data}/X_G02AN.d | 0 .../{ => data}/X_eigen_G02AA.d | 0 .../{ => data}/X_eigen_G02AB.d | 0 .../{ => data}/X_eigen_G02AJ.d | 0 .../{ => data}/X_eigen_G02AN.d | 0 .../{ => data}/alpha_G02AN.d | 0 nearest_correlation_matrices/ncm_nag.ipynb | 124 +++++++----------- nearest_correlation_matrices/output.txt | 70 ++++++++++ .../|G-X| for G02AA.png | Bin 7234 -> 0 bytes 21 files changed, 135 insertions(+), 82 deletions(-) rename nearest_correlation_matrices/{ => data}/G.d (100%) rename nearest_correlation_matrices/{g02aa.d => data/G02AA.d} (100%) mode change 100644 => 100755 rename nearest_correlation_matrices/{g02ab.d => data/G02AB.d} (100%) mode change 100644 => 100755 rename nearest_correlation_matrices/{g02aj.d => data/G02AJ.d} (100%) mode change 100644 => 100755 rename nearest_correlation_matrices/{g02an.d => data/G02AN.d} (100%) mode change 100644 => 100755 rename nearest_correlation_matrices/{ => data}/G_eigen.d (100%) rename nearest_correlation_matrices/{ => data}/H_G02AJ.d (100%) rename nearest_correlation_matrices/{ => data}/X_G02AA.d (100%) rename nearest_correlation_matrices/{ => data}/X_G02AB.d (100%) rename nearest_correlation_matrices/{ => data}/X_G02AJ.d (100%) rename nearest_correlation_matrices/{ => data}/X_G02AN.d (100%) rename nearest_correlation_matrices/{ => data}/X_eigen_G02AA.d (100%) rename nearest_correlation_matrices/{ => data}/X_eigen_G02AB.d (100%) rename nearest_correlation_matrices/{ => data}/X_eigen_G02AJ.d (100%) rename nearest_correlation_matrices/{ => data}/X_eigen_G02AN.d (100%) rename nearest_correlation_matrices/{ => data}/alpha_G02AN.d (100%) create mode 100755 nearest_correlation_matrices/output.txt delete mode 100644 nearest_correlation_matrices/|G-X| for G02AA.png diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 291862b..f3c30c8 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -13,6 +13,8 @@ import java.io.FileWriter; public class NcmNag { + + public static String dataFolder = "data"; public static void main(String[] args) { // Initialize our P matrix of observations @@ -64,6 +66,7 @@ public static void main(String[] args) { System.out.println(); + // Nearest Correlation Matrices // Using G02AA to compute the nearest correlation matrix in the Frobenius norm @@ -125,7 +128,8 @@ public static void main(String[] args) { work = new double[n]; double X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); - printDataToFile("g02aa.d", iter, X_G, X_G_norm); + printDataToFile("G02AA.d", iter, X_G, X_G_norm); + // Weighting rows and columns of elements @@ -192,7 +196,8 @@ public static void main(String[] args) { work = new double[n]; X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); - printDataToFile("g02ab.d", iter, X_G, X_G_norm); + printDataToFile("G02AB.d", iter, X_G, X_G_norm); + // Weighting Individual Elements @@ -272,8 +277,9 @@ public static void main(String[] args) { work = new double[n]; X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); - printDataToFile("g02aj.d", iter, X_G, X_G_norm); + printDataToFile("G02AJ.d", iter, X_G, X_G_norm); + // Fixing a Block of Elements // Use G02AN to compute the nearest correlation matrix with fixed leading block @@ -339,7 +345,7 @@ public static void main(String[] args) { work = new double[n]; X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); - printDataToFile("g02an.d", iter, X_G, X_G_norm); + printDataToFile("G02AN.d", iter, X_G, X_G_norm); } @@ -423,7 +429,7 @@ public static double[][] cor_bar(double[][] P) { public static void printDataToFile(String fileName, int iter, double[][] X_G, double X_G_norm) { double[][] absX_G = matrixAbs(X_G); try { - FileWriter writer = new FileWriter(new File(fileName)); + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); writer.write(iter + "\n"); writer.write(X_G_norm + "\n"); for (int i = 0; i < X_G.length; i++) { @@ -599,7 +605,7 @@ public static void printMatrix(double[][] a) { public static void printMatrixToFile(double[][] a, String fileName) { try { - FileWriter writer = new FileWriter(new File(fileName)); + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[0].length; j++) { writer.write(a[i][j] + " "); @@ -615,7 +621,7 @@ public static void printMatrixToFile(double[][] a, String fileName) { public static void printVectorToFile(double[] a, String fileName) { try { - FileWriter writer = new FileWriter(new File(fileName)); + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); for (int i = 0; i < a.length; i++) { writer.write(a[i] + " "); } diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index f5d71c9..32e96c4 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -2,4 +2,5 @@ * [ncm_whitepaper_2019.pdf](./ncm_whitepaper_2019.pdf) Nearest Correlation Matrices whitepaper * [ncm_nag.ipynb](./ncm_nag.ipynb) Nearest Correlation Matrices Tutorial - +* [NcmNag.java](./NcmNag.java) Nearest Correlation Matrices Java Source File +* [output.txt](./output.txt) Output of NcmNag.java diff --git a/nearest_correlation_matrices/G.d b/nearest_correlation_matrices/data/G.d similarity index 100% rename from nearest_correlation_matrices/G.d rename to nearest_correlation_matrices/data/G.d diff --git a/nearest_correlation_matrices/g02aa.d b/nearest_correlation_matrices/data/G02AA.d old mode 100644 new mode 100755 similarity index 100% rename from nearest_correlation_matrices/g02aa.d rename to nearest_correlation_matrices/data/G02AA.d diff --git a/nearest_correlation_matrices/g02ab.d b/nearest_correlation_matrices/data/G02AB.d old mode 100644 new mode 100755 similarity index 100% rename from nearest_correlation_matrices/g02ab.d rename to nearest_correlation_matrices/data/G02AB.d diff --git a/nearest_correlation_matrices/g02aj.d b/nearest_correlation_matrices/data/G02AJ.d old mode 100644 new mode 100755 similarity index 100% rename from nearest_correlation_matrices/g02aj.d rename to nearest_correlation_matrices/data/G02AJ.d diff --git a/nearest_correlation_matrices/g02an.d b/nearest_correlation_matrices/data/G02AN.d old mode 100644 new mode 100755 similarity index 100% rename from nearest_correlation_matrices/g02an.d rename to nearest_correlation_matrices/data/G02AN.d diff --git a/nearest_correlation_matrices/G_eigen.d b/nearest_correlation_matrices/data/G_eigen.d similarity index 100% rename from nearest_correlation_matrices/G_eigen.d rename to nearest_correlation_matrices/data/G_eigen.d diff --git a/nearest_correlation_matrices/H_G02AJ.d b/nearest_correlation_matrices/data/H_G02AJ.d similarity index 100% rename from nearest_correlation_matrices/H_G02AJ.d rename to nearest_correlation_matrices/data/H_G02AJ.d diff --git a/nearest_correlation_matrices/X_G02AA.d b/nearest_correlation_matrices/data/X_G02AA.d similarity index 100% rename from nearest_correlation_matrices/X_G02AA.d rename to nearest_correlation_matrices/data/X_G02AA.d diff --git a/nearest_correlation_matrices/X_G02AB.d b/nearest_correlation_matrices/data/X_G02AB.d similarity index 100% rename from nearest_correlation_matrices/X_G02AB.d rename to nearest_correlation_matrices/data/X_G02AB.d diff --git a/nearest_correlation_matrices/X_G02AJ.d b/nearest_correlation_matrices/data/X_G02AJ.d similarity index 100% rename from nearest_correlation_matrices/X_G02AJ.d rename to nearest_correlation_matrices/data/X_G02AJ.d diff --git a/nearest_correlation_matrices/X_G02AN.d b/nearest_correlation_matrices/data/X_G02AN.d similarity index 100% rename from nearest_correlation_matrices/X_G02AN.d rename to nearest_correlation_matrices/data/X_G02AN.d diff --git a/nearest_correlation_matrices/X_eigen_G02AA.d b/nearest_correlation_matrices/data/X_eigen_G02AA.d similarity index 100% rename from nearest_correlation_matrices/X_eigen_G02AA.d rename to nearest_correlation_matrices/data/X_eigen_G02AA.d diff --git a/nearest_correlation_matrices/X_eigen_G02AB.d b/nearest_correlation_matrices/data/X_eigen_G02AB.d similarity index 100% rename from nearest_correlation_matrices/X_eigen_G02AB.d rename to nearest_correlation_matrices/data/X_eigen_G02AB.d diff --git a/nearest_correlation_matrices/X_eigen_G02AJ.d b/nearest_correlation_matrices/data/X_eigen_G02AJ.d similarity index 100% rename from nearest_correlation_matrices/X_eigen_G02AJ.d rename to nearest_correlation_matrices/data/X_eigen_G02AJ.d diff --git a/nearest_correlation_matrices/X_eigen_G02AN.d b/nearest_correlation_matrices/data/X_eigen_G02AN.d similarity index 100% rename from nearest_correlation_matrices/X_eigen_G02AN.d rename to nearest_correlation_matrices/data/X_eigen_G02AN.d diff --git a/nearest_correlation_matrices/alpha_G02AN.d b/nearest_correlation_matrices/data/alpha_G02AN.d similarity index 100% rename from nearest_correlation_matrices/alpha_G02AN.d rename to nearest_correlation_matrices/data/alpha_G02AN.d diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index a35ca6f..759f6b9 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -10,9 +10,10 @@ "source": [ "# Nearest Correlation Matrices\n", "\n", - "This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Python*.\n", + "This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*.\n", "\n", - "\n" + "All the calculations happen in the [NcmNag.java](./NcmNag.java) file and they are presented here using *Python*.\n", + "For a better understanding, it is suggested to have open NcmNag.java to look up the different functions used." ] }, { @@ -177,7 +178,7 @@ "S_{3,4} & = \\large \\frac{1}{6} (v_1 - \\bar{v}_1 )^T(v_2 - \\bar{v}_2) \n", "\\end{align*}\n", "\n", - "* Let's compute this in Python.\n" + "* Let's compute this in Java.\n" ] }, { @@ -188,12 +189,12 @@ } }, "source": [ - "### Import required modules, set print options and define the read_file functions" + "### Import required modules, set print options and define the read_file functions for *Python*" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "nbpresent": { "id": "bbde4683-adc6-4094-891a-5487f24b873e" @@ -202,45 +203,47 @@ "outputs": [], "source": [ "import numpy as np\n", - "#from naginterfaces.library import correg as nl_correg\n", "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", "# Set the print precision\n", "np.set_printoptions(precision=4, suppress=True)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Select the display backend for Jupyter:\n", - "%matplotlib inline" + "%matplotlib inline\n", + "# Set the data folder path\n", + "data_folder = Path(\"data\")" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def read_matrix_file(fname):\n", - " with open(fname) as fdata:\n", + " with open(data_folder / fname) as fdata:\n", " a = np.array([line.split() for line in fdata], dtype = np.float64)\n", " return a" ] }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def read_data_file(fname):\n", - " with open(fname) as fdata:\n", + " with open(data_folder / fname) as fdata:\n", " for i, line in enumerate(fdata):\n", " if i == 0:\n", - " itr = float(line)\n", + " itr = int(line)\n", " elif i == 1:\n", " norm = float(line)\n", " elif i == 2:\n", @@ -405,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 5, "metadata": { "nbpresent": { "id": "f417663e-badf-45d3-8f98-0647907657de" @@ -474,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 6, "metadata": { "nbpresent": { "id": "b1c83af0-e6ca-42cc-a0ca-50276ebe4f67" @@ -485,13 +488,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of G [[-0.2498 -0.016 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355]]\n" + "Sorted eigenvalues of G [-0.2498 -0.016 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355]\n" ] } ], "source": [ "G_eigen = read_matrix_file(\"G_eigen.d\")\n", - "print(\"Sorted eigenvalues of G {}\".format(G_eigen))" + "print(\"Sorted eigenvalues of G {}\".format(G_eigen[0]))" ] }, { @@ -571,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 7, "metadata": { "nbpresent": { "id": "9d1819cb-4c08-4d0b-8cbe-d9de4ab61a0f" @@ -624,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 8, "metadata": { "nbpresent": { "id": "9737d750-04fe-4a91-933c-a799449e427e" @@ -635,18 +638,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [[-0. 0. 0.038 0.1731 0.6894 1.7117 1.9217 3.4661]]\n" + "Sorted eigenvalues of X [-0. 0. 0.038 0.1731 0.6894 1.7117 1.9217 3.4661]\n" ] } ], "source": [ "X_eigen = read_matrix_file(\"X_eigen_G02AA.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" + "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 9, "metadata": { "nbpresent": { "id": "85008295-2019-4aae-8de4-10440d7b1192" @@ -655,7 +658,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -667,7 +670,7 @@ } ], "source": [ - "itr, norm, X_G = read_data_file(\"g02aa.d\")\n", + "itr, norm, X_G = read_data_file(\"G02AA.d\")\n", "\n", "# Plot the difference between G and X as a small shaded square for each element\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", @@ -780,7 +783,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -829,25 +832,25 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [[0.001 0.001 0.0305 0.1646 0.6764 1.7716 1.891 3.4639]]\n" + "Sorted eigenvalues of X [0.001 0.001 0.0305 0.1646 0.6764 1.7716 1.891 3.4639]\n" ] } ], "source": [ "X_eigen = read_matrix_file(\"X_eigen_G02AB.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" + "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" ] }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 12, "metadata": { "nbpresent": { "id": "f769cb44-ca59-43ad-a0b6-29e394f2557e" @@ -856,7 +859,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -868,7 +871,7 @@ } ], "source": [ - "itr, norm, X_G = read_data_file(\"g02ab.d\")\n", + "itr, norm, X_G = read_data_file(\"G02AB.d\")\n", "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", @@ -954,7 +957,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 13, "metadata": { "nbpresent": { "id": "d477130b-e56d-4bab-b0bd-3a1ddf2c328d" @@ -974,7 +977,7 @@ " [ 1., 1., 1., 1., 1., 1., 1., 1.]])" ] }, - "execution_count": 90, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1013,7 +1016,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -1063,25 +1066,25 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [[0.001 0.001 0.0375 0.1734 0.6882 1.7106 1.9224 3.466 ]]\n" + "Sorted eigenvalues of X [0.001 0.001 0.0375 0.1734 0.6882 1.7106 1.9224 3.466 ]\n" ] } ], "source": [ "X_eigen = read_matrix_file(\"X_eigen_G02AJ.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen))" + "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" ] }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 16, "metadata": { "nbpresent": { "id": "e07e5a46-5f1d-49ef-9ae7-20b944efd9fb" @@ -1090,7 +1093,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1102,7 +1105,7 @@ } ], "source": [ - "itr, norm, X_G = read_data_file(\"g02ab.d\")\n", + "itr, norm, X_G = read_data_file(\"G02AJ.d\")\n", "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", @@ -1203,7 +1206,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -1252,55 +1255,28 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Sorted eigenvalues of X [[0. 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356]]\n", + "Sorted eigenvalues of X [0. 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356]\n", "Value of alpha returned: [0.2003]\n" ] } ], "source": [ "X_eigen = read_matrix_file(\"X_eigen_G02AN.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen))\n", + "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))\n", "alpha = read_matrix_file(\"alpha_G02AN.d\")\n", "print(\"Value of alpha returned: {}\".format(alpha[0]))" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": { - "nbpresent": { - "id": "3eadfa7e-67da-4128-89cc-641d720a8679" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of X [0.0000 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356 ]\n", - "Value of alpha returned: 0.2003\n" - ] - } - ], - "source": [ - "print(\"Sorted eigenvalues of X [{0}]\".format(\n", - " ''.join(\n", - " ['{:.4f} '.format(x) for x in np.sort(np.linalg.eig(X)[0])]\n", - " )\n", - "))\n", - "print(\"Value of alpha returned: {:.4f}\".format(alpha))" - ] - }, - { - "cell_type": "code", - "execution_count": 134, + "execution_count": 19, "metadata": { "nbpresent": { "id": "4dfd2936-1a71-4f33-b4df-8f271e6caae4" @@ -1309,7 +1285,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAHFCAYAAADbvnGdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwzElEQVR4nO3debwkdX3v/9ebGUBBBQTcWAQDLiNxARw1LiAEhSxgfheuYFQwGkyExES9BjVBg4ZEY0TuFRNHQXFFghpRRxG3uERxBkRwQHRYhBkXGFYHhHHg8/uj6kjTnKXPnG76FLyej0c9TlfVt6o+p6fnvPtba6oKSZLUHRuNuwBJkjQ7hrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeGuDJakkR0wxb98kn07yiyS/SXJ9km8meXWSB42wphOTrE3y4L7p2yf5WZJlSe4/U/19y/5Zkp8kWZfkhtFUfpftPT3JaUlWtdu8qa37LUkePkn7HZKckeTGtu2nkuzY1+bgJJ9M8tMkv05ySZJ/TvLAaep4X/senTDF/CPa+Tck2apv3sJ23ps38G2QNA3DW0PX/rH/Ms3n6zXAvsCfARcD/wz83Qg3/05gU+Conno2Az4D3AEcWFW/HnRlSR4BLAH+B9gH+P2hVnv37b0G+DawLfD37fYOBc4CjgRO6Wu/GfBV4LHA4cCLgV2BryXZvKfpa4HbgTcA+wP/DvwlcHaSu/0daL/g/O929IVJFk5T9haM9t9UUr+qcnDYoAEo4Ii+aW+nCckjpljmCcBzRlzXR4FfAvcDApwB3AzsPlP9k6xrr7bdPkOsb9Mppj+nfe9OmGL+5pO836+iCeVdeqbtDKwHXt0zbdtJ1veSqX434LB23ufbn380SZsj2nlnte/vQ3vmLWznvXncn1MHh3vjYM9bQ5PkqTQ97XdU1Qcna1NVF1TV10ZcytuBhwAvBY4D/j/gJVV13mxWkuSDwNfb0a+0u4E/2DN//yTfaXdD35jkv5I8pm8db26X2y3JWUnWAqdPscm/A9YwRS+2qm6e5H09EPhuVa3saXc5Te/9oJ5p10yyymXtz+0mmXc4cD1NQP+6HZ/KW9uffz9NG0lDZHhrmN5A84f+rTM1HKWq+gFNb/CfaALl2Kr65Aas6i3AX7evjwKe3k4jyf40vdK1wAtodkHvBnwryWRh+Bngv2nC9m7HkNvd0nsBZ1fVulnU+Hjgh5NMXwEsmmHZvdqfF/fV8gia3fWfaEP/v4A/7j+u3ePnwLuBI5M8csC6Jc2B4a2hSPIA4HnAF6rqpr55C3uHe6ikM4CtgDOraoO+TFTVpdwZbBdV1XfbadB8QbkMOKCqzqyqjwH7AVvS7H3o93+r6viq+mpVfX2S+VvT7Oa/sn/GDO/fg2l6yP2uo/n9J9V+wTgO+HJVLe+b/SJgAfChdvxUmvMIXjDV+oC30Xxxe9M0bSQNieGtYXkUzR/4u+yabkPiNz3DrX0nUk20+/129/JMw9dnKiTJTsDx7ej2c/u1Jl3/5sDuND3T9RPTe3ZX7zXJYp/ewG09jLu+f7+Z6xeg9ovWZ2iOi790kiaHAz+pqu+0418GfsY0u86r6jrg34CX9B86kDR8hreGZZv25419028AntIOy2l6sDdPsvz/AI8bYHjJdEW0l6F9rq3jL4Hdkwz7DPGtaE6E+/kk835B0xvuN1nbXtcCtwI79k1fw53v3/smWe56Ju9hT9ojb88i/yzNl63nVdWqvvl70uxu/1SSLZNsCTwQ+BTwtCSPnuZ3OIGmx3/cNG0kDcE9tQtT934TJ0Td5ZhnG9TLAZLsTNPju5uqugX40VwKSLIA+ATNCVhPA35Cswv7dTS9x2G5nuZM6odNMu9hNAHWr6ZbYVWtT/INYL8km0wc92579hPv3x9NsugKmuPe/RYBF/VOSLIxzeGEPYH9qurCSZab6F3/HZOfOPcSpjgxrarWJvlnmh74v07WRtJw2PPWsKwAfgr86WQ3/kjyOzTHdZf1zxuiE2lOtDqkqi6pqjtoQmS/JE8a1kbaLyTnAoe0XxgAaE/W+j3uPEN9tt5OswfjbbNY5kyaHvGjeurYCXhGO29i2kY0l9DtAzy/qr7bv6Ikm9BcInYOzWVr/cP5wIuTZJp63gOsZswnLUr3dva8NRRVdUeSo2jOTD43yTuBHwP3p7mByItormH+zpQrmYMkR9OcEf7KqurtZZ8K/CNN7/uFQ9zkP9Ccbf65JO8BHtBu50aanuesVdVXkhwD/EuSJ9CcMHY5zYlsj6a5WcvN3LUX/z7gaOAzSf6+nfcW4CrgvT3tTgIOoTkD/+YkT+uZt6rdff6HNF+wXjPZSXVJ3ktzc5e9gUkv96uq25IcR3NjG0kjYs9bQ1NVnweeSXOG9ltpLtf6EPAnNMehH9texjVUSZ4HvAt4d1X9e19Nt9H0yA9pe6RDUVVfpAm7LWmu2/4Pmt/7mVX1szms9+3As2iOgR9Ps7v/DJrd2Z8Adq2q23va30zTm/4x8GGa3vXlNDdeWduz6gPan2+k+QLVO7y8nXc48CvgP6co7+PMfM03wAdoDllIGpFUTXsoTppSkgJeOtUNWea7rtcv6b7LnrckSR3TufBOcuS4a5iLLtff5drB+sepy7VDt+vvcu1d094y+ZIkK9vzV/rnvzrJRUkuSPKV3jsSJjk8zdMLf5JkpkNT3QtvmicrdVmX6+9y7WD949Tl2qHb9Xe59s5orzw5ieb8kkXAYUn6b1H8fWDPqnoCzbksb2+XfTDN3QmfCiwG3jTN7YgBzzbXHFTVdJcMzXtdr1/SvLIYWFlVlwEkOY3m4UC/vd9C30OZvktzFQ40t5Y+u71TIUnOpnl078en2thIwnubbbapRz5yp1Gsmh123JE99tizs2fZdbn+e6L2y669ZWTrvv+DH8ZWOy0aWf07b73ZqFYNNO//7iN8/y+9ZrIb3w3H/bZ6GFvs+LiRfnZ2GuH7v/0OO/LEJ+8xsvpvv2N0b80jttuB3Z64+8g2sPqqK7n+ujXz8ovwgq12qVo/nL8ptfbnK2jugjhhSVX1XhK5Hc0lmhNW0fSkp/Iy4AvTLDvZA45+ayTh/chH7sS3z+l/1oE0sxeeeu64S9hgH33J7uMuYU6ev+SccZcwJx968R7jLmGDXX/zbB4kN78cvP+zxl3ClGr9LWz6pJfP3HAAt37rLbdW1Z7DWFeSF9Hc6XCy5yAMpIvHvCVJmm9WAzv0jG/fTruL9lkLbwQObO9DMfCyvQxvSZLmbhmwa5Kd21sNH0rPLYoBkjyZ5s6HB1bV1T2zzgKem2Sr9kS157bTpuQJa5IkzVH7cKGjaUJ3AXBKVa1obxe8vKrOpHnWwgOA/2wfEXBlVR1YVdcleQt3PvvhuImT16ZieEuSNARVtRRY2jft2J7XUz6euKpOAU4ZdFvuNpckqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mSOsbwliSpYwYK7yT7J7kkycokx4y6KEmSNLUZwzvJAuAk4ABgEXBYkkWjLkySJE1ukJ73YmBlVV1WVeuA04CDRluWJEmayiDhvR1wVc/4qnbaXSQ5MsnyJMuvWXPNsOqTJM1j11+7hom//e1w5Lhrui9YOKwVVdUSYAnAHnvsWcNaryRp/tpq621YverKPcddx33NID3v1cAOPePbt9MkSdIYDBLey4Bdk+ycZBPgUODM0ZYlSZKmMuNu86pan+Ro4CxgAXBKVa0YeWWSJGlSAx3zrqqlwNIR1yJJkgbgHdYkSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqQhmOkJnEmeneS8JOuTHNw37+1JViS5OMn/TZLptmV4S5I0RwM+gfNK4AjgY33L/h7wDOAJwG7AU4C9ptve0O5tLknSfdhvn8AJkGTiCZwXTTSoqivaeXf0LVvA/YBNgAAbA7+cbmP2vCVJmtk2Mzw9baAncE6mqr4DfA34eTucVVUXT7eMPW9J0r1SNt6UjbfbZSjruhXWVNVInp6WZBfgcTQP/gI4O8mzquqbUy1jz1uSpLmbyxM4/wT4blWtraq1wBeAp0+3gOEtSdLczeUJnFcCeyVZmGRjmpPVpt1tbnhLkjRHVbUemHgC58XA6VW1IslxSQ4ESPKUJKuAQ4D3Jpl4QucZwKXAhcAPgB9U1Wen257HvCVJGoLJnsBZVcf2vF7Gnce1e9vcDrxiNtuy5y1JUscY3pIkdYzhLUlSxxjekiR1jCesaV553V6/M+4SNtiS714x7hLm5PW/v+u4S5iTC1bfMO4SNtj5v7xp3CVssBtu/c24S7hPsuctSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHXMjOGd5JQkVyf54T1RkCRJmt4gPe8PAvuPuA5JkjSgGcO7qr4BXHcP1CJJkgYwtGPeSY5MsjzJ8mvWXDOs1UqS5rGbb7yOib/97XDkuGu6LxhaeFfVkqras6r23HabbYe1WknSPLb5Fg9m4m9/OywZd03jkmT/JJckWZnkmEnmPzvJeUnWJzm4b96OSb6U5OIkFyXZabpteba5JElzlGQBcBJwALAIOCzJor5mVwJHAB+bZBUfAv61qh4HLAaunm57C+dasCRJYjGwsqouA0hyGnAQcNFEg6q6op13R++CbcgvrKqz23ZrZ9rYIJeKfRz4DvCYJKuSvGzgX0WSpHuHbWY4tr8dcFXP+Kp22iAeDdyQ5FNJvp/kX9ue/JRm7HlX1WEDblySpHlj4cYL2frhWw9lXb+CNVW151BWdncLgWcBT6bZtf4Jmt3rJ0+1gMe8JUmau9XADj3j27fTBrEKOL+qLquq9cB/AbtPt4DhLUnS3C0Ddk2yc5JNgEOBM2ex7JZJJi7V2oeeY+WTMbwlSZqjtsd8NHAWcDFwelWtSHJckgMBkjwlySrgEOC9SVa0y94OvBb4SpILgQDvm257nm0uSdIQVNVSYGnftGN7Xi+j2Z0+2bJnA08YdFv2vCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hifKqZ55SFbbDruEjbYv5144bhLmJNTj3rGuEuYk7d9ZeW4S9hg3166bNwlbLDbfnHjuEu4T7LnLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJA1Bkv2TXJJkZZJjJpn/7CTnJVmf5OBJ5j8oyaok755pW4a3JElzlGQBcBJwALAIOCzJor5mVwJHAB+bYjVvAb4xyPYMb0mS5m4xsLKqLquqdcBpwEG9Darqiqq6ALijf+EkewAPBb40yMYMb0mSZrZNkuU9w5F987cDruoZX9VOm1GSjYB/A147aDELB20oSVKXbLzJArbb7kFDWdcVsKaq9hzKyu7ulcDSqlqVZKAFZgzvJDsAH6LpzhewpKpOnEuVkiTdy6wGdugZ376dNoinA89K8krgAcAmSdZW1d1OepswSM97PfCaqjovyQOBc5OcXVUXDViUJEn3dsuAXZPsTBPahwIvHGTBqvrTiddJjgD2nC64YYBj3lX186o6r339K+BiBtyPL0nSfUFVrQeOBs6iycnTq2pFkuOSHAiQ5ClJVgGHAO9NsmJDtzerY95JdgKeDJwzybwjgSMBdthxxw2tR5LUIbVuLUmW90xaUlVLxlbQGFXVUmBp37Rje14vo9mdPt06Pgh8cKZtDRzeSR4AfBL4m6q6aZINLgGWAOyxx5416HolSd2VTR7AHb++blQncmkKA10qlmRjmuD+aFV9arQlSZKk6cwY3mnOWz8ZuLiq3jn6kiRJ0nQG6Xk/A3gxsE+S89vhD0ZclyRJmsKMx7yr6lvAYFeNS5KkkfP2qJIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscsHMVKL7v2Fl546rmjWPXIvW6v3xl3CXPykC02HXcJc/KIre4/7hI22H+84mnjLmFOFj/qweMuYU5uu+32cZewwT7+L4eMu4QN9trDTh53CfdJ9rwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqQhSLJ/kkuSrExyzCTzn53kvCTrkxzcM/1JSb6TZEWSC5K8YKZtGd6SJM1RkgXAScABwCLgsCSL+ppdCRwBfKxv+i3AS6rq8cD+wLuSbDnd9kZynbckSfcxi4GVVXUZQJLTgIOAiyYaVNUV7bw7ehesqh/3vP5ZkquBbYEbptqYPW9Jkma2TZLlPcORffO3A67qGV/VTpuVJIuBTYBLp2tnz1uSdK+06cYL2OlhDxrKur4Na6pqz6GsbApJHg58GDi8qu6Yrq09b0mS5m41sEPP+PbttIEkeRDweeCNVfXdmdob3pIkzd0yYNckOyfZBDgUOHOQBdv2nwY+VFVnDLKM4S1J0hxV1XrgaOAs4GLg9KpakeS4JAcCJHlKklXAIcB7k6xoF//fwLOBI5Kc3w5Pmm57HvOWJGkIqmopsLRv2rE9r5fR7E7vX+4jwEdmsy173pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUsfMGN5J7pfke0l+0D6u7B/vicIkSdLkBrnO+zZgn6pam2Rj4FtJvjDI7dskSdLwzRjeVVXA2nZ043aoURYlSZKmNtAx7yQLkpwPXA2cXVXnTNLmyIlHpd32q+uHXKYkaT666fprmeFRmRqBgW6PWlW3A09KsiXw6SS7VdUP+9osAZYAbLXTInvmknQf8KCttubqn60a6aMydXezOtu8qm4AvgbsP5JqJEnSjAY523zbtsdNkvsD+wE/GnFdkiRpCoPsNn84cGqSBTRhf3pVfW60ZUmSpKkMcrb5BcCT74FaJEnSALzDmiRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JElDkGT/JJckWZnkmEnmPzvJeUnWJzm4b97hSX7SDofPtC3DW5KkOUqyADgJOABYBByWZFFfsyuBI4CP9S37YOBNwFOBxcCbkmw13fYMb0mS5m4xsLKqLquqdcBpwEG9Darqiqq6ALijb9nnAWdX1XVVdT1wNrD/dBtbOLy677Tz1pvx0ZfsPopVj9yS714x7hLm5N9OvHDcJczJf7ziaeMuYYPt89iHjLuEOdn7Hf897hLm5P8c8Ohxl7DBDjvi+HGXsMFuu/zn4y5hvtgOuKpnfBVNT3pDl91uugVGEt6SJI3bpgs3YpeHbDas1W2TZHnP+JKqWjKslc+W4S1J0szWVNWe08xfDezQM759O20Qq4G9+5b9+nQLeMxbkqS5WwbsmmTnJJsAhwJnDrjsWcBzk2zVnqj23HbalAxvSZLmqKrWA0fThO7FwOlVtSLJcUkOBEjylCSrgEOA9yZZ0S57HfAWmi8Ay4Dj2mlTcre5JElDUFVLgaV9047teb2MZpf4ZMueApwy6LbseUuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMQOHd5IFSb6f5HOjLEiSJE1vNj3vVwEXj6oQSZI0mIHCO8n2wB8C7x9tOZIkaSaD9rzfBbwOuGOqBkmOTLI8yfI1a64ZRm2SpHmu1v+aib/97XDkuGu6L1g4U4MkfwRcXVXnJtl7qnZVtQRYArD7HnvWsAqUJM1fWXh/7lj3qz3HXcd9zSA972cABya5AjgN2CfJR0ZalSRJmtKM4V1Vr6+q7atqJ+BQ4KtV9aKRVyZJkibldd6SJHXMjMe8e1XV14Gvj6QSSZI0EHvekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiQNQZL9k1ySZGWSYyaZv2mST7Tzz0myUzt94ySnJrkwycVJXj/TtgxvSZLmKMkC4CTgAGARcFiSRX3NXgZcX1W7ACcAb2unHwJsWlW/C+wBvGIi2KdieEuSNHeLgZVVdVlVraN5FshBfW0OAk5tX58B7JskQAGbJ1kI3B9YB9w03cZmdYc1SZK64n4LN+Ix2242rNVtk2R5z/iS9mmaE7YDruoZXwU8tW8dv21TVeuT3AhsTRPkBwE/BzYD/raqrpuuGMNbkqSZramqUT36dDFwO/AIYCvgm0m+XFWXTbWAu80lSZq71cAOPePbt9MmbdPuIt8CuBZ4IfDFqvpNVV0NfBuY9ouC4S1J0twtA3ZNsnOSTWgeoX1mX5szgcPb1wfTPGK7gCuBfQCSbA48DfjRdBszvCVJmqOqWg8cDZwFXAycXlUrkhyX5MC22cnA1klWAq8GJi4nOwl4QJIVNF8CPlBVF0y3PY95S5I0BFW1FFjaN+3Ynte30lwW1r/c2smmT8eetyRJHWN4S5LUMYa3JEkdM5Jj3pdeczPPX3LOKFY9cq///V3HXcKcnHrUM8ZdwpwsftSDx13CBtv7Hf897hLm5Ouv3WvcJczJLbetH3cJG2zfV7x43CVssG8d/+Vxl3CfZM9bkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYhYM0SnIF8CvgdmB9Ve05yqIkSdLUBgrv1nOqas3IKpEkSQNxt7kkSR0zaHgX8KUk5yY5crIGSY5MsjzJ8nVrbxhagZKk+Wvd2huY+NvfDpNmhIZr0N3mz6yq1UkeApyd5EdV9Y3eBlW1BFgCsMWOj6sh1ylJmoc2ecCW3HLtzz0P6h42UM+7qla3P68GPg0sHmVRkiR1TZL9k1ySZGWSYyaZv2mST7Tzz0myU8+8JyT5TpIVSS5Mcr/ptjVjeCfZPMkDJ14DzwV+OOvfSpKke6kkC4CTgAOARcBhSRb1NXsZcH1V7QKcALytXXYh8BHgL6rq8cDewG+m294gPe+HAt9K8gPge8Dnq+qLA/9GkiTd+y0GVlbVZVW1DjgNOKivzUHAqe3rM4B9k4SmU3xBVf0AoKqurarbp9vYjMe8q+oy4Imz+x0kSRqvTRdsxE4P3HxYq9smyfKe8SXtuV4TtgOu6hlfBTy1bx2/bVNV65PcCGwNPBqoJGcB2wKnVdXbpytmNtd5S5J0X7VmhDcoWwg8E3gKcAvwlSTnVtVXplrA67wlSZq71cAOPePbt9MmbdMe594CuJaml/6NqlpTVbcAS4Hdp9uY4S1J0twtA3ZNsnOSTYBDgTP72pwJHN6+Phj4alUVcBbwu0k2a0N9L+Ci6TbmbnNJkuaoPYZ9NE0QLwBOqaoVSY4DllfVmcDJwIeTrASuowl4qur6JO+k+QJQwNKq+vx02zO8JUkagqpaSrPLu3fasT2vbwUOmWLZj9BcLjYQd5tLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxhrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hLktQxI3mq2E5bb8aHXrzHKFY9chesvmHcJczJ276yctwlzMltt90+7hI22P854NHjLmFObrlt/bhLmJPNNu3uQxL3323bcZewwS64f3ff9y6z5y1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdYzhLUlSxxjekiQNQZL9k1ySZGWSYyaZv2mST7Tzz0myU9/8HZOsTfLambZleEuSNEdJFgAnAQcAi4DDkizqa/Yy4Pqq2gU4AXhb3/x3Al8YZHuGtyRJc7cYWFlVl1XVOuA04KC+NgcBp7avzwD2TRKAJM8HLgdWDLKxhcOoWJKk+WbBRmHrB24yrNVtk2R5z/iSqlrSM74dcFXP+CrgqX3r+G2bqlqf5EZg6yS3An8H7AfMuMscBgzvJFsC7wd2Awr4s6r6ziDLSpJ0L7CmqvYc0brfDJxQVWvbjviMBu15nwh8saoOTrIJsNmG1SdJ0r3SamCHnvHt22mTtVmVZCGwBXAtTQ/94CRvB7YE7khya1W9e6qNzRjeSbYAng0cAdDuy1834C8jSdJ9wTJg1yQ704T0ocAL+9qcCRwOfAc4GPhqVRXwrIkGSd4MrJ0uuGGwE9Z2Bq4BPpDk+0nen2Tz/kZJjkyyPMny665dM8BqJUldt/aG65j4298OR467pnGoqvXA0cBZwMXA6VW1IslxSQ5sm51Mc4x7JfBq4G6Xkw1qkN3mC4Hdgb+qqnOSnNhu8B/6Cl8CLAF44pP3qA0tSJLUHQ/Y8sFc94vVozoW3ClVtRRY2jft2J7XtwKHzLCONw+yrUF63quAVVV1Tjt+Bk2YS5KkMZgxvKvqF8BVSR7TTtoXuGikVUmSpCkNerb5XwEfbc80vwx46ehKkiRJ0xkovKvqfMBjGpIkzQPeHlWSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeqYhaNY6e13FNffvG4Uqx65839507hLmJNvL1027hLm5OP/csi4S9hghx1x/LhLmJN9X/HicZcwJ/vvtu24S9hgL3/qzuMuYYN9YPNNx13CfZI9b0mSOsbwliSpYwxvSZI6xvCWJKljDG9JkjrG8JYkqWMMb0mShiDJ/kkuSbIyyTGTzN80ySfa+eck2amdvl+Sc5Nc2P7cZ6ZtGd6SJM1RkgXAScABwCLgsCSL+pq9DLi+qnYBTgDe1k5fA/xxVf0ucDjw4Zm2Z3hLkjR3i4GVVXVZVa0DTgMO6mtzEHBq+/oMYN8kqarvV9XP2ukrgPsnmfbuNyO5w5okSeO28YKN2PaBQ7sD3DZJlveML6mqJT3j2wFX9YyvAp7at47ftqmq9UluBLam6XlP+F/AeVV123TFGN6SJM1sTVXtOcoNJHk8za70587U1t3mkiTN3Wpgh57x7dtpk7ZJshDYAri2Hd8e+DTwkqq6dKaNGd6SJM3dMmDXJDsn2QQ4FDizr82ZNCekARwMfLWqKsmWwOeBY6rq24NszPCWJGmOqmo9cDRwFnAxcHpVrUhyXJID22YnA1snWQm8Gpi4nOxoYBfg2CTnt8NDptuex7wlSRqCqloKLO2bdmzP61uBuz33uKreCrx1Ntuy5y1JUscY3pIkdYzhLUlSxxjekiR1jOEtSVLHzBjeSR7Tc+r6+UluSvI390BtkiRpEjNeKlZVlwBPgt8+NWU1zV1gJEnSGMx2t/m+wKVV9dNRFCNJkmY22/A+FPj4ZDOSHJlkeZLl11+7ZrImkqR7mWvWXMPE3/52OHLcNd0XDHyHtfZerQcCr59sfvtotCUAuz1x9xpKdZKkeW3bbbblyp/+dKRP29LdzabnfQDNM0Z/OapiJEnSzGYT3ocxxS5zSZJ0zxkovJNsDuwHfGq05UiSpJkMdMy7qm4Gth5xLZIkaQDeYU2SpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUnqGMNbkqSOMbwlSeoYw1uSpI4xvCVJ6hjDW5KkjjG8JUkagiT7J7kkycokx0wyf9Mkn2jnn5Nkp555r2+nX5LkeTNty/CWJGmOkiwATgIOABYBhyVZ1NfsZcD1VbULcALwtnbZRcChwOOB/YH3tOubkuEtSdLcLQZWVtVlVbUOOA04qK/NQcCp7eszgH2TpJ1+WlXdVlWXAyvb9U0pVTXU6gGSXAP8dOgrbmwDrBnRuu8JXa6/y7WD9Y9Tl2uHbtc/6tofWVXbjnD9GyzJF2l+/2G4H3Brz/iSqlrSs62Dgf2r6uXt+IuBp1bV0T1tfti2WdWOXwo8FXgz8N2q+kg7/WTgC1V1xlTFLBzSL3UXo/yHTLK8qvYc1fpHrcv1d7l2sP5x6nLt0O36u1z7XFXV/uOuYVTcbS5J0tytBnboGd++nTZpmyQLgS2Aawdc9i4Mb0mS5m4ZsGuSnZNsQnMC2pl9bc4EDm9fHwx8tZpj12cCh7Zno+8M7Ap8b7qNjWS3+YgtmbnJvNbl+rtcO1j/OHW5duh2/V2uvTOqan2So4GzgAXAKVW1IslxwPKqOhM4GfhwkpXAdTQBT9vudOAiYD1wVFXdPt32RnLCmiRJGh13m0uS1DGGtyRJHdOp8J7p1nPzWZJTklzdXufXKUl2SPK1JBclWZHkVeOuaTaS3C/J95L8oK3/H8dd02wlWZDk+0k+N+5aZivJFUkuTHJ+kuXjrmc2kmyZ5IwkP0pycZKnj7umQSV5TPueTww3Jfmbcdel4ejMMe/2VnE/BvYDVtGc2XdYVV001sIGlOTZwFrgQ1W127jrmY0kDwceXlXnJXkgcC7w/A699wE2r6q1STYGvgW8qqq+O+bSBpbk1cCewIOq6o/GXc9sJLkC2LOqOneTkySnAt+sqve3ZxBvVlU3jLmsWWv/fq6muWnIqG6gpXtQl3reg9x6bt6qqm/QnF3YOVX186o6r339K+BiYLvxVjW4aqxtRzduh258awWSbA/8IfD+cddyX5JkC+DZNGcIU1XruhjcrX2BSw3ue48uhfd2wFU946voUIDcW7RPwXkycM6YS5mVdrfz+cDVwNlV1aX63wW8DrhjzHVsqAK+lOTcJEeOu5hZ2Bm4BvhAe8ji/Uk2H3dRG+hQ4OPjLkLD06Xw1pgleQDwSeBvquqmcdczG1V1e1U9iebORYuTdOLQRZI/Aq6uqnPHXcscPLOqdqd52tJR7SGkLlgI7A78e1U9GbgZ6NS5NgDt7v4Dgf8cdy0ani6F96xvH6fhaY8VfxL4aFV9atz1bKh2t+fXaB671wXPAA5sjxufBuyT5CPjLWl2qmp1+/Nq4NPM8LSkeWQVsKpnL80ZNGHeNQcA51XVL8ddiIanS+E9yK3nNALtCV8nAxdX1TvHXc9sJdk2yZbt6/vTnPT4o7EWNaCqen1VbV9VO9F85r9aVS8ac1kDS7J5e5Ij7S7n5wKduOKiqn4BXJXkMe2kfWnugNU1h+Eu83udztwedapbz425rIEl+TiwN7BNklXAm6rq5PFWNbBnAC8GLmyPGwO8oaqWjq+kWXk4cGp7xu1GwOlV1blLrjrqocCnm+9/LAQ+VlVfHG9Js/JXwEfbDsNlwEvHXM+stF+Y9gNeMe5aNFyduVRMkiQ1urTbXJIkYXhLktQ5hrckSR1jeEuS1DGGtyRJHWN4S5LUMYa3JEkdY3hrSkk+2MXnRw9Lkr3b25JOO20+6nLtkmZmeM8D/SGZ5OtJ3n0Pbn+q7b0KmFe34kzy+iTLktyU5Jokn+1/yEiSK5LUJMPnR1jX49p/x6uSrGt/np3k8PbObsPcVpL8MMk7+6Y/M8mvk8ybu2kleWWSy5Pc2j5V7FkDLPPwJKe2/763JrkoyV498xckeUvPei9P8tYkk94xsv3MVP9nfJDPkjRfGd73Yu0tHTdYVd04D59fvDfwHuD3gH2A9cCXkzy4p81TaG6JOjHsTvNYytNHUVCS5wPfBzYFXgLsAjyP5kEur2+nD001t0X8J+AVSbZpa3gM8BngnVX13mFub0MleQFwInA8zWNk/wf4QpIdp1lmS+DbQGieYf44mluUXt3T7O+Ao4C/Bh5L8yXzKJr3un99TwOOBC6YZHN7M/NnSZqfqsphzAPwQeBzPa+rb9iJ5o/Z64BLgV8DFwIv6lvP14F/B95B8xziZTRPz/omcD1wHc294R/Xt+27bW+Sujalea70L4Fbge/SPOqxf/vvofljvYbmD+47gI162jy7XXYtcCPwPWC3Obx3DwBuB/54mjZvBG4A7j/Lde8NXDHdNOCJwDqae71Pto6M6DOzEfDj9r1+KM19tz88m9rvgc/1OcD7+qb9BPjnaZY5Hvj2DOv9HHBq37RTJz6rPdO2aP+/PKf9bL57rp8lB4f5Mtjznn9eBXwH+AB39hyvAt4KvIymh7EI+GfgvUn+sG/5F9EE/bNoeoGb04TuYpo/3jcCn+3plU+1vX5vB14A/BlNL+pC4ItJHt7X7k9pejC/BxwN/E27HO1uzc8A36IJvae2td3ezj+i3b2500xvUo8H0gTZ9ZPNbJ+I9jLgI1X161msd1AnAsuq6vjJZlbVSB4eUFV30ATdUcBS4HKa33OokrwhydoZhrvtCm8/X3sAX+qb9SWaz8ZUng+ck+QTSa5Ocn6So9t/xwnfAp6T5LHtthbR9Jz7H5SzBDijqr424K877WdJmk8681Sx+4qqujHJOuCWah5JOPFkoFcDz62qb7ZNL0+ymOaPd++x3Mur6jU94xf3rj/JS4GbaML8W5Ntr1+7/b8EXl5Vn2+n/QXNH8yjgL/vaX5RVR3bvv5xkj+neZTix4EHAVsCn62qS9s2vY/mvBG4BPjNlG/Q3Z0InE/zBWQy+wE7A++bxToHkuSRwF7A4T3TNgJ+AWzWTvpkVR0+yeLDcBrw/2je132qat1sV5Dk1TSfrTXtpM9X1Rt7mvwHMx9uWD3JtG1onv7X/wzpXwK/P826HgW8EjgB+BfgSTS/I8DEMeu30QTtRUlup/k79k9V9Z6JlbSfu12Y3TkbM32WpHnD8O6GRcD9aHq6vT25jYEr+tqe2zuS5HeAt9D0crel6VlsBEx53HESv9Nu69sTE6rq9iTfaWvr1X9s8WfAQ9plrkvyQeCsJF8BvkLTM7qynf9p4NODFtWesPVMmt33t0/R7M9pesY/GHS9s/C77c/v9U2f6Fn+D82XkbtJ8laa3fnTeU5VfX2a+f+P5v/w1sAdM6xrKrsBr6qqT042s6quozncck/ZCFheVRPHr7+fZFeaL4kT4f0Cmr1KLwRW0AT8iUkur6qT2+P/x9N8Lgb6IjjgZ0maN9xt3g0T/05/TPOHamJ4PPDcvrY3941/jia0X0ET4E+m2a09p5PZevTvFu7/Y1n0fM6q6qVtHd8ADgQuSfK82W40yQnAYTQ9zsumaPMQ4CBG0OtuPbD9uX5iQlXdUVUrgWtp3vepvjS8i+ZkrOmG/i8Fv5XkTcD/Ap5O829+9Ab+DrvR9Dan2s4G7Tan6cnfTnM8vtdDafZMTOXnwEV90y7mrl82/xV4R1WdVlUXVtWHgXdy5wlrT6fp+a9Isj7Jepo9JK9sx+9yAuEgnyVpvrHnPT+to9nlOOEi4DbgkVX11UFXkmRrmrNxXzlx3C/J7tz9371/e/0ubds8o31Ne/nT04GPDVrPhLYX/APgbUm+QLPb+axBl09yIk3v6zlV9aNpmh5B8759fLY1DuiH7c9nAiv75k1ccjRpeFfVGu7cVT0rSV4GHENzGOX8JG8H/iHJiVV1yyzWE+AxwCfbQ8oXVNVL+ppt0G7zqlqX5Fyawxb/2TNrP5qz8Kfy7bamXo8GftozvhnteRI9bufOL4n/BSzvm/8BmpPljqf5LAOz+ixJ84rhPT9dASxuT9xaS7Pb8h3AO9o/uN+gOTP2acAdVbVkivVcTxMQf57kKmA7ml7L+r52d9tee0IUAFV1c5J/pwnbNTQnR/0tTS/qPQwoyc40ewDOpPmD/yjgCTRnyJPkT2hOxNu3qiY7jkqSk4AX05zYdH2Sh7Wz1lbV2p52AV4OnNY7fZiq6sIknwH+rT1B6xs0exqeQHMc+eqqWjXMbSb5A5r3/EU95z+8D3gDzXt7wixWtzPNOQpPn6rBHHebvxP4cJLv0YTyXwCPoPlCAECSo4Gjq+qx7aQTgP9J8kbgEzR7iv6a5veb8FngmCSX0+w2fzLN+/2htuYbaK4u+K0kN9N8rn/YM22gz5I0L437dHeHu16S1Y4/muakmVu466Vif8WdvfBrgLOB/XqW+zp9l8PQnFT2Q5rLu35Ic/3xWuCI6bbXXxd3vVTsNqa+VKx/+73reCjwKZrgvg24kuYs9o3b+Uf0bn+K96r/sraJ4c197Z7TTl88xXoG2dbezHyp2CY0l/Bd0L5/N9Fcovdm4GFD/pw8pf23+9tJ5r2mfV83nUXtBwKnjPiz/UqaL4e30ZyP8ey++W+mPSm/Z9of0uyxuJXmcri/pueSO5rDFe+i6Y3/muYyueOB+01Tx2SfzYE+Sw4O83FI1UiuZJHmtST/CBwMPLGq+vdETLTZG/hgVe003bT5aJDak7wB+E1V/es9XqCkOfGENd1X/QFw1FTBfR+xG32XEkrqBo956z6pqp4y7hrGrapeOO4aJG0Ye97S1K6gObY607T56Aq6W7ukGXjMW5KkjrHnLUlSxxjekiR1jOEtSVLHGN6SJHWM4S1JUscY3pIkdcz/DyaqDNDKjG/rAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -1321,7 +1297,7 @@ } ], "source": [ - "itr, norm, X_G = read_data_file(\"g02an.d\")\n", + "itr, norm, X_G = read_data_file(\"G02AN.d\")\n", "\n", "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", diff --git a/nearest_correlation_matrices/output.txt b/nearest_correlation_matrices/output.txt new file mode 100755 index 0000000..08a1ffe --- /dev/null +++ b/nearest_correlation_matrices/output.txt @@ -0,0 +1,70 @@ +The approximate correlation matrix + 1.0000 -0.3250 0.1881 0.5760 0.0064 -0.6111 -0.0724 -0.1589 + -0.3250 1.0000 0.2048 0.2436 0.4058 0.2730 0.2869 0.4241 + 0.1881 0.2048 1.0000 -0.1325 0.7658 0.2765 -0.6172 0.9006 + 0.5760 0.2436 -0.1325 1.0000 0.3041 0.0126 0.6452 -0.3210 + 0.0064 0.4058 0.7658 0.3041 1.0000 0.6652 -0.3293 0.9939 + -0.6111 0.2730 0.2765 0.0126 0.6652 1.0000 0.0492 0.5964 + -0.0724 0.2869 -0.6172 0.6452 -0.3293 0.0492 1.0000 -0.3983 + -0.1589 0.4241 0.9006 -0.3210 0.9939 0.5964 -0.3983 1.0000 + +Sorted eigenvalues of G: -0.2498 -0.0160 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355 + +Nearest correlation matrix + 1.0000 -0.3112 0.1889 0.5396 0.0268 -0.5925 -0.0621 -0.1921 + -0.3112 1.0000 0.2050 0.2265 0.4148 0.2822 0.2915 0.4088 + 0.1889 0.2050 1.0000 -0.1468 0.7880 0.2727 -0.6085 0.8802 + 0.5396 0.2265 -0.1468 1.0000 0.2137 0.0015 0.6069 -0.2208 + 0.0268 0.4148 0.7880 0.2137 1.0000 0.6580 -0.2812 0.8762 + -0.5925 0.2822 0.2727 0.0015 0.6580 1.0000 0.0479 0.5932 + -0.0621 0.2915 -0.6085 0.6069 -0.2812 0.0479 1.0000 -0.4470 + -0.1921 0.4088 0.8802 -0.2208 0.8762 0.5932 -0.4470 1.0000 + +Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 + +Nearest correlation matrix using row and column weighting + 1.0000 -0.3250 0.1881 0.5739 0.0067 -0.6097 -0.0722 -0.1598 + -0.3250 1.0000 0.2048 0.2426 0.4060 0.2737 0.2870 0.4236 + 0.1881 0.2048 1.0000 -0.1322 0.7661 0.2759 -0.6171 0.9004 + 0.5739 0.2426 -0.1322 1.0000 0.2085 -0.0890 0.5954 -0.1805 + 0.0067 0.4060 0.7661 0.2085 1.0000 0.6556 -0.2780 0.8757 + -0.6097 0.2737 0.2759 -0.0890 0.6556 1.0000 0.0490 0.5746 + -0.0722 0.2870 -0.6171 0.5954 -0.2780 0.0490 1.0000 -0.4550 + -0.1598 0.4236 0.9004 -0.1805 0.8757 0.5746 -0.4550 1.0000 + +Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 1.8910 3.4639 + +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + +Nearest correlation matrix using element-wise weighting + 1.0000 -0.3251 0.1881 0.5371 0.0255 -0.5893 -0.0625 -0.1929 + -0.3251 1.0000 0.2048 0.2249 0.4144 0.2841 0.2914 0.4081 + 0.1881 0.2048 1.0000 -0.1462 0.7883 0.2718 -0.6084 0.8804 + 0.5371 0.2249 -0.1462 1.0000 0.2138 -0.0002 0.6070 -0.2199 + 0.0255 0.4144 0.7883 0.2138 1.0000 0.6566 -0.2807 0.8756 + -0.5893 0.2841 0.2718 -0.0002 0.6566 1.0000 0.0474 0.5930 + -0.0625 0.2914 -0.6084 0.6070 -0.2807 0.0474 1.0000 -0.4471 + -0.1929 0.4081 0.8804 -0.2199 0.8756 0.5930 -0.4471 1.0000 + +Sorted eigenvalues of X: 0.0010 0.0010 0.0375 0.1734 0.6882 1.7106 1.9224 3.4660 + +Nearest correlation matrix with fixed leading block + 1.0000 -0.3250 0.1881 0.4606 0.0051 -0.4887 -0.0579 -0.1271 + -0.3250 1.0000 0.2048 0.1948 0.3245 0.2183 0.2294 0.3391 + 0.1881 0.2048 1.0000 -0.1060 0.6124 0.2211 -0.4936 0.7202 + 0.4606 0.1948 -0.1060 1.0000 0.2432 0.0101 0.5160 -0.2567 + 0.0051 0.3245 0.6124 0.2432 1.0000 0.5320 -0.2634 0.7949 + -0.4887 0.2183 0.2211 0.0101 0.5320 1.0000 0.0393 0.4769 + -0.0579 0.2294 -0.4936 0.5160 -0.2634 0.0393 1.0000 -0.3185 + -0.1271 0.3391 0.7202 -0.2567 0.7949 0.4769 -0.3185 1.0000 + +Sorted eigenvalues of X: 0.0000 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356 +Value of alpha returned: 0.2003 + diff --git a/nearest_correlation_matrices/|G-X| for G02AA.png b/nearest_correlation_matrices/|G-X| for G02AA.png deleted file mode 100644 index 69ad820349ecdbad765041cc3b0bd707041609dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7234 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 HmD~RWbI7=9 From 4c8fdfea4515c94975fd7598199b3e7b5e227170 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Thu, 17 Dec 2020 11:35:37 +0200 Subject: [PATCH 012/196] Added link to Ncm --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b9dc70..e25bb4d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This repository contains examples and demonstrations using the [NAG Library for ## Directory of GitHub examples -* [Nearest Correlation Matrices]() +* [Nearest Correlation Matrices](./nearest_correlation_matrices) * [Quadratically constrained quadratic programming and its applications in portfolio optimization]() ## Examples that ship with the product From 9774c4352b9723d11d6aec4b02ed323e12955bf9 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 10:07:39 +0000 Subject: [PATCH 013/196] Added ncm_nag.pdf --- nearest_correlation_matrices/ncm_nag.pdf | Bin 0 -> 139877 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nearest_correlation_matrices/ncm_nag.pdf diff --git a/nearest_correlation_matrices/ncm_nag.pdf b/nearest_correlation_matrices/ncm_nag.pdf new file mode 100644 index 0000000000000000000000000000000000000000..85d0af4d0188c278df12c2537285194c7fc3c9dc GIT binary patch literal 139877 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 literal 0 HcmV?d00001 From 761b5244a7930bec4f44c5b13eb5062f14706315 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 13:01:39 +0000 Subject: [PATCH 014/196] Added ncm_nag.html --- nearest_correlation_matrices/ncm_nag.html | 15412 ++++++++++++++++++++ 1 file changed, 15412 insertions(+) create mode 100644 nearest_correlation_matrices/ncm_nag.html diff --git a/nearest_correlation_matrices/ncm_nag.html b/nearest_correlation_matrices/ncm_nag.html new file mode 100644 index 0000000..8cf790b --- /dev/null +++ b/nearest_correlation_matrices/ncm_nag.html @@ -0,0 +1,15412 @@ + + + + + +ncm_nag + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ac844e7e550e911313441ad9ed21ca70c9b30bf0 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 13:20:26 +0000 Subject: [PATCH 015/196] Fixed pdf --- nearest_correlation_matrices/ncm_nag.ipynb | 5 +++-- nearest_correlation_matrices/ncm_nag.pdf | Bin 139877 -> 139788 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 759f6b9..90bea7f 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -274,7 +274,8 @@ "source": [ "```java\n", "// Define a 2-d array and use Double.NaN to set elements as NaNs\n", - "double[][] P = new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", + "double[][] P = new double[][] {\n", + " { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", " { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 },\n", " { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 },\n", " { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN },\n", @@ -2527,4 +2528,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} +} \ No newline at end of file diff --git a/nearest_correlation_matrices/ncm_nag.pdf b/nearest_correlation_matrices/ncm_nag.pdf index 85d0af4d0188c278df12c2537285194c7fc3c9dc..55517ab9b0965b4fb03b7d6bfaccde1a8f30f199 100644 GIT binary patch delta 70254 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 z zk{HRQsSBqnr_Gp_YB|sHs3o5M_Vk<6vD8`GMX#q%%$PgFZpQhSX1=6H{)`#ZAloWy zmi-LY=B(~l9rtpipb57B0NYKt)K*DJ+Tny;l${#R#?g2JS1mlIR%rw2;D1=wOU>X3 z12saGlFdwI5>r!?;-x{2Yz6v-tgL5S+ag&XrtViEtR(AZ34J2jz@U1zlKF+KXk=R% zydL&QuqF9Ed>}MW)j8?lj?Ut|9%A)W6j$CRX;rXs?n$}X$p`{Pcbvb(uN<7sZVal4 ztuJdX?9!qFt+qM~X-iAkLVx<>3xS&%yd?uq+`B+ZCEDDu`=zTdzwIodHU!q5(;TCl zYuPq_$A3wbY=mbtqDo?XT-jvW!Q;rgJzsah>>S2CQ3rQ*FjZ&Ktk3IB?rqoG^|IIQ z_U^n!c_wo4+$)l{Fg6w~CgT)rP+&bZH1ek2fRA zlGy9)I`?4y&Ki3rIr*KpGBx6;uvp&%QtH}e+9O%p)F^#mf`4R}w@;dic1^m`bgroQ>;)!2w#vU$DW=8{wVt`^iZHP`M89vs z?FWBJMM7bw7AY#Wc7&D!am}(gza+m(n!~mnLU__9VOFE|{T68<+u`re`m2MrwppPF z6E}o~s!TS8j*O3viz-SjNnt?nHYVN{CZxotMoQD!;Nu7;eSaj(4As~MOVzA@M+e(c z*rItqvk~e1ysK}!i({Lz*aEt`q_T|RV+|s7;HtCuRu6G{7d>^Fi-5Hfz00jNRp@5z zsSAD5yN(aB3BnPiDwMZ+16$5C4X8rMSOp(Tjch3c8j@0i@Ou9P<~8V+cm&waN3Vb@ zOeU#MzN&TbXMbw&yOMpLZ!brff(Sq)W%^a?MpuRpIJl<+p-%9l9`f`iTpR>SVB*rB zUUqSf4)jA{Cu&PQ?1wgvY;}4dkBnp^I*+i`4amLwq`I93!H?eq#n?<;u*Gi6df!Lq z&|T5Bs~2zFySi~XGGC>G^MZYJYUG&+(;Wcy&Xo(s|3GOxDL=idTpZl?9wsqMZSm`_rY^Mik8Y;MtkTusiRN zif_KJ{=AIQ=CS9SrH@5N*|MYMsO;!DZM{(i!~TEF;x||DHjdmim_vBsAG2T~X$Wb< zF@tSM{}goq^Y6Drfq6+s5ZD^ey|`ATH-XFUl7Bzm8uSUjd?*LY8Cdx5S$N^7V_UK# zzp&kq&0K*_a9j`9_>H4roung-O;jt{;7s&t%9=0_ddZ64VLrV2&F}r!FCSP_%EV-6 z#kSI&Y)v%-jHsM#2#QWiN=ZYR>1<}aLfq_spn4CDCD;^8u^oO3_;;8J;;;K38-wW+ zoqyo29>V%fIByV0nuFQY*rd$J6cnEtwcnavx#{+|=bAwTbj`c0n(@_Esp{$anu?aY zvshQWVLP6&44Zv78!Ui1@>2z$888`aVX^@B!(t)cD58rs?r zzGnKj&kWZYu9;&3&l)5;&v)GpDT4yMT7MKBdHLF`d=%%fKQYY; zVrkGRlTpALET&D-zv|8V=( z?VCM2oecUwxDMQO7JPC~)1TJw*HeFTnr=zIsEV!i^JOCIF7cp^h}Ve_Bo zfCMbhK5jspVWtFEk#|e4UA|3U=u^B>Xe?7%Iyj)SIHh;eLmmG@E##E2QGasZ?wWNC z`mE`6&lTyzl@IWEZ1(!PH9OAi{WKI&cQ!=4_4Wqo{HM$K$g+6y=tr~)j!SkpxNSsK z$3}v%WkHW2TU8=ovRSFW0h^MUU&7zw@r=I~m%JUm=3 zuMKZ*uB~l0`q$s^6#Sxx8N7daT#M&YCBr_NJmQs(0hRx#ptTwSoqyfn4>QPrbpH(g zRQ4#}8}{qd!DJqa?Dao>W5U^Tmn7HMvaxI5IItY;nkzDH(738U1n}0s^YP$ZNtJEZd%i}C1by023iTgBu2M{%mD2ny1IzTVlykX_R3jeYw zh7u5ovFh+3sc)&GFac31ldN6Yt%=eVzd6DbnDSfSSBSEfbw!`w(}eQl-D_W?w~)#4 zY*sQ8m&%qVFx1S%#8OQyE6vF&%{h!RvyUlz=qGnS>VIdbr5jq+Eiuigrno+*L@N%- zt4lddSJV}^FnAj_k?e4D+wJUr_9CKgcXWH`*$HAFqXJ&I5>CihLfi%3)|bP zQF%ildzbD9A-iIPUkSd^gD-D%P3xe46`ZPJR49(}Km&HgzTo=TvoHMIFrZS5^7{CZ zRSKS4`G4XF#i&9&eyE1CLp8uaw48V$3V9(Eybx{>NB+F$NG&r9kRI72uH@E$Fm|6ZU--uF&GI>1;j|w;(ueKl9?D#VPe$rG2=RB5FGA3w*bHA z8}*cqa~ZnXOn5k0-SEs&R|#<+o-hiL&JEs$T7qYCwUWO>9nWJjbb>qmV8hF);2sQR zjqS)S9}ZZND_5sQCA+YV!6+v;C%0T$A62bThQ|fizrX)^|L2#!McndMk+Ei)<0u`k zd4GsO;&c6A`Fx9>^5;z5B%I9zRHk*|% zZB|x9D8pld5v6|fC$<}A9|g0Uh?=71evteVWE-sA-wV$08V@zRjd(7GGIP@NG+B5# z9J7Rl;3Pa+!?v}CuqtMmLBBztVjo;3gnz19QQ5Hn=ME}w=mw0W>iBAiwFB)qjkr<5XTsa0zIS}IuQd;sb*{VVt*7F z!Sj?4oRu~$6w3GBmSB0vX zZP+!zM;)9RJY7R3om~dSnR(*+Bn7LYcNz`LP%VKqY&#lIi2@?nK!(aSD369Dr#=|G zcc@lWbl@g-%84&fmU!i+h?Db*Q;O-5(t^?gCOhvd$Sb}m)((V{hI<&TM}H+f909C8 zp1E3F?1k}$=ad;#4_9K8+6O@z?;0SN26@DL%F&THd8I!c5TptZW2nztGb7n(I$$sy zYuKXubjT`zaTl)^8dkdo;$4WgD&19dZ>S}`406P7XY^; zkcv(83$e+ZRd@m>A1#G37cNwEpGJ66()xJ|Xtj^FJc7x|&CRQj)_+G=hbkgtf&wZx z^L5&i&+W;u53T=1;^e$z)tX%&-23KE??)$_m67F$61RI6Ms1c3HITh}XyWt8m+zY4 zL_{-ozzz{1_#{4269NukU)uyHkWHb)f!&oyc7vmIsAIgMhXzBI8fFiZt)B6{rK#0CJQ-8pFN85L=KCMO z0@>tCtQ!B7?>Lm05;wXt=Ul%?cE7xS_45 z3Pj#E;bLA;mYFb%EM_}>dEUYw&B8N9BNS#Po<%0GzJHxOk10kl3ucN2Db0|b?->Ul zb-dz7u+v~@?BgzxgAGoM7itOdXxu?#)7gA~jVFCKAI5xmrmL=o!2$b3BgJd&5RG5T zO_l7}w|cd;-R;LuZtFk0fBFquUgFQ;tbk*ZznXj7>~ZvOyY@oar4SXU|-`!4|0N zP(q8cMpY!HetW;GO4lv@`pt)U9Ku`vcQn=i0a?|`%G(+0&)Nt!++AwN22};1po-?$ zBlL~>_mA=V!oMW@T;ExOHi7>~B-Q`q)Y~p2*nbC$^kAZAzoM3KvD|n`b;5~Nd)|t+ zcS1)*)F*=#cFYL2evbRrjN${Oqxgi0VMh7Nch`P^2`Efk5!pc3R+l#o4X!LM+_KZ3 z)dQpVx7BTO`j79CCKA=NdEfDHIY)zF z(tp??g{8#=C8JIc=VDhHn`~IOa@!f(FTxlQg$Sv#=F~4DmrHjae0!aIUry5@6-#OY za?#deVQ|jY;&-Ku?QP$GQ5qDQjbgM}F@J4?Qt1bUN>`<1q8c|hHj2h;m8*Rg{}%H^ z#q=b97QajC?d`v0|IVTZ3RIbvUKBbg$9$t0h2`3=V&v0vF|(P5rR`sw`(F*oa`AVP z_k-HKd_v`Z@(SM`6z}X66_+ed%}}Mp8Yf`2KU@M+WPUh;yQ&kM(qA!R-%vHhUw@G0 zsnKjQ?Z<{kG47(lfk0I=f(jB_V|zawg2zZztbb=kMNtdNg)UeG8+F&j)sHT6w*K4t*6fN)yr7|)mwxx~5q+dQF)f!#OG`_Q zmWEYEHa1jOwD$O1nvbRY&jh|ROMe2>jn5GE7z96k31&Rzt+3s($)_{Q1Rg*2tXm{$sABGOi*rJS8qZmDl9oHo}xx4Vx^DE{mzI%`Yp-L-55PHp2XJ zEn6TRq7xtJpYT6ZR&i;grYSV(pPcN^Y!tnihg^i|1FGGlpu&38ScUJPEPqGOPErlH zFEFIdQr@=CU?HhwYkd7R5i!U?vm;4KzrkK;U_cG4Mol+XJtSXD>Q*lwnXf#;8RUWw zeeT}-{A9mzVv=6Pl>4$OpLwYLMI1Ib9|C((p>OIm9ws3OxRQ@kTRjt!O?6hmi7>hQDo zw!P!H(|*aJH;T@NGP$|=dDSo4tEE4_!*hvgUp;whEXf&s-u8n+AFQV`xWH~nS~VH8hUGN`CoeL7-gWjcLGEPUz}Mn;MZKAFkSF_To#_?ouKC<_OX^^!p$#;k zB=z=el6v}rP=n<_h0yD8Iom=vRk2-#{0Cg6v1w$?D+skS z{B0(&0N=*~xG!uTHQ^XLQY>0Y5aFjnzhb`sqO0oIjv^i|;eR_}>kv&!{*nvUSrox? zH7sv~<K;r znuAzF=4z@^E}`9=OgL)jvTm^ZZDtD@E&0(vwUGM6H@BWGrVFdt>cdQS{w0XdIWE?c zIj)y*v^G<$$bWBS^XcMxwlkOch^rPBH5sH${}|rW3Ch9cJ8&`Ka=F=()-X02VG$V} z#+#&$tzvq}z4$$$hD>jaKa<*_+7AcnG8PNM6R>@Sd<|@Ectv8^sJ? zU&HTl9rp{BIoWZ?>Eqdjx=N)9g+@@9T{jG zCt)0(hbQ3`!b2q0@ZxhAI~W0mw)Sh7*pDX)<-=m}=Sqz}#Zfv(uyE6HE;@@w*o(J4 z1RK~(N&i#CZ^C}@-l@?kfrb>TQrDzZSwV_r!+$@Ae;dhD%RhuUNo)oyWfiZ-D-e|u z?BtUfrxCNcg(XsILql{W|KZ7ynCMXVBZqpPp9agK90nG1E-#YAXgWcU9=dtJmv>99 zj(qFlg=5*_Y3gM@N1?Ip=foX&+5x#|cgb|UNj2Nk3En9`SiDYda zTUcE-+?k!%!@K#WHNq}u?G{C z(gLo36IUMJK(eWtqOwG9y83ooe-uXuQE?P+dM%2A7U>UZwU%}WqG?tB>Xu9yxM&bK${%gN%bIbZyaR?q=*p`BQ+S zg<^$v?PK@QPe^i&OqprF(d2O1T)wS3y*_&nQ|)uwELIo2Rj=QcA2y$!f5hX~s+!n~u!ToOHZfCZZfbYBkgt=O-|ZnHPQJm94e;wF%B19Xe&24SQDL@Nz<&!L|a|1>Rnk` zF1JO;I4xObX%Cxa|9%sjCI6SX@0p^1;>^PRd-fI`+N*PUU9_2T(ngcZV6(HjALGTO zu@2jeZN+wAyRic7Aod(qjFn<#m<_AKoXMC%-mx58o+P~~u^Q}(f>JaoZYQlz>QB0z zY)<}6X;xlRZBe}kb5o89@HfIYLTX3cAIpiux)@;;UxyAYT&e$-E-kNTD*()YR!5r8 zl!H8+(0d)6*>aW(QIQ9AILou|1LErFTb;c;RT-UZ8X;lQ-M_;$DreQUr;85c+5a>J z=G2!i&VG2~V*by8Omde*69v~kpB}sq zS5m}7zvWcrd|%xVIo#iKjv~H)yY*;W3Cb-(Yqz3@zgZ6nxNiI(p#?xMue2L25hPs71%{ zt6djnJ|Sl=xwC^*ieG?}!hJyj_r;RMLh;wy-|cAioE!o5fw!44GCb6MZh_-N zs7i%p5YLViSHxE*wDR8|6JEy?X-7bUZ?Pue@1aSQgfA39VtX&aMiF`h#18GKbD*-) z>9ki4ILF2Y2F8E{FB+tO0BYjNVuggu@LqtHiFFIWI{b%n!etK(Xz3z*9`BYMUvO}* zkovcHN!$|uYn+%AI~I_v(1HK+#i^V_ zk#QHPkSZe`5h(4>W|$0<@7#d|*x9b#{`}tj{O50e@%hIeU%UR%Gdn;EvI~$D;B+E_ z*efwx3~q`MKU<{mvU+C)Al8Su#-K&^-I4G;L=mHr2b^_LLbC8sBGs2=*QMC^;1$tm z^G_5H2tpP;wOI6jQU+TElk5RZkHhS5CHi`CiMFp{X4}ip)g3+zI@JW7CtPK!(Y}hwA815cTw8ANY5mG-D z;0b|vRxE?7wD-~KaK%Zmv0GJhsyY~cgrLKt{eK3;Q@`(jWL<5Phi~&tkni*TVd{qD zNl(kL)!o$CbOMA7<$fPY`~f}b-fqeKm*?wxYN}aic=ZvRwK}KtNXMKD^c_2X#!i-T zEK6moy}TpR5%QmV8`x*hw+xYR``GRCi4smr8hktsDXEVR!`0e%{QU+a$9ljE+)ItM zWPyL?9SXXCVTM|koGdL0WqgMBaRcQNvJ33_g*qXrVM+0SM6coLH%+&0#iqZKqunRV zGZkKw)L9ZwTSL@|9Z_whivK0B$oh3bCxui(FSd*8wC^&lwE!t`ceT`@ zgIt)3;s(Td1=S7ju?{oYQ0uRGoiZV9DdbgAyl;q)L~2@H(ouldGA&kH?}<^VNiL&# zRdpcn+BEsW$+xa|Q3GE^(FT>LvzO~6e--E+3{aQhylS*JFixe&cj*d|)NGXQLu{9P zH#Vd>z7Z662I0RbK5wU{l33~-`1*`h9R9apE33@z_ZxX^m=&mT5=bvgDEIbTYqw&IKq5lqg3^;@*uT5hQ?nFU~!P*Xwb15?IPy^>iWL!Fil9yfy0vrJ-mwO2UA%7tO(VX*43Q1)o z5=Lc^Cs7NvQADB~XDA{S=~f|D#c6Np(2SUD(XHJl2&tO03Zv9+*^E?Hm(W?P3soK$#DHh{z) zZAO^@JSa@W0a8v-dtrk!jB41-SuzGjct%tLWS&zyV2&5WKlBJBfPf(m5+-n}SHv91 z_Da$f90^fN1b;?N)bozq0Gqw1K1mc5;YwgIP!Yr|jn2ibB?`l{IzUJ#*}2a^O5+Y-Q%5}H%2 zA{>n)q#eNr(*p`?sz&{3>54|&3_wshIPd8;15?4_+V_N^PcY*k|SvRO;KX+)EC zl7EK1I%$Y^F=>f;Ke82V!W-J>?fCOFw&JmbbB_CC7}VB9+L)M7cIna7&r2R8tw~(^ zC;9P*Iq&`J%ij=`kac{E>8GiM&b7DU_F(_`VeM`UWlP9gJ?3bTT{SH6-T!INOFWih zj%cpGMf>y5)r*U&s7jjDlY))rJUlwI0e{(wUOU}?0FK+Yc%YQ*(9XlUY}MKGOVK1R+Ct)jEqf#_^u|5gp*;jjxekx; zqcUxWtjjGrd)G_3MThoEsQhJzM}HUY4LY>pL8+?_?Q2k~?C{75RHiMCrQE*{uVy_T zu7pjRaE!DFTQqgao{IhM{fA#^Ev}X9VhK3DAC3B}d05VN0eqcjT%(>~U95=fJkQcR z!%dg-_B>@>7qqYQWFyP*L|r3Gc-GbJSy)(h)xr?5(m2~ilj=O}8+l%Iv454E!nD0an{9Zv{j^0yt{xzt48CT>I&WtvqiVBGpycR$u;u0m0h`Lwi69I zEbH10z7Yh;B2PB`CTtfgs@6Q|OjnrpJZ@Fj&+!6FpOv#}7Iq3l6rxLShSjLtJDg0X z<*2BJlW}%hR8vHkS*Knbzkis#ndHw98YpZP({fye%{Ef=3V|zZ%B_fdetS2BjAE2+ zAy~8sKAV=G!nR+c#jG2Bdv{+A$2Z$(k(;&XREu5JvVV6soqQhN(vY!*9<^D|S_58{ zC^xIN5z9#I(QrDe7Of`aS8WyABzkkbYazD+^vRl&o zIh$N(lgn8-{S>TOwZb+U=MxR{wZy7-%B=cWW`oJ6Vmd6wgYvK0@Mb)jlGAR7vl$&f z6{GvL_PQ2L5yqO~wOa9z+9Gk?Ai+4cbw#7!tdXZ0|`&xD|(B~dVkj%cYJ#{nO51f{MY?(T3%(hldJntIs0oiE351ds8-qJE;ueL z##dQT8x5P5#nt~_4@YHoeLo(=BG(f*{!8_7GF~ysBxI}Mj%2I10M^O2#;?=bxfj)B z@OySfl+K=iE^hBe<%%+$GTW!j_Ng+y%IvyRrGZGQRWsfOBY$2nvA>^H6Odr(s&U=< z)`^h~$Dzd0baGjahxfA#jJ;hkdyu+qUGWZG`!Ypar)cYK0B|V)W*vYsH2+|S=KnFQ zK4#O&AAv)I$>{!eoc#f2f23HuVtmAfGe%^l-klNTMe+(gE6C9j1@Nk>)I38aOKMk+$F-AUbhv7PfA?+A) zn~o8EQNy6vCKz7r3d8mAGXl>D;e=XoIYRed#h@{uud6;9ex|BLc0iSh2O9w3JV8M5 z1cCbGD+r`LL#@Tq{Shstir@^a#%N*LGUD;Zc&^exRjDmSM&N(;F$zp)Ky!aE0GFl# z+Es13MO$o*k{fW`pI#2DX)*n>5k{H9C{q|!3ZrO;QKjRpTAS*fPNtYbjI;X?X^BCv z_FrTt!^>b24KY6#pNhY&+GHA|UPE8vsrj(bFglHjj@DFhnHDCv=j9AzE@Es}Pm;nN zp);(dm#EHz$hdzZuzFE=Ki)Q)g?q9K{fRigt+;emxU63@_UrW{-0StXZBBG>U4K!0 zR^zoCvQ>-^Vci<4WN{vx#Q{HyZdkX&ZnDF#*kM}hYqo8D-(FvCSzou?uiduw?d~{6 zYG#o^baOr&RI4FIY%ruoXkm!q?e*=p_1hg``Ihx$~W@1%HBzK_G-N9e(f;ySx42ERjHhqgek z?g!;`?|pwsrC8VFpX^>6zV)^=U}ZNv9G$Le@=!ghVULc2bhlYD~-$eb@9CF`I5vEuM0sD?EQUysAFV!ZUd>7-IH(__3H~ zoQKJCObeDD6tgna|M~dU>y!6?IXpc*<}81Rd{)i|)8QSWcX;w{IoqG>Toyotyn7iI zv>2jgzCRn#_+z}HeddsU!f|qpFghIUk8egLE~qY3`9)RU{(=ELKN=M`m`g;}2Q-*G zkpfE*dh(FbQ;wSTL*CJFRMN9;^#&9ga#2=$c`>^CSmdMP_VTL8F~AHbS2LiMN+axL=;WKlW_a(UVWUFWqyqbPJTW7ROYkc=X_RvD#v-SKObZ0 z&C7q?7o!}@#KG@n6=c@wAT@DF3fjZ|cr$rB9u6?_)1!}}0Sgb=6%VnbLomDa(81~H zyMr?*yZF%NBJ&L{Vhabc&3!?!w!VN>=Mx{EL*)j;k8b+Nt@vm-h9hq8N7aAuZuBLe zU~Y7IKN^))UTyL`r$NaLG(&y@Olz`o6|Ca3cE7)qEfXkC;^N*M3FZX{5 zUCXUwYach*xK@Bw-3jP^@oFcipG{f-90SWyh$Iw2#tCj|)3$@n@DtZ9iE(#(HjhHZgMG~tRYYl#V==O@@D4crnsxw$tdbbJ2yqqiUa z5xCrfoPV^gY+8pkgj=uaEsF4ny>CLNTDo$AP}-8MLtuPNZ3&uLofNnwYR)ZTdvkPn zaY_T=^Y<+w(6McCV_!pUPBjpJoobEWoX+kM4k(;n4QF?w;!EPM283I3+O39zB#P>U)z4o2e0F+D zy~V6Mhd)+0K=BqI&8HCD%k^;Jn=YyYL4s1!lI<|EYy~5m%xi5r&pLeb;pAB;x8(qR+%ro!SC;oP2;!pF<1fsMVv|%G$Pify*vZt8oYah<6rZrXH+MedTj}gCT zyzFmSQ5_yXqjSnghm_Z^FJ6E6%gO2aM376cdDSQb#H4sXrTyE|N9(%JOj+;JDxmr)5@&WiD5 zR{q51|1@j-ds=_DEe>Rx@Jn3n>$L|EEh~BvsBU&}s%L$vds?aBTdDg>_XItvrRXg< z)z^%!W>k*6j)O5&fSm8R={pfFdef5*9AGw_a>2uKCoY`5JUV%Myl9JfOfI-47X)Kl za=|qF;-dGZTrde2WP=NW*5dR+oD46X3Hu|tuo1tM3qF74f?#~X1>2+76ScB^se1IX zqybZvfRkm|jFVjUmF}wgbmh!%;;Z2< z<*TLjiSxAHr&m1X2EGa-xMmwk>mDF&JA_Nd3MQM3)d^#18=p2=B{2|A*M=BNuiYwo z#gpFY#K+Q$y_Ds9#_^Cvm9*?puF*0J?;h4$-WGq$3CcDiiq~MMl(e%NgwaczC>{tb zT;L!s6M;RqnAL@OTc|}s9K#6d7P3iw5a?)Q-V>jxvad_g3(1JA6idB`1$|BLC;({{ znnwbb*L;tf7bs3IkurRtP^7qUk>YeDinDN&g$%{HjupKp{e47(9`z^T6qN&B2>9V4 zXMulVKm=2@h{|^AChtDH+JAer@G*P5z%Js`>}gMN-xb(5b`*`}MAA`cH7e-cTgB}U z59}N9OS_3}b`zg=6NO-i85#z9#LY0!(;-gVXn@C=cHn@b*ZKqV>lzsAB_z|!#5fY^ zselC+z=1FWaAEpqL2qHvP62!Uc8T3w4r%VjS z%9+Sa$lQ%(@87*WIZaTC4tNBT)o-FKNyf$ZkW8D+Bx^)t?P`)qXIf^GVbO#*g+Vk~ zF?|!^Hb9y1jq?WIxJ)M!7_K$e2Q-nOR}!TU6A7%?H2suDm%d#rBQaraq3pswhmnG0p}B$4B!L)>hKAT1&s{tU zM%^RI0lTT?AiH z& z{SXXS_Nx&PJOP)#i6;+1nzE(2q!Q_piUv-6`jVz*I;^y5{lw-O^AD}M)6)xjGQM`Gbc*$QG(ZNc4Bhbi$~Rx=NEG0WK@TE z7>}ktMhzhz)@66%`T4KEoIQVg1E-u$#*@b!;}2jlJ0Jm9GgD0DBH4VWV+a; z_(m~~^&ZS#_A<|7SCAWeM7G`w9_$&L>wRy}cz$^P=K1TTLmzLEC02hIS;GA(T|?Jh z!_sd^t#ysX4gYWI4x7+R`$KbyB^FDpd03AenaA#Uu@22K7>BjeA^_LHH%tfUQ2U?h zUc#A01l@@XzwV#BfB&v-%}Mom(?q$t6q4I5g{+ea6}VmA6-%f<_dqsLLD59OfeI8Q zF`3>xN#qX<{+s!*0l|NS4zjrdl5O{P8h4Ynxb5*|4*Zjs`SbB$Lhl6S$+ZaCRRJR= z;i3BY$I zy|Wo|-3+&b8LexiosDqoM))0!cwhp)t0^%oHB9kr2UFT-OFJZ6q1LV7yM&GQL273+ z%(@w32Q%7ZC51IWRCeF=03{IA&&MVK+7~HZo?Hp&tS< ze>6Tm3UhRFWnpa!c-l48*;7t&9LMqBCreq2C`*cvwIWMNSrSP}ixkP4CE2rQ$(}ts zrN}bO7|i$&$b}omxG)CeMq|bpmo8k8bKdiPZeH`A@9(V7bIx(jx%T!T=fd1_T!z`$ z3lHHfJc3Pl9GkHYZ{r!fgHAyq+0M}$fABoE;6~hxTjgA+Z7H0G+i{0naI38bVGi!X zi+C5W;61#K_pt#V$c6p1<8;7WxtMU9bi_QlxKf*R!Ub{(MK>mJfs5rn$J(SPE|L3I@9+C3-&5VwZ8a3jq|o0s3B#c{2nXOu z9F5^P3I}2oj=^Y*!9F+`hv8U^#{}$$eX&0d$5@QRAvgjfFcK3n3n$_@9FIvj0aI}b zPQuBUj47CgQ*j!m;|!dR88{PXf8#97#5q`w^KmW~VhJwA6;i}s`^{HMaaI2Rl8|VV zRZ`+M>(x@yC+i9+<&5a5pGnSp1uQp(z4U4@%)3vR<| z+=;t!FV^4zDZAW1@4WZExjTLHT6_!q=Uhb*zQx>8Nx1Lg9N)4wJ8!L2e_m^SP+FB? zebnnl>%&r2jr9qyKUyD?YR_7q^7@DMNvSFD-kp`29iPpYjic>T`$oYeZy`jYf& zxplqtCh*o@mENXUUzXYmtZ#Vz%=()5Aq(6~qt{=pZz?GGm;Y^y_OARt^NxWZ3T19& kb98cLVQmU!Ze(v_Y6^37mrx=C3JW+nHaH3;B}Gq03Y>C8(*OVf delta 70308 zcmY&bMBw|nmNgqV=&K=dkmUzvIE^a`94Fz>6I?CPC_FGt&@CX6({U2= zKt$j6W^f)0$EEKuNvsaX;9rBTFgPS!@vz}rZ>dT56%srJ6u3sRg-OBT{qaQc%b$r3 zQN&kWcTS!wq_^5nnkmMr_ftjZj$8fJ@3N->Uc^Uccv?lQ6was4fbtX~#Pl}1h|{yp zI`OK&vLhpE(?_5TDy9rXUG4gvaeiD z-+?;i`=)P>$y_&bbkYie*}+H{fTvX3DTYvXM5iarrX~0W|0{dPFMQMeqdhp1I!Jw7 zwM|1%gD6WN%>UCcYG+#%8Kr#0=Sj6S)R!obEc52k3FfU6 z=5vwbeaP^}keI{6_hEIoc1dc_5v@FG8W?e9lnZcLAoTSJS4z5IflE2ya9~ z@hHKtp80Aqtd8@r7ZDJqRwhw#Cnd^=cn;YV>;JWg53b2?IS~sSW$*U`i#;e7POcyO$B@CGvkBcQEar(Z#zNzDwGF|}^o*k`)y8GR~2a~j@KzgKEDl;i| zT^DQ-1A)*Vs%6sk>OXVL84jPzkA>*Y(OrNX74+euKgD7Kn(8kNAUA2pVx_Ywcuge7 z3{@QjR_~)A&;jivJ{U*eb?_EW89{nsKVw|(@7X2))WK-#eEGk9-Rm=BPqos?H;_L- z`u3aC=V<6?;s5YIg+kr~hXW!j0~ zDP5yzynb2`Z8pztIH4oC!$$P7$Y_%i!B$2jX3 z$f*79j@5-2Y6)LQ@B$;6o}CIt=$3SUX}9$%zKh0q!MbMXzCyX|@I}QkI|H%O(aahT{2$eM z8~+ruPb)To&F~qj8e9en^R}s=yHk3sbAjRn@_O_^4KTUx%*ewLbwy=WqV1 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�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�{GB!SOmgx&Z)a-6 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 From df1d43b65d5db47c542641c48471e67f3a7cae6e Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 13:55:15 +0000 Subject: [PATCH 016/196] Added "Obtaining a License to README.md" --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e25bb4d..5db369e 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,37 @@ The NAG Library for Java Mark 27.1 is available for the following platforms: You can get the NAG Library from [here](https://www.nag.com/content/nag-library). +## Obtaining a license + +Before you can use the NAG Library for Java, you'll need a license. Free trial licenses are available! + +To request a licence key, you first need to know your Kusari *hostid* and email that along with the Product Code to [support@nag.com](mailto:support@nag.com). + +To get your *khostid*: + +### Linux + +* Run the program *khostid* located in the *license/bin/linux_x64* subdirectory of the software distribution. + +* Once you have obtained one of the above licence keys, the easiest way to install it is to store the text in a file, +``` +$HOME/nag.key +``` +or +``` +/opt/NAG/nag.key +``` +or +``` +/usr/local/NAG/nag.key +``` + +### Windows + +* Use the Kusari Installer GUI. Once you have a key, the same GUI can be used to install it. + +More detailed installation instructions are availavle in the [Installer's Note](https://www.nag.com/content/nag-library-mark-27). + ## NAG Library for Java installation ### Linux @@ -35,20 +66,20 @@ To install the NAG Library for Java, you simply have to unzip the distribution f * NAGJava.jar * libnag_jni271.so -The following **must** be in your LD_LIBRARY_PATH environment variable to use the NAG Library for Java: +The following **must** be in your *LD_LIBRARY_PATH* environment variable to use the NAG Library for Java: -The directory containing libnag_jni271.so -The directories lp64/lib and rtl/lib/intel64 of the underlying library NLL6I271BL +* The directory containing *libnag_jni271.so* +* The directories *lp64/lib* and *rtl/lib/intel64* of the underlying library NLL6I271BL It is also recommended that the path to NAGJava.jar is added to your CLASSPATH. -So your LD_LIBRARY_PATH should contain something like: +So your *LD_LIBRARY_PATH* should contain something like: ``` [nagjava_install_dir]/linux_x64:[nll6i271bl_install_dir]/lp64/lib:[nll6i271bl_install_dir]/rtl/lib/intel64 ``` -and your CLASSPATH: +and your *CLASSPATH*: ``` .:[nagjava_install_dir]/jar/NAGJava.jar @@ -63,20 +94,20 @@ To install the NAG Library for Java, you simply have to unzip the distribution f * NAGJava.jar * nag_jni271.dll -The following **must** be in your PATH environment variable to use the NAG Library for Java: +The following **must** be in your *PATH* environment variable to use the NAG Library for Java: -The directory containing nag_jni271.dll -The directories bin and rtl\bin of the underlying library NLW6I271EL +* The directory containing *nag_jni271.dll* +* The directories *bin* and *rtl\bin* of the underlying library NLW6I271EL It is also recommended that the path to NAGJava.jar is added to your CLASSPATH. -So your PATH should contain something like: +So your *PATH* should contain something like: ``` [nagjava_install_dir]\win64;[nlw6i271el_install_dir]\bin;[nlw6i271el_install_dir]\rtl\bin ``` -and your CLASSPATH: +and your *CLASSPATH*: ``` .;[nagjava_install_dir]\jar\NAGJava.jar From 4aac259852ab04f5b7119986904b1100946f5957 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 13:55:38 +0000 Subject: [PATCH 017/196] Deleted ncm_nag.html --- nearest_correlation_matrices/ncm_nag.html | 15412 -------------------- 1 file changed, 15412 deletions(-) delete mode 100644 nearest_correlation_matrices/ncm_nag.html diff --git a/nearest_correlation_matrices/ncm_nag.html b/nearest_correlation_matrices/ncm_nag.html deleted file mode 100644 index 8cf790b..0000000 --- a/nearest_correlation_matrices/ncm_nag.html +++ /dev/null @@ -1,15412 +0,0 @@ - - - - - -ncm_nag - - - - - - - - - - - - - - - - - - - - - - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 5585260606b786334b6406b0b6a652024d13c09c Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 14:07:44 +0000 Subject: [PATCH 018/196] Updated Ncm readme --- nearest_correlation_matrices/Readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 32e96c4..6e923a0 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,6 +1,8 @@ # Nearest Correlation Matrices using the NAG Library for Java * [ncm_whitepaper_2019.pdf](./ncm_whitepaper_2019.pdf) Nearest Correlation Matrices whitepaper -* [ncm_nag.ipynb](./ncm_nag.ipynb) Nearest Correlation Matrices Tutorial -* [NcmNag.java](./NcmNag.java) Nearest Correlation Matrices Java Source File +* [NcmNag.java](./NcmNag.java) Nearest Correlation Matrices Java Source File, which outputs data files for *ncm_nag.ipynb* to use. * [output.txt](./output.txt) Output of NcmNag.java +* [ncm_nag.ipynb](./ncm_nag.ipynb) Nearest Correlation Matrices Tutorial, which reads the data files produced from *NcmNag.java* and renders the output using Python +* [ncm_nag.pdf](./ncm_nag.pdf) PDF version of ncm_nag.ipynb, without the Input cells + From 49c0886ad01a4670b680b0fa336fef711724ff7e Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 14:08:33 +0000 Subject: [PATCH 019/196] Updated Ncm notebook image path --- nearest_correlation_matrices/ncm_nag.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 90bea7f..0a51df6 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -1365,7 +1365,7 @@ "\n", "* We do this until we converge on a matrix with both properties.\n", "\n", - "\n", + "\n", "\n" ] }, From 8b5cfd586336df45fdd66f7e09167297c0fa9b8c Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 14:11:32 +0000 Subject: [PATCH 020/196] Changed image width to 300px --- nearest_correlation_matrices/ncm_nag.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 0a51df6..f7c6983 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -1365,7 +1365,7 @@ "\n", "* We do this until we converge on a matrix with both properties.\n", "\n", - "\n", + "\n", "\n" ] }, From ce88c3c41c63262f3aefe43ba3b54e5714ad308c Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 14:15:26 +0000 Subject: [PATCH 021/196] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5db369e..e27258c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ You can get the NAG Library from [here](https://www.nag.com/content/nag-library) Before you can use the NAG Library for Java, you'll need a license. Free trial licenses are available! -To request a licence key, you first need to know your Kusari *hostid* and email that along with the Product Code to [support@nag.com](mailto:support@nag.com). +To request a licence key, you first need to know your Kusari *hostid* and email that along with the *Product Code* to [support@nag.com](mailto:support@nag.com). To get your *khostid*: From 4fe0cf187062bff437da328c3e8d91840e2f24e2 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 18 Dec 2020 14:36:32 +0000 Subject: [PATCH 022/196] Added link to download the Nag Java lib --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e27258c..0974dd6 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,8 @@ More detailed installation instructions are availavle in the [Installer's Note]( ## NAG Library for Java installation +You can get the NAG Library for Java from [here](https://www.nag.com/content/nag-library-java-download). + ### Linux To install the NAG Library for Java, you simply have to unzip the distribution file and copy two files to convenient locations on your system: From 30dc1141215cf3f553abdfe3877f9a6e3142cc7f Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Tue, 22 Dec 2020 10:19:31 +0000 Subject: [PATCH 023/196] removed _config.yml --- _config.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 _config.yml diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 2f7efbe..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-minimal \ No newline at end of file From 66eb4547ebe61e2c222fbccb47e5218618d8990f Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 8 Jan 2021 14:14:31 +0000 Subject: [PATCH 024/196] Added QCQP (unfinished) --- QCQP/Readme.md | 0 QCQP/data/djia_close_price.csv | 31 ++ QCQP/portfolioOptimizationQCQP.java | 520 ++++++++++++++++++++++++++++ 3 files changed, 551 insertions(+) create mode 100644 QCQP/Readme.md create mode 100644 QCQP/data/djia_close_price.csv create mode 100644 QCQP/portfolioOptimizationQCQP.java diff --git a/QCQP/Readme.md b/QCQP/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/QCQP/data/djia_close_price.csv b/QCQP/data/djia_close_price.csv new file mode 100644 index 0000000..46f1a62 --- /dev/null +++ b/QCQP/data/djia_close_price.csv @@ -0,0 +1,31 @@ +,05/03/2018,06/03/2018,07/03/2018,08/03/2018,09/03/2018,12/03/2018,13/03/2018,14/03/2018,15/03/2018,16/03/2018,19/03/2018,20/03/2018,21/03/2018,22/03/2018,23/03/2018,26/03/2018,27/03/2018,28/03/2018,29/03/2018,02/04/2018,03/04/2018,04/04/2018,05/04/2018,06/04/2018,09/04/2018,10/04/2018,11/04/2018,12/04/2018,13/04/2018,16/04/2018,17/04/2018,18/04/2018,19/04/2018,20/04/2018,23/04/2018,24/04/2018,25/04/2018,26/04/2018,27/04/2018,30/04/2018,01/05/2018,02/05/2018,03/05/2018,04/05/2018,07/05/2018,08/05/2018,09/05/2018,10/05/2018,11/05/2018,14/05/2018,15/05/2018,16/05/2018,17/05/2018,18/05/2018,21/05/2018,22/05/2018,23/05/2018,24/05/2018,25/05/2018,29/05/2018,30/05/2018,31/05/2018,01/06/2018,04/06/2018,05/06/2018,06/06/2018,07/06/2018,08/06/2018,11/06/2018,12/06/2018,13/06/2018,14/06/2018,15/06/2018,18/06/2018,19/06/2018,20/06/2018,21/06/2018,22/06/2018,25/06/2018,26/06/2018,27/06/2018,28/06/2018,29/06/2018,02/07/2018,03/07/2018,05/07/2018,06/07/2018,09/07/2018,10/07/2018,11/07/2018,12/07/2018,13/07/2018,16/07/2018,17/07/2018,18/07/2018,19/07/2018,20/07/2018,23/07/2018,24/07/2018,25/07/2018,26/07/2018,27/07/2018,30/07/2018,31/07/2018,01/08/2018,02/08/2018,03/08/2018,06/08/2018,07/08/2018,08/08/2018,09/08/2018,10/08/2018,13/08/2018,14/08/2018,15/08/2018,16/08/2018,17/08/2018,20/08/2018,21/08/2018,22/08/2018,23/08/2018,24/08/2018,27/08/2018,28/08/2018,29/08/2018,30/08/2018,31/08/2018,04/09/2018,05/09/2018,06/09/2018,07/09/2018,10/09/2018,11/09/2018,12/09/2018,13/09/2018,14/09/2018,17/09/2018,18/09/2018,19/09/2018,20/09/2018,21/09/2018,24/09/2018,25/09/2018,26/09/2018,27/09/2018,28/09/2018,01/10/2018,02/10/2018,03/10/2018,04/10/2018,05/10/2018,08/10/2018,09/10/2018,10/10/2018,11/10/2018,12/10/2018,15/10/2018,16/10/2018,17/10/2018,18/10/2018,19/10/2018,22/10/2018,23/10/2018,24/10/2018,25/10/2018,26/10/2018,29/10/2018,30/10/2018,31/10/2018,01/11/2018,02/11/2018,05/11/2018,06/11/2018,07/11/2018,08/11/2018,09/11/2018,12/11/2018,13/11/2018,14/11/2018,15/11/2018,16/11/2018,19/11/2018,20/11/2018,21/11/2018,23/11/2018,26/11/2018,27/11/2018,28/11/2018,29/11/2018,30/11/2018,03/12/2018,04/12/2018,06/12/2018,07/12/2018,10/12/2018,11/12/2018,12/12/2018,13/12/2018,14/12/2018,17/12/2018,18/12/2018,19/12/2018,20/12/2018,21/12/2018,24/12/2018,26/12/2018,27/12/2018,28/12/2018,31/12/2018,02/01/2019,03/01/2019,04/01/2019,07/01/2019,08/01/2019,09/01/2019,10/01/2019,11/01/2019,14/01/2019,15/01/2019,16/01/2019,17/01/2019,18/01/2019,22/01/2019,23/01/2019,24/01/2019,25/01/2019,28/01/2019,29/01/2019,30/01/2019,31/01/2019,01/02/2019,04/02/2019,05/02/2019,06/02/2019,07/02/2019,08/02/2019,11/02/2019,12/02/2019,13/02/2019,14/02/2019,15/02/2019,19/02/2019,20/02/2019,21/02/2019,22/02/2019,25/02/2019,26/02/2019,27/02/2019,28/02/2019,01/03/2019 +AXP,96.660004,96.07,95.639999,96.589996,99.050003,97.669998,95.370003,94.529999,94.389999,95.610001,94.839996,94.949997,94.739998,91.410004,90.449997,92.620003,91.419998,92.209999,93.279999,91,92.739998,93.580002,94.199997,91.910004,92.139999,93,91.599998,93.349998,93.029999,93.599998,93.860001,95.150002,102.370003,100.790001,100.610001,100.440002,98.779999,100.230003,99.610001,98.75,98.580002,97.629997,97.139999,98.349998,98.580002,99.739998,100.5,101.379997,101.419998,101.290001,100.739998,100.589996,101.220001,100.989998,102.040001,102.699997,101.93,102.010002,101.099998,97.720001,98.989998,98.300003,98.25,99.449997,99.309998,100.970001,101.480003,101,101.199997,100.730003,100.019997,99.760002,98.519997,98.470001,97.139999,96.419998,96.629997,97.230003,98.540001,98.209999,96.959999,96.970001,98,99,97.839996,98.529999,98.519997,99.910004,99.910004,100.300003,101.150002,100.5,100.690002,101.150002,102.980003,100.169998,100.150002,101.220001,101.709999,102.629997,102.5,103.849998,100.849998,99.519997,99.449997,99.730003,100.790001,100.919998,101.970001,102.779999,102.989998,101.580002,101.809998,102.18,101.510002,102.650002,103.029999,103.830002,104.809998,105.830002,105.370003,105.760002,107.050003,107.279999,106.709999,106.230003,105.980003,107.010002,105.68,105.400002,106.080002,107.290001,108.309998,107.879997,108.660004,109.559998,109.199997,109.639999,110.099998,111.110001,110.900002,109.849998,109.870003,108.010002,107.849998,106.489998,107.900002,108.389999,108.449997,107.739998,107.230003,106.989998,106.660004,103.57,101.580002,103,102.620003,104.269997,104.339996,102.839996,106.730003,104.510002,104.379997,101.839996,103.599998,101.25,101.190002,102.080002,102.730003,104.040001,103.709999,105.209999,104.980003,107.309998,108.5,108.279999,106.489998,107.860001,107.769997,109.599998,109.459999,108.25,106.089996,106.5,105.739998,109.68,110.110001,112.889999,111.309998,112.269997,112.360001,107.639999,108.25,106.68,105.790001,105.400002,107.480003,106.699997,105.699997,101.18,101.019997,98.769997,95.769997,91.330002,89.5,93.839996,94.68,94.419998,95.32,95.68,93.43,97.639999,98.169998,98.650002,98.830002,98.260002,98.550003,98.440002,97.989998,99.410004,99.489998,100.480003,99.830002,99.709999,99.720001,100.769997,100.379997,100.959999,102.669998,102.699997,103.059998,103.419998,103.900002,104.959999,104.389999,104.519997,105.410004,107,107.559998,106.620003,107.379997,106.5,106.779999,106.610001,107.440002,106.93,106.940002,107.419998,107.739998,108.900002 +DWDP,69.660004,70.790001,70.169998,70.580002,72.230003,71.339996,70.57,68.989998,67.879997,67.959999,66.559998,66.389999,67.43,65.620003,63.060001,64.480003,63.639999,62.41,63.709999,62.040001,63.32,63.689999,65.440002,63.709999,63.689999,65.889999,64.730003,66.470001,66.169998,67.010002,67.550003,68.059998,66.529999,66.040001,65.599998,63.18,63.639999,64.040001,64.32,63.240002,63.060001,63.490002,63.470001,64.470001,64.919998,64.230003,66.029999,66.949997,66.93,67.529999,67.150002,68.029999,68.160004,67.57,68.629997,67.470001,67.040001,66.379997,65.709999,63.939999,64.790001,64.110001,66.169998,67.129997,67.889999,70.040001,69.419998,69.489998,69.489998,69.779999,68.57,68.379997,67.75,67.790001,66.360001,65.889999,65.279999,67,65.980003,66.309998,65.610001,66.150002,65.919998,65.769997,65.150002,66.07,65.93,66.75,67.809998,66.300003,66.25,66.360001,65.720001,67.059998,66.589996,66.139999,65.82,65.699997,66.919998,67.529999,68.25,68.370003,68.050003,68.769997,67.959999,66.440002,66.82,67.760002,68.139999,67.660004,69.019997,67.739998,66.589996,67.559998,66.459999,67.080002,67.790001,68.480003,68.830002,68.760002,68.110001,69.209999,70.809998,70.739998,71.440002,70.199997,70.129997,69.720001,70.050003,70.080002,70,70.059998,70.080002,69.239998,68.919998,68.580002,68.82,68.029999,68.730003,70.029999,69.690002,68.199997,67.949997,66.889999,65.330002,64.309998,64.82,64.82,64.389999,64.010002,63.189999,63.16,60.84,59.32,58.98,59.66,58.939999,60.259998,59.57,58.580002,57.490002,56.07,54.68,52.68,52.919998,52,52.07,52.630001,53.919998,58.27,57.73,57.630001,58.02,59.830002,59.439999,58.68,57.700001,57.470001,57.98,58.73,59.189999,57.799999,56.369999,56.970001,56.43,57.66,57.18,57.220001,57.240002,57.849998,59.16,56.490002,55.919998,53.75,53.799999,53.259998,54.349998,53.779999,52.779999,51.68,52.290001,52.16,51.040001,50.59,49.09,52.23,53.330002,53.02,53.48,54.52,52.509998,54.73,54.759998,55.389999,55.619999,55.68,55.279999,55.380001,55.009998,55.400002,57.040001,58.060001,56.240002,56.43,56.330002,57.759998,58.130001,58.52,59.279999,53.810001,53.470001,53.130001,54.259998,53.209999,52.18,51.709999,52,53.360001,53.139999,52.66,54.240002,54.59,56.240002,55.259998,54.970001,56.080002,55.880001,54.720001,53.23,53.34 +BA,352.75,348.920013,347.040009,348.730011,354.519989,344.190002,338.670013,330.26001,329.980011,330.470001,331.76001,337.630005,337.100006,319.609985,321,328.970001,321.119995,320.019989,327.880005,322.440002,330.820007,327.440002,336.399994,326.119995,322.480011,334.829987,327.359985,337.480011,329.279999,331.769989,336.720001,341,340.640015,338.670013,338.839996,329.059998,342.859985,342.790009,340.880005,333.559998,329.540009,324.190002,330.690002,334.429993,340.429993,338.369995,344.5,344.070007,342.459991,344.589996,342.119995,340.970001,344.140015,351.230011,363.920013,355.019989,359.209991,359,360.089996,352.480011,358.190002,352.160004,356.720001,360.730011,360.100006,371.559998,368.529999,369.5,370.940002,370.619995,363.850006,362.420013,357.880005,354.73999,341.119995,342.690002,337.660004,338.910004,331.200012,331.299988,329.820007,334.649994,335.51001,336.079987,332.929993,333.179993,334.640015,341.920013,347.160004,340.600006,346.029999,350.790009,356.100006,356.880005,360.230011,355.329987,354.899994,353.269989,358.269989,355.920013,359.320007,360.649994,351.059998,356.299988,352.76001,349.730011,348.440002,346.570007,350.76001,347.779999,343.720001,339.410004,338.359985,339.140015,331.76001,345.980011,346.399994,350.73999,353.769989,350.029999,347.480011,349.380005,353.73999,351.209991,350.190002,346.899994,342.790009,346.25,346.679993,351.269989,349.279999,341.859985,345.25,353.410004,355.459991,359.799988,355.959991,363.579987,365.220001,367.459991,372.230011,367.98999,367.230011,365.029999,367.390015,371.899994,382.290009,386.369995,392.299988,389.98999,386.470001,385.769989,385.440002,367.470001,358.109985,360.109985,358.880005,368.25,365.5,359.350006,356.26001,355.980011,350.049988,354.649994,363.769989,359.269989,335.589996,349.910004,354.859985,363.070007,357.75,361.980011,366.470001,372.019989,370.769989,369.339996,357.029999,349.51001,344.720001,341.570007,335.950012,320.940002,317.700012,317.320007,312.320007,316.359985,318.029999,333.5,342.559998,346.76001,359.959991,342.5,331.899994,323.220001,326.350006,322.029999,326.690002,325.470001,318.75,316.130005,328.059998,319.549988,313.049988,304.549988,294.160004,313.929993,317.140015,316.380005,322.5,323.809998,310.899994,327.079987,328.109985,340.529999,343.829987,352.609985,352.899994,350.359985,352.23999,352.059998,359.089996,364.730011,357.899994,358.609985,358.269989,364.200012,362.970001,364.910004,387.720001,385.619995,387.429993,397,410.179993,411.109985,405.170013,404.910004,403.950012,410.720001,410.579987,409.820007,417.970001,416.26001,421.549988,417.579987,424.049988,426.869995,426.769989,435.440002,439.959991,440.619995 +CVX,113.150002,113.650002,113.839996,113.349998,117.220001,116.790001,116.459999,115.129997,115.580002,115.400002,113.889999,114.5,117.040001,113.699997,112.980003,115.349998,114.660004,112.099998,114.040001,112.239998,114.830002,114.480003,117.290001,114.760002,115.980003,118.849998,119.25,119.230003,119.919998,120.699997,121.459999,123.82,123.709999,122.309998,123.580002,122.540001,122.720001,124.220001,126.620003,125.110001,124.860001,125.489998,126.010002,125.529999,124.940002,126.57,128.720001,128.820007,129.839996,130.389999,129.740005,129.559998,129.460007,127.860001,129.369995,128.229996,128.699997,126.610001,122.190002,121.389999,125.160004,124.300003,123.849998,122.260002,122.730003,123.379997,126.959999,126.440002,127.559998,127.080002,127.07,126.510002,124.040001,125.970001,125.540001,125.290001,122.589996,125.099998,122.610001,124.160004,126,125.660004,126.43,124.25,124.730003,123.980003,124.139999,125.989998,127.589996,123.519997,124.260002,124.040001,122.980003,121.910004,121.529999,121.669998,122.269997,121.330002,123.849998,124.900002,123.949997,125.970001,127.830002,126.269997,125.389999,123.760002,124.050003,124.300003,125.18,123.879997,122.529999,123.339996,122.440002,122.580002,117.940002,117.660004,117.800003,117.75,117.940002,118.919998,118.099998,119.010002,120.349998,119.860001,120.220001,119.809998,118.459999,118.870003,118.919998,115.230003,114.599998,114.480003,115.019997,115.790001,116.300003,117.379997,117.510002,118.129997,119.510002,119.419998,121.129997,122.620003,123.370003,121.949997,122.470001,122.279999,124.389999,124.739998,125.309998,124.949997,125.330002,124.839996,126.82,122.599998,118.43,117.769997,116.940002,117.510002,117.290001,117.470001,118.139999,117.209999,113.400002,110.209999,111.580002,111.529999,108.93,110.849998,111.650002,111.169998,114.730003,118.940002,118.900002,120.870003,119.360001,119.510002,117.389999,115.349998,115.720001,116.949997,119.059998,119.419998,116.099998,117.57,113.599998,114.980003,115.209999,118.139999,118.849998,118.940002,120.669998,117.239998,115.910004,115.489998,114.940002,115.470001,115.620003,115.940002,113.830002,112.449997,109.739998,107.830002,104.980003,104.209999,100.989998,107.389999,109.32,108.650002,108.790001,110.690002,108.57,110.82,112.260002,111.769997,113.269997,113.449997,112.540001,111.720001,112.120003,111.400002,111.959999,114.370003,112.339996,111.389999,113.510002,113.220001,112.169998,111.830002,113.010002,114.650002,118.370003,119.739998,119.480003,118.879997,118.230003,117.580002,116.949997,118.720001,119.57,118.160004,119.349998,119.309998,120.279999,119.139999,119.389999,119.620003,119.940002,120.080002,119.580002,122.029999 +CSCO,44.52,44.290001,44.200001,44.34,45.369999,45.549999,45.16,45.279999,45.330002,45.009998,44.27,44.369999,44.310001,43.07,42.419998,44.060001,42.68,41.66,42.889999,41.009998,41.380001,41.200001,41.82,40.73,41.169998,42.509998,42.43,43.34,43,43.299999,44.59,44.630001,44.560001,44.09,44.25,43.740002,43.709999,44.209999,44.709999,44.290001,44.830002,43.860001,44.439999,45.299999,45.73,45.709999,46.040001,46.299999,45.93,45.700001,45.48,45.16,43.459999,43.209999,43.75,43.650002,43.68,43.57,43.259998,42.970001,42.849998,42.709999,43.66,43.580002,43.669998,44.259998,43.650002,43.48,43.689999,43.939999,44.009998,44.689999,44.25,44.209999,43.82,43.740002,43.16,43.200001,42.290001,42.549999,42.330002,42.939999,43.029999,42.810001,42.669998,42.560001,42.709999,42.669998,42.860001,42.57,43.580002,41.779999,42.5,42.34,42.209999,42.400002,42.009998,42.060001,42.389999,43.16,43.529999,42.57,42.169998,42.290001,41.860001,42.529999,42.830002,43.299999,43.580002,43.84,43.779999,43.779999,43.75,44,43.860001,45.16,45.869999,46.220001,45.779999,45.990002,46.02,46.32,46.59,46.950001,47.48,47.150002,47.77,47.73,47.27,47.279999,47.049999,47.07,47.029999,46.889999,47.240002,47.400002,47.110001,47.459999,47.279999,47.73,48.560001,48.439999,48.470001,48.41,48.330002,48.650002,48.869999,49.009998,49.139999,48.380001,48.130001,47.52,47.490002,45.630001,44.119999,45.709999,44.669998,45.82,45.939999,45.459999,45.34,45.759998,45.419998,44.07,45.470001,44.25,43.84,44.580002,45.75,45.650002,45.48,46.139999,46.5,47.900002,48.439999,47.110001,45.619999,45.119999,44.330002,46.77,46.349998,45.75,44.490002,44.889999,44.540001,45.57,46.119999,47.290001,47.34,47.869999,48.740002,47.349998,48.389999,46.439999,46.860001,47.09,47.419998,47.470001,45.82,44.200001,44.060001,43.139999,42.490002,41.849998,40.279999,42.470001,42.91,42.77,43.330002,42.950001,41.07,42.919998,43.209999,43.560001,43.32,43.240002,43.490002,43.209999,44.02,43.959999,44.209999,45.029999,44.779999,45.459999,45.610001,46.130001,45.75,45.959999,46.709999,47.290001,47.34,47.349998,47.259998,47.48,46.700001,47.189999,47.580002,47.889999,47.5,48.400002,49.43,49.650002,49.630001,49.41,50.110001,50.790001,51.18,51.59,51.77,51.41 +AAPL,176.820007,176.669998,175.029999,176.940002,179.979996,181.720001,179.970001,178.440002,178.649994,178.020004,175.300003,175.240005,171.270004,168.850006,164.940002,172.770004,168.339996,166.479996,167.779999,166.679993,168.389999,171.610001,172.800003,168.380005,170.050003,173.25,172.440002,174.139999,174.729996,175.820007,178.240005,177.839996,172.800003,165.720001,165.240005,162.940002,163.649994,164.220001,162.320007,165.259995,169.100006,176.570007,176.889999,183.830002,185.160004,186.050003,187.360001,190.039993,188.589996,188.149994,186.440002,188.179993,186.990005,186.309998,187.630005,187.160004,188.360001,188.149994,188.580002,187.899994,187.5,186.869995,190.240005,191.830002,193.309998,193.979996,193.460007,191.699997,191.229996,192.279999,190.699997,190.800003,188.839996,188.740005,185.690002,186.5,185.460007,184.919998,182.169998,184.429993,184.160004,185.5,185.110001,187.179993,183.919998,185.399994,187.970001,190.580002,190.350006,187.880005,191.029999,191.330002,190.910004,191.449997,190.399994,191.880005,191.440002,191.610001,193,194.820007,194.210007,190.979996,189.910004,190.289993,201.5,207.389999,207.990005,209.070007,207.110001,207.25,208.880005,207.529999,208.869995,209.75,210.240005,213.320007,217.580002,215.460007,215.039993,215.050003,215.490005,216.160004,217.940002,219.699997,222.979996,225.029999,227.630005,228.360001,226.869995,223.100006,221.300003,218.330002,223.850006,221.070007,226.410004,223.839996,217.880005,218.240005,218.369995,220.029999,217.660004,220.789993,222.190002,220.419998,224.949997,225.740005,227.259995,229.279999,232.070007,227.990005,224.289993,223.770004,226.869995,216.360001,214.449997,222.110001,217.360001,222.149994,221.190002,216.020004,219.309998,220.649994,222.729996,215.089996,219.800003,216.300003,212.240005,213.300003,218.860001,222.220001,207.479996,201.589996,203.770004,209.949997,208.490005,204.470001,194.169998,192.229996,186.800003,191.410004,193.529999,185.860001,176.979996,176.779999,172.289993,174.619995,174.240005,180.940002,179.550003,178.580002,184.820007,176.690002,174.720001,168.490005,169.600006,168.630005,169.100006,170.949997,165.479996,163.940002,166.070007,160.889999,156.830002,150.729996,146.830002,157.169998,156.149994,156.229996,157.740005,157.919998,142.190002,148.259995,147.929993,150.75,153.309998,153.800003,152.289993,150,153.070007,154.940002,155.860001,156.820007,153.300003,153.919998,152.699997,157.759995,156.300003,154.679993,165.25,166.440002,166.520004,171.25,174.179993,174.240005,170.940002,170.410004,169.429993,170.889999,170.179993,170.800003,170.419998,170.929993,172.029999,171.059998,172.970001,174.229996,174.330002,174.869995,173.149994,174.970001 +V,121.879997,121.059998,121.849998,122.220001,124.510002,124.239998,123.199997,122.580002,123.410004,124.529999,123.209999,124.910004,123.220001,119.989998,117,120.639999,117.400002,116.989998,119.620003,118.389999,119.199997,119.809998,121.190002,117.699997,118.790001,120.720001,119.779999,121.07,120.75,121.879997,123.800003,124.480003,123.959999,124.199997,124.459999,121.269997,121.209999,127.080002,126.010002,126.879997,127.510002,126.379997,127.18,128.160004,129.259995,129.899994,130.839996,131,131.820007,131.210007,131.100006,130.889999,129.929993,129.929993,130.660004,130.710007,131.880005,131.889999,131.279999,129.690002,130.639999,130.720001,130.850006,133.070007,133.559998,136.279999,133.839996,134.740005,133.910004,134.860001,134.399994,135,135.100006,136.199997,135.110001,135.5,134.529999,135.330002,130.929993,132.550003,131.020004,132.740005,132.449997,132.5,131.449997,133.289993,134.089996,135.520004,136.690002,138.149994,139.899994,139.419998,138.460007,139.639999,140.899994,140.130005,140.990005,140.029999,140.029999,142.639999,142.5,140.710007,136.479996,136.740005,138.25,138.919998,139.820007,139.710007,140.279999,140.679993,140.009995,139.729996,140.210007,140.759995,139.919998,140.649994,141.330002,140.940002,140.039993,141.139999,142.100006,144.199997,145.399994,145.199997,147.029999,146.740005,146.889999,147.800003,142.669998,144.5,143.199997,144.080002,145.490005,146.570007,147.630005,147.839996,146.179993,147.630005,147.419998,149.240005,150.050003,149.110001,149.580002,149.270004,150.020004,150.089996,150.789993,149.669998,149.369995,146.759995,145.360001,141.889999,142.309998,135.520004,133.729996,140.059998,137.229996,141.740005,142.449997,139.289993,140.080002,140.639999,139.119995,134.259995,140.520004,137.740005,134.330002,132.759995,137.850006,140.830002,139.779999,139.800003,140.789993,144.779999,145.229996,143.929993,139.720001,139.720001,139.490005,141.839996,140.179993,134.759995,133.369995,134.419998,132.869995,135.940002,135.910004,141.380005,139.100006,141.710007,145,138.639999,141.050003,137.110001,137.880005,136.809998,137.800003,137.539993,135.089996,131.399994,132.660004,131.259995,128.759995,124.260002,121.730003,130.229996,132.009995,130.940002,131.940002,132.919998,128.130005,133.649994,136.059998,136.800003,138.410004,138.669998,138.059998,137.100006,137.339996,137.339996,137.279999,138.5,138.050003,137.009995,137.699997,138.669998,135.990005,135,137.600006,135.009995,140.149994,141.5,142.529999,141.490005,140.169998,140.380005,140.800003,141.990005,143.490005,143.160004,144.910004,144.440002,144.729996,144,145.869995,146.059998,147.039993,147.220001,148.119995,149.470001 +CAT,151.119995,153.75,151.509995,153.589996,158.25,154.5,153.690002,152.539993,154.570007,156.460007,152.149994,154.059998,155.800003,146.899994,144.289993,149.190002,146.990005,145.160004,147.380005,143.889999,145.059998,145.179993,148.130005,142.990005,143.080002,148.089996,146.789993,150.139999,150.229996,152.139999,153.309998,155.949997,155.699997,153.25,153.990005,144.440002,145.190002,146.309998,144.720001,144.360001,144.419998,143.860001,143.779999,146.369995,149.820007,149.929993,152.610001,153.970001,154.860001,155.279999,152.589996,153.800003,153.690002,155.710007,158.919998,156.199997,157.740005,157.699997,155.850006,153.619995,155.460007,151.910004,153.520004,152.5,153.009995,156.509995,156.289993,155.320007,156.300003,157.490005,154.710007,153.139999,150.020004,148.679993,143.300003,143.130005,139.529999,139.940002,136.580002,135.539993,134.610001,136.029999,135.669998,136.289993,133.830002,135.809998,135.410004,140.970001,141.25,136.759995,139.419998,140.75,138.080002,138.949997,141.119995,139.419998,136.820007,136.279999,137.970001,140.479996,142.580002,142.559998,139.75,143.800003,138.539993,138.009995,138.509995,139.479996,142.380005,139.710007,138.520004,135.919998,135.020004,134.919998,132.020004,136.259995,139.339996,138.669998,139.990005,139.630005,136.789993,138.210007,142.039993,142,141.860001,139.059998,138.850006,138.240005,140.589996,141.570007,141.320007,142.050003,142.029999,144.279999,145.539993,144.899994,146.220001,149.070007,152.759995,156,156.380005,154,154.089996,153.169998,152.470001,152.490005,152.279999,154.820007,158.220001,156.75,153.309998,153.350006,149.460007,143.720001,140.970001,142.070007,141.800003,143.710007,141.339996,135.800003,131.320007,128.710007,118.980003,112.339996,115.629997,115.050003,113.980003,117.459999,121.32,124.699997,125.790001,126.410004,129.330002,135.100006,131.389999,126.910004,125,125.959999,125.099998,129.419998,129.960007,125.980003,122.269997,123.870003,122.32,124.800003,124.599998,130.770004,130.229996,135.669998,138.949997,129.320007,128.369995,123.550003,123.389999,123.239998,125.370003,125.900002,126.769997,124.470001,124.269997,122.330002,121.550003,120.07,116.949997,124.760002,126.669998,125.610001,127.07,126.379997,121.510002,128.149994,128.229996,129.770004,130.270004,132.960007,132.100006,131.800003,130.690002,131.660004,134.539993,136.600006,132.240005,131.820007,132.729996,136.860001,124.370003,126.529999,130.110001,133.160004,130.910004,130.880005,132,130.539993,128.779999,128.600006,128.929993,132.669998,133.100006,132.619995,136.199997,135.800003,140.309998,138.880005,138.679993,141.410004,137.979996,139.580002,137.339996,137.470001 +WBA,70.550003,69.790001,69.5,68.970001,70.599998,70.150002,69.860001,68.550003,67.379997,67.57,66.620003,66.050003,66.269997,65.830002,65.43,67.470001,65.959999,67.589996,65.470001,63.099998,63.169998,65.510002,64.650002,63.470001,62.849998,63.759998,64.110001,64.040001,63.82,66.220001,65.970001,66.260002,65.279999,63.919998,64.599998,65,65.949997,66.739998,67.110001,66.449997,65.419998,63.650002,62.23,63.810001,62.299999,62.360001,62.939999,63.810001,64.089996,65.099998,64.610001,65.739998,65.989998,64.339996,64.5,64.230003,63.91,63.41,63.529999,62.700001,63.540001,62.389999,62.860001,63.299999,62.889999,63.150002,63.599998,63.400002,64.059998,63.700001,63.91,64.870003,65.800003,64.150002,64.610001,68,67.790001,67.610001,67.239998,66.57,66.260002,59.700001,60.02,61.130001,60.759998,62.380001,63.299999,63.73,63.200001,63.66,63.880001,65.169998,65.160004,65.629997,66.160004,64.93,64.980003,65.339996,65.510002,66.699997,67.540001,68.639999,69.160004,67.620003,66.440002,66.980003,67.220001,67.419998,67.050003,66.489998,66.169998,66.489998,66.480003,68.660004,68.730003,69.620003,69.989998,69.989998,70.25,69.639999,69.279999,69.209999,69.440002,69.279999,68.660004,67.800003,68.559998,67.620003,68.239998,68.029999,68.190002,68.800003,68.739998,70.379997,70.480003,70.279999,70.449997,70.879997,71.279999,72.889999,73,72.199997,72.209999,72.959999,73.809998,72.900002,72.459999,73.489998,73.800003,73.339996,72.510002,74.150002,73.559998,72.309998,70.900002,73.5,74.720001,76.279999,76.980003,76.580002,77.349998,77.650002,77.260002,74.199997,75.739998,76.230003,76.82,78.800003,79.769997,79.900002,79.300003,79.970001,80.599998,81.910004,82.440002,82.389999,81.809998,81.919998,81.519997,82.290001,82.519997,81.919998,79.790001,79.760002,80.809998,81.699997,83.519997,84.639999,84.849998,84.669998,85.690002,82.82,82.940002,81.190002,81.160004,81.809998,82.440002,82.32,78.739998,76.220001,75.480003,73.290001,69.610001,67.260002,65.260002,67.720001,68.360001,68.050003,68.330002,68.040001,67.330002,69.57,69.970001,71.370003,72.230003,72.480003,71.709999,70.650002,71.790001,72,71.989998,72.43,71.589996,71.709999,71.32,71.889999,71.580002,71.5,71.610001,72.260002,71.879997,71.459999,71.309998,71.470001,71.199997,70.120003,70.470001,71.559998,72.43,72.110001,73.43,74.43,71.800003,70.470001,70.43,71.309998,71.480003,71.370003,71.190002,66.610001 +VZ,48.709999,48.889999,48.84,49.009998,49.009998,48.799999,48.650002,48.450001,48.290001,48.560001,48.310001,47.689999,47.279999,46.880001,46.290001,47.07,47.310001,48,47.82,47.16,47.5,47.93,48.240002,47.48,46.919998,48.27,47.580002,47.740002,47.66,48.389999,48.849998,48.619999,48.43,47.900002,48.66,49.669998,50.099998,49.759998,51.57,49.349998,48.82,47.75,47.84,48.189999,47.73,47.02,46.380001,47.200001,48.619999,48.490002,47.790001,47.860001,47.849998,47.740002,48.43,48.810001,48.59,48.639999,48.52,48.200001,48.599998,47.669998,47.810001,47.82,47.970001,48.41,49.009998,49.18,49.299999,48.810001,47.400002,47.82,48.060001,47.459999,48.5,48.09,48.630001,49.759998,49.599998,49.299999,49.310001,50.860001,50.310001,50.419998,50.700001,51.279999,51.48,50.740002,51.34,51.34,51.240002,51.41,51.59,51.43,51.139999,50.75,50.619999,50.75,51.509998,50.91,51.18,52.009998,52.490002,51.639999,51.73,51.98,52.27,52.48,52.459999,52.700001,53.009998,52.470001,52.220001,52.869999,53.240002,54.27,54.790001,54.650002,54.91,54.139999,54.279999,54.779999,54.849998,54.650002,54.57,54.75,54.369999,53.189999,53.82,54.290001,54,54.119999,54.720001,54.970001,54.939999,54.549999,54.700001,54.389999,53.5,53.950001,54.419998,53.540001,53.049999,53.139999,53.59,53.389999,53.84,54.419998,54.290001,55.02,54.939999,55.02,54.990002,54.330002,53.330002,53.73,53.599998,53.700001,53.959999,54.650002,54.900002,54.98,57.209999,57.419998,56.43,55.509998,56.48,58.18,57.09,56.049999,56.630001,57.209999,57.209999,57.650002,58.27,58.459999,58.720001,58.66,58.939999,59.080002,60.209999,60.619999,59.459999,59.16,58.639999,59.169998,60.650002,60.060001,59.450001,60.299999,58.16,58.09,58.080002,57.68,58.27,58.849998,57.25,57.09,57.080002,55.950001,55.650002,55.860001,55.07,54.919998,53.049999,54.439999,55.150002,55.27,56.220001,56.02,56.220001,56.360001,56.720001,58.380001,57.049999,57.599998,58.02,58.029999,58.099998,57.080002,56.830002,57.09,56.990002,57.759998,57.07,56.400002,55.07,53.279999,54,55.060001,54.549999,54.040001,54.139999,53.790001,53.57,53.950001,54.049999,54.419998,54.48,54.029999,55.16,55.439999,55.759998,56.150002,56.919998,56.779999,56.639999,56.720001,56.919998,56.959999 +HD,181.740005,181.639999,178.580002,177.940002,182.160004,179.710007,178.350006,177.410004,178.070007,178.960007,177.100006,178.160004,178.020004,175.289993,171.800003,176.380005,174.679993,174.759995,178.240005,172.899994,173.759995,177.440002,179.130005,174.449997,172.509995,173.490005,172.860001,173.360001,172.800003,174.429993,174.910004,179.850006,177.080002,177.009995,177.660004,176.259995,177.389999,185.720001,186.460007,184.800003,184.630005,185.910004,183.190002,185.029999,183.559998,185.039993,186.360001,187.160004,190.309998,191.080002,187.979996,186.380005,185.330002,187.419998,189.789993,186.869995,186.669998,187.149994,186.850006,185,187.089996,186.550003,187.350006,191.360001,191.940002,193.589996,196.169998,198.330002,199.639999,201.309998,200.309998,199.669998,200.539993,200.690002,199.210007,199.080002,200.309998,197.410004,196.380005,196.360001,195.020004,195.210007,195.100006,194.020004,193.619995,194.410004,194.479996,196.080002,197.610001,196.949997,197.949997,198.690002,198.880005,201.100006,200.970001,202.630005,202.449997,202.229996,201.990005,201,199.399994,197.139999,197.279999,197.520004,196.300003,195.660004,195.639999,195.690002,197.050003,198.020004,198.080002,196.300003,194.139999,193.100006,193.990005,195.389999,195.559998,197.929993,200.229996,198.970001,200.160004,201.300003,201.979996,201.970001,201.679993,199.259995,200.770004,205.080002,204.149994,205.889999,206.229996,210.690002,213.850006,211.979996,209.449997,209.070007,208.399994,211.020004,211.679993,211.059998,212.389999,207.990005,207.460007,207.520004,206.839996,207.149994,207.600006,204.75,203.740005,198.850006,196.380005,198.410004,195.75,193.699997,189.740005,192.470001,191.169998,193.580002,185.169998,180.440002,179.850006,178.75,178.529999,176.970001,179.070007,172.229996,173.199997,176.240005,175.880005,180.460007,179.929993,182.190002,182.009995,187.229996,188,185.990005,179.429993,179,179.899994,177.360001,177.020004,173.589996,169.050003,169.300003,168.850006,169.820007,173.220001,177.429993,175.660004,180.320007,181.740005,175.300003,175.960007,172.789993,171.690002,172.210007,174.210007,173.869995,172.289993,167.970001,170.039993,167.559998,164.160004,160.479996,158.139999,168.279999,170.320007,170.220001,171.820007,172.410004,168.610001,173.619995,177.039993,177.889999,179.729996,179.059998,179.410004,178.809998,176.470001,177.039993,174.869995,179.580002,177.110001,176.889999,177.289993,180.399994,179.830002,179.690002,182.179993,183.529999,184.369995,186.429993,186.389999,184.720001,184.070007,184.539993,182.919998,185.520004,188.410004,187.710007,192.389999,192.330002,191.850006,191.820007,192.389999,189.979996,188.300003,183.669998,185.139999,185.169998 +IBM,156.949997,155.720001,158.320007,156.210007,159.309998,160.259995,159.320007,158.119995,159.610001,160.259995,157.350006,156.199997,156.690002,152.089996,148.889999,153.369995,151.910004,152.520004,153.429993,150.070007,149.850006,154.119995,154.029999,150.570007,152.690002,155.389999,155.360001,158.070007,156.710007,157.889999,160.910004,148.789993,147.699997,144.899994,145.860001,145.559998,145.940002,146.720001,146.479996,144.960007,145,142.449997,141.990005,143.910004,143.220001,143,142.610001,144.240005,144.139999,144.300003,143.740005,144.630005,144.5,144.080002,145.490005,145.089996,144.669998,144.070007,143.639999,141.220001,142.619995,141.309998,141.949997,143.039993,143.699997,144.710007,145.360001,146.139999,146.580002,146.869995,146.350006,145.199997,145.389999,144.479996,143.899994,142.630005,141.25,141.279999,138.789993,139.080002,137.479996,140.039993,139.699997,139.860001,139.570007,141.429993,142.479996,144.389999,144.710007,144.940002,146.449997,145.899994,145.460007,143.490005,144.520004,149.240005,146.350006,145.699997,146.380005,146.619995,146.710007,145.149994,145.490005,144.929993,143.5,142.960007,147.699997,146.029999,147.009995,146.889999,144.770004,144.479996,142.710007,143.360001,143.910004,145.339996,146.059998,146.509995,145.970001,145.240005,145.369995,146.039993,146.690002,146.589996,147.539993,145.929993,146.479996,145.679993,146.660004,146.389999,145.449997,145.649994,146.490005,146.570007,148.949997,148.330002,147.940002,148.559998,149.059998,151.149994,151.350006,150.029999,148.910004,151.610001,151.5,151.210007,153,153.75,153.220001,151.309998,149.029999,148.389999,147.240005,142.690002,139.020004,140.850006,141.130005,145.119995,134.050003,130.550003,129.100006,130.020004,131.210007,127.209999,126.449997,124.790001,119.639999,115.400002,115.43,116.830002,115.669998,120.059998,123.120003,124.839996,123.379997,123.540001,120.900002,120.839996,120.199997,121.440002,121.57,120.309998,117.199997,118.57,117.190002,119.559998,120.029999,123,121.480003,124.269997,125.309998,121.599998,123.910004,119.339996,121.129997,120.889999,121.160004,120.730003,119.900002,116.099998,116.650002,116.43,113.019997,110.940002,107.57,111.389999,113.779999,113.029999,113.669998,115.209999,112.910004,117.32,118.150002,119.830002,120.690002,121.790001,121.459999,120.389999,121.730003,121.620003,122.190002,123.82,122.519997,132.889999,132.529999,133.970001,134.270004,134.330002,134.380005,134.419998,134.100006,135.190002,135.550003,136.320007,133.190002,133.710007,133.990005,136.050003,137.520004,136.479996,138.029999,138.699997,138,137.839996,139.25,139.460007,139.720001,139.169998,138.130005,139.199997 +PG,80.290001,80.019997,79.160004,79.970001,80.290001,79.860001,79.720001,79,78.669998,78.970001,78.660004,78.309998,77.040001,76.410004,75.910004,76.410004,77.790001,78.839996,79.279999,77.400002,78.459999,79.050003,78.800003,78.43,78.160004,78.370003,78.269997,77.790001,78.370003,78.610001,78.43,78.199997,74.949997,73.800003,73,72.5,72.300003,72.75,72.809998,72.339996,71.959999,70.940002,71.360001,72.43,71.980003,71.440002,72.370003,73.150002,73.370003,73.279999,72.949997,73.529999,73.959999,73.449997,74.059998,74.029999,74.18,73.769997,74.309998,74.050003,74.889999,73.169998,73.449997,74.18,73.970001,74.349998,75.760002,77.18,77.529999,77.239998,76.470001,75.989998,77.379997,75.839996,76.330002,75.849998,76.440002,77.43,77.790001,78,77.690002,78.050003,78.059998,78.129997,77.900002,79.209999,79.309998,77.860001,79.82,79.160004,78.889999,79.309998,79.529999,80.029999,79.720001,78.730003,78.68,78.510002,78.989998,79.470001,80.089996,80.580002,80.199997,80.879997,80.650002,82,82.330002,82.519997,82.639999,82.349998,81.400002,81.43,81.519997,81.309998,82.300003,83.690002,83.690002,83.639999,83.900002,83.389999,83.239998,83.360001,83.440002,83.480003,83.489998,83.410004,82.949997,82.699997,83.290001,82.650002,81.910004,82.379997,82.010002,83.110001,83.449997,83.610001,84.25,84,84,85.360001,85.82,84.269997,83.120003,83.260002,82.860001,83.230003,83.669998,84.360001,83.029999,81.919998,82.150002,82.400002,82.199997,81.440002,78.870003,79.059998,80.129997,81.010002,81.860001,80.239998,87.300003,86.599998,87.160004,89.459999,89,87.860001,88.239998,89.190002,88.68,89.589996,89.809998,91.199997,91.510002,91.290001,91.360001,92.410004,92.699997,93.470001,93.489998,93.830002,93.82,93.290001,92.099998,91.410004,91.540001,91.940002,92.720001,93.010002,92.82,94.510002,93.32,93.309998,93.550003,92.449997,93.029999,93.910004,94.029999,96.489998,96.639999,92.769997,92.489998,91.760002,90.980003,90.970001,87.360001,90.089996,92.019997,91.18,91.919998,91.279999,90.639999,92.489998,92.120003,92.459999,90.949997,91.169998,91.769997,91.150002,92.010002,91.370003,90.639999,91.419998,90.440002,94.839996,94.300003,93.599998,93.519997,93.540001,94.519997,96.470001,97.470001,98.029999,97.440002,97.919998,97.139999,97.709999,98.269997,99.260002,99.239998,98.459999,98.480003,99.989998,99.279999,99.779999,100.25,99.57,99.830002,98.910004,98.550003,98.440002 +DIS,103.410004,104.940002,103.589996,104.029999,104.730003,105.169998,103.730003,103.900002,103.239998,102.870003,101.480003,101.349998,101.82,100.599998,98.540001,100.650002,99.360001,98.540001,100.440002,98.660004,99.419998,100.949997,102.110001,100.349998,99.699997,101.370003,100.800003,100.389999,100.349998,100.239998,102.169998,101.209999,100.889999,100.239998,100.150002,99.459999,101.150002,99.839996,99.230003,100.330002,100.059998,99.620003,98.760002,101.150002,102.480003,101.790001,99.970001,101.68,102.07,102.440002,102.919998,105.040001,104.339996,103.93,104.059998,104.07,102.889999,102.110001,102.199997,99.690002,99.980003,99.470001,99.360001,100.239998,99.940002,101.910004,102.470001,103.980003,104.349998,104.330002,106.309998,108.75,108.849998,107.059998,106.099998,107.150002,105.889999,106.339996,104.449997,104.260002,103.959999,104.769997,104.809998,105.330002,104.040001,105.339996,104.779999,106.019997,106.029999,108.040001,108.25,110,110.199997,110.300003,110.690002,112.129997,111.480003,111.089996,110.699997,111.18,113.510002,112.620003,112.629997,113.559998,112.970001,112.75,114.089996,115.940002,116.559998,113.980003,114.160004,112.68,112.120003,112.75,112.849998,112.480003,112.480003,111.989998,112.389999,111.940002,112,111.93,112.330002,112.580002,112.449997,111.919998,112.019997,110.849998,109.870003,110.260002,110.970001,110.68,109.599998,109.459999,110.669998,109.260002,109.360001,109.529999,109.790001,111.620003,110.400002,112.769997,113.629997,115.209999,116.040001,116.940002,116.239998,117.660004,116.910004,116.129997,114.779999,116.019997,116.889999,112.860001,111.150002,112.610001,113.440002,116.190002,117.129997,116.18,118.900002,118.269997,117.849998,111.610001,114.160004,113.190002,113.040001,114.760002,114.830002,116.099998,115.18,115.449997,116.709999,117.050003,116,118,116.699997,116.849998,117.120003,117.110001,116.190002,115.419998,111.870003,113.029999,112.080002,112.550003,113.900002,116.099998,116.610001,115.489998,115.739998,112.870003,114.330002,111.980003,111.860001,111.970001,112.209999,113.389999,112.199997,110.620003,109.449997,109.220001,107,104.220001,100.349998,105.830002,106.519997,107.300003,109.650002,108.970001,106.330002,109.610001,110.559998,111.419998,112.669998,112.800003,112.650002,112.419998,111.760002,110.910004,111.010002,111.040001,110.599998,111.120003,110.550003,111.089996,110.809998,110.900002,110.129997,111.519997,111.300003,111.800003,112.660004,111.410004,110.949997,111.510002,109.440002,109.199997,110.199997,110.660004,112.589996,113.510002,113.68,114.290001,115.25,113.589996,113.5,112.779999,112.839996,114.010002 +GS,263.119995,266.929993,265.350006,266.339996,270.769989,273.380005,268.529999,264.429993,266.609985,267.600006,262.529999,263.190002,261.850006,252.600006,245.259995,254.880005,247.259995,249.369995,251.860001,247.350006,250.580002,252.619995,255.809998,249.970001,252.190002,256.570007,252.940002,259.589996,255.919998,257.880005,253.630005,254,254.169998,251.960007,246.669998,242.490005,239.229996,240.089996,239.800003,238.330002,236.669998,234.050003,233.410004,234.940002,237.199997,237,241.729996,243.440002,242.919998,243.910004,241.559998,240.960007,239.100006,237,237.699997,238,237.809998,236.100006,235.009995,227.029999,229.160004,225.880005,228.350006,229.889999,228.339996,232.229996,233.449997,233.389999,234.089996,232.630005,233.830002,233.649994,231.919998,231.389999,228.320007,227.820007,226.979996,226.020004,221.539993,221.580002,220.179993,223.419998,220.570007,223.259995,220.380005,220.740005,221.789993,227.990005,226.850006,225.660004,227.220001,226.410004,231.440002,231.020004,231.240005,229.630005,231.690002,233.759995,235.880005,236.690002,237.110001,237.639999,238.949997,237.429993,236.039993,233.990005,234.089996,235.929993,237.830002,236.369995,233.779999,229.610001,226.860001,229.559998,229.25,233,233.380005,235.779999,238.649994,239.339996,236.339996,235.110001,242.600006,242.369995,241.399994,239.399994,237.809998,237.660004,237.559998,234.520004,233.910004,231.910004,230.210007,228.149994,228.330002,229.240005,227.889999,228.889999,235.580002,237.399994,235.339996,232.899994,232.5,228.880005,227.740005,224.240005,225.330002,226.070007,227.779999,227.479996,225.710007,225.350006,222.910004,214.889999,212.970001,213.869995,215.220001,221.699997,228.279999,224.949997,226.960007,221.600006,218.559998,209.179993,214.009995,212.360001,214.490005,219.279999,225.369995,226.970001,229.690002,228.720001,228.199997,231.279999,231.649994,222.649994,206.050003,205.050003,202.490005,203.740005,202.119995,198.220001,191.339996,192.600006,189.100006,194.339996,193.649994,198.350006,194.850006,190.690002,191.630005,184.309998,184.089996,179.669998,178.830002,176.800003,176.699997,175.919998,172.770004,168.009995,171.5,169.25,168.410004,160.050003,156.350006,162.929993,165.410004,163.029999,167.050003,172.029999,169.509995,175.050003,176.020004,175.369995,176.470001,176,176.929993,178.720001,179.910004,197.080002,199.089996,202.539993,197.679993,196.899994,197.800003,200.740005,199.720001,200.5,202.479996,198.009995,196.539993,197.720001,198.009995,196.619995,193.070007,191.669998,191.330002,194.490005,194.690002,192.529999,198.5,198.669998,198.600006,196.360001,196,198.649994,198.899994,198.100006,196.699997,198.199997 +INTC,49.75,50.709999,51.32,50.740002,52.189999,51.52,51.779999,51.860001,50.880001,51.169998,50.830002,51.549999,51.560001,50.830002,49.360001,52.48,51.189999,49.599998,52.080002,48.919998,49.75,49.990002,50.380001,48.790001,49.549999,51.27,51.099998,52.720001,51.860001,52.400002,53.540001,53.610001,52.220001,51.529999,51.099998,51.450001,51.380001,53.049999,52.73,51.619999,53.330002,52.310001,52.279999,52.779999,53.330002,53.630001,54.34,54.98,54.669998,54.900002,53.919998,54.639999,54.810001,53.5,54.32,54.450001,55.209999,54.75,55.439999,55.32,55.68,55.200001,57.080002,56.830002,56.529999,57.029999,55.880001,55.049999,54.52,54.82,55.029999,55.540001,55.110001,53.220001,52.93,53.459999,52.189999,52.5,50.709999,49.669998,48.759998,49.25,49.709999,50.200001,49.470001,50.75,51.369999,51.860001,52.16,51.200001,52.349998,52.220001,52.009998,51.75,51.720001,51.98,51.91,52.310001,52.18,52.43,52.16,47.68,47.689999,48.099998,48.810001,49.48,49.630001,49.299999,49.700001,49.959999,50.139999,48.849998,48.450001,48.119999,47.459999,47.169998,47.099998,46.5,47.619999,47.049999,46.98,47.66,48.349998,48.57,48.75,48.240002,48.43,47.959999,47.720001,47.259998,46.450001,46.299999,44.93,44.93,45.57,45.540001,45.419998,46.099998,46.150002,47.200001,46.66,46.91,45.91,45.700001,45.880001,47.290001,46.450001,48.099998,48.759998,48.130001,47.029999,47.029999,46.549999,44.799999,44.23,44.880001,44.529999,45.939999,45.889999,44.970001,44,45.009998,44.5,42.419998,44.310001,45.689999,45.400002,47.759998,46.880001,48.220001,47.110001,47.970001,47.25,48.720001,48.990002,48.110001,46.650002,47.389999,47.09,48.110001,48.830002,48,47.389999,47.029999,46.540001,47.450001,48.07,48.860001,47.700001,49.310001,50.130001,47.75,48.369999,46.240002,47.209999,47.380001,47.830002,48.290001,47.860001,47.080002,47.740002,45.57,45.540001,44.84,43.59,46.189999,46.360001,46.75,46.93,47.080002,44.490002,47.220001,47.439999,47.740002,48.009998,48.560001,48.93,48.349998,48.599998,48.130001,48.470001,49.189999,48.27,47.939999,49.759998,47.040001,46.709999,46.540001,47.540001,47.119999,48.73,49.220001,50.009998,49.900002,49.23,48.84,48.77,50.009998,50.470001,50.810001,51.66,51.400002,51.389999,51.41,52.490002,53.099998,53.23,53.240002,52.959999,53.299999 +WMT,89.980003,89.059998,87.739998,87.919998,88.720001,88.07,88.300003,87.669998,87.510002,89.169998,87.449997,87.949997,88.18,87.139999,85.419998,87.5,86.050003,87.769997,88.970001,85.550003,86.800003,87.220001,87.809998,86.690002,86.279999,86.449997,85.910004,85.43,86.019997,86.839996,87.900002,87.57,87.889999,86.980003,86.099998,86.529999,87.169998,87.940002,87.290001,88.459999,87.410004,86.339996,86.230003,87.529999,85.470001,85.739998,83.059998,82.690002,83.379997,84.389999,84.519997,86.129997,84.489998,83.639999,84.510002,83.370003,83.010002,82.849998,82.459999,82.400002,84.120003,82.540001,82.989998,85.419998,84.620003,84.559998,84.949997,84.360001,84.300003,84.099998,84.089996,83.790001,83.699997,83,83.610001,83.610001,84.209999,84.82,86.470001,85.980003,86.889999,85.860001,85.650002,84,84.440002,84.57,84.510002,85.93,87.209999,86.529999,86.519997,87.699997,87.639999,88.190002,88.07,87.720001,88.059998,87.629997,87.959999,87.900002,88.230003,88.129997,88.879997,89.230003,88.239998,88.760002,89.599998,89.669998,89.769997,90.050003,89.010002,90.18,89.639999,90.849998,90.220001,98.639999,97.849998,96,96.080002,95.669998,95.18,94.949997,94.540001,96.07,95.639999,96.099998,95.860001,95.360001,96.620003,96.449997,95.830002,96.900002,96.639999,95.970001,95.120003,94.589996,94.82,95.43,95.239998,95.75,95.900002,94.919998,95.099998,94.589996,94.129997,93.910004,94.400002,95.150002,94.07,94.209999,93.309998,94.690002,97.080002,95.760002,93.919998,94.809998,93.82,95.809998,96.559998,96.169998,97.150002,97.139999,97.800003,97.559998,99.18,98.940002,99.800003,102.419998,100.279999,100.580002,101.339996,102.910004,103.330002,104.32,104.879997,105.559998,103.870003,102.940002,101.529999,99.540001,97.690002,96.779999,94.160004,94.169998,95.099998,95.150002,95.040001,97.459999,97.290001,97.650002,98.75,95.809998,94.769997,93.190002,93.940002,93.849998,93.110001,92.959999,91.849998,90.769997,91.080002,90.550003,87.279999,87.129997,85.82,90.410004,91.589996,92.129997,93.150002,93.339996,92.860001,93.440002,94.540001,95.199997,94.889999,94.959999,94.839996,94.949997,96.25,96.349998,96.739998,97.730003,97.489998,98.709999,98.360001,96.940002,97.059998,96.709999,94.800003,95.830002,93.860001,94.769997,95.599998,95.639999,96.730003,95.580002,96.199997,96.970001,97.940002,98.519997,99.989998,102.199997,99.879997,99.389999,99.550003,99.120003,98.690002,98.110001,98.989998,97.93 +MSFT,93.639999,93.32,93.860001,94.43,96.540001,96.769997,94.410004,93.849998,94.18,94.599998,92.889999,93.129997,92.480003,89.790001,87.18,93.779999,89.470001,89.389999,91.269997,88.519997,89.709999,92.330002,92.379997,90.230003,90.769997,92.879997,91.860001,93.580002,93.080002,94.169998,96.07,96.440002,96.110001,95,95.349998,93.120003,92.309998,94.260002,95.82,93.519997,95,93.510002,94.07,95.160004,96.220001,95.809998,96.940002,97.910004,97.699997,98.029999,97.32,97.150002,96.18,96.360001,97.599998,97.5,98.660004,98.309998,98.360001,98.010002,98.949997,98.839996,100.790001,101.669998,102.190002,102.489998,100.879997,101.629997,101.050003,101.309998,100.849998,101.419998,100.129997,100.860001,100.860001,101.870003,101.139999,100.410004,98.389999,99.080002,97.540001,98.629997,98.610001,100.010002,99.050003,99.760002,101.160004,101.849998,102.120003,101.980003,104.190002,105.43,104.910004,105.949997,105.120003,104.400002,106.269997,107.970001,107.660004,110.830002,109.620003,107.68,105.370003,106.080002,106.279999,107.57,108.040001,108.129997,108.879997,109.489998,109.669998,109,108.209999,109.559998,107.660004,107.639999,107.580002,106.870003,105.980003,107.059998,107.559998,108.400002,109.599998,110.260002,112.019997,111.949997,112.330002,111.709999,108.489998,108.739998,108.209999,109.379997,111.239998,111.709999,112.910004,113.370003,112.139999,113.209999,111.699997,113.57,114.260002,114.669998,114.449997,113.980003,114.410004,114.370003,115.610001,115.150002,115.169998,112.790001,112.129997,110.849998,112.260002,106.160004,105.910004,109.57,107.599998,111,110.709999,108.5,108.660004,109.629997,108.099998,102.32,108.300003,106.959999,103.849998,103.730003,106.809998,105.919998,106.160004,107.510002,107.720001,111.959999,111.75,109.57,106.870003,106.940002,104.970001,107.279999,108.290001,104.620003,101.709999,103.110001,103.07,106.470001,107.139999,111.120003,110.190002,110.889999,112.089996,108.519997,109.190002,104.82,107.589996,108.589996,109.080002,109.449997,106.029999,102.889999,103.970001,103.690002,101.510002,98.230003,94.129997,100.559998,101.18,100.389999,101.57,101.120003,97.400002,101.93,102.059998,102.800003,104.269997,103.599998,102.800003,102.050003,105.010002,105.379997,106.120003,107.709999,105.68,106.709999,106.199997,107.169998,105.080002,102.940002,106.379997,104.43,102.779999,105.739998,107.220001,106.029999,105.269997,105.669998,105.25,106.889999,106.809998,106.900002,108.220001,108.169998,107.150002,109.410004,110.970001,111.589996,112.360001,112.169998,112.029999,112.529999 +MRK,54.400002,54.299999,54.470001,54.759998,55.139999,55.360001,55.369999,54.799999,55.25,55.669998,54.630001,54.639999,54.689999,54.119999,53.41,54.040001,53.75,55.09,54.470001,53.27,54.09,54.540001,54.529999,53.360001,56.16,56.490002,56.200001,56.740002,57.169998,58.650002,59.27,58.919998,58.639999,58.830002,60.25,60.09,59.630001,59.41,59.470001,58.869999,57.98,57.299999,57.529999,57.75,57.380001,56.759998,57.950001,58.060001,59.689999,59.68,59.200001,59.75,59.07,59.139999,58.57,58.450001,59.169998,59.130001,59.09,58.400002,59.720001,59.529999,60.560001,62.02,61.389999,61.93,61.990002,62.580002,62.330002,62.439999,62.59,61.560001,62.029999,60.990002,61.029999,61.279999,61.18,61.470001,61.080002,60.720001,59.880001,60.299999,60.700001,60.459999,60.709999,61.639999,62.200001,62.02,62.299999,61.900002,62.66,62.889999,62.59,62.529999,62.939999,62.509998,62.52,62.689999,63.419998,64.489998,64.010002,63.490002,64.809998,65.870003,65.489998,65.220001,65.93,66.220001,66.580002,66.690002,66,66.07,66.720001,66.459999,67.370003,68.849998,69.059998,70.169998,69.169998,69.040001,68.970001,69.040001,68.989998,68.629997,68.809998,68.540001,68.589996,67.949997,68.620003,69.379997,69.669998,69.559998,69.080002,69.860001,70.830002,69.980003,70.419998,70.419998,69.980003,70.779999,71.099998,70.779999,70.650002,70.330002,70.720001,70.940002,71.529999,71.75,71.370003,71.220001,71.029999,71.459999,72.339996,70.449997,68.370003,69.809998,69.459999,71.220001,71.82,72.209999,72.349998,72.57,72.099998,70.540001,69.959999,70.400002,71.449997,72.870003,73.610001,73.120003,72.269997,73.120003,73.309998,75.080002,75.480003,74.860001,74.690002,74.610001,74.089996,74.839996,76.059998,76.349998,74.779999,74.790001,74.669998,75.440002,76.339996,77.230003,77.910004,79.339996,79.220001,78.209999,78.370003,76.720001,77.419998,77.110001,78.010002,79.010002,76.480003,75.230003,74.330002,73.769997,73.489998,72.900002,71.150002,74,75.379997,75.370003,76.410004,75.589996,74.040001,76.269997,75.43,75.989998,75.410004,74.480003,74.900002,73.370003,74.5,74.610001,75.599998,75.870003,75.830002,75.440002,73.169998,72.949997,72.919998,73.230003,73.370003,74.43,76.449997,76.870003,77.150002,77.389999,76.82,77.519997,76.709999,78.519997,79.019997,78.940002,79.809998,79.239998,79.43,79.830002,80.769997,80.379997,80.739998,80.620003,81.290001,81.650002 +UNH,228.380005,226.179993,227.270004,224.729996,225.429993,222.770004,226.940002,225.380005,229.479996,227.860001,225.050003,226.779999,222.820007,215.210007,212.550003,219.070007,217.960007,218.5,214,217.199997,224.580002,228.789993,229.070007,223.960007,222.729996,226.789993,221.899994,224.240005,224.279999,230.320007,238.550003,236.399994,235.759995,235.059998,234.339996,234.220001,234.899994,237.029999,240.179993,236.399994,236.850006,233.460007,234.149994,235.899994,233.779999,232.029999,229.210007,233.710007,238.279999,242.899994,239.5,241.720001,242.960007,244.639999,247.899994,245.179993,244.259995,242.729996,244.949997,242.169998,244.940002,241.509995,243.350006,244.630005,244.429993,248.649994,248.979996,250.679993,253.779999,253.580002,252.869995,255.330002,255.979996,254.869995,253.020004,252.809998,251.889999,254.369995,250.710007,249.770004,248.169998,244.899994,245.339996,247.479996,246.979996,250.5,250.759995,253.669998,255.539993,254.589996,256.049988,258.700012,256.980011,250.289993,255.419998,252.929993,252.699997,252.740005,253.759995,254.860001,257,255.949997,253.839996,253.220001,253.369995,256.079987,257.220001,256.76001,257.649994,258.809998,261.589996,260.359985,260.910004,263.480011,260.609985,263.100006,262.329987,262.399994,261.690002,260.73999,261.420013,264.279999,267.079987,268.51001,269,268.390015,268.459991,268.51001,267.640015,269.649994,268.279999,259.730011,261.040009,262.670013,265.48999,265.309998,263.869995,263.290009,265.329987,266.390015,266.670013,267.359985,263.51001,262.910004,264.649994,266.040009,269.100006,270.630005,270.899994,268.320007,269.200012,269.01001,270.109985,263.079987,257.119995,259.609985,260.25,272.570007,267.299988,266.809998,265.299988,262.190002,264.859985,256.320007,264.23999,258.179993,256.519989,258.279999,261.350006,260.929993,261.01001,261.01001,263.540009,274.630005,276.649994,276.549988,272.380005,269.220001,264.959991,264.940002,271.109985,266.049988,261.5,260.549988,261.619995,266.160004,271.149994,280.950012,282.549988,281.359985,286.329987,278.549988,276.850006,269.179993,266.529999,267.220001,270.640015,272.149994,265.019989,258.070007,252.970001,250.309998,242.440002,238.339996,232.940002,243.350006,245.970001,246.240005,249.119995,243.490005,236.850006,239.619995,240.080002,243.289993,243.639999,244.869995,247.669998,248.059998,256.869995,261.459991,259.769989,265.5,265.690002,267.019989,266.130005,268.049988,266.769989,267.339996,270.369995,270.200012,268.720001,268.209991,266.309998,269.5,269,261.899994,257.140015,263.5,263.799988,265.329987,271.130005,270.410004,269.51001,266.399994,267.109985,264.600006,262.980011,250.080002,242.220001,246.149994 +PFE,36.119999,35.880001,35.93,36.5,36.77,36.610001,36.75,36.349998,36.580002,36.779999,36.330002,36.330002,36.27,35.599998,34.490002,35.040001,35.009998,35.299999,35.490002,35.049999,35.68,36.130001,35.73,35.169998,35.459999,35.950001,35.790001,36.32,36.32,36.529999,36.330002,36.490002,36.529999,36.630001,36.799999,37.060001,36.68,36.849998,37,36.610001,35.400002,34.889999,34.759998,34.84,34.93,34.98,35.169998,35.040001,35.5,35.860001,35.689999,35.68,35.709999,35.639999,35.799999,35.720001,35.970001,35.889999,35.68,35.700001,36.049999,35.93,36.25,36.450001,36.439999,36.380001,36.490002,36.669998,36.299999,36.299999,36.220001,36.16,36.360001,36.16,36.220001,36.459999,36.299999,36.509998,36.380001,36.380001,36.209999,36.360001,36.279999,36.330002,36.349998,36.869999,37.110001,37.16,37.43,37.209999,37.52,37.529999,37.380001,37.650002,37.66,37.360001,37.330002,37.209999,37.700001,37.990002,38.16,38.41,38.59,39.93,40.27,39.650002,40.540001,41.040001,40.84,41.41,41,40.93,40.810001,40.709999,41.16,41.419998,42.09,42.330002,42.16,42.07,42.200001,42.400002,41.580002,41.5,41.5,41.5,41.52,41.369999,41.849998,41.779999,42.200001,42.060001,42.310001,42.41,42.849998,42.959999,43.009998,43.509998,43.259998,43.75,44.060001,43.93,43.790001,43.68,43.900002,44.07,44.27,44.220001,44.810001,44.700001,44.91,45.279999,45.470001,44.509998,42.810001,43.779999,43.119999,43.93,44.57,44,44.5,44.369999,44.099998,42.48,43.41,42.599998,43.23,42.889999,43.060001,43.669998,42.93,43.52,43.009998,44.400002,43.849998,44.279999,44.110001,43.52,42.91,43.209999,43.509998,44.18,43.529999,43.099998,43.139999,43.34,44.07,44.900002,45.509998,46.23,45.990002,45.139999,44.98,43.919998,44.400002,44.009998,44.16,44.57,43.799999,43.110001,42.400002,41.970001,41.950001,41.93,40.549999,42.189999,42.849998,42.959999,43.650002,43.25,42.040001,43,43.23,43.43,43.34,42.310001,42.880001,42.369999,42.73,42.110001,42.470001,42.529999,42.27,42.16,40.950001,40.639999,39.529999,40.77,41.580002,42.450001,42.880001,42.439999,42.110001,42.330002,41.700001,42.23,41.68,41.869999,41.700001,41.970001,42.400002,42.599998,42.200001,42.139999,42.959999,43.080002,43.02,42.93,43.349998,43.360001 +UTX,131.710007,131.610001,130.929993,131.259995,134.070007,131.5,130.149994,129.580002,129.25,128.330002,127.199997,127.160004,127,124.07,122.309998,126.639999,125.279999,124.449997,125.82,123.480003,124.910004,125.769997,125.760002,122.760002,122.220001,122.959999,122.449997,123.25,122.709999,123.809998,124.529999,124.800003,123.849998,123.080002,123.459999,122.099998,121.449997,122.82,122.459999,120.150002,118.959999,118.5,117.699997,119.510002,120.889999,121.790001,123.110001,124.099998,124.480003,124.980003,124.550003,124.779999,124.610001,125.190002,128.050003,127.870003,127.580002,127.400002,127.029999,125.110001,126.199997,124.82,125.809998,126.290001,125.949997,126.82,127.580002,127.610001,128.169998,127.849998,126.940002,126.940002,126.910004,127.489998,125.050003,125.360001,123.480003,124.870003,124.610001,125.639999,124.360001,124.599998,125.029999,125.029999,124.919998,124.949997,125.400002,126.68,127.059998,124.879997,127.349998,129.509995,128.979996,130.710007,131.690002,130.360001,130.259995,129.369995,134.240005,134.75,135.839996,134.529999,133.100006,135.740005,134.899994,134.119995,133.889999,133.940002,134.490005,134.710007,134.240005,133.100006,132.179993,132.419998,131.75,133.309998,134.440002,135.139999,135.979996,133.240005,132.619995,133.360001,135.360001,134.5,133.619995,132.589996,131.699997,131.899994,132.779999,133.520004,132.009995,133.649994,133.610001,133.889999,135.520004,137.800003,137.759995,139.580002,140.5,141.850006,142.080002,140.339996,139.710007,139.559998,139.679993,139.809998,140.919998,141.449997,141.020004,140.389999,139.059998,139.589996,135.880005,131.119995,129.369995,129.630005,130.330002,132.509995,130.070007,128.940002,128.679993,126.400002,130.020004,122.07,124.400002,123.230003,121.089996,122.620003,124.209999,127.580002,127.43,127.25,127.940002,130.550003,131.339996,130.710007,128.300003,129.119995,128.889999,129.729996,130.130005,127.849998,126,125.709999,129.039993,127.980003,122.68,122.730003,121.199997,121.839996,123.599998,120.870003,121.449997,119.449997,119.410004,118.93,119.660004,119.25,118.800003,115.309998,115.779999,113.800003,109.620003,106.18,102.059998,106.010002,105.760002,105.339996,106.480003,108.300003,103.480003,107.019997,106.970001,108.900002,109.32,110.410004,109.949997,110.849998,111.059998,110.870003,112.769997,113.900002,111.059998,117.040001,115.559998,115.809998,115.080002,117.839996,119.120003,118.07,118.980003,119.139999,120.769997,121.360001,120.720001,122.489998,122.720001,123.980003,124.419998,124.129997,127.760002,128.639999,128.429993,126.32,127.769997,128.270004,127.190002,126.900002,125.669998,125.769997 +XOM,76.269997,76.18,74.260002,74.120003,74.559998,75.239998,74.529999,73.599998,74.419998,75.120003,74.150002,73.989998,75.040001,73.5,72.889999,74,73.699997,72.809998,74.610001,73.220001,75.019997,74.870003,76.019997,74.870003,74.870003,77.07,77.43,77.220001,77.839996,78.540001,78.330002,79.220001,79.419998,79,79.57,78.349998,79.5,80.860001,77.790001,77.75,76.949997,76.800003,76.540001,76.900002,77.739998,78.089996,79.93,81.720001,81.279999,81.830002,81.790001,82.019997,81.879997,81.300003,82.279999,81.639999,82.150002,80.269997,78.709999,78.419998,81.5,81.239998,81.830002,80.970001,80.68,82.059998,82.879997,83.599998,83.099998,82.419998,81.510002,81.889999,80.660004,80.82,80.699997,80.449997,79.690002,81.379997,79.739998,80.639999,81.709999,81.970001,82.730003,81.760002,82.239998,82.309998,82.330002,82.900002,83.660004,82.589996,82.690002,83.309998,82.489998,82.309998,82.220001,82.010002,81.400002,81.400002,83.010002,83.589996,84.239998,81.919998,81.739998,81.510002,80.389999,79.910004,80.199997,80.18,81.269997,80.730003,80.32,79.419998,78.559998,78.309998,76.940002,78,78.260002,78.809998,78.830002,79.959999,79.080002,79.620003,80.400002,80.279999,80.860001,80.510002,80.169998,80.290001,81.360001,80.459999,81.830002,81.709999,82.860001,83.129997,82.32,82.919998,83.410004,83.629997,84.629997,84.82,85.169998,86.599998,86.5,85.779999,85.769997,85.019997,85.809998,86.459999,86.150002,85.580002,85.339996,86.129997,86.510002,84.519997,81.599998,81.379997,80.82,81.199997,81.5,81.849998,81.970001,81.150002,79.839996,77.620003,78.309998,77.529999,77.050003,78.779999,79.68,80.669998,81.949997,81.639999,81.989998,83.029999,81.709999,80.870003,79.830002,78,77.389999,78.190002,78.959999,79.220001,76.970001,77.559998,75.489998,76.980003,77.050003,78.449997,79.059998,79.5,81.220001,79.43,78.389999,77.639999,76.540001,76.68,76.019997,76.980003,75.580002,74.040001,72,70.779999,68.629997,68.120003,65.510002,68.639999,68.940002,68.169998,68.190002,69.690002,68.620003,71.150002,71.519997,72.040001,72.419998,72.050003,71.720001,71.629997,71.669998,71.639999,72.129997,72.989998,71.889999,71.300003,71.400002,71.720001,71.239998,71.510002,72.290001,73.279999,75.919998,74.82,75.589996,75.260002,74.68,73.980003,74.099998,75.400002,76.25,76.269997,77.709999,78.230003,78.529999,77.82,78.419998,78.5,78.660004,79.470001,79.029999,80 +TRV,139.580002,141.389999,138.880005,139.669998,142.300003,141.490005,140.690002,139.520004,140.470001,141.320007,140.020004,141.479996,141.100006,138.149994,134.899994,138.220001,136.75,138.789993,138.860001,134.839996,136.990005,138.630005,139.289993,137.25,137.229996,137.860001,136.589996,137.289993,136.289993,137.550003,137.339996,136.470001,136.589996,136.839996,137.229996,132.880005,132.220001,132.949997,133.190002,131.600006,131.089996,128.320007,127.309998,129.710007,128.990005,128.660004,129.75,130.880005,131.25,130,129.860001,130.149994,130.720001,129.850006,131.139999,131.419998,130.899994,130.649994,131.029999,128.210007,130.169998,128.520004,129.289993,129.720001,129.169998,128.770004,129.770004,131.320007,130.5,129.580002,129.720001,128.860001,129.369995,127.589996,128.160004,124.989998,123.449997,124.410004,123.720001,122.620003,121.339996,122.449997,122.339996,122.389999,122.769997,122.599998,123.18,125.400002,125.870003,125.050003,126.019997,126.629997,128.190002,128.789993,130,125.18,125.199997,124.239998,124.75,126.279999,129.490005,130.729996,131.100006,130.139999,128.960007,128.330002,129.699997,130,129.940002,129.210007,129.559998,128.869995,128.050003,127.540001,128.770004,130.339996,130.419998,131.419998,131.710007,129.410004,129.520004,130.509995,131.889999,132.279999,132.660004,131.649994,131.600006,132.130005,132.589996,132.570007,130.089996,127.599998,127.849998,126.889999,128.830002,130.009995,129.889999,131.369995,132.5,134.149994,134.440002,132.830002,131.289993,129.5,129.119995,129.710007,128.970001,129.509995,129.539993,130.789993,130.130005,131.660004,131.589996,128.169998,124.309998,123.650002,123.389999,124.75,126.440002,125.139999,126.07,124.07,123.800003,121.559998,121.239998,121.290001,122.32,125.870003,125.129997,125.199997,124.900002,126.529999,128.600006,130.279999,130.990005,131.029999,127.040001,126.809998,123.040001,125.589996,128.770004,130.520004,128.369995,127.760002,126.599998,130.339996,129.610001,130.699997,130.630005,130.369995,130.110001,126.690002,125.410004,123.559998,123,120.970001,122.010002,121.5,120.550003,119.93,119.300003,119.160004,117.32,116.059998,112.629997,117.169998,118.669998,118.239998,119.75,117.370003,115.260002,118.68,118.300003,117.839996,118.68,120.269997,120.470001,120.580002,121.82,122.300003,122.940002,124.010002,122.360001,123.019997,124.379997,124.980003,125.029999,124.82,125.879997,125.540001,126.489998,126.040001,126.18,125.550003,126.760002,125.790001,125.419998,127.260002,128.039993,126.93,128.740005,129.100006,129.740005,129.820007,131.020004,132.490005,133.270004,132.619995,132.910004,133.029999 +JPM,115.059998,115.160004,114.730003,114.739998,118.040001,117.660004,116.25,114.949997,115.239998,115.440002,114.529999,114.639999,114.739998,109.949997,107.010002,110.309998,108.169998,108,109.970001,107.849998,109.330002,110.989998,111.879997,109.089996,110.400002,112.510002,110.620003,113.370003,110.300003,110.209999,110.209999,109.32,111.720001,111.470001,110.93,110.410004,109.989998,110.099998,109.400002,108.779999,108.779999,107.919998,107.239998,108.43,109.370003,110.989998,113.410004,114.290001,113.860001,113.900002,113.029999,113.339996,112.959999,111.129997,112.150002,113.010002,112.489998,111.230003,110.660004,105.93,108.349998,107.010002,108.400002,108.449997,107.839996,110.360001,110.800003,111.110001,110.830002,110.190002,109.970001,108.029999,107.900002,108.18,107.550003,107.540001,107.510002,105.75,104.790001,104.860001,103.239998,104.93,104.199997,105.080002,103.610001,103.720001,104.059998,107.279999,106.620003,106.389999,106.849998,106.360001,110.580002,110.5,111.529999,109.889999,111.279999,113.349998,114.150002,115.18,114.849998,116.029999,116.730003,114.949997,115.660004,116.150002,117.089996,117.120003,117.550003,117.790001,116.879997,115.730003,113.889999,114.650002,113.699997,114.769997,114.769997,114.620003,115.32,114.970001,114.730003,114.68,116.709999,116.139999,115.760002,115.190002,114.580002,115.150002,114.589996,114.099998,114.32,113.709999,114.43,113.080002,113.519997,113.5,113.839996,114.300003,117.620003,118.629997,117.849998,116.720001,116.389999,115.019997,114.519997,112.839996,113.5,113.970001,115.040001,115.269997,114.620003,115.32,114.519997,111.470001,108.129997,106.949997,106.339996,108.620003,109.830002,108.089996,107.910004,106.360001,105.25,103.290001,104.860001,103.419998,104.849998,106.699997,109.019997,108.980003,108.379997,109.089996,109.599998,111.480003,112.379997,111.290001,108.949997,109.589996,107.330002,110.07,109.989998,110.830002,108.449997,107.639999,106.650002,109.260002,109.720001,110.940002,110.059998,111.190002,112.239998,107.230003,105.190002,103.290001,101.360001,100.370003,101.019997,101.120003,100.290001,99.010002,98.540001,97.290001,96.449997,94.169998,92.139999,95.959999,97.040001,96.830002,97.620003,99.309998,97.110001,100.690002,100.760002,100.57,100.400002,100.389999,99.910004,100.940002,101.68,102.5,102.919998,104.589996,102.940002,102.68,102.739998,103.389999,103.879997,104.169998,104.410004,103.5,103.879997,104.25,103.790001,103.739998,102.379997,101.360001,100.879997,102.599998,103.089996,102.419998,105.550003,105.18,105.690002,105.470001,105,106.099998,105.290001,105.160004,104.360001,104.43 +NKE,65.050003,65.239998,64.169998,65.110001,66.300003,66.82,66.169998,66.199997,66.389999,65.910004,65.709999,66.800003,66.349998,64.419998,64.629997,65.900002,66.169998,65.440002,66.440002,64.120003,66.699997,68.419998,69.589996,67.550003,67.18,67,66.830002,67.769997,67.25,67.059998,67.510002,66.199997,65.730003,66.089996,66.879997,66.970001,66.669998,68.050003,69.559998,68.389999,68.099998,68.260002,66.900002,68.099998,69.339996,68.459999,67.949997,67.919998,68.43,68.839996,69.5,71.339996,70.940002,71.32,71.379997,71.309998,71.339996,72.18,72.25,70.919998,72.230003,71.800003,72.760002,73.830002,74.050003,74.75,74.760002,74.900002,74.589996,74.290001,74.110001,74.699997,75.839996,75.610001,74.260002,74.720001,73.940002,73.43,72.349998,72.559998,71.349998,71.699997,79.68,78.349998,76.279999,76.550003,76.480003,77.279999,77.57,77.360001,77.370003,77.379997,77.75,77.470001,76.589996,76.949997,76.959999,76.589996,75.529999,77.160004,78.150002,76.889999,75.959999,76.910004,77.540001,78.650002,78.739998,79.510002,80.529999,80.5,81.260002,80.730003,80.150002,80.139999,79.57,80.050003,79.75,82.18,82.949997,82.639999,82.910004,82.449997,82.650002,82.580002,82.790001,81.400002,82.199997,79.599998,79.919998,80.400002,80.300003,82.099998,82.629997,83,83.470001,83.489998,83.260002,85.260002,84.43,85.370003,85.550003,84.269997,84.790001,83.699997,84.540001,84.720001,84.459999,82.769997,82.5,80.18,80.120003,80.230003,80.419998,74.940002,74.510002,75.910004,74.989998,77.480003,76.480003,75.599998,74.209999,74.900002,73.349998,72.120003,73.099998,72.07,72.190002,74.510002,75.040001,76.790001,76.580002,77.529999,76.57,77.970001,77.779999,76.360001,75.099998,75.199997,75.199997,74.330002,74.739998,72.519997,71.120003,72.370003,71.489998,72.709999,72.089996,74.660004,74.339996,75.120003,77.940002,75.790001,75.540001,73.339996,72.510002,73.57,74.32,72.93,72.529999,69.900002,71.150002,68.970001,67.529999,72.370003,68.099998,73.010002,73.669998,73.339996,74.139999,74.059998,72.75,74.650002,75.720001,76.730003,76.589996,76.419998,76.040001,76.089996,77.879997,77.68,79.129997,80.449997,80.75,80.5,80.440002,80.610001,80.32,80.220001,81.279999,81.879997,81.510002,81.989998,82.860001,82.709999,82.389999,82.360001,83.68,84.709999,85.400002,84.68,85.379997,84.57,84.839996,83.949997,84.760002,85.169998,85.800003,86.169998,85.730003,87.160004 +MCD,151.029999,151.199997,152.380005,154.440002,157.240005,157.740005,158.220001,158.240005,161.610001,162.360001,159.009995,159.380005,158.660004,157.039993,154.979996,158.009995,157.479996,158.410004,156.380005,157.720001,160.399994,161.729996,163.949997,161.25,161.229996,162.770004,163.339996,161.619995,161.729996,161.630005,162.550003,161.809998,159.529999,158.770004,158.990005,157.320007,155.940002,158.899994,158.300003,167.440002,163.440002,160.679993,160.080002,165.029999,165,164.770004,164.240005,165.070007,165.389999,164.720001,163.059998,162.869995,161.309998,160.979996,161.479996,159.449997,161.619995,162.389999,163.210007,160.619995,161.820007,160.009995,159.160004,160.220001,159.479996,162.380005,169.479996,168.910004,166.490005,166.729996,166.580002,167.050003,166.460007,166.279999,164.970001,162.559998,160.529999,164.550003,159.809998,160.910004,157.419998,156.320007,156.690002,156.869995,156.479996,157.320007,159.419998,159.940002,160.619995,158.619995,159.119995,158.509995,158.779999,159.75,157.929993,157.410004,157.970001,158.75,157.940002,158.889999,156.139999,157.479996,158.639999,157.539993,156.919998,155.410004,156.210007,156.720001,156.039993,158.919998,159.300003,158.679993,158.139999,160.600006,159.880005,161.729996,161.149994,161.679993,161.039993,160.550003,159.050003,159.380005,160.479996,161.639999,163.110001,162.800003,162.229996,161.720001,163.240005,163.740005,163.899994,165.070007,164.619995,164.740005,162.399994,160.839996,158.139999,157.770004,159.179993,160.789993,165.300003,163.309998,166.410004,165.759995,166.529999,167.289993,166.669998,165.179993,164.660004,165.800003,166.570007,167.770004,169.830002,168.369995,162.970001,163.820007,163.669998,164.070007,166.770004,166.809998,167.490005,166.630005,177.149994,177.350006,175.309998,173.339996,173.229996,178.490005,176.899994,174.880005,176.75,180.389999,182.710007,184.25,185.479996,185.940002,184.369995,184.009995,183.850006,183.559998,187.589996,186.720001,183.710007,182.720001,181.929993,183.889999,184.630005,187.850006,189.259995,188.509995,185.369995,185.039993,185.449997,182.960007,184.649994,183.589996,183.479996,186.429993,183.289993,180.789993,179.710007,179.160004,173.679993,174.149994,170.279999,174.029999,175.710007,175.559998,177.570007,176.059998,174.899994,178.279999,180.220001,180.600006,180.289993,181.550003,182.369995,181.220001,181.020004,179.350006,181.110001,182.570007,184.570007,186.089996,187.369995,184,183.600006,182.169998,181.770004,178.779999,176.720001,177.550003,177.570007,176.179993,175.279999,174.75,174.259995,173.970001,174.149994,175.869995,179.970001,179.25,180.490005,182.809998,183.169998,182.610001,183.210007,183.360001,183.839996,185.050003 +KO,43.889999,43.93,43.82,44.450001,44.82,44.529999,44.57,43.779999,43.669998,43.459999,43.259998,43.16,43,42.759998,42.330002,42.689999,42.889999,43.32,43.43,42.669998,43.380001,44.240002,44.400002,43.919998,43.830002,43.990002,43.990002,44.029999,44.509998,44.68,44.880001,44.509998,44.310001,43.740002,43.98,43.07,42.43,42.75,43.310001,43.209999,42.59,42.060001,41.889999,42.360001,42.139999,41.810001,41.779999,42.18,42.139999,42.040001,41.720001,41.549999,42.299999,42.18,42.41,42.25,42.400002,42.32,42.400002,42.68,43.130001,43,43.119999,43.490002,43.110001,43.459999,43.439999,43.950001,44.130001,44.41,44.18,43.580002,44.119999,43.549999,43.599998,43.259998,43.09,43.25,43.580002,43.330002,43.07,43.470001,43.860001,43.75,43.990002,44.66,44.639999,44.400002,44.970001,44.790001,44.669998,44.740002,44.73,45.25,45.119999,45.110001,45.279999,44.950001,45.259998,46.09,46.240002,46.209999,46.23,46.630001,46.389999,46.18,46.619999,46.650002,46.5,46.150002,46.349998,46.080002,45.830002,45.889999,46.080002,46.220001,46.599998,46.73,46.220001,45.93,45.700001,45.630001,45.689999,45.369999,45.330002,44.950001,44.57,44.759998,45.380001,45.77,45.720001,46.060001,46.02,46.240002,45.830002,45.990002,46.32,45.93,45.959999,46.639999,46.580002,46.07,45.68,45.849998,46.009998,46.189999,46.23,46.509998,45.869999,45.849998,45.880001,46.48,46.389999,45.68,44.639999,44.68,44.91,45.490002,45.860001,45.610001,46.330002,45.970001,46.360001,46.73,46.509998,45.919998,46.459999,47.630001,47.880001,47.740002,48,48.689999,49.110001,49.369999,49.330002,49.68,49.869999,49.860001,49.759998,49.740002,50.169998,50.509998,49.380001,48.73,49.02,48.869999,49.369999,49.709999,48.98,50.400002,49.689999,49.580002,49.380001,49.09,49.240002,49.540001,49.220001,49.470001,49.34,48.330002,48.32,47.900002,47.540001,47.57,45.959999,46.939999,47.529999,47.200001,47.349998,46.93,46.639999,47.57,46.950001,47.48,46.57,47.07,47.34,47.150002,47.57,46.919998,47.060001,47.610001,47.720001,48.27,47.689999,47.369999,47.169998,47.400002,47.860001,48.130001,48.700001,49.25,49.259998,49.259998,49.419998,49.5,49.610001,49.66,49.790001,45.59,45.240002,44.830002,45.099998,45.860001,45.279999,44.939999,44.689999,44.939999,45.34,45.380001 +MMM,232.809998,233.660004,235.570007,236.339996,241.350006,239.800003,237.570007,234.289993,235.869995,237.220001,231.559998,232.449997,234.139999,223.169998,215.360001,220.240005,215.869995,216.539993,219.520004,212.619995,216.330002,217.559998,218.669998,212.25,212.809998,216.979996,214.330002,216.419998,215.520004,217.699997,220.089996,219.520004,218.850006,217.75,215.880005,201.130005,198.839996,197.089996,196.119995,194.389999,195.020004,194.5,195.679993,199.360001,200.259995,201.740005,203.419998,205.029999,205.160004,205.759995,202.410004,200.210007,200.360001,198.960007,201.759995,198.970001,198.669998,199.410004,199.029999,195.740005,198.679993,197.229996,199.589996,201.059998,201.199997,203.860001,205.070007,206.589996,205.119995,204.919998,204.889999,203.630005,204.970001,204.169998,199.389999,198.080002,195.520004,196.5,195.800003,196.580002,194.919998,195.970001,196.720001,195.520004,195.830002,197.339996,197.460007,200.529999,201.479996,197.679993,199.320007,201.179993,201.110001,202.070007,202.199997,201.600006,201.949997,198.839996,200.679993,204.380005,207.960007,207.419998,205.119995,212.320007,207.050003,205.529999,207.289993,206.699997,208.570007,207.139999,204.779999,201.960007,199.839996,200.520004,201.389999,203.149994,204.770004,204.600006,205.690002,204.259995,202.75,205.289993,208.330002,209.429993,210.460007,210.220001,210.919998,208.600006,211.830002,212.740005,212.570007,212.929993,211.779999,206.710007,209.050003,207.880005,209.529999,211.529999,213.119995,215.270004,216.330002,213.509995,210.639999,211.070007,210.110001,210.710007,212.190002,215.710007,215.759995,213.839996,213.190002,214.369995,210.419998,202.149994,196.729996,198.229996,198.940002,202.330002,202.929993,200.380005,199.850006,201.360001,192.550003,184.539993,184.990005,184.949997,185.789993,189.809998,190.259995,192.220001,192.809998,193.25,195.300003,201.289993,204.070007,201.100006,197.039993,198.369995,198.059998,204.910004,209,205.580002,200.509995,198.690002,196.800003,199.860001,200.690002,204.339996,204.559998,207.919998,208.759995,202.199997,202.679993,198.240005,198.320007,197.460007,199.809998,202.130005,196.100006,192.820007,194.559998,189.960007,187.380005,183.75,178.619995,186.259995,190.699997,189.369995,190.539993,190.949997,183.759995,191.320007,190.880005,191.679993,192.300003,193.600006,192.210007,192.169998,188.940002,189.479996,191.710007,195.860001,192.259995,192.289993,192.520004,195.899994,193.199997,196.949997,199.270004,200.300003,199.160004,200.210007,201.119995,202.570007,199.839996,199.820007,200.910004,206.570007,209.720001,204.929993,208.860001,208.410004,208.529999,207.770004,209.350006,210.580002,209.380005,209.029999,207.389999,207.490005 +JNJ,129.789993,128.220001,129.039993,132.059998,133.800003,132.630005,134.350006,132.320007,133.059998,133.679993,130.240005,131.210007,131.190002,127.379997,125.099998,127.389999,127.209999,127.449997,128.149994,124.559998,128.350006,130.410004,130.710007,128.100006,129.479996,130.25,129.630005,130.429993,130.619995,131.759995,130.539993,127.720001,127.550003,126.660004,126.830002,126.190002,126.760002,128.009995,128.270004,126.489998,126.010002,123.5,123.029999,124.190002,123.589996,122.610001,123.510002,125.349998,127.239998,126.059998,125.129997,125.349998,123.849998,124.239998,123.720001,122.910004,123.449997,122.25,121.470001,119.400002,120.970001,119.620003,121.260002,121.949997,121.480003,122.790001,123.330002,124.059998,122.660004,122.540001,122.629997,122.410004,122.610001,121.32,122.57,122.040001,121.449997,122.839996,122.589996,122.349998,121.610001,122,121.339996,121.580002,122.709999,125,125.75,126.050003,127.379997,126.239998,127.760002,125.93,124.690002,129.110001,127.800003,125.940002,125.849998,126.629997,129.360001,128.619995,130.279999,131.550003,132.169998,132.520004,132.639999,131.25,131.949997,132.020004,131.460007,131.169998,131.199997,130.75,130.220001,129.5,130.429993,132.479996,134.470001,136.880005,135.350006,134.610001,135.110001,135.949997,134.919998,134.320007,134.860001,134.949997,134.690002,133.720001,135.860001,136.869995,137.320007,137.210007,138.509995,139.360001,139.889999,139.490005,139.960007,140.539993,140.460007,141.979996,142.880005,140.470001,138.639999,138.160004,138.220001,138.169998,139.690002,140.479996,139.029999,139.350006,139.100006,139.389999,139.199997,137.729996,133.839996,133.869995,133.949997,136.559998,139.460007,139.5,139.050003,138.679993,138.929993,137.470001,138.470001,136.970001,137.550003,140.75,139.990005,140.820007,140.679993,142.199997,142.570007,144.75,145.300003,145.339996,145.619995,144.679993,144.25,144.5,145.990005,147.729996,146.449997,141.990005,142.229996,141.369995,143.220001,146.440002,145.850006,146.899994,146.210007,146.029999,145.910004,145.429993,145.259995,146.5,147.100006,147.839996,133,129.139999,130.419998,127.610001,128.270004,128.089996,122.839996,126.709999,127.410004,127.269997,129.050003,127.75,125.720001,127.830002,127.010002,129.960007,128.929993,129.710007,129.75,128.279999,129.360001,128.039993,129.089996,130.690002,128.800003,128.800003,127.029999,128.229996,128.990005,130.330002,131.639999,133.080002,134.199997,132.880005,132.880005,133,132.050003,132.399994,132,134.160004,134.449997,134.309998,136.380005,135.690002,136.350006,135.419998,136.600006,136.199997,136.110001,135.869995,136.639999,138.350006 diff --git a/QCQP/portfolioOptimizationQCQP.java b/QCQP/portfolioOptimizationQCQP.java new file mode 100644 index 0000000..88a5ab4 --- /dev/null +++ b/QCQP/portfolioOptimizationQCQP.java @@ -0,0 +1,520 @@ +import com.nag.routines.G02.G02BX; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RY; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Map; +import java.util.LinkedHashMap; +import java.util.Arrays; +import java.io.FileWriter; + +public class portfolioOptimizationQCQP { + + public static String dataFile = "data" + File.separator + "djia_close_price.csv"; + + public static void main(String[] args) { + + int i, j; + + // Data Preparation + + // Load stock price data from djia_close_price.csv + String[] dateIndex = new String[0]; + Map closePrice = new LinkedHashMap<>(); + try { + BufferedReader reader = new BufferedReader(new FileReader(dataFile)); + + String line = reader.readLine().substring(1); + dateIndex = line.split(","); + + String[] data; + String key; + double[] values; + + while ((line = reader.readLine()) != null) { + data = line.split(","); + key = data[0]; + values = parseDoubleArr(Arrays.copyOfRange(data, 1, data.length)); + closePrice.put(key, values); + } + reader.close(); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + dataFile); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + dataFile + "\n" + e.getMessage()); + } + + int m = dateIndex.length; + int n = closePrice.size(); + + double[][] data = new double[m][n]; + i = 0; + double[] tempA; + for (Map.Entry entry : closePrice.entrySet()) { + tempA = entry.getValue(); + for (j = 0; j < m; j++) { + data[j][i] = tempA[j]; + } + i++; + } + + // Relative return + double[][] relRtn = new double[m - 1][n]; + + for (j = 0; j < m - 1; j++) { + for (i = 0; i < n; i++) { + relRtn[j][i] = (data[j + 1][i] - data[j][i]) / data[j][i]; + } + } + + // Mean return + double[] r = new double[n]; + double sum; + for (j = 0; j < n; j++) { + sum = 0; + for (i = 0; i < m - 1; i++) { + sum += relRtn[i][j]; + } + r[j] = sum; + r[j] /= m - 1; + } + + // printVectorToFile(r, "r_java.txt"); + + // Covariance matrix + G02BX g02bx = new G02BX(); + String weight = "U"; + n = relRtn.length; + m = relRtn[0].length; + int ldx = n; + double[] x1d = convert2DTo1D(relRtn); + double[] wt = new double[0]; + double[] xbar = new double[m]; + double[] std = new double[m]; + int ldv = m; + double[] v1d = new double[ldv * m]; + double[] r1d = new double[ldv * m]; + int ifail = 0; + g02bx.eval(weight, n, m, x1d, ldx, wt, xbar, std, v1d, ldv, r1d, ifail); + + double[][] V = convert1DTo2D(v1d, m); + + // Classic Mean-Variance Model + + // Efficient Frontier + + int itemsDiag = V.length; + int itemsAboveDiag = (int) (Math.pow(itemsDiag, 2) - itemsDiag) / 2 + itemsDiag; + int[] irowq = new int[itemsAboveDiag]; + int[] icolq = new int[itemsAboveDiag]; + double[] vVal = new double[itemsAboveDiag]; + int c = 0; + // Input for quadratic objective + // Sparsity pattern of upper triangular V + for (i = 0; i < V.length; i++) { + for (j = i; j < V[0].length; j++) { + vVal[c] = V[i][j]; + irowq[c] = i + 1; + icolq[c] = j + 1; + c++; + } + } + + // printVectorToFile(vVal, "vVal_java.txt"); + + n = closePrice.size(); + // Sparsity pattern of r, which is actually dense in this application + int[] idxr = new int[n]; + for (i = 0; i < n; i++) { + idxr[i] = i + 1; + } + + // Input for linear constraint: e'x = 1 + int[] irowa = new int[n]; + Arrays.fill(irowa, 1); + int[] icola = new int[n]; + for (i = 0; i < n; i++) { + icola[i] = i + 1; + } + double[] a = new double[n]; + Arrays.fill(a, 1.0); + double[] bl = new double[1]; + bl[0] = 1.0; + double[] bu = new double[1]; + bu[0] = 1.0; + + // Input for bound constraint: x >= 0 + double[] blx = new double[n]; + Arrays.fill(blx, 0.0); + double[] bux = new double[n]; + Arrays.fill(bux, 1.0e20); + + // Set step for mu + int step = 2001; + + // Initialize output data: absolute risk and return + double[] abRisk = new double[2001]; + double[] abRtn = new double[2001]; + + E04RA e04ra = new E04RA(); + E04RS e04rs = new E04RS(); + E04RJ e04rj = new E04RJ(); + E04RH e04rh = new E04RH(); + E04ZM e04zm = new E04ZM(); + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + E04RZ e04rz = new E04RZ(); + E04RY e04ry = new E04RY(); + + int mu; + long handle = 0; + double[] q = new double[vVal.length]; + int idqc; + int nnzr = nonZeroLength(r); + int nnzq = q.length; + int nclin = bl.length; + int nnza = nonZeroLength(a); + double[] x = new double[n]; + double[] u = new double[0]; + double[] uc = new double[0]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[2]; + double[] ruser = new double[1]; + long cpuser = 0; + double[][] x2d; + double[][] VX; + double[][] XVX; + double[][] r2d; + double[][] RX; + + for (mu = 0; mu < step; mu++) { + // Create problem handle + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*mu*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * mu * vVal[i]; + } + + nnzq = nonZeroLength(q); + idqc = -1; + ifail = 0; + e04rs.eval(handle, 0.0, nnzr, idxr, invertSignVector(r), nnzq, irowq, icolq, q, idqc, ifail); + + // Set linear constraint e'x = 1 + e04rj.eval(handle, nclin, bl, bu, nnza, irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, n, blx, bux, ifail); + + // set options + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + // if (mu == 255){ + // // e04ry.eval(handle, 6, "Overview, Objective, Simple bounds, Linear + // constraints bounds, Linear constraints detailed", ifail); + // // e04zm.eval(handle, "Print Options = YES", ifail); + // // e04zm.eval(handle, "Print Level = 3", ifail); + // // e04zm.eval(handle, "Print File = 6", ifail); + // // e04zm.eval(handle, "Print Solution = YES", ifail); + // printVectorToFile(r, "r_java.log"); + // printVectorToFile(q, "q_java.log"); + // } + + // Call socp interior point solver + ifail = -1; + e04pt.eval(handle, n, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + ifail = e04pt.getIFAIL(); + if (ifail != 0) { + System.out.println("mu = " + mu); + System.out.println("ifail = " + ifail); + } + + // Compute risk and return from the portfolio + x2d = convert1DTo2D(x, n); + VX = multiplyMatrices(V, x2d); + XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + abRisk[mu] = Math.sqrt(XVX[0][0]); + + r2d = convert1DTo2D(r, n); + RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); + abRtn[mu] = RX[0][0]; + + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); + } + + // System.out.println(ab_risk[0]); + // System.out.println(ab_risk[2000]); + // System.out.println(ab_rtn[0]); + // System.out.println(ab_rtn[2000]); + + // Maximizing the Sharpe ratio + + // Input for linear constraint: e'y = lambda + irowa = new int[(n + 1) + n]; + icola = new int[(n + 1) + n]; + a = new double[(n + 1) + n]; + bl = new double[2]; + bu = new double[2]; + blx = new double[n + 1]; + bux = new double[n + 1]; + + Arrays.fill(irowa, 0, n + 1, 1); + for (i = 0; i <= n; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 0, n, 1.0); + a[n] = -1.0; + bl[0] = 0.0; + bu[0] = 0.0; + + // Input for linear constraint: r'y = 1 + Arrays.fill(irowa, n + 1, irowa.length, 2); + for (i = 0; i < n; i++) { + icola[(n + 1) + i] = i + 1; + } + for (i = 0; i < n; i++) { + a[(n + 1) + i] = r[i]; + } + bl[1] = 1.0; + bu[1] = 1.0; + + // Input for bound constraint: x >= 0 + Arrays.fill(blx, 0.0); + Arrays.fill(bux, 1.0e20); + + ifail = 0; + + // Create problem handle + e04ra.eval(handle, n + 1, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * vVal[i]; + } + idqc = -1; + nnzq = nonZeroLength(q); + e04rs.eval(handle, 0.0, 0, idxr, r, nnzq, irowq, icolq, q, idqc, ifail); + + // Set linear constraints + nclin = bl.length; + nnza = nonZeroLength(a); + e04rj.eval(handle, nclin, bl, bu, nnza, irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, blx.length, blx, bux, ifail); + + // Set options + e04zm.eval(handle, "Print Options = YES", ifail); + e04zm.eval(handle, "Print Level = 3", ifail); + e04zm.eval(handle, "Print File = 6", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + e04zm.eval(handle, "Print Solution = YES", ifail); + + // e04ry.eval(handle, 6, + // "Overview, Objective, Simple bounds, Linear constraints bounds, Linear constraints detailed", ifail); + + // Call socp interior point solver + x = new double[n + 1]; + e04pt.eval(handle, n + 1, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + printVector(x); + + x2d = convert1DTo2D(x, n); + VX = multiplyMatrices(V, x2d); + XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + double srRisk = Math.sqrt(XVX[0][0]) / x[n]; + + r2d = convert1DTo2D(r, n); + RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); + double srRtn = RX[0][0] / x[n]; + + double[] srX = vectorDivScalar(x, x[n]); + + System.out.println(srRisk); + System.out.println(srRtn); + printVector(srX); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } + + public static double[] vectorDivScalar(double[] a, double s) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = a[i] / s; + } + return t; + } + + public static double[][] invertRowColMatrix(double[][] a) { + double[][] t = new double[a[0].length][a.length]; + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + t[j][i] = a[i][j]; + } + } + return t; + } + + public static double[] invertSignVector(double[] a) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = -a[i]; + } + return t; + } + + public static int nonZeroLength(double[] a) { + int c = 0; + for (int i = 0; i < a.length; i++) { + if (a[i] != 0) { + c++; + } + } + return c; + } + + public static double[] parseDoubleArr(String[] a) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = Double.parseDouble(a[i]); + } + return t; + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + return b; + } + + public static double sum(double[][] a) { + double sum = 0; + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + sum += a[i][j]; + } + } + return sum; + } + + public static double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { + double[][] result = new double[firstMatrix.length][secondMatrix[0].length]; + for (int row = 0; row < result.length; row++) { + for (int col = 0; col < result[row].length; col++) { + result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col); + } + } + return result; + } + + private static double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) { + double cell = 0; + for (int i = 0; i < secondMatrix.length; i++) { + cell += firstMatrix[row][i] * secondMatrix[i][col]; + } + return cell; + } + + public static void printArr(String[] a) { + for (int i = 0; i < a.length; i++) { + System.out.printf("%s ", a[i]); + } + System.out.println(); + } + + public static void printMap(Map map) { + for (Map.Entry entry : map.entrySet()) { + System.out.printf("%4s: ", entry.getKey()); + printVector(entry.getValue()); + } + } + + public static void printMatrix(double[][] a) { + printMatrix(a, a.length, a[0].length); + } + + public static void printMatrix(double[][] a, int row, int col) { + for (int i = 0; i < row; i++) { + for (int j = 0; j < col; j++) { + System.out.printf("%11.4e ", a[i][j]); + } + System.out.println(); + } + } + + public static void printVector(double[] a) { + for (int i = 0; i < a.length; i++) { + System.out.printf("%.3e ", a[i]); + } + System.out.println(); + } + + public static void printVector(int[] a) { + for (int i = 0; i < a.length; i++) { + System.out.printf("%4d ", a[i]); + } + System.out.println(); + } + + public static void printVectorToFile(double[] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(fileName)); + for (int i = 0; i < a.length; i++) { + writer.write(a[i] + "\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + +} From cc4908f25b0d8447b8ae0f825b25a4b7ab737fc2 Mon Sep 17 00:00:00 2001 From: "U-NAGNTD\\christos.efstathiou" Date: Fri, 8 Jan 2021 16:42:39 +0200 Subject: [PATCH 025/196] Numerical changes from Bladon --- nearest_correlation_matrices/data/G.d | 16 +++++++-------- nearest_correlation_matrices/data/G02AA.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AB.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AJ.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AN.d | 20 +++++++++---------- nearest_correlation_matrices/data/G_eigen.d | 2 +- nearest_correlation_matrices/data/H_G02AJ.d | 16 +++++++-------- nearest_correlation_matrices/data/X_G02AA.d | 16 +++++++-------- nearest_correlation_matrices/data/X_G02AB.d | 16 +++++++-------- nearest_correlation_matrices/data/X_G02AJ.d | 16 +++++++-------- nearest_correlation_matrices/data/X_G02AN.d | 16 +++++++-------- .../data/X_eigen_G02AA.d | 2 +- .../data/X_eigen_G02AB.d | 2 +- .../data/X_eigen_G02AJ.d | 2 +- .../data/X_eigen_G02AN.d | 2 +- .../data/alpha_G02AN.d | 2 +- nearest_correlation_matrices/ncm_nag.ipynb | 5 +++-- 17 files changed, 97 insertions(+), 96 deletions(-) diff --git a/nearest_correlation_matrices/data/G.d b/nearest_correlation_matrices/data/G.d index 5d286c9..71c5575 100755 --- a/nearest_correlation_matrices/data/G.d +++ b/nearest_correlation_matrices/data/G.d @@ -1,8 +1,8 @@ -1.0 -0.3250029917945835 0.18814425997629136 0.5759508639629596 0.00640355776080848 -0.6111098444919633 -0.07240613328341335 -0.15893528307270638 --0.3250029917945835 1.0 0.20484152654833515 0.24360955555978517 0.40582420357130317 0.273020298287851 0.2868805375451461 0.4240671568750279 -0.1881442599762914 0.20484152654833518 1.0 -0.1325040936108396 0.7657991363667153 0.27646640778981524 -0.617183266829168 0.9005703206682636 -0.5759508639629596 0.24360955555978514 -0.13250409361083962 0.9999999999999998 0.30409424292463905 0.012596382998409861 0.645158339588759 -0.32102379456595537 -0.006403557760808479 0.40582420357130317 0.7657991363667153 0.304094242924639 1.0000000000000002 0.6651979348683132 -0.3293323685112022 0.9939281510877161 --0.6111098444919633 0.273020298287851 0.27646640778981524 0.012596382998409863 0.6651979348683132 0.9999999999999998 0.049172233461315856 0.5963589524568644 --0.07240613328341335 0.2868805375451461 -0.6171832668291679 0.645158339588759 -0.3293323685112022 0.049172233461315856 0.9999999999999999 -0.39827829557224775 --0.15893528307270638 0.42406715687502783 0.9005703206682635 -0.3210237945659553 0.993928151087716 0.5963589524568643 -0.3982782955722478 1.0000000000000002 +1.0 -0.3250029917945835 0.18814425997629136 0.5759508639629596 0.00640355776080848 -0.6111098444919633 -0.07240613328341335 -0.15893528307270638 +-0.3250029917945835 1.0 0.20484152654833515 0.24360955555978517 0.40582420357130317 0.273020298287851 0.2868805375451461 0.4240671568750279 +0.1881442599762914 0.20484152654833518 1.0 -0.1325040936108396 0.7657991363667153 0.27646640778981524 -0.617183266829168 0.9005703206682636 +0.5759508639629596 0.24360955555978514 -0.13250409361083962 0.9999999999999998 0.30409424292463905 0.012596382998409861 0.645158339588759 -0.32102379456595537 +0.006403557760808479 0.40582420357130317 0.7657991363667153 0.304094242924639 1.0000000000000002 0.6651979348683132 -0.3293323685112022 0.9939281510877161 +-0.6111098444919633 0.273020298287851 0.27646640778981524 0.012596382998409863 0.6651979348683132 0.9999999999999998 0.049172233461315856 0.5963589524568644 +-0.07240613328341335 0.2868805375451461 -0.6171832668291679 0.645158339588759 -0.3293323685112022 0.049172233461315856 0.9999999999999999 -0.39827829557224775 +-0.15893528307270638 0.42406715687502783 0.9005703206682635 -0.3210237945659553 0.993928151087716 0.5963589524568643 -0.3982782955722478 1.0000000000000002 diff --git a/nearest_correlation_matrices/data/G02AA.d b/nearest_correlation_matrices/data/G02AA.d index 55ed396..ad79122 100755 --- a/nearest_correlation_matrices/data/G02AA.d +++ b/nearest_correlation_matrices/data/G02AA.d @@ -1,10 +1,10 @@ -3 -0.2959969817070778 -0.0 0.013815700430991396 7.366710963886136E-4 0.03635540303506091 0.02034779708157225 0.018640792841438603 0.010277120331962035 0.03313079901499455 -0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236613 0.015279544615574847 -7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 -0.03635540303506091 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.0903873270564857 0.011108665944863202 0.03829235517819496 0.10025930306912842 -0.02034779708157225 0.009011302957805278 0.022160907986847334 0.09038732705648564 2.220446049250313E-16 0.007170761154141281 0.04815905065166437 0.11769167350320131 -0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863204 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 -0.010277120331962035 0.004646613030236613 0.008723271763466323 0.03829235517819496 0.04815905065166437 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 -0.03313079901499455 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 +3 +0.2959969817070778 +0.0 0.013815700430991396 7.366710963886136E-4 0.03635540303506091 0.02034779708157225 0.018640792841438603 0.010277120331962035 0.03313079901499455 +0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236613 0.015279544615574847 +7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 +0.03635540303506091 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.0903873270564857 0.011108665944863202 0.03829235517819496 0.10025930306912842 +0.02034779708157225 0.009011302957805278 0.022160907986847334 0.09038732705648564 2.220446049250313E-16 0.007170761154141281 0.04815905065166437 0.11769167350320131 +0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863204 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 +0.010277120331962035 0.004646613030236613 0.008723271763466323 0.03829235517819496 0.04815905065166437 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 +0.03313079901499455 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AB.d b/nearest_correlation_matrices/data/G02AB.d index 85f882b..52475cd 100755 --- a/nearest_correlation_matrices/data/G02AB.d +++ b/nearest_correlation_matrices/data/G02AB.d @@ -1,10 +1,10 @@ -4 -0.3524228941273674 -0.0 1.2127569472830668E-5 7.195785961727763E-6 0.002038032317451921 3.353434369406643E-4 0.001459140067176179 2.2543497516450128E-4 8.700269518134296E-4 -1.2127569472830668E-5 0.0 3.3697723013370595E-6 0.0010287283953215043 2.0605535082529602E-4 7.060499939418041E-4 1.2971188999805205E-4 4.693987256226828E-4 -7.195785961755519E-6 3.369772301364815E-6 0.0 3.1606180612731016E-4 3.3451678969276255E-4 5.464856907395066E-4 1.3231874883401495E-4 1.8281093738581333E-4 -0.002038032317451921 0.0010287283953214765 3.160618061273379E-4 2.220446049250313E-16 0.09562569837460122 0.10161736192678256 0.0497455932654437 0.14048758269560868 -3.3534343694066517E-4 2.0605535082529602E-4 3.3451678969276255E-4 0.09562569837460116 2.220446049250313E-16 0.009591829656777184 0.05135556336768127 0.11827727452119219 -0.001459140067176179 7.060499939418041E-4 5.464856907395066E-4 0.10161736192678256 0.009591829656777184 2.220446049250313E-16 1.4712946889805512E-4 0.021750337132225628 -2.2543497516450128E-4 1.2971188999805205E-4 1.3231874883390393E-4 0.0497455932654437 0.05135556336768127 1.4712946889805512E-4 1.1102230246251565E-16 0.05672380746719463 -8.700269518134296E-4 4.693987256226273E-4 1.828109373857023E-4 0.14048758269560863 0.11827727452119208 0.021750337132225517 0.056723807467194576 2.220446049250313E-16 +4 +0.3524228941273674 +0.0 1.2127569472830668E-5 7.195785961727763E-6 0.002038032317451921 3.353434369406643E-4 0.001459140067176179 2.2543497516450128E-4 8.700269518134296E-4 +1.2127569472830668E-5 0.0 3.3697723013370595E-6 0.0010287283953215043 2.0605535082529602E-4 7.060499939418041E-4 1.2971188999805205E-4 4.693987256226828E-4 +7.195785961755519E-6 3.369772301364815E-6 0.0 3.1606180612731016E-4 3.3451678969276255E-4 5.464856907395066E-4 1.3231874883401495E-4 1.8281093738581333E-4 +0.002038032317451921 0.0010287283953214765 3.160618061273379E-4 2.220446049250313E-16 0.09562569837460122 0.10161736192678256 0.0497455932654437 0.14048758269560868 +3.3534343694066517E-4 2.0605535082529602E-4 3.3451678969276255E-4 0.09562569837460116 2.220446049250313E-16 0.009591829656777184 0.05135556336768127 0.11827727452119219 +0.001459140067176179 7.060499939418041E-4 5.464856907395066E-4 0.10161736192678256 0.009591829656777184 2.220446049250313E-16 1.4712946889805512E-4 0.021750337132225628 +2.2543497516450128E-4 1.2971188999805205E-4 1.3231874883390393E-4 0.0497455932654437 0.05135556336768127 1.4712946889805512E-4 1.1102230246251565E-16 0.05672380746719463 +8.700269518134296E-4 4.693987256226273E-4 1.828109373857023E-4 0.14048758269560863 0.11827727452119208 0.021750337132225517 0.056723807467194576 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AJ.d b/nearest_correlation_matrices/data/G02AJ.d index ee927b2..877abc6 100755 --- a/nearest_correlation_matrices/data/G02AJ.d +++ b/nearest_correlation_matrices/data/G02AJ.d @@ -1,10 +1,10 @@ -137 -0.29813714558068444 -0.0 5.0774791750307635E-5 2.425786085669124E-6 0.03883768090546136 0.019130917809027575 0.02182932325871967 0.00987166742762663 0.03391663346423357 -5.0774791750307635E-5 0.0 5.503563274000811E-7 0.018710223175318536 0.008532716981402788 0.011049620489332113 0.004524701071976667 0.015984364111987615 -2.4257860856968794E-6 5.503563274278367E-7 0.0 0.013678853424135107 0.022547222563915392 0.004645537805090194 0.008813804760212207 0.02015546927216605 -0.03883768090546136 0.018710223175318508 0.013678853424135079 2.220446049250313E-16 0.09025842648426527 0.012778743855939181 0.038178346548207065 0.10114967989476989 -0.019130917809027575 0.008532716981402788 0.022547222563915392 0.09025842648426521 2.220446049250313E-16 0.008578555196769533 0.04861770043459507 0.1182788714519033 -0.02182932325871967 0.011049620489332113 0.004645537805090194 0.012778743855939183 0.008578555196769533 2.220446049250313E-16 0.0017968276748671075 0.00339877792490062 -0.00987166742762663 0.004524701071976667 0.008813804760212096 0.038178346548207065 0.04861770043459507 0.0017968276748671075 1.1102230246251565E-16 0.04880165619044008 -0.03391663346423357 0.01598436411198756 0.020155469272165938 0.10114967989476983 0.11827887145190319 0.003398777924900509 0.048801656190440024 2.220446049250313E-16 +137 +0.29813714558068444 +0.0 5.0774791750307635E-5 2.425786085669124E-6 0.03883768090546136 0.019130917809027575 0.02182932325871967 0.00987166742762663 0.03391663346423357 +5.0774791750307635E-5 0.0 5.503563274000811E-7 0.018710223175318536 0.008532716981402788 0.011049620489332113 0.004524701071976667 0.015984364111987615 +2.4257860856968794E-6 5.503563274278367E-7 0.0 0.013678853424135107 0.022547222563915392 0.004645537805090194 0.008813804760212207 0.02015546927216605 +0.03883768090546136 0.018710223175318508 0.013678853424135079 2.220446049250313E-16 0.09025842648426527 0.012778743855939181 0.038178346548207065 0.10114967989476989 +0.019130917809027575 0.008532716981402788 0.022547222563915392 0.09025842648426521 2.220446049250313E-16 0.008578555196769533 0.04861770043459507 0.1182788714519033 +0.02182932325871967 0.011049620489332113 0.004645537805090194 0.012778743855939183 0.008578555196769533 2.220446049250313E-16 0.0017968276748671075 0.00339877792490062 +0.00987166742762663 0.004524701071976667 0.008813804760212096 0.038178346548207065 0.04861770043459507 0.0017968276748671075 1.1102230246251565E-16 0.04880165619044008 +0.03391663346423357 0.01598436411198756 0.020155469272165938 0.10114967989476983 0.11827887145190319 0.003398777924900509 0.048801656190440024 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AN.d b/nearest_correlation_matrices/data/G02AN.d index 264585c..b90c333 100755 --- a/nearest_correlation_matrices/data/G02AN.d +++ b/nearest_correlation_matrices/data/G02AN.d @@ -1,10 +1,10 @@ -27 -0.6842232923771067 -0.0 0.0 0.0 0.11534559633486957 0.0012824395878200104 0.12238688028701034 0.014500765854245638 0.031829946184179364 -0.0 0.0 0.0 0.048787650504719254 0.08127435463151922 0.05467773570274814 0.057453523816818036 0.0849278682546235 -2.7755575615628914E-17 2.7755575615628914E-17 0.0 0.026536575688402134 0.15336648242727113 0.055367887554946565 0.12360320370123046 0.18035708804084039 -0.11534559633486957 0.04878765050471923 0.02653657568840216 2.220446049250313E-16 0.06090091010680207 0.0025226758036557776 0.1292057674820426 0.06429138896868497 -0.0012824395878200095 0.08127435463151922 0.15336648242727113 0.060900910106802014 2.220446049250313E-16 0.13321909433413714 0.06595534587259971 0.19905384725423392 -0.12238688028701034 0.05467773570274814 0.055367887554946565 0.0025226758036557793 0.13321909433413714 2.220446049250313E-16 0.009847716092804867 0.11943272126977661 -0.014500765854245638 0.057453523816818036 0.12360320370123035 0.1292057674820426 0.06595534587259971 0.009847716092804867 1.1102230246251565E-16 0.07976313672648783 -0.031829946184179364 0.08492786825462345 0.18035708804084027 0.06429138896868491 0.1990538472542338 0.1194327212697765 0.07976313672648788 2.220446049250313E-16 +27 +0.6842232923771067 +0.0 0.0 0.0 0.11534559633486957 0.0012824395878200104 0.12238688028701034 0.014500765854245638 0.031829946184179364 +0.0 0.0 0.0 0.048787650504719254 0.08127435463151922 0.05467773570274814 0.057453523816818036 0.0849278682546235 +2.7755575615628914E-17 2.7755575615628914E-17 0.0 0.026536575688402134 0.15336648242727113 0.055367887554946565 0.12360320370123046 0.18035708804084039 +0.11534559633486957 0.04878765050471923 0.02653657568840216 2.220446049250313E-16 0.06090091010680207 0.0025226758036557776 0.1292057674820426 0.06429138896868497 +0.0012824395878200095 0.08127435463151922 0.15336648242727113 0.060900910106802014 2.220446049250313E-16 0.13321909433413714 0.06595534587259971 0.19905384725423392 +0.12238688028701034 0.05467773570274814 0.055367887554946565 0.0025226758036557793 0.13321909433413714 2.220446049250313E-16 0.009847716092804867 0.11943272126977661 +0.014500765854245638 0.057453523816818036 0.12360320370123035 0.1292057674820426 0.06595534587259971 0.009847716092804867 1.1102230246251565E-16 0.07976313672648783 +0.031829946184179364 0.08492786825462345 0.18035708804084027 0.06429138896868491 0.1990538472542338 0.1194327212697765 0.07976313672648788 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G_eigen.d b/nearest_correlation_matrices/data/G_eigen.d index ffbb905..cae4deb 100755 --- a/nearest_correlation_matrices/data/G_eigen.d +++ b/nearest_correlation_matrices/data/G_eigen.d @@ -1 +1 @@ --0.24977745860993417 -0.015972279592768625 0.08945238623840102 0.2191673628508196 0.7072035937038217 1.7533864538965915 1.9610814370428227 3.53545850447024 +-0.24977745860993417 -0.015972279592768625 0.08945238623840102 0.2191673628508196 0.7072035937038217 1.7533864538965915 1.9610814370428227 3.53545850447024 diff --git a/nearest_correlation_matrices/data/H_G02AJ.d b/nearest_correlation_matrices/data/H_G02AJ.d index 06b2a26..65df620 100755 --- a/nearest_correlation_matrices/data/H_G02AJ.d +++ b/nearest_correlation_matrices/data/H_G02AJ.d @@ -1,8 +1,8 @@ -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AA.d b/nearest_correlation_matrices/data/X_G02AA.d index 9d5299b..b5deb07 100755 --- a/nearest_correlation_matrices/data/X_G02AA.d +++ b/nearest_correlation_matrices/data/X_G02AA.d @@ -1,8 +1,8 @@ -1.0 -0.3111872913635921 0.18888093107267998 0.5395954609278987 0.02675135484238073 -0.5924690516505247 -0.06212901295145131 -0.19206608208770093 --0.3111872913635921 1.0 0.20502514288449164 0.22653323290889946 0.41483550652910844 0.28220348838267434 0.2915271505753827 0.40878761225945304 -0.18888093107267998 0.20502514288449164 1.0 -0.14679747104822682 0.7879600443535626 0.2727105118922599 -0.6084599950657016 0.880228639445601 -0.5395954609278987 0.22653323290889946 -0.14679747104822682 1.0 0.21370691586815335 0.0014877170535466597 0.606865984410564 -0.22076449149682695 -0.02675135484238073 0.41483550652910844 0.7879600443535626 0.21370691586815335 1.0 0.658027173714172 -0.2811733178595378 0.8762364775845148 --0.5924690516505247 0.28220348838267434 0.2727105118922599 0.0014877170535466597 0.658027173714172 1.0 0.047885300489080775 0.593152378069519 --0.06212901295145131 0.2915271505753827 -0.6084599950657016 0.606865984410564 -0.2811733178595378 0.047885300489080775 1.0 -0.446982409442484 --0.19206608208770093 0.40878761225945304 0.880228639445601 -0.22076449149682695 0.8762364775845148 0.593152378069519 -0.446982409442484 1.0 +1.0 -0.3111872913635921 0.18888093107267998 0.5395954609278987 0.02675135484238073 -0.5924690516505247 -0.06212901295145131 -0.19206608208770093 +-0.3111872913635921 1.0 0.20502514288449164 0.22653323290889946 0.41483550652910844 0.28220348838267434 0.2915271505753827 0.40878761225945304 +0.18888093107267998 0.20502514288449164 1.0 -0.14679747104822682 0.7879600443535626 0.2727105118922599 -0.6084599950657016 0.880228639445601 +0.5395954609278987 0.22653323290889946 -0.14679747104822682 1.0 0.21370691586815335 0.0014877170535466597 0.606865984410564 -0.22076449149682695 +0.02675135484238073 0.41483550652910844 0.7879600443535626 0.21370691586815335 1.0 0.658027173714172 -0.2811733178595378 0.8762364775845148 +-0.5924690516505247 0.28220348838267434 0.2727105118922599 0.0014877170535466597 0.658027173714172 1.0 0.047885300489080775 0.593152378069519 +-0.06212901295145131 0.2915271505753827 -0.6084599950657016 0.606865984410564 -0.2811733178595378 0.047885300489080775 1.0 -0.446982409442484 +-0.19206608208770093 0.40878761225945304 0.880228639445601 -0.22076449149682695 0.8762364775845148 0.593152378069519 -0.446982409442484 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AB.d b/nearest_correlation_matrices/data/X_G02AB.d index 383aa7b..640200b 100755 --- a/nearest_correlation_matrices/data/X_G02AB.d +++ b/nearest_correlation_matrices/data/X_G02AB.d @@ -1,8 +1,8 @@ -1.0 -0.32499086422511064 0.18813706419032963 0.5739128316455077 0.006738901197749145 -0.6096507044247871 -0.07218069830824884 -0.1598053100245198 --0.32499086422511064 1.0 0.20483815677603381 0.24258082716446366 0.40603025892212846 0.2737263482817928 0.28701024943514414 0.4235977581494052 -0.18813706419032963 0.20483815677603381 1.0 -0.13218803180471228 0.766133653156408 0.27591992209907573 -0.617050948080334 0.9003875097308778 -0.5739128316455077 0.24258082716446366 -0.13218803180471228 1.0 0.20846854455003783 -0.0890209789283727 0.5954127463233153 -0.18053621187034669 -0.006738901197749145 0.40603025892212846 0.766133653156408 0.20846854455003783 1.0 0.6556061052115361 -0.2779768051435209 0.875650876566524 --0.6096507044247871 0.2737263482817928 0.27591992209907573 -0.0890209789283727 0.6556061052115361 1.0 0.0490251039924178 0.5746086153246388 --0.07218069830824884 0.28701024943514414 -0.617050948080334 0.5954127463233153 -0.2779768051435209 0.0490251039924178 1.0 -0.4550021030394424 --0.1598053100245198 0.4235977581494052 0.9003875097308778 -0.18053621187034669 0.875650876566524 0.5746086153246388 -0.4550021030394424 1.0 +1.0 -0.32499086422511064 0.18813706419032963 0.5739128316455077 0.006738901197749145 -0.6096507044247871 -0.07218069830824884 -0.1598053100245198 +-0.32499086422511064 1.0 0.20483815677603381 0.24258082716446366 0.40603025892212846 0.2737263482817928 0.28701024943514414 0.4235977581494052 +0.18813706419032963 0.20483815677603381 1.0 -0.13218803180471228 0.766133653156408 0.27591992209907573 -0.617050948080334 0.9003875097308778 +0.5739128316455077 0.24258082716446366 -0.13218803180471228 1.0 0.20846854455003783 -0.0890209789283727 0.5954127463233153 -0.18053621187034669 +0.006738901197749145 0.40603025892212846 0.766133653156408 0.20846854455003783 1.0 0.6556061052115361 -0.2779768051435209 0.875650876566524 +-0.6096507044247871 0.2737263482817928 0.27591992209907573 -0.0890209789283727 0.6556061052115361 1.0 0.0490251039924178 0.5746086153246388 +-0.07218069830824884 0.28701024943514414 -0.617050948080334 0.5954127463233153 -0.2779768051435209 0.0490251039924178 1.0 -0.4550021030394424 +-0.1598053100245198 0.4235977581494052 0.9003875097308778 -0.18053621187034669 0.875650876566524 0.5746086153246388 -0.4550021030394424 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AJ.d b/nearest_correlation_matrices/data/X_G02AJ.d index a8d3ca0..103b2ad 100755 --- a/nearest_correlation_matrices/data/X_G02AJ.d +++ b/nearest_correlation_matrices/data/X_G02AJ.d @@ -1,8 +1,8 @@ -1.0 -0.3250537665863338 0.1881418341902057 0.5371131830574982 0.025534475569836054 -0.5892805212332436 -0.06253446585578672 -0.19285191653693995 --0.3250537665863338 1.0 0.20484097619200775 0.22489933238446663 0.41435692055270595 0.28406991877718313 0.29140523861712275 0.40808279276304027 -0.1881418341902057 0.20484097619200775 1.0 -0.1461829470349747 0.7883463589306307 0.27182086998472504 -0.6083694620689558 0.8804148513960975 -0.5371131830574982 0.22489933238446663 -0.1461829470349747 1.0 0.21383581644037378 -1.8236085752931886E-4 0.606979993040552 -0.21987411467118548 -0.025534475569836054 0.41435692055270595 0.7883463589306307 0.21383581644037378 1.0 0.6566193796715437 -0.2807146680766071 0.8756492796358128 --0.5892805212332436 0.28406991877718313 0.27182086998472504 -1.8236085752931886E-4 0.6566193796715437 1.0 0.04737540578644875 0.5929601745319638 --0.06253446585578672 0.29140523861712275 -0.6083694620689558 0.606979993040552 -0.2807146680766071 0.04737540578644875 1.0 -0.44707995176268783 --0.19285191653693995 0.40808279276304027 0.8804148513960975 -0.21987411467118548 0.8756492796358128 0.5929601745319638 -0.44707995176268783 1.0 +1.0 -0.3250537665863338 0.1881418341902057 0.5371131830574982 0.025534475569836054 -0.5892805212332436 -0.06253446585578672 -0.19285191653693995 +-0.3250537665863338 1.0 0.20484097619200775 0.22489933238446663 0.41435692055270595 0.28406991877718313 0.29140523861712275 0.40808279276304027 +0.1881418341902057 0.20484097619200775 1.0 -0.1461829470349747 0.7883463589306307 0.27182086998472504 -0.6083694620689558 0.8804148513960975 +0.5371131830574982 0.22489933238446663 -0.1461829470349747 1.0 0.21383581644037378 -1.8236085752931886E-4 0.606979993040552 -0.21987411467118548 +0.025534475569836054 0.41435692055270595 0.7883463589306307 0.21383581644037378 1.0 0.6566193796715437 -0.2807146680766071 0.8756492796358128 +-0.5892805212332436 0.28406991877718313 0.27182086998472504 -1.8236085752931886E-4 0.6566193796715437 1.0 0.04737540578644875 0.5929601745319638 +-0.06253446585578672 0.29140523861712275 -0.6083694620689558 0.606979993040552 -0.2807146680766071 0.04737540578644875 1.0 -0.44707995176268783 +-0.19285191653693995 0.40808279276304027 0.8804148513960975 -0.21987411467118548 0.8756492796358128 0.5929601745319638 -0.44707995176268783 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AN.d b/nearest_correlation_matrices/data/X_G02AN.d index 9197e94..a66f3ec 100755 --- a/nearest_correlation_matrices/data/X_G02AN.d +++ b/nearest_correlation_matrices/data/X_G02AN.d @@ -1,8 +1,8 @@ -1.0 -0.3250029917945835 0.18814425997629136 0.46060526762809 0.00512111817298847 -0.4887229642049529 -0.05790536742916771 -0.12710533688852702 --0.3250029917945835 1.0 0.20484152654833515 0.1948219050550659 0.32454984893978395 0.21834256258510287 0.22942701372832805 0.3391392886204044 -0.18814425997629136 0.20484152654833515 1.0 -0.10596751792243746 0.6124326539394441 0.22109852023486867 -0.49358006312793756 0.7202132326274232 -0.46060526762809 0.1948219050550659 -0.10596751792243746 1.0 0.24319333281783698 0.010073707194754084 0.5159525721067164 -0.2567324055972704 -0.00512111817298847 0.32454984893978395 0.6124326539394441 0.24319333281783698 1.0 0.5319788405341761 -0.26337702263860246 0.7948743038334822 --0.4887229642049529 0.21834256258510287 0.22109852023486867 0.010073707194754084 0.5319788405341761 1.0 0.03932451736851099 0.4769262311870878 --0.05790536742916771 0.22942701372832805 -0.49358006312793756 0.5159525721067164 -0.26337702263860246 0.03932451736851099 1.0 -0.3185151588457599 --0.12710533688852702 0.3391392886204044 0.7202132326274232 -0.2567324055972704 0.7948743038334822 0.4769262311870878 -0.3185151588457599 1.0 +1.0 -0.3250029917945835 0.18814425997629136 0.46060526762809 0.00512111817298847 -0.4887229642049529 -0.05790536742916771 -0.12710533688852702 +-0.3250029917945835 1.0 0.20484152654833515 0.1948219050550659 0.32454984893978395 0.21834256258510287 0.22942701372832805 0.3391392886204044 +0.18814425997629136 0.20484152654833515 1.0 -0.10596751792243746 0.6124326539394441 0.22109852023486867 -0.49358006312793756 0.7202132326274232 +0.46060526762809 0.1948219050550659 -0.10596751792243746 1.0 0.24319333281783698 0.010073707194754084 0.5159525721067164 -0.2567324055972704 +0.00512111817298847 0.32454984893978395 0.6124326539394441 0.24319333281783698 1.0 0.5319788405341761 -0.26337702263860246 0.7948743038334822 +-0.4887229642049529 0.21834256258510287 0.22109852023486867 0.010073707194754084 0.5319788405341761 1.0 0.03932451736851099 0.4769262311870878 +-0.05790536742916771 0.22942701372832805 -0.49358006312793756 0.5159525721067164 -0.26337702263860246 0.03932451736851099 1.0 -0.3185151588457599 +-0.12710533688852702 0.3391392886204044 0.7202132326274232 -0.2567324055972704 0.7948743038334822 0.4769262311870878 -0.3185151588457599 1.0 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AA.d b/nearest_correlation_matrices/data/X_eigen_G02AA.d index 2824faf..3b4e8a5 100755 --- a/nearest_correlation_matrices/data/X_eigen_G02AA.d +++ b/nearest_correlation_matrices/data/X_eigen_G02AA.d @@ -1 +1 @@ --6.173883426196985E-17 2.550377090501583E-17 0.038046493282210325 0.17308760612514437 0.6893558332540384 1.7117146722540244 1.9217270612302262 3.4660683338543565 +-6.173883426196985E-17 2.550377090501583E-17 0.038046493282210325 0.17308760612514437 0.6893558332540384 1.7117146722540244 1.9217270612302262 3.4660683338543565 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AB.d b/nearest_correlation_matrices/data/X_eigen_G02AB.d index b9f32aa..0445a93 100755 --- a/nearest_correlation_matrices/data/X_eigen_G02AB.d +++ b/nearest_correlation_matrices/data/X_eigen_G02AB.d @@ -1 +1 @@ -9.999999999997552E-4 9.99999999999841E-4 0.030520719790230445 0.1646165705339852 0.676371387352591 1.771620208378711 1.8909924571529526 3.4638786567915307 +9.999999999997552E-4 9.99999999999841E-4 0.030520719790230445 0.1646165705339852 0.676371387352591 1.771620208378711 1.8909924571529526 3.4638786567915307 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AJ.d b/nearest_correlation_matrices/data/X_eigen_G02AJ.d index 10d308d..ccfa05e 100755 --- a/nearest_correlation_matrices/data/X_eigen_G02AJ.d +++ b/nearest_correlation_matrices/data/X_eigen_G02AJ.d @@ -1 +1 @@ -9.999999999997702E-4 9.999999999999124E-4 0.037510930964740785 0.1733826335965124 0.6881675924398503 1.7105895508241635 1.9223622895788683 3.465987002595862 +9.999999999997702E-4 9.999999999999124E-4 0.037510930964740785 0.1733826335965124 0.6881675924398503 1.7105895508241635 1.9223622895788683 3.465987002595862 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AN.d b/nearest_correlation_matrices/data/X_eigen_G02AN.d index 26ccdd2..0c6eff3 100755 --- a/nearest_correlation_matrices/data/X_eigen_G02AN.d +++ b/nearest_correlation_matrices/data/X_eigen_G02AN.d @@ -1 +1 @@ -1.4134713692893524E-9 0.13753724988136337 0.2743711328835331 0.3803668326795735 0.7768482873688412 1.6263475038033162 1.768932428977788 3.0355965629921156 +1.4134713692893524E-9 0.13753724988136337 0.2743711328835331 0.3803668326795735 0.7768482873688412 1.6263475038033162 1.768932428977788 3.0355965629921156 diff --git a/nearest_correlation_matrices/data/alpha_G02AN.d b/nearest_correlation_matrices/data/alpha_G02AN.d index ca71ea2..9224985 100755 --- a/nearest_correlation_matrices/data/alpha_G02AN.d +++ b/nearest_correlation_matrices/data/alpha_G02AN.d @@ -1 +1 @@ -0.20026985555887222 +0.20026985555887222 diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb index 759f6b9..e031f68 100644 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ b/nearest_correlation_matrices/ncm_nag.ipynb @@ -274,7 +274,8 @@ "source": [ "```java\n", "// Define a 2-d array and use Double.NaN to set elements as NaNs\n", - "double[][] P = new double[][] { { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", + "double[][] P = new double[][] {\n", + " { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", " { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 },\n", " { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 },\n", " { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN },\n", @@ -1364,7 +1365,7 @@ "\n", "* We do this until we converge on a matrix with both properties.\n", "\n", - "\n", + "\n", "\n" ] }, From b4826be3f89723cb2c239f01ac6c615880eef4d4 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 8 Jan 2021 16:51:35 +0200 Subject: [PATCH 026/196] Numerical Differences from Bladon --- nearest_correlation_matrices/data/G.d | 0 nearest_correlation_matrices/data/G02AA.d | 0 nearest_correlation_matrices/data/G02AB.d | 0 nearest_correlation_matrices/data/G02AJ.d | 0 nearest_correlation_matrices/data/G02AN.d | 0 nearest_correlation_matrices/data/G_eigen.d | 0 nearest_correlation_matrices/data/H_G02AJ.d | 0 nearest_correlation_matrices/data/X_G02AA.d | 0 nearest_correlation_matrices/data/X_G02AB.d | 0 nearest_correlation_matrices/data/X_G02AJ.d | 0 nearest_correlation_matrices/data/X_G02AN.d | 0 nearest_correlation_matrices/data/X_eigen_G02AA.d | 0 nearest_correlation_matrices/data/X_eigen_G02AB.d | 0 nearest_correlation_matrices/data/X_eigen_G02AJ.d | 0 nearest_correlation_matrices/data/X_eigen_G02AN.d | 0 nearest_correlation_matrices/data/alpha_G02AN.d | 0 nearest_correlation_matrices/output.txt | 0 17 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 nearest_correlation_matrices/data/G.d mode change 100755 => 100644 nearest_correlation_matrices/data/G02AA.d mode change 100755 => 100644 nearest_correlation_matrices/data/G02AB.d mode change 100755 => 100644 nearest_correlation_matrices/data/G02AJ.d mode change 100755 => 100644 nearest_correlation_matrices/data/G02AN.d mode change 100755 => 100644 nearest_correlation_matrices/data/G_eigen.d mode change 100755 => 100644 nearest_correlation_matrices/data/H_G02AJ.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_G02AA.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_G02AB.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_G02AJ.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_G02AN.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_eigen_G02AA.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_eigen_G02AB.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_eigen_G02AJ.d mode change 100755 => 100644 nearest_correlation_matrices/data/X_eigen_G02AN.d mode change 100755 => 100644 nearest_correlation_matrices/data/alpha_G02AN.d mode change 100755 => 100644 nearest_correlation_matrices/output.txt diff --git a/nearest_correlation_matrices/data/G.d b/nearest_correlation_matrices/data/G.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/G02AA.d b/nearest_correlation_matrices/data/G02AA.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/G02AB.d b/nearest_correlation_matrices/data/G02AB.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/G02AJ.d b/nearest_correlation_matrices/data/G02AJ.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/G02AN.d b/nearest_correlation_matrices/data/G02AN.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/G_eigen.d b/nearest_correlation_matrices/data/G_eigen.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/H_G02AJ.d b/nearest_correlation_matrices/data/H_G02AJ.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_G02AA.d b/nearest_correlation_matrices/data/X_G02AA.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_G02AB.d b/nearest_correlation_matrices/data/X_G02AB.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_G02AJ.d b/nearest_correlation_matrices/data/X_G02AJ.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_G02AN.d b/nearest_correlation_matrices/data/X_G02AN.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AA.d b/nearest_correlation_matrices/data/X_eigen_G02AA.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AB.d b/nearest_correlation_matrices/data/X_eigen_G02AB.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AJ.d b/nearest_correlation_matrices/data/X_eigen_G02AJ.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AN.d b/nearest_correlation_matrices/data/X_eigen_G02AN.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/data/alpha_G02AN.d b/nearest_correlation_matrices/data/alpha_G02AN.d old mode 100755 new mode 100644 diff --git a/nearest_correlation_matrices/output.txt b/nearest_correlation_matrices/output.txt old mode 100755 new mode 100644 From 7489500e34465b1464ce2b5bfd65d6515f16948c Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 8 Jan 2021 17:11:55 +0200 Subject: [PATCH 027/196] Added workspace.code-workspace to gitingore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d6068b5..08b4244 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.class myvenv .ipynb_checkpoints +workspace.code-workspace From 868869bb2d7000935869443e21d6217633b48b78 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:08:01 +0200 Subject: [PATCH 028/196] Finished QCQP example --- QCQP/portfolioOptimizationQCQP.java | 334 +++++++++++++++------------- 1 file changed, 185 insertions(+), 149 deletions(-) diff --git a/QCQP/portfolioOptimizationQCQP.java b/QCQP/portfolioOptimizationQCQP.java index 88a5ab4..e21c616 100644 --- a/QCQP/portfolioOptimizationQCQP.java +++ b/QCQP/portfolioOptimizationQCQP.java @@ -7,7 +7,6 @@ import com.nag.routines.E04.E04PT; import com.nag.routines.E04.E04PTU; import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RY; import java.io.BufferedReader; import java.io.File; @@ -17,6 +16,7 @@ import java.util.Map; import java.util.LinkedHashMap; import java.util.Arrays; +import java.util.ArrayList; import java.io.FileWriter; public class portfolioOptimizationQCQP { @@ -27,6 +27,15 @@ public static void main(String[] args) { int i, j; + E04RA e04ra = new E04RA(); + E04RS e04rs = new E04RS(); + E04RJ e04rj = new E04RJ(); + E04RH e04rh = new E04RH(); + E04ZM e04zm = new E04ZM(); + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + E04RZ e04rz = new E04RZ(); + // Data Preparation // Load stock price data from djia_close_price.csv @@ -62,9 +71,8 @@ public static void main(String[] args) { double[][] data = new double[m][n]; i = 0; - double[] tempA; for (Map.Entry entry : closePrice.entrySet()) { - tempA = entry.getValue(); + double[] tempA = entry.getValue(); for (j = 0; j < m; j++) { data[j][i] = tempA[j]; } @@ -73,7 +81,6 @@ public static void main(String[] args) { // Relative return double[][] relRtn = new double[m - 1][n]; - for (j = 0; j < m - 1; j++) { for (i = 0; i < n; i++) { relRtn[j][i] = (data[j + 1][i] - data[j][i]) / data[j][i]; @@ -82,9 +89,8 @@ public static void main(String[] args) { // Mean return double[] r = new double[n]; - double sum; for (j = 0; j < n; j++) { - sum = 0; + double sum = 0; for (i = 0; i < m - 1; i++) { sum += relRtn[i][j]; } @@ -92,8 +98,6 @@ public static void main(String[] args) { r[j] /= m - 1; } - // printVectorToFile(r, "r_java.txt"); - // Covariance matrix G02BX g02bx = new G02BX(); String weight = "U"; @@ -116,11 +120,11 @@ public static void main(String[] args) { // Efficient Frontier - int itemsDiag = V.length; - int itemsAboveDiag = (int) (Math.pow(itemsDiag, 2) - itemsDiag) / 2 + itemsDiag; - int[] irowq = new int[itemsAboveDiag]; - int[] icolq = new int[itemsAboveDiag]; - double[] vVal = new double[itemsAboveDiag]; + int itemsDiagLength = V.length; + int itemsAboveDiagLength = (int) (Math.pow(itemsDiagLength, 2) - itemsDiagLength) / 2 + itemsDiagLength; + int[] irowq = new int[itemsAboveDiagLength]; + int[] icolq = new int[itemsAboveDiagLength]; + double[] vVal = new double[itemsAboveDiagLength]; int c = 0; // Input for quadratic objective // Sparsity pattern of upper triangular V @@ -133,8 +137,6 @@ public static void main(String[] args) { } } - // printVectorToFile(vVal, "vVal_java.txt"); - n = closePrice.size(); // Sparsity pattern of r, which is actually dense in this application int[] idxr = new int[n]; @@ -144,49 +146,37 @@ public static void main(String[] args) { // Input for linear constraint: e'x = 1 int[] irowa = new int[n]; - Arrays.fill(irowa, 1); int[] icola = new int[n]; - for (i = 0; i < n; i++) { - icola[i] = i + 1; - } double[] a = new double[n]; - Arrays.fill(a, 1.0); double[] bl = new double[1]; - bl[0] = 1.0; double[] bu = new double[1]; + double[] blx = new double[n]; + double[] bux = new double[n]; + + Arrays.fill(irowa, 1); + for (i = 0; i < n; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 1.0); + bl[0] = 1.0; bu[0] = 1.0; // Input for bound constraint: x >= 0 - double[] blx = new double[n]; - Arrays.fill(blx, 0.0); - double[] bux = new double[n]; + Arrays.fill(blx, 0.0); Arrays.fill(bux, 1.0e20); // Set step for mu int step = 2001; // Initialize output data: absolute risk and return - double[] abRisk = new double[2001]; - double[] abRtn = new double[2001]; - - E04RA e04ra = new E04RA(); - E04RS e04rs = new E04RS(); - E04RJ e04rj = new E04RJ(); - E04RH e04rh = new E04RH(); - E04ZM e04zm = new E04ZM(); - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - E04RZ e04rz = new E04RZ(); - E04RY e04ry = new E04RY(); + ArrayList abRisk = new ArrayList<>(); + ArrayList abRtn = new ArrayList<>(); int mu; long handle = 0; double[] q = new double[vVal.length]; int idqc; - int nnzr = nonZeroLength(r); - int nnzq = q.length; - int nclin = bl.length; - int nnza = nonZeroLength(a); + double[] invertSignR = invertSignVector(r); double[] x = new double[n]; double[] u = new double[0]; double[] uc = new double[0]; @@ -202,6 +192,8 @@ public static void main(String[] args) { double[][] RX; for (mu = 0; mu < step; mu++) { + ifail = 0; + // Create problem handle e04ra.eval(handle, n, ifail); handle = e04ra.getHANDLE(); @@ -212,13 +204,11 @@ public static void main(String[] args) { q[i] = 2.0 * mu * vVal[i]; } - nnzq = nonZeroLength(q); idqc = -1; - ifail = 0; - e04rs.eval(handle, 0.0, nnzr, idxr, invertSignVector(r), nnzq, irowq, icolq, q, idqc, ifail); + e04rs.eval(handle, 0.0, nonZeroLength(invertSignR), idxr, invertSignR, nonZeroLength(q), irowq, icolq, q, idqc, ifail); // Set linear constraint e'x = 1 - e04rj.eval(handle, nclin, bl, bu, nnza, irowa, icola, a, 0, ifail); + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); // Set bound constraint e04rh.eval(handle, n, blx, bux, ifail); @@ -229,47 +219,30 @@ public static void main(String[] args) { e04zm.eval(handle, "Print File = -1", ifail); e04zm.eval(handle, "SOCP Scaling = A", ifail); - // if (mu == 255){ - // // e04ry.eval(handle, 6, "Overview, Objective, Simple bounds, Linear - // constraints bounds, Linear constraints detailed", ifail); - // // e04zm.eval(handle, "Print Options = YES", ifail); - // // e04zm.eval(handle, "Print Level = 3", ifail); - // // e04zm.eval(handle, "Print File = 6", ifail); - // // e04zm.eval(handle, "Print Solution = YES", ifail); - // printVectorToFile(r, "r_java.log"); - // printVectorToFile(q, "q_java.log"); - // } - // Call socp interior point solver - ifail = -1; + ifail = 1; e04pt.eval(handle, n, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); ifail = e04pt.getIFAIL(); - if (ifail != 0) { - System.out.println("mu = " + mu); - System.out.println("ifail = " + ifail); - } + if (ifail == 0) { + // Compute risk and return from the portfolio + x2d = convert1DTo2D(x, x.length); + VX = multiplyMatrices(V, x2d); + XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + + abRisk.add(Math.sqrt(XVX[0][0])); - // Compute risk and return from the portfolio - x2d = convert1DTo2D(x, n); - VX = multiplyMatrices(V, x2d); - XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); - abRisk[mu] = Math.sqrt(XVX[0][0]); + r2d = convert1DTo2D(r, r.length); + RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); - r2d = convert1DTo2D(r, n); - RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); - abRtn[mu] = RX[0][0]; + abRtn.add(RX[0][0]); + } // Destroy the handle: e04rz.eval(handle, ifail); handle = e04rz.getHANDLE(); } - // System.out.println(ab_risk[0]); - // System.out.println(ab_risk[2000]); - // System.out.println(ab_rtn[0]); - // System.out.println(ab_rtn[2000]); - // Maximizing the Sharpe ratio // Input for linear constraint: e'y = lambda @@ -317,48 +290,163 @@ public static void main(String[] args) { q[i] = 2.0 * vVal[i]; } idqc = -1; - nnzq = nonZeroLength(q); - e04rs.eval(handle, 0.0, 0, idxr, r, nnzq, irowq, icolq, q, idqc, ifail); + e04rs.eval(handle, 0.0, 0, idxr, r, nonZeroLength(q), irowq, icolq, q, idqc, ifail); // Set linear constraints - nclin = bl.length; - nnza = nonZeroLength(a); - e04rj.eval(handle, nclin, bl, bu, nnza, irowa, icola, a, 0, ifail); + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); // Set bound constraint e04rh.eval(handle, blx.length, blx, bux, ifail); // Set options - e04zm.eval(handle, "Print Options = YES", ifail); - e04zm.eval(handle, "Print Level = 3", ifail); - e04zm.eval(handle, "Print File = 6", ifail); + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); e04zm.eval(handle, "SOCP Scaling = A", ifail); - e04zm.eval(handle, "Print Solution = YES", ifail); - - // e04ry.eval(handle, 6, - // "Overview, Objective, Simple bounds, Linear constraints bounds, Linear constraints detailed", ifail); - // Call socp interior point solver x = new double[n + 1]; e04pt.eval(handle, n + 1, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - printVector(x); - x2d = convert1DTo2D(x, n); VX = multiplyMatrices(V, x2d); XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + double srRisk = Math.sqrt(XVX[0][0]) / x[n]; r2d = convert1DTo2D(r, n); RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); + double srRtn = RX[0][0] / x[n]; - double[] srX = vectorDivScalar(x, x[n]); + double[] srX = new double[n]; + for (i = 0; i < srX.length; i++) { + srX[i] = x[i] / x[n]; + } + + // Portfolio optimization with tracking-error constraint + + // Generate a benchmark portfolio from efficient portfolio that maximize the + // Sharpe ratio + // Perturb x + double[] b = new double[n]; + double sumB = 0; + for (i = 0; i < b.length; i++) { + b[i] = srX[i] + 1.0e-1; + sumB += b[i]; + } + + // Normalize b + for (i = 0; i < b.length; i++) { + b[i] /= sumB; + } + + // Set limit on tracking-error + double tev = 0.000002; + + // Compute risk and return at the benchmark + double[][] b2d = convert1DTo2D(b, n); + double[][] VB = multiplyMatrices(V, b2d); + double[][] BVB = multiplyMatrices(invertRowColMatrix(b2d), VB); + + double bRisk = Math.sqrt(BVB[0][0]); + + r2d = convert1DTo2D(r, n); + double[][] RB = multiplyMatrices(invertRowColMatrix(r2d), b2d); + + double bRtn = RB[0][0]; + + irowa = new int[n]; + icola = new int[n]; + a = new double[n]; + bl = new double[1]; + bu = new double[1]; + + // Input for linear constraint: e'x = 0 + Arrays.fill(irowa, 1); + for (i = 0; i < icola.length; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 1.0); + bl[0] = 0; + bu[0] = 0; + + // Input for bound constraint: x >= -b + blx = invertSignVector(b); + Arrays.fill(bux, 1.0e20); + + // Initialize output data: TEV risk and return + ArrayList tevRisk = new ArrayList<>(); + ArrayList tevRtn = new ArrayList<>(); + + double[] rMu = new double[n]; + double[][] Vb; + double[] Vb1d; + x = new double[n]; + double[] xb; + double[][] xb2d; + double[][] xbVxb; - System.out.println(srRisk); - System.out.println(srRtn); - printVector(srX); + for (mu = 0; mu < step; mu++) { + ifail = 0; + + // Create problem handle + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*mu*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * mu * vVal[i]; + } + Vb = multiplyMatrices(V, b2d); + Vb1d = convert2DTo1D(Vb); + for (i = 0; i < rMu.length; i++) { + rMu[i] = 2.0 * mu * Vb1d[i] - r[i]; + } + idqc = -1; + e04rs.eval(handle, 0.0, nonZeroLength(rMu), idxr, rMu, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + + // Set quadratic constraint + // In qcqp standard form q should be 2*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * vVal[i]; + } + idqc = 0; + e04rs.eval(handle, -tev, 0, idxr, rMu, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + + // Set linear constraint e'x = 1 + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, blx.length, blx, bux, ifail); + + // Set options + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + // Call socp interior point solver + // Mute warnings and do not count results from warnings + ifail = -1; + e04pt.eval(handle, n, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + ifail = e04pt.getIFAIL(); + if (ifail == 0) { + // Compute risk and return from the portfolio + xb = addVectors(x, b); + xb2d = convert1DTo2D(xb, xb.length); + xbVxb = multiplyMatrices(invertRowColMatrix(xb2d), multiplyMatrices(V, xb2d)); + tevRisk.add(Math.sqrt(xbVxb[0][0])); + + tevRtn.add(multiplyMatrices(invertRowColMatrix(r2d), xb2d)[0][0]); + } + + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); + } } public static class MONIT extends E04PT.Abstract_E04PT_MONIT { @@ -369,14 +457,6 @@ public void eval() { } } - public static double[] vectorDivScalar(double[] a, double s) { - double[] t = new double[a.length]; - for (int i = 0; i < t.length; i++) { - t[i] = a[i] / s; - } - return t; - } - public static double[][] invertRowColMatrix(double[][] a) { double[][] t = new double[a[0].length][a.length]; for (int i = 0; i < a.length; i++) { @@ -426,7 +506,6 @@ public static double[] convert2DTo1D(double[][] a) { public static double[][] convert1DTo2D(double[] a, int n) { double[][] b = new double[n][a.length / n]; - for (int i = 0; i < b.length; i++) { for (int j = 0; j < b[0].length; j++) { b[i][j] = a[i + j * n]; @@ -435,14 +514,12 @@ public static double[][] convert1DTo2D(double[] a, int n) { return b; } - public static double sum(double[][] a) { - double sum = 0; - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - sum += a[i][j]; - } + public static double[] addVectors(double[] a, double[] b) { + double[] t = new double[a.length]; + for (int i = 0; i < t.length; i++) { + t[i] = a[i] + b[i]; } - return sum; + return t; } public static double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) { @@ -463,47 +540,6 @@ private static double multiplyMatricesCell(double[][] firstMatrix, double[][] se return cell; } - public static void printArr(String[] a) { - for (int i = 0; i < a.length; i++) { - System.out.printf("%s ", a[i]); - } - System.out.println(); - } - - public static void printMap(Map map) { - for (Map.Entry entry : map.entrySet()) { - System.out.printf("%4s: ", entry.getKey()); - printVector(entry.getValue()); - } - } - - public static void printMatrix(double[][] a) { - printMatrix(a, a.length, a[0].length); - } - - public static void printMatrix(double[][] a, int row, int col) { - for (int i = 0; i < row; i++) { - for (int j = 0; j < col; j++) { - System.out.printf("%11.4e ", a[i][j]); - } - System.out.println(); - } - } - - public static void printVector(double[] a) { - for (int i = 0; i < a.length; i++) { - System.out.printf("%.3e ", a[i]); - } - System.out.println(); - } - - public static void printVector(int[] a) { - for (int i = 0; i < a.length; i++) { - System.out.printf("%4d ", a[i]); - } - System.out.println(); - } - public static void printVectorToFile(double[] a, String fileName) { try { FileWriter writer = new FileWriter(new File(fileName)); From e40a355133d40845eb624008a289146b56b8ab6a Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:24:51 +0200 Subject: [PATCH 029/196] Added simple_examples --- NAGPythonExamples | 1 + README.md | 2 +- simple_examples/A00AAJE.java | 16 ++ simple_examples/A00ACJE.java | 29 +++ simple_examples/A00ADJE.java | 107 +++++++++ simple_examples/C02AAJE.java | 174 +++++++++++++++ simple_examples/C02ABJE.java | 217 ++++++++++++++++++ simple_examples/C02AFJE.java | 271 ++++++++++++++++++++++ simple_examples/C02AGJE.java | 262 ++++++++++++++++++++++ simple_examples/C02AHJE.java | 61 +++++ simple_examples/C02AJJE.java | 65 ++++++ simple_examples/C02AKJE.java | 62 ++++++ simple_examples/C02ALJE.java | 64 ++++++ simple_examples/C02AMJE.java | 75 +++++++ simple_examples/C02ANJE.java | 80 +++++++ simple_examples/C05AUJE.java | 67 ++++++ simple_examples/C05AWJE.java | 59 +++++ simple_examples/C05AYJE.java | 44 ++++ simple_examples/C05AZJE.java | 65 ++++++ simple_examples/C05BBJE.java | 89 ++++++++ simple_examples/C05MBJE.java | 95 ++++++++ simple_examples/C05QBJE.java | 167 ++++++++++++++ simple_examples/C06BAJE.java | 56 +++++ simple_examples/C06FKJE.java | 91 ++++++++ simple_examples/C09AAJE.java | 158 +++++++++++++ simple_examples/D01BDJE.java | 58 +++++ simple_examples/D01RJJE.java | 184 +++++++++++++++ simple_examples/D01RKJE.java | 173 +++++++++++++++ simple_examples/D01RLJE.java | 196 ++++++++++++++++ simple_examples/D01RMJE.java | 163 ++++++++++++++ simple_examples/D01TCJE.java | 45 ++++ simple_examples/D02NEJE.java | 388 ++++++++++++++++++++++++++++++++ simple_examples/D02TLJE.java | 290 ++++++++++++++++++++++++ simple_examples/D03PCJE.java | 217 ++++++++++++++++++ simple_examples/D03RAJE.java | 307 +++++++++++++++++++++++++ simple_examples/D03RBJE.java | 388 ++++++++++++++++++++++++++++++++ simple_examples/D05BAJE.java | 111 +++++++++ simple_examples/D05BEJE.java | 185 +++++++++++++++ simple_examples/DTFSMJE.java | 54 +++++ simple_examples/E01DAJE.java | 182 +++++++++++++++ simple_examples/E02ALJE.java | 101 +++++++++ simple_examples/E04ABJE.java | 76 +++++++ simple_examples/E04BBJE.java | 81 +++++++ simple_examples/E04CBJE.java | 90 ++++++++ simple_examples/E04FCJE.java | 420 +++++++++++++++++++++++++++++++++++ simple_examples/E04FFJE.java | 140 ++++++++++++ simple_examples/E04GBJE.java | 183 +++++++++++++++ simple_examples/E04GGJE.java | 219 ++++++++++++++++++ simple_examples/E04MTJE.java | 132 +++++++++++ simple_examples/E04MXJE.java | 292 ++++++++++++++++++++++++ simple_examples/E04NCJE.java | 246 ++++++++++++++++++++ simple_examples/E04NFJE.java | 234 +++++++++++++++++++ simple_examples/E04NKJE.java | 295 ++++++++++++++++++++++++ simple_examples/E04NQJE.java | 384 ++++++++++++++++++++++++++++++++ simple_examples/E04PTJE.java | 344 ++++++++++++++++++++++++++++ simple_examples/E04RPJE.java | 199 +++++++++++++++++ simple_examples/E04RSJE.java | 229 +++++++++++++++++++ simple_examples/E04RTJE.java | 225 +++++++++++++++++++ simple_examples/E04SAJE.java | 104 +++++++++ simple_examples/E04TAJE.java | 188 ++++++++++++++++ simple_examples/E04TCJE.java | 263 ++++++++++++++++++++++ simple_examples/E04UCJE.java | 211 ++++++++++++++++++ simple_examples/E04YAJE.java | 112 ++++++++++ simple_examples/F01ADJE.java | 39 ++++ simple_examples/F01CKJE.java | 60 +++++ simple_examples/F01CRJE.java | 47 ++++ simple_examples/F01DGJE.java | 72 ++++++ simple_examples/F01ELJE.java | 89 ++++++++ simple_examples/F01EMJE.java | 106 +++++++++ simple_examples/F02EKJE.java | 227 +++++++++++++++++++ simple_examples/F02FKJE.java | 230 +++++++++++++++++++ simple_examples/F02WGJE.java | 132 +++++++++++ simple_examples/F03BAJE.java | 108 +++++++++ simple_examples/F04AMJE.java | 114 ++++++++++ simple_examples/F04BAJE.java | 144 ++++++++++++ simple_examples/F05AAJE.java | 99 +++++++++ simple_examples/F06CLJE.java | 40 ++++ simple_examples/F07AAJE.java | 90 ++++++++ simple_examples/F07ABJE.java | 134 +++++++++++ simple_examples/F07ADJE.java | 72 ++++++ simple_examples/F07AQJE.java | 99 +++++++++ simple_examples/F07FAJE.java | 79 +++++++ simple_examples/F07FBJE.java | 122 ++++++++++ simple_examples/F08BTJE.java | 228 +++++++++++++++++++ simple_examples/F08FAJE.java | 113 ++++++++++ simple_examples/F08XPJE.java | 297 +++++++++++++++++++++++++ simple_examples/G01ALJE.java | 55 +++++ simple_examples/G02AKJE.java | 68 ++++++ simple_examples/G02BJJE.java | 303 +++++++++++++++++++++++++ simple_examples/G02BRJE.java | 134 +++++++++++ simple_examples/G02DAJE.java | 187 ++++++++++++++++ simple_examples/G02EEJE.java | 184 +++++++++++++++ simple_examples/G02MAJE.java | 130 +++++++++++ simple_examples/G03GAJE.java | 355 +++++++++++++++++++++++++++++ simple_examples/G05KFJE.java | 105 +++++++++ simple_examples/G13AWJE.java | 31 +++ simple_examples/G13MEJE.java | 160 +++++++++++++ simple_examples/G13NAJE.java | 123 ++++++++++ simple_examples/H02BBJE.java | 92 ++++++++ simple_examples/H02DAJE.java | 228 +++++++++++++++++++ simple_examples/M01CCJE.java | 42 ++++ simple_examples/S01BAJE.java | 39 ++++ simple_examples/S10AAJE.java | 40 ++++ simple_examples/S10ABJE.java | 41 ++++ simple_examples/S10ACJE.java | 41 ++++ simple_examples/S14ABJE.java | 71 ++++++ simple_examples/S14ACJE.java | 68 ++++++ simple_examples/S14AFJE.java | 80 +++++++ simple_examples/S17DCJE.java | 69 ++++++ simple_examples/S17DGJE.java | 61 +++++ simple_examples/S30AAJE.java | 109 +++++++++ simple_examples/S30ACJE.java | 129 +++++++++++ simple_examples/X03AAJE.java | 87 ++++++++ simple_examples/X04CBJE.java | 53 +++++ simple_examples/X05ABJE.java | 25 +++ 115 files changed, 15936 insertions(+), 1 deletion(-) create mode 160000 NAGPythonExamples create mode 100644 simple_examples/A00AAJE.java create mode 100644 simple_examples/A00ACJE.java create mode 100644 simple_examples/A00ADJE.java create mode 100644 simple_examples/C02AAJE.java create mode 100644 simple_examples/C02ABJE.java create mode 100644 simple_examples/C02AFJE.java create mode 100644 simple_examples/C02AGJE.java create mode 100644 simple_examples/C02AHJE.java create mode 100644 simple_examples/C02AJJE.java create mode 100644 simple_examples/C02AKJE.java create mode 100644 simple_examples/C02ALJE.java create mode 100644 simple_examples/C02AMJE.java create mode 100644 simple_examples/C02ANJE.java create mode 100644 simple_examples/C05AUJE.java create mode 100644 simple_examples/C05AWJE.java create mode 100644 simple_examples/C05AYJE.java create mode 100644 simple_examples/C05AZJE.java create mode 100644 simple_examples/C05BBJE.java create mode 100644 simple_examples/C05MBJE.java create mode 100644 simple_examples/C05QBJE.java create mode 100644 simple_examples/C06BAJE.java create mode 100644 simple_examples/C06FKJE.java create mode 100644 simple_examples/C09AAJE.java create mode 100644 simple_examples/D01BDJE.java create mode 100644 simple_examples/D01RJJE.java create mode 100644 simple_examples/D01RKJE.java create mode 100644 simple_examples/D01RLJE.java create mode 100644 simple_examples/D01RMJE.java create mode 100644 simple_examples/D01TCJE.java create mode 100644 simple_examples/D02NEJE.java create mode 100644 simple_examples/D02TLJE.java create mode 100644 simple_examples/D03PCJE.java create mode 100644 simple_examples/D03RAJE.java create mode 100644 simple_examples/D03RBJE.java create mode 100644 simple_examples/D05BAJE.java create mode 100644 simple_examples/D05BEJE.java create mode 100644 simple_examples/DTFSMJE.java create mode 100644 simple_examples/E01DAJE.java create mode 100644 simple_examples/E02ALJE.java create mode 100644 simple_examples/E04ABJE.java create mode 100644 simple_examples/E04BBJE.java create mode 100644 simple_examples/E04CBJE.java create mode 100644 simple_examples/E04FCJE.java create mode 100644 simple_examples/E04FFJE.java create mode 100644 simple_examples/E04GBJE.java create mode 100644 simple_examples/E04GGJE.java create mode 100644 simple_examples/E04MTJE.java create mode 100644 simple_examples/E04MXJE.java create mode 100644 simple_examples/E04NCJE.java create mode 100644 simple_examples/E04NFJE.java create mode 100644 simple_examples/E04NKJE.java create mode 100644 simple_examples/E04NQJE.java create mode 100644 simple_examples/E04PTJE.java create mode 100644 simple_examples/E04RPJE.java create mode 100644 simple_examples/E04RSJE.java create mode 100644 simple_examples/E04RTJE.java create mode 100644 simple_examples/E04SAJE.java create mode 100644 simple_examples/E04TAJE.java create mode 100644 simple_examples/E04TCJE.java create mode 100644 simple_examples/E04UCJE.java create mode 100644 simple_examples/E04YAJE.java create mode 100644 simple_examples/F01ADJE.java create mode 100644 simple_examples/F01CKJE.java create mode 100644 simple_examples/F01CRJE.java create mode 100644 simple_examples/F01DGJE.java create mode 100644 simple_examples/F01ELJE.java create mode 100644 simple_examples/F01EMJE.java create mode 100644 simple_examples/F02EKJE.java create mode 100644 simple_examples/F02FKJE.java create mode 100644 simple_examples/F02WGJE.java create mode 100644 simple_examples/F03BAJE.java create mode 100644 simple_examples/F04AMJE.java create mode 100644 simple_examples/F04BAJE.java create mode 100644 simple_examples/F05AAJE.java create mode 100644 simple_examples/F06CLJE.java create mode 100644 simple_examples/F07AAJE.java create mode 100644 simple_examples/F07ABJE.java create mode 100644 simple_examples/F07ADJE.java create mode 100644 simple_examples/F07AQJE.java create mode 100644 simple_examples/F07FAJE.java create mode 100644 simple_examples/F07FBJE.java create mode 100644 simple_examples/F08BTJE.java create mode 100644 simple_examples/F08FAJE.java create mode 100644 simple_examples/F08XPJE.java create mode 100644 simple_examples/G01ALJE.java create mode 100644 simple_examples/G02AKJE.java create mode 100644 simple_examples/G02BJJE.java create mode 100644 simple_examples/G02BRJE.java create mode 100644 simple_examples/G02DAJE.java create mode 100644 simple_examples/G02EEJE.java create mode 100644 simple_examples/G02MAJE.java create mode 100644 simple_examples/G03GAJE.java create mode 100644 simple_examples/G05KFJE.java create mode 100644 simple_examples/G13AWJE.java create mode 100644 simple_examples/G13MEJE.java create mode 100644 simple_examples/G13NAJE.java create mode 100644 simple_examples/H02BBJE.java create mode 100644 simple_examples/H02DAJE.java create mode 100644 simple_examples/M01CCJE.java create mode 100644 simple_examples/S01BAJE.java create mode 100644 simple_examples/S10AAJE.java create mode 100644 simple_examples/S10ABJE.java create mode 100644 simple_examples/S10ACJE.java create mode 100644 simple_examples/S14ABJE.java create mode 100644 simple_examples/S14ACJE.java create mode 100644 simple_examples/S14AFJE.java create mode 100644 simple_examples/S17DCJE.java create mode 100644 simple_examples/S17DGJE.java create mode 100644 simple_examples/S30AAJE.java create mode 100644 simple_examples/S30ACJE.java create mode 100644 simple_examples/X03AAJE.java create mode 100644 simple_examples/X04CBJE.java create mode 100644 simple_examples/X05ABJE.java diff --git a/NAGPythonExamples b/NAGPythonExamples new file mode 160000 index 0000000..c301999 --- /dev/null +++ b/NAGPythonExamples @@ -0,0 +1 @@ +Subproject commit c301999c02afc152546db595f2680265c95a18e5 diff --git a/README.md b/README.md index 0974dd6..d8659fd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This repository contains examples and demonstrations using the [NAG Library for ## Examples that ship with the product -The NAG Library for Java ships with a set of usage [examples](). +The NAG Library for Java ships with a set of usage [examples](./simple_examples). ## Prerequisites diff --git a/simple_examples/A00AAJE.java b/simple_examples/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/A00ACJE.java b/simple_examples/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/A00ADJE.java b/simple_examples/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/C02AAJE.java b/simple_examples/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/C02ABJE.java b/simple_examples/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/C02AFJE.java b/simple_examples/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/C02AGJE.java b/simple_examples/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/C02AHJE.java b/simple_examples/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/C02AJJE.java b/simple_examples/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/C02AKJE.java b/simple_examples/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/C02ALJE.java b/simple_examples/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/C02AMJE.java b/simple_examples/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/C02ANJE.java b/simple_examples/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/C05AUJE.java b/simple_examples/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/C05AWJE.java b/simple_examples/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/C05AYJE.java b/simple_examples/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/C05AZJE.java b/simple_examples/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/C05BBJE.java b/simple_examples/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/C05MBJE.java b/simple_examples/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/C05QBJE.java b/simple_examples/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/C06BAJE.java b/simple_examples/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/C06FKJE.java b/simple_examples/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/C09AAJE.java b/simple_examples/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/D01BDJE.java b/simple_examples/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/D01RJJE.java b/simple_examples/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/D01RKJE.java b/simple_examples/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/D01RLJE.java b/simple_examples/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/D01RMJE.java b/simple_examples/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/D01TCJE.java b/simple_examples/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/D02NEJE.java b/simple_examples/D02NEJE.java new file mode 100644 index 0000000..3d90bb8 --- /dev/null +++ b/simple_examples/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/D02TLJE.java b/simple_examples/D02TLJE.java new file mode 100644 index 0000000..9333518 --- /dev/null +++ b/simple_examples/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/D03PCJE.java b/simple_examples/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/D03RAJE.java b/simple_examples/D03RAJE.java new file mode 100644 index 0000000..03c2e3b --- /dev/null +++ b/simple_examples/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/D03RBJE.java b/simple_examples/D03RBJE.java new file mode 100644 index 0000000..97faf1c --- /dev/null +++ b/simple_examples/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/D05BAJE.java b/simple_examples/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/D05BEJE.java b/simple_examples/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/DTFSMJE.java b/simple_examples/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/E01DAJE.java b/simple_examples/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/E02ALJE.java b/simple_examples/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/E04ABJE.java b/simple_examples/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/E04BBJE.java b/simple_examples/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/E04CBJE.java b/simple_examples/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/E04FCJE.java b/simple_examples/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/E04FFJE.java b/simple_examples/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/E04GBJE.java b/simple_examples/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/E04GGJE.java b/simple_examples/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/E04MTJE.java b/simple_examples/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/E04MXJE.java b/simple_examples/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/E04NCJE.java b/simple_examples/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/E04NFJE.java b/simple_examples/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/E04NKJE.java b/simple_examples/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/E04NQJE.java b/simple_examples/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/E04PTJE.java b/simple_examples/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/E04RPJE.java b/simple_examples/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/E04RSJE.java b/simple_examples/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/E04RTJE.java b/simple_examples/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/E04SAJE.java b/simple_examples/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/E04TAJE.java b/simple_examples/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/E04TCJE.java b/simple_examples/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/E04UCJE.java b/simple_examples/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/E04YAJE.java b/simple_examples/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/F01ADJE.java b/simple_examples/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/F01CKJE.java b/simple_examples/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/F01CRJE.java b/simple_examples/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/F01DGJE.java b/simple_examples/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/F01ELJE.java b/simple_examples/F01ELJE.java new file mode 100644 index 0000000..93ffe77 --- /dev/null +++ b/simple_examples/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/F01EMJE.java b/simple_examples/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/F02EKJE.java b/simple_examples/F02EKJE.java new file mode 100644 index 0000000..ffdced6 --- /dev/null +++ b/simple_examples/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/F02FKJE.java b/simple_examples/F02FKJE.java new file mode 100644 index 0000000..ecdac2e --- /dev/null +++ b/simple_examples/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/F02WGJE.java b/simple_examples/F02WGJE.java new file mode 100644 index 0000000..5e077cb --- /dev/null +++ b/simple_examples/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/F03BAJE.java b/simple_examples/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/F04AMJE.java b/simple_examples/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/F04BAJE.java b/simple_examples/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/F05AAJE.java b/simple_examples/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/F06CLJE.java b/simple_examples/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/F07AAJE.java b/simple_examples/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/F07ABJE.java b/simple_examples/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/F07ADJE.java b/simple_examples/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/F07AQJE.java b/simple_examples/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/F07FAJE.java b/simple_examples/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/F07FBJE.java b/simple_examples/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/F08BTJE.java b/simple_examples/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/F08FAJE.java b/simple_examples/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/F08XPJE.java b/simple_examples/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/G01ALJE.java b/simple_examples/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/G02AKJE.java b/simple_examples/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/G02BJJE.java b/simple_examples/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/G02BRJE.java b/simple_examples/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/G02DAJE.java b/simple_examples/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/G02EEJE.java b/simple_examples/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/G02MAJE.java b/simple_examples/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/G03GAJE.java b/simple_examples/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/G05KFJE.java b/simple_examples/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/G13AWJE.java b/simple_examples/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/G13MEJE.java b/simple_examples/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/G13NAJE.java b/simple_examples/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/H02BBJE.java b/simple_examples/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/H02DAJE.java b/simple_examples/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/M01CCJE.java b/simple_examples/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/S01BAJE.java b/simple_examples/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/S10AAJE.java b/simple_examples/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/S10ABJE.java b/simple_examples/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/S10ACJE.java b/simple_examples/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/S14ABJE.java b/simple_examples/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/S14ACJE.java b/simple_examples/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/S14AFJE.java b/simple_examples/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/S17DCJE.java b/simple_examples/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/S17DGJE.java b/simple_examples/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/S30AAJE.java b/simple_examples/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/S30ACJE.java b/simple_examples/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/X03AAJE.java b/simple_examples/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/X04CBJE.java b/simple_examples/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/X05ABJE.java b/simple_examples/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} From a2dbea8986b90c75eebb119a726533dce25f6542 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:27:28 +0200 Subject: [PATCH 030/196] Modified gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 08b4244..b188e26 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ myvenv .ipynb_checkpoints workspace.code-workspace +NAGPythonExamples From b273fd95bd65392ecc4ee7ac1e61c1df709ab477 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:29:28 +0200 Subject: [PATCH 031/196] Removed python examples --- NAGPythonExamples | 1 - 1 file changed, 1 deletion(-) delete mode 160000 NAGPythonExamples diff --git a/NAGPythonExamples b/NAGPythonExamples deleted file mode 160000 index c301999..0000000 --- a/NAGPythonExamples +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c301999c02afc152546db595f2680265c95a18e5 From 109ff34dca1fb67835d510de4916d7d5e255ab2d Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:34:07 +0200 Subject: [PATCH 032/196] Added under dev message --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d8659fd..bd4a6e4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ ![NAG Logo](./nag_logo.png) +> ## Important Information +> This repository is still under development. + # Examples using the NAG Library for Java This repository contains examples and demonstrations using the [NAG Library for Java](https://www.nag.com/content/nag-library-for-java). The NAG Library for Java contains 1900+ functions spanning many areas of numerical computing and data science. From d0f7731d48d0d97a9a1e7aadcf7f3f284d1a049f Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 11 Jan 2021 17:35:05 +0200 Subject: [PATCH 033/196] Added message to the top --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd4a6e4..f1d64cd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -![NAG Logo](./nag_logo.png) - > ## Important Information > This repository is still under development. +![NAG Logo](./nag_logo.png) + # Examples using the NAG Library for Java This repository contains examples and demonstrations using the [NAG Library for Java](https://www.nag.com/content/nag-library-for-java). The NAG Library for Java contains 1900+ functions spanning many areas of numerical computing and data science. From d93aa3eb95b2eb05cd3780532a50d336cd1057fd Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 11:28:20 +0200 Subject: [PATCH 034/196] Added _config.yml from gh-pages branch --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c741881 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-slate \ No newline at end of file From f2a50b68d386e1579e51c9a9311d3b06dbce35f2 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 11:38:49 +0200 Subject: [PATCH 035/196] Added logo without background --- README.md | 2 +- nag_logo-removebg.png | Bin 0 -> 12271 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 nag_logo-removebg.png diff --git a/README.md b/README.md index f1d64cd..4f1479d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ > ## Important Information > This repository is still under development. -![NAG Logo](./nag_logo.png) +![NAG Logo](./nag_logo-removebg.png) # Examples using the NAG Library for Java diff --git a/nag_logo-removebg.png b/nag_logo-removebg.png new file mode 100644 index 0000000000000000000000000000000000000000..68858dc093ab8f0c1f79ee26175e7607acbc159c GIT binary patch literal 12271 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

    ur1&gy7 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 Date: Tue, 12 Jan 2021 11:40:41 +0200 Subject: [PATCH 036/196] Removed logo with background --- nag_logo.png | Bin 10702 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nag_logo.png diff --git a/nag_logo.png b/nag_logo.png deleted file mode 100644 index 17b2c26ce1da2859d4716fe912d69b69c64f8637..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10702 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 A{Qv*} From af88a06faadca26a0a90fcf5bc4c7610942db821 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 11:50:42 +0200 Subject: [PATCH 037/196] Removed ncm_nag.pdf --- nearest_correlation_matrices/ncm_nag.pdf | Bin 139788 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nearest_correlation_matrices/ncm_nag.pdf diff --git a/nearest_correlation_matrices/ncm_nag.pdf b/nearest_correlation_matrices/ncm_nag.pdf deleted file mode 100644 index 55517ab9b0965b4fb03b7d6bfaccde1a8f30f199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139788 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

    nyM1L}N2;#Z1 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 UIV>|P7dHnNECq$Qq6F;!0hAC6$p8QV From 307c3990f4d0cac11be074165e4320f35f535857 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 11:51:05 +0200 Subject: [PATCH 038/196] Updated the Readme file for ncm --- nearest_correlation_matrices/Readme.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 6e923a0..d81e243 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,8 +1,18 @@ -# Nearest Correlation Matrices using the NAG Library for Java +# Nearest Correlation Matrices -* [ncm_whitepaper_2019.pdf](./ncm_whitepaper_2019.pdf) Nearest Correlation Matrices whitepaper -* [NcmNag.java](./NcmNag.java) Nearest Correlation Matrices Java Source File, which outputs data files for *ncm_nag.ipynb* to use. -* [output.txt](./output.txt) Output of NcmNag.java -* [ncm_nag.ipynb](./ncm_nag.ipynb) Nearest Correlation Matrices Tutorial, which reads the data files produced from *NcmNag.java* and renders the output using Python -* [ncm_nag.pdf](./ncm_nag.pdf) PDF version of ncm_nag.ipynb, without the Input cells +This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. +The source of this example is in [NcmNag.java](./NcmNag.java). + +## Correlation Matrices + +* An $n$ by $n$ matrix is a correlation matrix if: + * it is symmetric + * it has ones on the diagonal + * its eigenvalues are non-negative (positive semidefinite) + + + $$ \Large Ax = \lambda x, \quad x \neq 0$$ + + +* The element in the $i$th row and $j$th column is the correlation between the $i$th and $j$th variables. This could be stock process, for example. From ed0b6efdc6bace3e104bbc09642dec972dfefcb1 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 11:55:50 +0200 Subject: [PATCH 039/196] Added default.html --- _layouts/default.html | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 _layouts/default.html diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..64b6c3c --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,68 @@ + + + + + + + + +{% seo %} + + + + +

    + + {% if site.google_analytics %} + + {% endif %} + + From 32a56f2922fcdaadaa0199e659f65c2bec192a29 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 12:07:49 +0200 Subject: [PATCH 040/196] Added default.html for slate theme --- _layouts/default.html | 106 +++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 64b6c3c..d671009 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,68 +1,70 @@ - - - + + + + - + + src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"> + + -{% seo %} - - - - -
    -
    -

    {{ site.title | default: site.github.repository_name }}

    - - {% if site.logo %} - Logo - {% endif %} + {% seo %} + -

    {{ site.description | default: site.github.project_tagline }}

    + - {% if site.github.is_project_page %} -

    View the Project on GitHub {{ site.github.repository_nwo }}

    - {% endif %} + +
    +
    + {% if site.github.is_project_page %} + View on GitHub + {% endif %} - {% if site.github.is_user_page %} -

    View My GitHub Profile

    - {% endif %} +

    {{ site.title | default: site.github.repository_name }}

    +

    {{ site.description | default: site.github.project_tagline }}

    - {% if site.show_downloads %} - - {% endif %} -
    -
    + {% if site.show_downloads %} +
    + Download this project as a .zip file + Download this project as a tar.gz file +
    + {% endif %} +
    +
    - {{ content }} + +
    +
    + {{ content }} +
    +
    - - + + - + {% if site.google_analytics %} {% endif %} - + + From ae078d2a2789674ce20d2501809af69e8047b586 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 12:13:17 +0200 Subject: [PATCH 041/196] Updated Readme --- nearest_correlation_matrices/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index d81e243..fb94aa2 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -6,7 +6,7 @@ The source of this example is in [NcmNag.java](./NcmNag.java). ## Correlation Matrices -* An $n$ by $n$ matrix is a correlation matrix if: +* An $$n$$ by $n$ matrix is a correlation matrix if: * it is symmetric * it has ones on the diagonal * its eigenvalues are non-negative (positive semidefinite) From cce65f683aa48e4d3a4bb8cfe4c48122999bb099 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 12:34:39 +0200 Subject: [PATCH 042/196] Updated Readme (Added all the doc) --- nearest_correlation_matrices/Readme.md | 570 ++++++++++++++++++++++++- 1 file changed, 568 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index fb94aa2..08a9a13 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -6,7 +6,7 @@ The source of this example is in [NcmNag.java](./NcmNag.java). ## Correlation Matrices -* An $$n$$ by $n$ matrix is a correlation matrix if: +* An $$n$$ by $$n$$ matrix is a correlation matrix if: * it is symmetric * it has ones on the diagonal * its eigenvalues are non-negative (positive semidefinite) @@ -15,4 +15,570 @@ The source of this example is in [NcmNag.java](./NcmNag.java). $$ \Large Ax = \lambda x, \quad x \neq 0$$ -* The element in the $i$th row and $j$th column is the correlation between the $i$th and $j$th variables. This could be stock process, for example. +* The element in the $$i$$th row and $$j$$th column is the correlation between the $$i$$th and $$j$$th variables. This could be stock process, for example. + +## Empirical Correlation Matrices + +* Empirical correlation matrices are often **not mathematically true** due to inconsistent or missing data. + + +* Thus we are required to find a true correlation matrix, where our input, $$G$$, is an approximate correlation matrix. + + +* In particular we seek the *nearest* correlation matrix, in most cases. + +## Computing Correlation Matrices + +* The vector $$p_i$$, the $$i$$th column of a matrix, $$P$$, holds the $$m$$ observations of the $$i$$th variable, of which there are $$n$$. $$\bar{p}_i$$ is the sample mean. + + +$$ \large S_{ij}=\frac{1}{m-1}(p_i - \bar{p}_i )^T(p_j - \bar{p}_j) $$ + +* $$S$$ is a covariance matrix, with $$S_{ij}$$ the covariance between variables $$i$$ and $$j$$ + + +* $$R$$ is the corresponding correlation matrix, given by: + + +\begin{align*} \large D_S^{1/2} & = \large \textrm{ diag}(s_{11}^{-1/2},s_{22}^{-1/2}, \ldots, s_{nn}^{-1/2}) \nonumber \\ & \\ +\large R & = \large D_S^{1/2} S D_S^{1/2} +\end{align*} + + +## Approximate Correlation Matrices + +* Now, what if we don't have all observations for each variable? + + +* We compute each covariance with observations that are available for *both* the *i*th and *j*th variable. + + +* For example NAG routine **G02BB**. + + +* We then compute the correlation matrix as before. + +# Missing Stock Price Example + +* Prices for 8 stocks on the first working day of 10 consecutive months. + + +| | Stock A | Stock B | Stock C | Stock D | Stock E | Stock F | Stock G | Stock H +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| **Month 1** | 59.875 | 42.734 | 47.938 | 60.359 | 54.016 | 69.625 | 61.500 | 62.125 | +| **Month 2** | 53.188 | 49.000 | 39.500 | | 34.750 | | 83.000 | 44.500 | +| **Month 3** | 55.750 | 50.000 | 38.938 | | 30.188 | | 70.875 | 29.938 | +| **Month 4** | 65.500 | 51.063 | 45.563 | 69.313 | 48.250 | 62.375 | 85.250 | | +| **Month 5** | 69.938 | 47.000 | 52.313 | 71.016 | | 59.359 | 61.188 | 48.219 | +| **Month 6** | 61.500 | 44.188 | 53.438 | 57.000 | 35.313 | 55.813 | 51.500 | 62.188 | +| **Month 7** | 59.230 | 48.210 | 62.190 | 61.390 | 54.310 | 70.170 | 61.750 | 91.080 | +| **Month 8** | 61.230 | 48.700 | 60.300 | 68.580 | 61.250 | 70.340 | | | +| **Month 9** | 52.900 | 52.690 | 54.230 | | 68.170 | 70.600 | 57.870 | 88.640 | +| **Month 10** | 57.370 | 59.040 | 59.870 | 62.090 | 61.620 | 66.470 | 65.370 | 85.840 | + + +* We will use NaNs where there is missing data. + +* So our $$P = \left[p_1, p_2, \ldots, p_n \right]$$ is: + + +$$ +P=\left[\begin{array}{rrrrrrrr} + 59.875 & 42.734 & {\color{blue}{47.938}} & {\color{blue}{60.359}} & 54.016 & 69.625 & 61.500 & 62.125 \\ + 53.188 & 49.000 & 39.500 & \textrm{NaN} & 34.750 & \textrm{NaN} & 83.000 & 44.500 \\ + 55.750 & 50.000 & 38.938 & \textrm{NaN} & 30.188 & \textrm{NaN} & 70.875 & 29.938 \\ + 65.500 & 51.063 & {\color{blue}{45.563}} & {\color{blue}{69.313}} & 48.250 & 62.375 & 85.250 & \textrm{NaN} \\ + 69.938 & 47.000 & {\color{blue}{52.313}} & {\color{blue}{71.016}} & \textrm{NaN} & 59.359 & 61.188 & 48.219 \\ + 61.500 & 44.188 & {\color{blue}{53.438}} & {\color{blue}{57.000}} & 35.313 & 55.813 & 51.500 & 62.188 \\ + 59.230 & 48.210 & {\color{blue}{62.190}} & {\color{blue}{61.390}} & 54.310 & 70.170 & 61.750 & + 91.080 \\ + 61.230 & 48.700 & {\color{blue}{60.300}} & {\color{blue}{68.580}} & 61.250 & 70.340 & \textrm{NaN} & \textrm{NaN} \\ + 52.900 & 52.690 & 54.230 & \textrm{NaN} & 68.170 & 70.600 & 57.870 & 88.640 \\ + 57.370 & 59.040 & {\color{blue}{59.870}} & {\color{blue}{62.090}} & 61.620 & 66.470 & 65.370 & + 85.840 +\end{array}\right]. +$$ + + +* And to compute the covariance between the 3rd and 4th variables: + + +\begin{align*} +\large v_1^T & = \large [47.938, 45.563, 52.313, 53.438, 62.190, 60.300, 59.870] \\ +\large v_2^T & = \large [60.359, 69.313, 71.016, 57.000, 61.390, 68.580, 62.090] \\ +S_{3,4} & = \large \frac{1}{6} (v_1 - \bar{v}_1 )^T(v_2 - \bar{v}_2) +\end{align*} + +* Let's compute this in Java. + +### Initialize our *P* matrix of observations + +```java +// Define a 2-d array and use Double.NaN to set elements as NaNs +double[][] P = new double[][] { + { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 }, + { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 }, + { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 }, + { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN }, + { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 }, + { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 }, + { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 }, + { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN }, + { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 }, + { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } }; +``` + +### Compute the covariance, ignoring missing values + +```java +public static double[][] cov_bar(double[][] P) { + double[] xi, xj; + boolean[] xib, xjb, notp; + int n = P[0].length; + double[][] S = new double[n][n]; + int notpFalseCount; + + for (int i = 0; i < n; i++) { + // Take the ith column + xi = getMatrixColumn(P, i); + + for (int j = 0; j < i + 1; j++) { + // Take the jth column, where j <= i + xj = getMatrixColumn(P, j); + + // Set mask such that all NaNs are true + xib = getNanMask(xi); + xjb = getNanMask(xj); + + notp = addBoolArrOr(xib, xjb); + + // S[i][j] = (xi - mean(xi)) * (xj - mean(xj)) + S[i][j] = matrixMaskedDot(vectorSubScalar(xi, vectorMaskedMean(xi, notp)), + vectorSubScalar(xj, vectorMaskedMean(xj, notp)), notp); + + // Take the sum over !notp to normalize + notpFalseCount = 0; + for (boolean b : notp) { + if (!b) { + notpFalseCount++; + } + } + S[i][j] = 1.0 / (notpFalseCount - 1) * S[i][j]; + S[j][i] = S[i][j]; + } + } + return S; +} +``` + +```java +public static double[][] cor_bar(double[][] P) { + double[][] S, D; + S = cov_bar(P); + // D = 1.0 / SQRT(S) + D = getMatrixFromDiag(vectorRightDiv(vectorSqrt(getMatrixDiag(S)), 1.0)); + + // S_ = S * D + F01CK f01ck = new F01CK(); + double[] S_ = new double[S.length * S[0].length]; + double[] S1d = convert2DTo1D(S); + double[] D1d = convert2DTo1D(D); + int n = S.length; + int p = n; + int m = n; + double[] z = new double[0]; + int iz = 0; + int opt = 1; + int ifail = 0; + f01ck.eval(S_, S1d, D1d, n, p, m, z, iz, opt, ifail); + + // D_ = D * S_ + double[] D_ = new double[n * n]; + f01ck.eval(D_, D1d, S_, n, p, m, z, iz, opt, ifail); + + return convert1DTo2D(D_, n); +} +``` + +### Compute the *approximate* correlation matrix + +```java +double[][] G = cor_bar(P); +``` + +### Compute the eigenvalues of our (indefinite) *G*. + +* We see below that our matrix $$G$$ is not a mathematically true correlation matrix. + +```java +F08NA f08na = new F08NA(); +String jobvl = "N"; +String jobvr = "N"; +int n = G[0].length; +double[] G1d = convert2DTo1D(G); +int lda = G.length; +double[] wr = new double[n]; +double[] wi = new double[n]; +int ldvl = 1; +double[] vl = new double[ldvl]; +int ldvr = 1; +double[] vr = new double[ldvr]; +int lwork = 3 * n; +double[] work = new double[lwork]; +int info = 0; +f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); +Arrays.sort(wr); +``` + +# Nearest Correlation Matrices + +* Our problem now is to solve: + + +$$ +\large +\min \frac{1}{2} \| G-X \|^2_F = +\min \frac{1}{2} \sum_{i=1}^{n} \sum_{i=1}^{n} +\left| G(i,j)-X(i,j) \right| ^2 +$$ + + +* In order to find $$X$$, a true correlation matrix, where $$G$$ is an approximate correlation matrix. + + +* An algorithm by Qi and Sun (2006), applies an inexact Newton method to a dual (unconstrained) formulation of this problem. + + +* Improvements were suggested by Borsdorf and Higham (2010 MSc). + + +* It is globally and quadratically (fast!) convergent. + + +* This is implemented in NAG routine **G02AA**. + +## Using G02AA to compute the nearest correlation matrix in the Frobenius norm + +```java +// Call NAG routine G02AA and print the result +G02AA g02aa = new G02AA(); +G1d = convert2DTo1D(G); +n = G.length; +int ldg = n; +int ldx = n; +double errtol = 0.0; +int maxits = 0; +int maxit = 0; +double[] X1d = new double[ldx * n]; +int iter = 0; +int feval = 0; +double nrmgrd = 0.0; +int ifail = 0; +g02aa.eval(G1d, ldg, n, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail); + +double[][] X = convert1DTo2D(X1d, ldx); +iter = g02aa.getITER(); +``` + +```java +jobvl = "N"; +jobvr = "N"; +n = X[0].length; +lda = X.length; +wr = new double[n]; +wi = new double[n]; +ldvl = 1; +vl = new double[ldvl]; +ldvr = 1; +vr = new double[ldvr]; +lwork = 3 * n; +work = new double[lwork]; +info = 0; +f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); +Arrays.sort(wr); +``` + +# Weighting rows and columns of elements + +* Now, we note that for Stocks A to C we have a complete set of observations. + + +$$ +P=\left[\begin{array}{rrrrrrrr} + {\color{blue}{59.875}} & {\color{blue}{42.734}} & {\color{blue}{47.938}} & 60.359 & 54.016 & 69.625 & 61.500 & 62.125 \\ + {\color{blue}{53.188}} & {\color{blue}{49.000}} & {\color{blue}{39.500}} & \textrm{NaN} & 34.750 & \textrm{NaN} & 83.000 & 44.500 \\ + {\color{blue}{55.750}} & {\color{blue}{50.000}} & {\color{blue}{38.938}} & \textrm{NaN} & 30.188 & \textrm{NaN} & 70.875 & 29.938 \\ + {\color{blue}{65.500}} & {\color{blue}{51.063}} & {\color{blue}{45.563}} & 69.313 & 48.250 & 62.375 & 85.250 & \textrm{NaN} \\ + {\color{blue}{69.938}} & {\color{blue}{47.000}} & {\color{blue}{52.313}} & 71.016 & \textrm{NaN} & 59.359 & 61.188 & 48.219 \\ + {\color{blue}{61.500}} & {\color{blue}{44.188}} & {\color{blue}{53.438}} & 57.000 & 35.313 & 55.813 & 51.500 & 62.188 \\ + {\color{blue}{59.230}} & {\color{blue}{48.210}} & {\color{blue}{62.190}} & 61.390 & 54.310 & 70.170 & 61.750 & 91.080 \\ + {\color{blue}{61.230}} & {\color{blue}{48.700}} & {\color{blue}{60.300}} & 68.580 & 61.250 & 70.340 & \textrm{NaN} & \textrm{NaN} \\ + {\color{blue}{52.900}} & {\color{blue}{52.690}} & {\color{blue}{54.230}} & \textrm{NaN} & 68.170 & 70.600 & 57.870 & 88.640 \\ + {\color{blue}{57.370}} & {\color{blue}{59.040}} & {\color{blue}{59.870}} & 62.090 & 61.620 &66.470 & 65.370 & 85.840 +\end{array}\right]. +$$ + + +* Perhaps we wish to preserve part of the correlation matrix? + + +* We could solve the *weighted* problem, NAG routine **G02AB** + + +$$ \Large \|W^{\frac{1}{2}} (G-X) W^{\frac{1}{2}} \|_F$$ + + +* Here $$W$$ is a diagonal matrix. + + +* We can also force the resulting matrix to be positive definite. + +### Use G02AB to compute the nearest correlation matrix with row and column weighting + +```java +// Define an arrray of weights +double[] W = new double[] { 10, 10, 10, 1, 1, 1, 1, 1 }; + +// Set up and call the NAG routine using weights and a minimum eigenvalue +G02AB g02ab = new G02AB(); +G1d = convert2DTo1D(G); +ldg = G.length; +n = G[0].length; +String opt = "B"; +double alpha = 0.001; +errtol = 0.0; +maxits = 0; +maxit = 0; +ldx = n; +X1d = new double[ldx * n]; +iter = 0; +feval = 0; +nrmgrd = 0; +ifail = 0; +g02ab.eval(G1d, ldg, n, opt, alpha, W, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail); + +X = convert1DTo2D(X1d, ldx); +iter = g02ab.getITER(); +``` + +```java +jobvl = "N"; +jobvr = "N"; +n = X[0].length; +lda = X.length; +wr = new double[n]; +wi = new double[n]; +ldvl = 1; +vl = new double[ldvl]; +ldvr = 1; +vr = new double[ldvr]; +lwork = 3 * n; +work = new double[lwork]; +info = 0; +f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); +Arrays.sort(wr); +``` + +# Weighting Individual Elements + +* Would it be better to be able to *weight individual elements* in our approximate matrix? + + +* In our example the top left 3 by 3 block of exact correlations, perhaps. + + +* Element-wise weighting means we wish to find the minimum of + + +$$ \Large \|H \circ(G-X) \|_F $$ + + +* So individually $$h_{ij} \times (g_{ij} – x_{ij}).$$ + + +* However, this is a more “difficult” problem, and more computationally expensive. + + +* This is implemented in the NAG routine **G02AJ**. + +### Use G02AJ to compute the nearest correlation matrix with element-wise weighting + +```java +// Set up a matrix of weights +n = P[0].length; +double[][] H = new double[n][n]; +for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if ((i < 3) && (j < 3)) { + H[i][j] = 100.0; + } else { + H[i][j] = 1; + } + } +} +``` + +```java +// Call the NAG routine specifying a minimum eigenvalue +G02AJ g02aj = new G02AJ(); +G1d = convert2DTo1D(G); +ldg = G.length; +n = G[0].length; +alpha = 0.001; +double[] H1d = convert2DTo1D(H); +int ldh = H.length; +errtol = 0; +maxit = 0; +ldx = n; +X1d = new double[ldx * n]; +iter = 0; +double norm2 = 0; +ifail = 0; +g02aj.eval(G1d, ldg, n, alpha, H1d, ldh, errtol, maxit, X1d, ldx, iter, norm2, ifail); + +X = convert1DTo2D(X1d, ldx); +iter = g02aj.getITER(); +``` + +```java +jobvl = "N"; +jobvr = "N"; +n = X[0].length; +lda = X.length; +wr = new double[n]; +wi = new double[n]; +ldvl = 1; +vl = new double[ldvl]; +ldvr = 1; +vr = new double[ldvr]; +lwork = 3 * n; +work = new double[lwork]; +info = 0; +f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); +Arrays.sort(wr); +Arrays.sort(wi); +``` + +# Fixing a Block of Elements + +* We probably really wish to *fix* our leading block of true correlations, so it does not change at all. + + +* We have the NAG routine **G02AN**. + + +* This routine fixes a leading block, which we require to be positive definite. + + +* We apply the *shrinking algorithm* of Higham, Strabić and Šego. The approach is **not** computationally expensive. + + +* What we find is the smallest α, such that *X* is a true correlation matrix: + + +$$ \large X = \alpha \left( +\begin{array}{ll}G_{11} & 0 \\ 0 & I \end{array} \right) +(1-\alpha)G, +\qquad G = \left( +\begin{array}{ll} G_{11} & G_{12} \\ G_{12}^T & G_{22} \end{array} +\right) +$$ + + +* $$G_{11}$$ is the leading $$k$$ by $$k$$ block of the approximate correlation matrix that we wish to fix. + + +* $$\alpha$$ is in the interval $$[0,1]$$. + +### Use G02AN to compute the nearest correlation matrix with fixed leading block + +```java +// Call the NAG routine fixing the top 3-by-3 block +G02AN g02an = new G02AN(); +G1d = convert2DTo1D(G); +ldg = G.length; +n = G[0].length; +int k = 3; +errtol = 0; +double eigtol = 0; +ldx = n; +X1d = new double[ldx * n]; +alpha = 0.001; +iter = 0; +double eigmin = 0; +norm2 = 0; +ifail = 0; +g02an.eval(G1d, ldg, n, k, errtol, eigtol, X1d, ldx, alpha, iter, eigmin, norm2, ifail); + +X = convert1DTo2D(X1d, ldx); +iter = g02an.getITER(); +alpha = g02an.getALPHA(); +``` + +```java +jobvl = "N"; +jobvr = "N"; +n = X[0].length; +lda = X.length; +wr = new double[n]; +wi = new double[n]; +ldvl = 1; +vl = new double[ldvl]; +ldvr = 1; +vr = new double[ldvr]; +lwork = 3 * n; +work = new double[lwork]; +info = 0; +f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); +Arrays.sort(wr); +``` + +# Fixing Arbitrary Elements + +* The routine **G02AP** fixes arbitrary elements by finding the smallest α, such that *X* is a true correlation matrix in: + + +$$ X = \large \alpha T+(1-\alpha)G, \quad T = H \circ G, \quad h_{ij} \in [0,1] $$ + + +* A "1" in *H* fixes corresponding elements in *G*. + + +* $$0 < h_{ij} < 1$$ weights corresponding element in *G*. + + +* $$\alpha$$ is again in the interval $$[0,1]$$. + +## Alternating Projections + +* First method proposed to solve our original problem, however, it is very slow. + + +* The idea is we alternate projecting onto two sets, which are: + * the set of smeidefinite matrices (S1), and + * matrices with unit diagonal (s2) + + +* We do this until we converge on a matrix with both properties. + + + +## Alternating Projections with Anderson Acceleration + + +* A new approach by Higham and Strabić uses *Anderson Acceleration*, and makes the method worthwhile. + + +* In particular, we will be able to fix elements whilst finding the nearest true correlation matrix in the Frobenius norm. + + +* Our projections are now: + * the set of (semi)definite matrices with some minimum eigenvalue, and + * matrix with elements $$G_{i,j}$$ for some given indices $$i$$ and $$j$$ + + +* To appear in a future NAG Library. + +# More on using the NAG Library for *Java*: + + +**https://www.nag.com/content/nag-library-for-java** From 934662d0713a1aa113badc57d8b176278affd0aa Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 12:45:11 +0200 Subject: [PATCH 043/196] Small fixes --- nearest_correlation_matrices/Readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 08a9a13..90543b4 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -39,10 +39,11 @@ $$ \large S_{ij}=\frac{1}{m-1}(p_i - \bar{p}_i )^T(p_j - \bar{p}_j) $$ * $$R$$ is the corresponding correlation matrix, given by: - +$$ \begin{align*} \large D_S^{1/2} & = \large \textrm{ diag}(s_{11}^{-1/2},s_{22}^{-1/2}, \ldots, s_{nn}^{-1/2}) \nonumber \\ & \\ \large R & = \large D_S^{1/2} S D_S^{1/2} \end{align*} +$$ ## Approximate Correlation Matrices @@ -102,12 +103,13 @@ $$ * And to compute the covariance between the 3rd and 4th variables: - +$$ \begin{align*} \large v_1^T & = \large [47.938, 45.563, 52.313, 53.438, 62.190, 60.300, 59.870] \\ \large v_2^T & = \large [60.359, 69.313, 71.016, 57.000, 61.390, 68.580, 62.090] \\ S_{3,4} & = \large \frac{1}{6} (v_1 - \bar{v}_1 )^T(v_2 - \bar{v}_2) \end{align*} +$$ * Let's compute this in Java. From 69657c9740596cd18db6eb90291253a5c288e7d5 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou <54641824+Brunochris13@users.noreply.github.com> Date: Tue, 12 Jan 2021 12:47:15 +0200 Subject: [PATCH 044/196] Set theme jekyll-theme-minimal --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index c741881..2f7efbe 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-slate \ No newline at end of file +theme: jekyll-theme-minimal \ No newline at end of file From 4aa68503324868a0d1e1866dbb6a4630ef75c9c9 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 12:49:47 +0200 Subject: [PATCH 045/196] Added default.html for minimal --- _layouts/default.html | 106 +++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index d671009..64b6c3c 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,70 +1,68 @@ - - - - + + + - + - + src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"> + - {% seo %} - +{% seo %} + + + + +
    +
    +

    {{ site.title | default: site.github.repository_name }}

    + + {% if site.logo %} + Logo + {% endif %} - +

    {{ site.description | default: site.github.project_tagline }}

    - -
    -
    - {% if site.github.is_project_page %} - View on GitHub - {% endif %} + {% if site.github.is_project_page %} +

    View the Project on GitHub {{ site.github.repository_nwo }}

    + {% endif %} -

    {{ site.title | default: site.github.repository_name }}

    -

    {{ site.description | default: site.github.project_tagline }}

    + {% if site.github.is_user_page %} +

    View My GitHub Profile

    + {% endif %} - {% if site.show_downloads %} -
    - Download this project as a .zip file - Download this project as a tar.gz file -
    - {% endif %} -
    -
    + {% if site.show_downloads %} + + {% endif %} +
    +
    - -
    -
    - {{ content }} -
    -
    + {{ content }} - -
    +
    - + {% if site.google_analytics %} {% endif %} - - + From 740698f53d950bc88a2eba484327acc0f582bcc5 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou <54641824+Brunochris13@users.noreply.github.com> Date: Tue, 12 Jan 2021 14:39:49 +0200 Subject: [PATCH 046/196] Set theme jekyll-theme-slate --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 2f7efbe..c741881 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-minimal \ No newline at end of file +theme: jekyll-theme-slate \ No newline at end of file From edae061d0ab80f714a0ddf88b55154e9ffad4e56 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 14:41:30 +0200 Subject: [PATCH 047/196] Updated default.html for Slate theme --- _layouts/default.html | 106 +++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 64b6c3c..d671009 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,68 +1,70 @@ - - - + + + + - + + src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"> + + -{% seo %} - - - - -
    -
    -

    {{ site.title | default: site.github.repository_name }}

    - - {% if site.logo %} - Logo - {% endif %} + {% seo %} + -

    {{ site.description | default: site.github.project_tagline }}

    + - {% if site.github.is_project_page %} -

    View the Project on GitHub {{ site.github.repository_nwo }}

    - {% endif %} + +
    +
    + {% if site.github.is_project_page %} + View on GitHub + {% endif %} - {% if site.github.is_user_page %} -

    View My GitHub Profile

    - {% endif %} +

    {{ site.title | default: site.github.repository_name }}

    +

    {{ site.description | default: site.github.project_tagline }}

    - {% if site.show_downloads %} - - {% endif %} -
    -
    + {% if site.show_downloads %} +
    + Download this project as a .zip file + Download this project as a tar.gz file +
    + {% endif %} +
    +
    - {{ content }} + +
    +
    + {{ content }} +
    +
    - - + + - + {% if site.google_analytics %} {% endif %} - + + From 8eb95070ca583a70c9beae6f94879c02b75455d7 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 14:43:37 +0200 Subject: [PATCH 048/196] Added style.scss --- docs/assets/style.scss | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 docs/assets/style.scss diff --git a/docs/assets/style.scss b/docs/assets/style.scss new file mode 100644 index 0000000..9e2720a --- /dev/null +++ b/docs/assets/style.scss @@ -0,0 +1,8 @@ +--- +--- + +@import "{{ site.theme }}"; + +.inner { + max-width: 75%; +} From 517aa228310566e10262b558a3415556766b79b2 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 14:50:46 +0200 Subject: [PATCH 049/196] Changed max-width to 15% --- docs/assets/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/assets/style.scss b/docs/assets/style.scss index 9e2720a..4155cb8 100644 --- a/docs/assets/style.scss +++ b/docs/assets/style.scss @@ -4,5 +4,5 @@ @import "{{ site.theme }}"; .inner { - max-width: 75%; + max-width: 15%; } From 379695224e22600338cb99b9f8ed11eaa1e9b46a Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 14:52:04 +0200 Subject: [PATCH 050/196] Renamed folders --- {docs/assets => assets/css}/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {docs/assets => assets/css}/style.scss (73%) diff --git a/docs/assets/style.scss b/assets/css/style.scss similarity index 73% rename from docs/assets/style.scss rename to assets/css/style.scss index 4155cb8..9e2720a 100644 --- a/docs/assets/style.scss +++ b/assets/css/style.scss @@ -4,5 +4,5 @@ @import "{{ site.theme }}"; .inner { - max-width: 15%; + max-width: 75%; } From 69f9134d7b81dd56025cc9c0c9ae1bedc6d0215a Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 14:53:31 +0200 Subject: [PATCH 051/196] Changed max-width to 65% --- assets/css/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/css/style.scss b/assets/css/style.scss index 9e2720a..efbd388 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -4,5 +4,5 @@ @import "{{ site.theme }}"; .inner { - max-width: 75%; + max-width: 65%; } From ec308d8adbb8a2d282c4d7b8faf714fe4a68c105 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:02:14 +0200 Subject: [PATCH 052/196] Added table centering to css --- assets/css/style.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assets/css/style.scss b/assets/css/style.scss index efbd388..5dcfad6 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -6,3 +6,8 @@ .inner { max-width: 65%; } + +table { + margin-right: auto; + margin-left: auto; +} From 034225adf47319946506d4738a8d35c18d3bb069 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:03:53 +0200 Subject: [PATCH 053/196] Added img centering --- assets/css/style.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/css/style.scss b/assets/css/style.scss index 5dcfad6..e39bf97 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -7,7 +7,9 @@ max-width: 65%; } -table { +table, img { margin-right: auto; margin-left: auto; } + + From fd79a3da4c20aef7cdd9fee363306d7439b2b114 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:05:50 +0200 Subject: [PATCH 054/196] Removed img centering --- assets/css/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/css/style.scss b/assets/css/style.scss index e39bf97..45e1b34 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -7,7 +7,7 @@ max-width: 65%; } -table, img { +table { margin-right: auto; margin-left: auto; } From 9344dfb92276bb59acef00a69f15b4277b6e2f49 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:13:06 +0200 Subject: [PATCH 055/196] Added img to the header --- README.md | 2 +- _layouts/default.html | 3 +++ .../nag_logo-removebg.png | Bin 3 files changed, 4 insertions(+), 1 deletion(-) rename nag_logo-removebg.png => _layouts/nag_logo-removebg.png (100%) diff --git a/README.md b/README.md index 4f1479d..ed97478 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ > ## Important Information > This repository is still under development. -![NAG Logo](./nag_logo-removebg.png) + # Examples using the NAG Library for Java diff --git a/_layouts/default.html b/_layouts/default.html index d671009..17cc4b3 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -26,6 +26,9 @@

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    + +
    + {% if site.show_downloads %}
    Download this project as a .zip file diff --git a/nag_logo-removebg.png b/_layouts/nag_logo-removebg.png similarity index 100% rename from nag_logo-removebg.png rename to _layouts/nag_logo-removebg.png From aeb4c75242a5b34ad6a70b3fbeb3e309a5233246 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:27:50 +0200 Subject: [PATCH 056/196] Changed img path --- _layouts/default.html | 2 +- .../nag_logo-removebg.png => nag_logo-removebg.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename _layouts/nag_logo-removebg.png => nag_logo-removebg.png (100%) diff --git a/_layouts/default.html b/_layouts/default.html index 17cc4b3..22d6606 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -26,7 +26,7 @@

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    - + NAG Logo
    {% if site.show_downloads %} diff --git a/_layouts/nag_logo-removebg.png b/nag_logo-removebg.png similarity index 100% rename from _layouts/nag_logo-removebg.png rename to nag_logo-removebg.png From 661bf2342094678de2d1832956f57288305029b3 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:33:47 +0200 Subject: [PATCH 057/196] Added logo-white --- _layouts/default.html | 2 +- assets/img/logo-white.png | Bin 0 -> 10514 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/img/logo-white.png diff --git a/_layouts/default.html b/_layouts/default.html index 22d6606..1407562 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -26,7 +26,7 @@

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    - NAG Logo + NAG Logo
    {% if site.show_downloads %} diff --git a/assets/img/logo-white.png b/assets/img/logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b57e23903acbcad5262931981db81b7dc6f483 GIT binary patch literal 10514 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 Date: Tue, 12 Jan 2021 15:35:59 +0200 Subject: [PATCH 058/196] Fixed img path --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 1407562..cf3d781 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -26,7 +26,7 @@

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    - NAG Logo + NAG Logo
    {% if site.show_downloads %} From a749824f5d1d52ca400efe011f183678c5cefb7b Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:40:02 +0200 Subject: [PATCH 059/196] Made the logo smaller --- _layouts/default.html | 6 +++--- assets/css/style.scss | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index cf3d781..f767a48 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,12 +23,12 @@ View on GitHub {% endif %} + +
    +

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    - NAG Logo -
    - {% if site.show_downloads %}
    Download this project as a .zip file diff --git a/assets/css/style.scss b/assets/css/style.scss index 45e1b34..fd6a795 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -12,4 +12,7 @@ table { margin-left: auto; } - +#nag_logo { + border: none; + size: 50%; +} From f02084b34d15e6e0bf0d6628678a993572974f0d Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:41:43 +0200 Subject: [PATCH 060/196] Made the logo smaller --- assets/css/style.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/css/style.scss b/assets/css/style.scss index fd6a795..6a9a950 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -14,5 +14,7 @@ table { #nag_logo { border: none; - size: 50%; + box-shadow: none; + height: 50%; + width: 50%; } From 5788030b8ea5a0ca69ca638aa45817bb99618d42 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:46:03 +0200 Subject: [PATCH 061/196] Made the logo float right --- _layouts/default.html | 10 ++++++---- assets/css/style.scss | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index f767a48..b7745fa 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,12 +23,14 @@ View on GitHub {% endif %} - +
    +

    {{ site.title | default: site.github.repository_name }}

    +

    {{ site.description | default: site.github.project_tagline }}

    + +
    -

    {{ site.title | default: site.github.repository_name }}

    -

    {{ site.description | default: site.github.project_tagline }}

    - {% if site.show_downloads %}
    Download this project as a .zip file diff --git a/assets/css/style.scss b/assets/css/style.scss index 6a9a950..f8a6e52 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -15,6 +15,6 @@ table { #nag_logo { border: none; box-shadow: none; - height: 50%; - width: 50%; + max-height: 50%; + max-width: 50%; } From b0bda13e5e545d7d4191b06b915b00c8189eb0b2 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:48:47 +0200 Subject: [PATCH 062/196] Made the logo smaller --- _layouts/default.html | 4 ++-- assets/css/style.scss | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index b7745fa..27e3a74 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -26,8 +26,8 @@

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    - +

    diff --git a/assets/css/style.scss b/assets/css/style.scss index f8a6e52..83dae44 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -15,6 +15,6 @@ table { #nag_logo { border: none; box-shadow: none; - max-height: 50%; - max-width: 50%; + max-height: 10%; + max-width: 10%; } From 0a2e091069a2a2e6c3edb9e9568032fd280476fe Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:51:18 +0200 Subject: [PATCH 063/196] Made the logo slightly bigger --- _layouts/default.html | 6 +++--- assets/css/style.scss | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 27e3a74..c716bbc 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -24,10 +24,10 @@ {% endif %}
    -

    {{ site.title | default: site.github.repository_name }}

    -

    {{ site.description | default: site.github.project_tagline }}

    + alt="NAG Logo">

    +

    {{ site.title | default: site.github.repository_name }}

    +

    {{ site.description | default: site.github.project_tagline }}

    diff --git a/assets/css/style.scss b/assets/css/style.scss index 83dae44..f8cbfb4 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -15,6 +15,6 @@ table { #nag_logo { border: none; box-shadow: none; - max-height: 10%; - max-width: 10%; + max-height: 20%; + max-width: 20%; } From 7db5c5d9dae13914650c073e46987f8259c0ce75 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:53:22 +0200 Subject: [PATCH 064/196] Added debug styling borders --- _layouts/default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index c716bbc..2ea3a4e 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,8 +23,8 @@ View on GitHub {% endif %} -
    -

    +

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    From 6293417e16a5182a7dc2295cabfd73e587930d04 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 15:56:31 +0200 Subject: [PATCH 065/196] Updated debug style --- _layouts/default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 2ea3a4e..7d608de 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,8 +23,8 @@ View on GitHub {% endif %} -
    -

    +

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    From 2748722eaf3e61fed7bbf6eadcfb7358ce575280 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 16:04:16 +0200 Subject: [PATCH 066/196] Updated styling --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 7d608de..287e024 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -24,7 +24,7 @@ {% endif %}
    -

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    From 59ced1c820d934afea37ebd04ba9043daac2242c Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 16:08:26 +0200 Subject: [PATCH 067/196] Update styling --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 287e024..d44d5a0 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -24,7 +24,7 @@ {% endif %}
    -

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    From 281b82d1e76f24caeb4c6de872fd1031150ed57a Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 16:15:30 +0200 Subject: [PATCH 068/196] Update styling --- _layouts/default.html | 2 +- assets/css/style.scss | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index d44d5a0..7d608de 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -24,7 +24,7 @@ {% endif %}
    -

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    diff --git a/assets/css/style.scss b/assets/css/style.scss index f8cbfb4..d9a1e0f 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -15,6 +15,6 @@ table { #nag_logo { border: none; box-shadow: none; - max-height: 20%; - max-width: 20%; + max-height: 74px; + max-width: 144.5px; } From e6c9266682005244d107404336f09970ee5bdd96 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 16:17:45 +0200 Subject: [PATCH 069/196] Removed debug borders --- _layouts/default.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index 7d608de..c716bbc 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,8 +23,8 @@ View on GitHub {% endif %} -
    -

    +

    {{ site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    From 8b3bbc8753ef17d17cdb2f0ba44cb324896eaba4 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 16:20:32 +0200 Subject: [PATCH 070/196] Updated Readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ed97478..cb26580 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ > ## Important Information > This repository is still under development. - - +> To see the documentation and a better view of this repository click [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). # Examples using the NAG Library for Java From d48f07f8b68ae5b335f012d4f2d2db4c7359045a Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:06:57 +0200 Subject: [PATCH 071/196] Updated ncm Readme with output --- nearest_correlation_matrices/Readme.md | 39 ++++++++++++++- nearest_correlation_matrices/generate_img.py | 48 +++++++++++++++++++ nearest_correlation_matrices/img/G02AA.png | Bin 0 -> 29182 bytes 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 nearest_correlation_matrices/generate_img.py create mode 100644 nearest_correlation_matrices/img/G02AA.png diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 90543b4..a29c50e 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,8 +1,11 @@ +> ## Important Information +> To properly read the documentation click [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). + # Nearest Correlation Matrices This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. -The source of this example is in [NcmNag.java](./NcmNag.java). +The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). ## Correlation Matrices @@ -208,6 +211,18 @@ public static double[][] cor_bar(double[][] P) { double[][] G = cor_bar(P); ``` +``` +The approximate correlation matrix + 1.0000 -0.3250 0.1881 0.5760 0.0064 -0.6111 -0.0724 -0.1589 + -0.3250 1.0000 0.2048 0.2436 0.4058 0.2730 0.2869 0.4241 + 0.1881 0.2048 1.0000 -0.1325 0.7658 0.2765 -0.6172 0.9006 + 0.5760 0.2436 -0.1325 1.0000 0.3041 0.0126 0.6452 -0.3210 + 0.0064 0.4058 0.7658 0.3041 1.0000 0.6652 -0.3293 0.9939 + -0.6111 0.2730 0.2765 0.0126 0.6652 1.0000 0.0492 0.5964 + -0.0724 0.2869 -0.6172 0.6452 -0.3293 0.0492 1.0000 -0.3983 + -0.1589 0.4241 0.9006 -0.3210 0.9939 0.5964 -0.3983 1.0000 +``` + ### Compute the eigenvalues of our (indefinite) *G*. * We see below that our matrix $$G$$ is not a mathematically true correlation matrix. @@ -232,6 +247,10 @@ f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +``` +Sorted eigenvalues of G: -0.2498 -0.0160 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355 +``` + # Nearest Correlation Matrices * Our problem now is to solve: @@ -282,6 +301,18 @@ double[][] X = convert1DTo2D(X1d, ldx); iter = g02aa.getITER(); ``` +``` +Nearest correlation matrix + 1.0000 -0.3112 0.1889 0.5396 0.0268 -0.5925 -0.0621 -0.1921 + -0.3112 1.0000 0.2050 0.2265 0.4148 0.2822 0.2915 0.4088 + 0.1889 0.2050 1.0000 -0.1468 0.7880 0.2727 -0.6085 0.8802 + 0.5396 0.2265 -0.1468 1.0000 0.2137 0.0015 0.6069 -0.2208 + 0.0268 0.4148 0.7880 0.2137 1.0000 0.6580 -0.2812 0.8762 + -0.5925 0.2822 0.2727 0.0015 0.6580 1.0000 0.0479 0.5932 + -0.0621 0.2915 -0.6085 0.6069 -0.2812 0.0479 1.0000 -0.4470 + -0.1921 0.4088 0.8802 -0.2208 0.8762 0.5932 -0.4470 1.0000 +``` + ```java jobvl = "N"; jobvr = "N"; @@ -300,6 +331,12 @@ f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +``` +Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 +``` + +![$$|G-X|$$ for G02AA](./img/G02AA.png) + # Weighting rows and columns of elements * Now, we note that for Stocks A to C we have a complete set of observations. diff --git a/nearest_correlation_matrices/generate_img.py b/nearest_correlation_matrices/generate_img.py new file mode 100644 index 0000000..289f1a6 --- /dev/null +++ b/nearest_correlation_matrices/generate_img.py @@ -0,0 +1,48 @@ +import numpy as np +import matplotlib.pyplot as plt +from pathlib import Path + +# Set the print precision +np.set_printoptions(precision=4, suppress=True) + +# Set the data folder path +data_folder = Path("data") + +def read_matrix_file(fname): + with open(data_folder / fname) as fdata: + a = np.array([line.split() for line in fdata], dtype = np.float64) + return a + +def read_data_file(fname): + with open(data_folder / fname) as fdata: + for i, line in enumerate(fdata): + if i == 0: + itr = int(line) + elif i == 1: + norm = float(line) + elif i == 2: + a = np.array([float(lts) for lts in line.split()], dtype = np.float64) + else: + a = np.vstack([a, [float(lts) for lts in line.split()]]) + return itr, norm, a + +itr, norm, X_G = read_data_file("G02AA.d") + +# Plot the difference between G and X as a small shaded square for each element +fig1, ax1 = plt.subplots(figsize=(14, 7)) +cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, + vmin=0, vmax=0.2) +cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), + boundaries=np.linspace(0.0, 0.2, 11, endpoint=True)) +cbar.mappable.set_clim([0, 0.2]) +ax1.tick_params(axis='both', which='both', + bottom='off', top='off', left='off', right='off', + labelbottom='off', labelleft='off') +ax1.set_title(r'$|G-X|$ for G02AA', fontsize=16) +plt.xlabel( + r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm), + fontsize=14, +) +plt.savefig("./img/G02AA.png") + + diff --git a/nearest_correlation_matrices/img/G02AA.png b/nearest_correlation_matrices/img/G02AA.png new file mode 100644 index 0000000000000000000000000000000000000000..cd860bfeb949454770cbb382d8010025f04818a6 GIT binary patch literal 29182 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

    ogyQAALFARh) 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 literal 0 HcmV?d00001 From 5d573337184650e1da7e80807a5bdb16765a837d Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:12:44 +0200 Subject: [PATCH 072/196] Updated ncm Readme added more whitespace --- nearest_correlation_matrices/Readme.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index a29c50e..d6c1b62 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -176,6 +176,8 @@ public static double[][] cov_bar(double[][] P) { } ``` +
    + ```java public static double[][] cor_bar(double[][] P) { double[][] S, D; @@ -211,6 +213,8 @@ public static double[][] cor_bar(double[][] P) { double[][] G = cor_bar(P); ``` +
    + ``` The approximate correlation matrix 1.0000 -0.3250 0.1881 0.5760 0.0064 -0.6111 -0.0724 -0.1589 @@ -247,6 +251,8 @@ f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +
    + ``` Sorted eigenvalues of G: -0.2498 -0.0160 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355 ``` @@ -301,6 +307,8 @@ double[][] X = convert1DTo2D(X1d, ldx); iter = g02aa.getITER(); ``` +
    + ``` Nearest correlation matrix 1.0000 -0.3112 0.1889 0.5396 0.0268 -0.5925 -0.0621 -0.1921 @@ -313,6 +321,8 @@ Nearest correlation matrix -0.1921 0.4088 0.8802 -0.2208 0.8762 0.5932 -0.4470 1.0000 ``` +
    + ```java jobvl = "N"; jobvr = "N"; @@ -331,11 +341,13 @@ f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +
    + ``` Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ``` -![$$|G-X|$$ for G02AA](./img/G02AA.png) +![$$|G-X|$$ for G02AA](img/G02AA.png) # Weighting rows and columns of elements From dc15db26df16a3667e463e88eb005789b803a10e Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:16:03 +0200 Subject: [PATCH 073/196] Updated ncm Readme --- nearest_correlation_matrices/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index d6c1b62..148323a 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -347,7 +347,7 @@ Arrays.sort(wr); Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ``` -![$$|G-X|$$ for G02AA](img/G02AA.png) +![|G-X| for G02AA](img/G02AA.png) # Weighting rows and columns of elements From 13a427fb3c13d68ece8b65d823ee8d1388de62d3 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:17:38 +0200 Subject: [PATCH 074/196] Updated ncm Readme --- nearest_correlation_matrices/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 148323a..b2ff310 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -347,7 +347,7 @@ Arrays.sort(wr); Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ``` -![|G-X| for G02AA](img/G02AA.png) +![\|G-X\| for G02AA](img/G02AA.png) # Weighting rows and columns of elements From f25381c2ed4d6ccad0df425f0780d8e2130ed22c Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:27:45 +0200 Subject: [PATCH 075/196] G02AA img to center --- nearest_correlation_matrices/Readme.md | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index b2ff310..1c1adf7 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -347,7 +347,10 @@ Arrays.sort(wr); Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ``` -![\|G-X\| for G02AA](img/G02AA.png) + +

    + +
    # Weighting rows and columns of elements @@ -412,6 +415,23 @@ X = convert1DTo2D(X1d, ldx); iter = g02ab.getITER(); ``` +
    + +``` +Nearest correlation matrix using row and column weighting + 1.0000 -0.3250 0.1881 0.5739 0.0067 -0.6097 -0.0722 -0.1598 + -0.3250 1.0000 0.2048 0.2426 0.4060 0.2737 0.2870 0.4236 + 0.1881 0.2048 1.0000 -0.1322 0.7661 0.2759 -0.6171 0.9004 + 0.5739 0.2426 -0.1322 1.0000 0.2085 -0.0890 0.5954 -0.1805 + 0.0067 0.4060 0.7661 0.2085 1.0000 0.6556 -0.2780 0.8757 + -0.6097 0.2737 0.2759 -0.0890 0.6556 1.0000 0.0490 0.5746 + -0.0722 0.2870 -0.6171 0.5954 -0.2780 0.0490 1.0000 -0.4550 + -0.1598 0.4236 0.9004 -0.1805 0.8757 0.5746 -0.4550 1.0000 + +``` + +
    + ```java jobvl = "N"; jobvr = "N"; @@ -430,6 +450,12 @@ f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +
    + +``` +Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 1.8910 3.4639 +``` + # Weighting Individual Elements * Would it be better to be able to *weight individual elements* in our approximate matrix? From 2b4c8de7bf62e61f10fdb3d6c4af7672e1a81f63 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:29:32 +0200 Subject: [PATCH 076/196] G02AA img to center (added src) --- nearest_correlation_matrices/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 1c1adf7..8f2ccd8 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -349,7 +349,7 @@ Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117
    - +
    # Weighting rows and columns of elements From 874da8ae8f3ea4b6261e15292817483949a859bc Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:46:47 +0200 Subject: [PATCH 077/196] Updated ncm Readme --- nearest_correlation_matrices/Readme.md | 88 +++++++++++++++++-- nearest_correlation_matrices/generate_img.py | 59 +++++++++++++ nearest_correlation_matrices/img/G02AB.png | Bin 0 -> 28927 bytes nearest_correlation_matrices/img/G02AJ.png | Bin 0 -> 29570 bytes nearest_correlation_matrices/img/G02AN.png | Bin 0 -> 29115 bytes 5 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 nearest_correlation_matrices/img/G02AB.png create mode 100644 nearest_correlation_matrices/img/G02AJ.png create mode 100644 nearest_correlation_matrices/img/G02AN.png diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 8f2ccd8..562acea 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -347,7 +347,6 @@ Arrays.sort(wr); Sorted eigenvalues of X: -0.0000 0.0000 0.0380 0.1731 0.6894 1.7117 1.9217 3.4661 ``` -
    @@ -415,7 +414,7 @@ X = convert1DTo2D(X1d, ldx); iter = g02ab.getITER(); ``` -
    +
    ``` Nearest correlation matrix using row and column weighting @@ -430,7 +429,7 @@ Nearest correlation matrix using row and column weighting ``` -
    +
    ```java jobvl = "N"; @@ -450,12 +449,18 @@ f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` -
    +
    ``` Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 1.8910 3.4639 ``` +
    + +
    + +
    + # Weighting Individual Elements * Would it be better to be able to *weight individual elements* in our approximate matrix? @@ -470,7 +475,7 @@ Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 $$ \Large \|H \circ(G-X) \|_F $$ -* So individually $$h_{ij} \times (g_{ij} – x_{ij}).$$ +* So individually $$h_{ij} \times (g_{ij} \minus x_{ij}).$$ * However, this is a more “difficult” problem, and more computationally expensive. @@ -495,6 +500,21 @@ for (int i = 0; i < n; i++) { } ``` +
    + +``` +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 +100.0000 100.0000 100.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 + 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 +``` + +
    + ```java // Call the NAG routine specifying a minimum eigenvalue G02AJ g02aj = new G02AJ(); @@ -517,6 +537,22 @@ X = convert1DTo2D(X1d, ldx); iter = g02aj.getITER(); ``` +
    + +``` +Nearest correlation matrix using element-wise weighting + 1.0000 -0.3251 0.1881 0.5371 0.0255 -0.5893 -0.0625 -0.1929 + -0.3251 1.0000 0.2048 0.2249 0.4144 0.2841 0.2914 0.4081 + 0.1881 0.2048 1.0000 -0.1462 0.7883 0.2718 -0.6084 0.8804 + 0.5371 0.2249 -0.1462 1.0000 0.2138 -0.0002 0.6070 -0.2199 + 0.0255 0.4144 0.7883 0.2138 1.0000 0.6566 -0.2807 0.8756 + -0.5893 0.2841 0.2718 -0.0002 0.6566 1.0000 0.0474 0.5930 + -0.0625 0.2914 -0.6084 0.6070 -0.2807 0.0474 1.0000 -0.4471 + -0.1929 0.4081 0.8804 -0.2199 0.8756 0.5930 -0.4471 1.0000 +``` + +
    + ```java jobvl = "N"; jobvr = "N"; @@ -533,9 +569,20 @@ work = new double[lwork]; info = 0; f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info); Arrays.sort(wr); -Arrays.sort(wi); ``` +
    + +``` +Sorted eigenvalues of X: 0.0010 0.0010 0.0375 0.1734 0.6882 1.7106 1.9224 3.4660 +``` + +
    + +
    + +
    + # Fixing a Block of Elements * We probably really wish to *fix* our leading block of true correlations, so it does not change at all. @@ -591,6 +638,22 @@ iter = g02an.getITER(); alpha = g02an.getALPHA(); ``` +
    + +``` +Nearest correlation matrix with fixed leading block + 1.0000 -0.3250 0.1881 0.4606 0.0051 -0.4887 -0.0579 -0.1271 + -0.3250 1.0000 0.2048 0.1948 0.3245 0.2183 0.2294 0.3391 + 0.1881 0.2048 1.0000 -0.1060 0.6124 0.2211 -0.4936 0.7202 + 0.4606 0.1948 -0.1060 1.0000 0.2432 0.0101 0.5160 -0.2567 + 0.0051 0.3245 0.6124 0.2432 1.0000 0.5320 -0.2634 0.7949 + -0.4887 0.2183 0.2211 0.0101 0.5320 1.0000 0.0393 0.4769 + -0.0579 0.2294 -0.4936 0.5160 -0.2634 0.0393 1.0000 -0.3185 + -0.1271 0.3391 0.7202 -0.2567 0.7949 0.4769 -0.3185 1.0000 + ``` + +
    + ```java jobvl = "N"; jobvr = "N"; @@ -609,6 +672,19 @@ f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, i Arrays.sort(wr); ``` +
    + +``` +Sorted eigenvalues of X: 0.0000 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356 +Value of alpha returned: 0.2003 +``` + +
    + +
    + +
    + # Fixing Arbitrary Elements * The routine **G02AP** fixes arbitrary elements by finding the smallest α, such that *X* is a true correlation matrix in: diff --git a/nearest_correlation_matrices/generate_img.py b/nearest_correlation_matrices/generate_img.py index 289f1a6..a16e400 100644 --- a/nearest_correlation_matrices/generate_img.py +++ b/nearest_correlation_matrices/generate_img.py @@ -26,6 +26,7 @@ def read_data_file(fname): a = np.vstack([a, [float(lts) for lts in line.split()]]) return itr, norm, a +# G02AA itr, norm, X_G = read_data_file("G02AA.d") # Plot the difference between G and X as a small shaded square for each element @@ -45,4 +46,62 @@ def read_data_file(fname): ) plt.savefig("./img/G02AA.png") +# G02AB +itr, norm, X_G = read_data_file("G02AB.d") +fig1, ax1 = plt.subplots(figsize=(14, 7)) +cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, + vmax=0.2) +cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), + boundaries=np.linspace(0.0, 0.2, 11, endpoint=True)) +cbar.mappable.set_clim([0, 0.2]) +ax1.tick_params(axis='both', which='both', + bottom='off', top='off', left='off', right='off', + labelbottom='off', labelleft='off') + +ax1.set_title(r'$|G-X|$ for G02AB', fontsize=16) +plt.xlabel( + r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm), + fontsize=14, +) +plt.savefig("./img/G02AB.png") + +# G02AJ +itr, norm, X_G = read_data_file("G02AJ.d") + +fig1, ax1 = plt.subplots(figsize=(14, 7)) +cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, + vmax=0.2) +cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), + boundaries=np.linspace(0.0, 0.2, 11, endpoint=True)) +cbar.mappable.set_clim([0, 0.2]) +ax1.tick_params(axis='both', which='both', + bottom='off', top='off', left='off', right='off', + labelbottom='off', labelleft='off') + +ax1.set_title(r'$|G-X|$ for G02AJ', fontsize=16) +plt.xlabel( + r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm), + fontsize=14, +) +plt.savefig("./img/G02AJ.png") + +# G02AN +itr, norm, X_G = read_data_file("G02AN.d") + +fig1, ax1 = plt.subplots(figsize=(14, 7)) +cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, + vmax=0.2) +cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), + boundaries=np.linspace(0.0, 0.2, 11, endpoint=True)) +cbar.mappable.set_clim([0, 0.2]) +ax1.tick_params(axis='both', which='both', + bottom='off', top='off', left='off', right='off', + labelbottom='off', labelleft='off') + +ax1.set_title(r'$|G-X|$ for G02AN', fontsize=16) +plt.xlabel( + r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm), + fontsize=14, +) +plt.savefig("./img/G02AN.png") diff --git a/nearest_correlation_matrices/img/G02AB.png b/nearest_correlation_matrices/img/G02AB.png new file mode 100644 index 0000000000000000000000000000000000000000..5513727365b68cd55b2c959b9f60abf14acd5ba5 GIT binary patch literal 28927 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 literal 0 HcmV?d00001 diff --git a/nearest_correlation_matrices/img/G02AJ.png b/nearest_correlation_matrices/img/G02AJ.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6dda7495a4e60ebab495bc7f30513350642b0e GIT binary patch literal 29570 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 ObKuC=v0t6}?*9UOMrq6d literal 0 HcmV?d00001 From 9f5ba9603dc96636a430e295e4a3781d030a67da Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 12 Jan 2021 17:50:10 +0200 Subject: [PATCH 078/196] Small fix --- nearest_correlation_matrices/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 562acea..1e4e742 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -682,7 +682,7 @@ Value of alpha returned: 0.2003
    - +
    # Fixing Arbitrary Elements From 1a7e0ba23282b4b1f163e39e716cd5db55b716a4 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 10:52:27 +0200 Subject: [PATCH 079/196] Added link to the logo icon --- _layouts/default.html | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index c716bbc..e32458d 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -24,10 +24,13 @@ {% endif %}
    -

    +

    + + + +

    {{ site.title | default: site.github.repository_name }}

    -

    {{ site.description | default: site.github.project_tagline }}

    +

    {{ site.description | default: site.github.project_tagline }}

    From 203db14806f6fd2a571384d5ae06650f6684c3c9 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 10:52:53 +0200 Subject: [PATCH 080/196] Fixed final link and minus latex symbol --- nearest_correlation_matrices/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 1e4e742..618dccb 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -475,7 +475,7 @@ Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 $$ \Large \|H \circ(G-X) \|_F $$ -* So individually $$h_{ij} \times (g_{ij} \minus x_{ij}).$$ +* So individually $$h_{ij} \times (g_{ij} \- x_{ij}).$$ * However, this is a more “difficult” problem, and more computationally expensive. @@ -734,4 +734,4 @@ $$ X = \large \alpha T+(1-\alpha)G, \quad T = H \circ G, \quad h_{ij} \in [0,1] # More on using the NAG Library for *Java*: -**https://www.nag.com/content/nag-library-for-java** +**** From a5d39a5b4bfb76a4fd67ac953505f1d14ea9c079 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 10:56:20 +0200 Subject: [PATCH 081/196] Fixed minus symbol --- debug.log | 1 + nearest_correlation_matrices/Readme.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 debug.log diff --git a/debug.log b/debug.log new file mode 100644 index 0000000..49a1365 --- /dev/null +++ b/debug.log @@ -0,0 +1 @@ +[0113/105617.913:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 618dccb..b589930 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -475,7 +475,7 @@ Sorted eigenvalues of X: 0.0010 0.0010 0.0305 0.1646 0.6764 1.7716 $$ \Large \|H \circ(G-X) \|_F $$ -* So individually $$h_{ij} \times (g_{ij} \- x_{ij}).$$ +* So individually $$h_{ij} \times (g_{ij} - x_{ij}).$$ * However, this is a more “difficult” problem, and more computationally expensive. From a1ba3fb14495af7fafd15dc753a20c1533de8345 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 12:19:39 +0200 Subject: [PATCH 082/196] Removed unneeded data files --- nearest_correlation_matrices/NcmNag.java | 13 ------------ nearest_correlation_matrices/data/G.d | 8 -------- nearest_correlation_matrices/data/G02AA.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AB.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AJ.d | 20 +++++++++---------- nearest_correlation_matrices/data/G02AN.d | 20 +++++++++---------- nearest_correlation_matrices/data/G_eigen.d | 1 - nearest_correlation_matrices/data/H_G02AJ.d | 8 -------- nearest_correlation_matrices/data/X_G02AA.d | 8 -------- nearest_correlation_matrices/data/X_G02AB.d | 8 -------- nearest_correlation_matrices/data/X_G02AJ.d | 8 -------- nearest_correlation_matrices/data/X_G02AN.d | 8 -------- .../data/X_eigen_G02AA.d | 1 - .../data/X_eigen_G02AB.d | 1 - .../data/X_eigen_G02AJ.d | 1 - .../data/X_eigen_G02AN.d | 1 - .../data/alpha_G02AN.d | 1 - 17 files changed, 40 insertions(+), 107 deletions(-) delete mode 100644 nearest_correlation_matrices/data/G.d delete mode 100644 nearest_correlation_matrices/data/G_eigen.d delete mode 100644 nearest_correlation_matrices/data/H_G02AJ.d delete mode 100644 nearest_correlation_matrices/data/X_G02AA.d delete mode 100644 nearest_correlation_matrices/data/X_G02AB.d delete mode 100644 nearest_correlation_matrices/data/X_G02AJ.d delete mode 100644 nearest_correlation_matrices/data/X_G02AN.d delete mode 100644 nearest_correlation_matrices/data/X_eigen_G02AA.d delete mode 100644 nearest_correlation_matrices/data/X_eigen_G02AB.d delete mode 100644 nearest_correlation_matrices/data/X_eigen_G02AJ.d delete mode 100644 nearest_correlation_matrices/data/X_eigen_G02AN.d delete mode 100644 nearest_correlation_matrices/data/alpha_G02AN.d diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index f3c30c8..961c7b2 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -36,7 +36,6 @@ public static void main(String[] args) { double[][] G = cor_bar(P); System.out.println("The approximate correlation matrix"); printMatrix(G); - printMatrixToFile(G, "G.d"); System.out.println(); @@ -62,7 +61,6 @@ public static void main(String[] args) { System.out.print("Sorted eigenvalues of G: "); printVector(wr); - printVectorToFile(wr, "G_eigen.d"); System.out.println(); @@ -92,7 +90,6 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix"); printMatrix(X); - printMatrixToFile(X, "X_G02AA.d"); System.out.println(); @@ -114,7 +111,6 @@ public static void main(String[] args) { System.out.print("Sorted eigenvalues of X: "); printVector(wr); - printVectorToFile(wr, "X_eigen_G02AA.d"); System.out.println(); @@ -161,7 +157,6 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix using row and column weighting"); printMatrix(X); - printMatrixToFile(X, "X_G02AB.d"); System.out.println(); @@ -183,7 +178,6 @@ public static void main(String[] args) { System.out.print("Sorted eigenvalues of X: "); printVector(wr); - printVectorToFile(wr, "X_eigen_G02AB.d"); System.out.println(); @@ -216,7 +210,6 @@ public static void main(String[] args) { } } printMatrix(H); - printMatrixToFile(H, "H_G02AJ.d"); System.out.println(); @@ -242,7 +235,6 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix using element-wise weighting"); printMatrix(X); - printMatrixToFile(X, "X_G02AJ.d"); System.out.println(); @@ -264,7 +256,6 @@ public static void main(String[] args) { System.out.print("Sorted eigenvalues of X: "); printVector(wr); - printVectorToFile(wr, "X_eigen_G02AJ.d"); System.out.println(); @@ -307,7 +298,6 @@ public static void main(String[] args) { System.out.println("Nearest correlation matrix with fixed leading block"); printMatrix(X); - printMatrixToFile(X, "X_G02AN.d"); System.out.println(); @@ -329,10 +319,8 @@ public static void main(String[] args) { System.out.print("Sorted eigenvalues of X: "); printVector(wr); - printVectorToFile(wr, "X_eigen_G02AN.d"); System.out.printf("Value of alpha returned: %.4f\n", alpha); - printVectorToFile(new double[]{alpha}, "alpha_G02AN.d"); System.out.println(); @@ -346,7 +334,6 @@ public static void main(String[] args) { X_G_norm = f06rc.eval(norm, uplo, n, X_G1d, lda, work); printDataToFile("G02AN.d", iter, X_G, X_G_norm); - } /** diff --git a/nearest_correlation_matrices/data/G.d b/nearest_correlation_matrices/data/G.d deleted file mode 100644 index 71c5575..0000000 --- a/nearest_correlation_matrices/data/G.d +++ /dev/null @@ -1,8 +0,0 @@ -1.0 -0.3250029917945835 0.18814425997629136 0.5759508639629596 0.00640355776080848 -0.6111098444919633 -0.07240613328341335 -0.15893528307270638 --0.3250029917945835 1.0 0.20484152654833515 0.24360955555978517 0.40582420357130317 0.273020298287851 0.2868805375451461 0.4240671568750279 -0.1881442599762914 0.20484152654833518 1.0 -0.1325040936108396 0.7657991363667153 0.27646640778981524 -0.617183266829168 0.9005703206682636 -0.5759508639629596 0.24360955555978514 -0.13250409361083962 0.9999999999999998 0.30409424292463905 0.012596382998409861 0.645158339588759 -0.32102379456595537 -0.006403557760808479 0.40582420357130317 0.7657991363667153 0.304094242924639 1.0000000000000002 0.6651979348683132 -0.3293323685112022 0.9939281510877161 --0.6111098444919633 0.273020298287851 0.27646640778981524 0.012596382998409863 0.6651979348683132 0.9999999999999998 0.049172233461315856 0.5963589524568644 --0.07240613328341335 0.2868805375451461 -0.6171832668291679 0.645158339588759 -0.3293323685112022 0.049172233461315856 0.9999999999999999 -0.39827829557224775 --0.15893528307270638 0.42406715687502783 0.9005703206682635 -0.3210237945659553 0.993928151087716 0.5963589524568643 -0.3982782955722478 1.0000000000000002 diff --git a/nearest_correlation_matrices/data/G02AA.d b/nearest_correlation_matrices/data/G02AA.d index ad79122..55ed396 100644 --- a/nearest_correlation_matrices/data/G02AA.d +++ b/nearest_correlation_matrices/data/G02AA.d @@ -1,10 +1,10 @@ -3 -0.2959969817070778 -0.0 0.013815700430991396 7.366710963886136E-4 0.03635540303506091 0.02034779708157225 0.018640792841438603 0.010277120331962035 0.03313079901499455 -0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236613 0.015279544615574847 -7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 -0.03635540303506091 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.0903873270564857 0.011108665944863202 0.03829235517819496 0.10025930306912842 -0.02034779708157225 0.009011302957805278 0.022160907986847334 0.09038732705648564 2.220446049250313E-16 0.007170761154141281 0.04815905065166437 0.11769167350320131 -0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863204 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 -0.010277120331962035 0.004646613030236613 0.008723271763466323 0.03829235517819496 0.04815905065166437 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 -0.03313079901499455 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 +3 +0.2959969817070778 +0.0 0.013815700430991396 7.366710963886136E-4 0.03635540303506091 0.02034779708157225 0.018640792841438603 0.010277120331962035 0.03313079901499455 +0.013815700430991396 0.0 1.836163361564891E-4 0.01707632265088571 0.009011302957805278 0.009183190094823324 0.004646613030236613 0.015279544615574847 +7.366710963885859E-4 1.8361633615646133E-4 0.0 0.014293377437387234 0.022160907986847334 0.003755895897555317 0.008723271763466434 0.020341681222662555 +0.03635540303506091 0.017076322650885684 0.014293377437387206 2.220446049250313E-16 0.0903873270564857 0.011108665944863202 0.03829235517819496 0.10025930306912842 +0.02034779708157225 0.009011302957805278 0.022160907986847334 0.09038732705648564 2.220446049250313E-16 0.007170761154141281 0.04815905065166437 0.11769167350320131 +0.018640792841438603 0.009183190094823324 0.003755895897555317 0.011108665944863204 0.007170761154141281 2.220446049250313E-16 0.0012869329722350817 0.0032065743873453956 +0.010277120331962035 0.004646613030236613 0.008723271763466323 0.03829235517819496 0.04815905065166437 0.0012869329722350817 1.1102230246251565E-16 0.048704113870236265 +0.03313079901499455 0.015279544615574792 0.020341681222662444 0.10025930306912836 0.1176916735032012 0.0032065743873452845 0.04870411387023621 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AB.d b/nearest_correlation_matrices/data/G02AB.d index 52475cd..85f882b 100644 --- a/nearest_correlation_matrices/data/G02AB.d +++ b/nearest_correlation_matrices/data/G02AB.d @@ -1,10 +1,10 @@ -4 -0.3524228941273674 -0.0 1.2127569472830668E-5 7.195785961727763E-6 0.002038032317451921 3.353434369406643E-4 0.001459140067176179 2.2543497516450128E-4 8.700269518134296E-4 -1.2127569472830668E-5 0.0 3.3697723013370595E-6 0.0010287283953215043 2.0605535082529602E-4 7.060499939418041E-4 1.2971188999805205E-4 4.693987256226828E-4 -7.195785961755519E-6 3.369772301364815E-6 0.0 3.1606180612731016E-4 3.3451678969276255E-4 5.464856907395066E-4 1.3231874883401495E-4 1.8281093738581333E-4 -0.002038032317451921 0.0010287283953214765 3.160618061273379E-4 2.220446049250313E-16 0.09562569837460122 0.10161736192678256 0.0497455932654437 0.14048758269560868 -3.3534343694066517E-4 2.0605535082529602E-4 3.3451678969276255E-4 0.09562569837460116 2.220446049250313E-16 0.009591829656777184 0.05135556336768127 0.11827727452119219 -0.001459140067176179 7.060499939418041E-4 5.464856907395066E-4 0.10161736192678256 0.009591829656777184 2.220446049250313E-16 1.4712946889805512E-4 0.021750337132225628 -2.2543497516450128E-4 1.2971188999805205E-4 1.3231874883390393E-4 0.0497455932654437 0.05135556336768127 1.4712946889805512E-4 1.1102230246251565E-16 0.05672380746719463 -8.700269518134296E-4 4.693987256226273E-4 1.828109373857023E-4 0.14048758269560863 0.11827727452119208 0.021750337132225517 0.056723807467194576 2.220446049250313E-16 +4 +0.3524228941273674 +0.0 1.2127569472830668E-5 7.195785961727763E-6 0.002038032317451921 3.353434369406643E-4 0.001459140067176179 2.2543497516450128E-4 8.700269518134296E-4 +1.2127569472830668E-5 0.0 3.3697723013370595E-6 0.0010287283953215043 2.0605535082529602E-4 7.060499939418041E-4 1.2971188999805205E-4 4.693987256226828E-4 +7.195785961755519E-6 3.369772301364815E-6 0.0 3.1606180612731016E-4 3.3451678969276255E-4 5.464856907395066E-4 1.3231874883401495E-4 1.8281093738581333E-4 +0.002038032317451921 0.0010287283953214765 3.160618061273379E-4 2.220446049250313E-16 0.09562569837460122 0.10161736192678256 0.0497455932654437 0.14048758269560868 +3.3534343694066517E-4 2.0605535082529602E-4 3.3451678969276255E-4 0.09562569837460116 2.220446049250313E-16 0.009591829656777184 0.05135556336768127 0.11827727452119219 +0.001459140067176179 7.060499939418041E-4 5.464856907395066E-4 0.10161736192678256 0.009591829656777184 2.220446049250313E-16 1.4712946889805512E-4 0.021750337132225628 +2.2543497516450128E-4 1.2971188999805205E-4 1.3231874883390393E-4 0.0497455932654437 0.05135556336768127 1.4712946889805512E-4 1.1102230246251565E-16 0.05672380746719463 +8.700269518134296E-4 4.693987256226273E-4 1.828109373857023E-4 0.14048758269560863 0.11827727452119208 0.021750337132225517 0.056723807467194576 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AJ.d b/nearest_correlation_matrices/data/G02AJ.d index 877abc6..ee927b2 100644 --- a/nearest_correlation_matrices/data/G02AJ.d +++ b/nearest_correlation_matrices/data/G02AJ.d @@ -1,10 +1,10 @@ -137 -0.29813714558068444 -0.0 5.0774791750307635E-5 2.425786085669124E-6 0.03883768090546136 0.019130917809027575 0.02182932325871967 0.00987166742762663 0.03391663346423357 -5.0774791750307635E-5 0.0 5.503563274000811E-7 0.018710223175318536 0.008532716981402788 0.011049620489332113 0.004524701071976667 0.015984364111987615 -2.4257860856968794E-6 5.503563274278367E-7 0.0 0.013678853424135107 0.022547222563915392 0.004645537805090194 0.008813804760212207 0.02015546927216605 -0.03883768090546136 0.018710223175318508 0.013678853424135079 2.220446049250313E-16 0.09025842648426527 0.012778743855939181 0.038178346548207065 0.10114967989476989 -0.019130917809027575 0.008532716981402788 0.022547222563915392 0.09025842648426521 2.220446049250313E-16 0.008578555196769533 0.04861770043459507 0.1182788714519033 -0.02182932325871967 0.011049620489332113 0.004645537805090194 0.012778743855939183 0.008578555196769533 2.220446049250313E-16 0.0017968276748671075 0.00339877792490062 -0.00987166742762663 0.004524701071976667 0.008813804760212096 0.038178346548207065 0.04861770043459507 0.0017968276748671075 1.1102230246251565E-16 0.04880165619044008 -0.03391663346423357 0.01598436411198756 0.020155469272165938 0.10114967989476983 0.11827887145190319 0.003398777924900509 0.048801656190440024 2.220446049250313E-16 +137 +0.29813714558068444 +0.0 5.0774791750307635E-5 2.425786085669124E-6 0.03883768090546136 0.019130917809027575 0.02182932325871967 0.00987166742762663 0.03391663346423357 +5.0774791750307635E-5 0.0 5.503563274000811E-7 0.018710223175318536 0.008532716981402788 0.011049620489332113 0.004524701071976667 0.015984364111987615 +2.4257860856968794E-6 5.503563274278367E-7 0.0 0.013678853424135107 0.022547222563915392 0.004645537805090194 0.008813804760212207 0.02015546927216605 +0.03883768090546136 0.018710223175318508 0.013678853424135079 2.220446049250313E-16 0.09025842648426527 0.012778743855939181 0.038178346548207065 0.10114967989476989 +0.019130917809027575 0.008532716981402788 0.022547222563915392 0.09025842648426521 2.220446049250313E-16 0.008578555196769533 0.04861770043459507 0.1182788714519033 +0.02182932325871967 0.011049620489332113 0.004645537805090194 0.012778743855939183 0.008578555196769533 2.220446049250313E-16 0.0017968276748671075 0.00339877792490062 +0.00987166742762663 0.004524701071976667 0.008813804760212096 0.038178346548207065 0.04861770043459507 0.0017968276748671075 1.1102230246251565E-16 0.04880165619044008 +0.03391663346423357 0.01598436411198756 0.020155469272165938 0.10114967989476983 0.11827887145190319 0.003398777924900509 0.048801656190440024 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G02AN.d b/nearest_correlation_matrices/data/G02AN.d index b90c333..264585c 100644 --- a/nearest_correlation_matrices/data/G02AN.d +++ b/nearest_correlation_matrices/data/G02AN.d @@ -1,10 +1,10 @@ -27 -0.6842232923771067 -0.0 0.0 0.0 0.11534559633486957 0.0012824395878200104 0.12238688028701034 0.014500765854245638 0.031829946184179364 -0.0 0.0 0.0 0.048787650504719254 0.08127435463151922 0.05467773570274814 0.057453523816818036 0.0849278682546235 -2.7755575615628914E-17 2.7755575615628914E-17 0.0 0.026536575688402134 0.15336648242727113 0.055367887554946565 0.12360320370123046 0.18035708804084039 -0.11534559633486957 0.04878765050471923 0.02653657568840216 2.220446049250313E-16 0.06090091010680207 0.0025226758036557776 0.1292057674820426 0.06429138896868497 -0.0012824395878200095 0.08127435463151922 0.15336648242727113 0.060900910106802014 2.220446049250313E-16 0.13321909433413714 0.06595534587259971 0.19905384725423392 -0.12238688028701034 0.05467773570274814 0.055367887554946565 0.0025226758036557793 0.13321909433413714 2.220446049250313E-16 0.009847716092804867 0.11943272126977661 -0.014500765854245638 0.057453523816818036 0.12360320370123035 0.1292057674820426 0.06595534587259971 0.009847716092804867 1.1102230246251565E-16 0.07976313672648783 -0.031829946184179364 0.08492786825462345 0.18035708804084027 0.06429138896868491 0.1990538472542338 0.1194327212697765 0.07976313672648788 2.220446049250313E-16 +27 +0.6842232923771067 +0.0 0.0 0.0 0.11534559633486957 0.0012824395878200104 0.12238688028701034 0.014500765854245638 0.031829946184179364 +0.0 0.0 0.0 0.048787650504719254 0.08127435463151922 0.05467773570274814 0.057453523816818036 0.0849278682546235 +2.7755575615628914E-17 2.7755575615628914E-17 0.0 0.026536575688402134 0.15336648242727113 0.055367887554946565 0.12360320370123046 0.18035708804084039 +0.11534559633486957 0.04878765050471923 0.02653657568840216 2.220446049250313E-16 0.06090091010680207 0.0025226758036557776 0.1292057674820426 0.06429138896868497 +0.0012824395878200095 0.08127435463151922 0.15336648242727113 0.060900910106802014 2.220446049250313E-16 0.13321909433413714 0.06595534587259971 0.19905384725423392 +0.12238688028701034 0.05467773570274814 0.055367887554946565 0.0025226758036557793 0.13321909433413714 2.220446049250313E-16 0.009847716092804867 0.11943272126977661 +0.014500765854245638 0.057453523816818036 0.12360320370123035 0.1292057674820426 0.06595534587259971 0.009847716092804867 1.1102230246251565E-16 0.07976313672648783 +0.031829946184179364 0.08492786825462345 0.18035708804084027 0.06429138896868491 0.1990538472542338 0.1194327212697765 0.07976313672648788 2.220446049250313E-16 diff --git a/nearest_correlation_matrices/data/G_eigen.d b/nearest_correlation_matrices/data/G_eigen.d deleted file mode 100644 index cae4deb..0000000 --- a/nearest_correlation_matrices/data/G_eigen.d +++ /dev/null @@ -1 +0,0 @@ --0.24977745860993417 -0.015972279592768625 0.08945238623840102 0.2191673628508196 0.7072035937038217 1.7533864538965915 1.9610814370428227 3.53545850447024 diff --git a/nearest_correlation_matrices/data/H_G02AJ.d b/nearest_correlation_matrices/data/H_G02AJ.d deleted file mode 100644 index 65df620..0000000 --- a/nearest_correlation_matrices/data/H_G02AJ.d +++ /dev/null @@ -1,8 +0,0 @@ -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -100.0 100.0 100.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AA.d b/nearest_correlation_matrices/data/X_G02AA.d deleted file mode 100644 index b5deb07..0000000 --- a/nearest_correlation_matrices/data/X_G02AA.d +++ /dev/null @@ -1,8 +0,0 @@ -1.0 -0.3111872913635921 0.18888093107267998 0.5395954609278987 0.02675135484238073 -0.5924690516505247 -0.06212901295145131 -0.19206608208770093 --0.3111872913635921 1.0 0.20502514288449164 0.22653323290889946 0.41483550652910844 0.28220348838267434 0.2915271505753827 0.40878761225945304 -0.18888093107267998 0.20502514288449164 1.0 -0.14679747104822682 0.7879600443535626 0.2727105118922599 -0.6084599950657016 0.880228639445601 -0.5395954609278987 0.22653323290889946 -0.14679747104822682 1.0 0.21370691586815335 0.0014877170535466597 0.606865984410564 -0.22076449149682695 -0.02675135484238073 0.41483550652910844 0.7879600443535626 0.21370691586815335 1.0 0.658027173714172 -0.2811733178595378 0.8762364775845148 --0.5924690516505247 0.28220348838267434 0.2727105118922599 0.0014877170535466597 0.658027173714172 1.0 0.047885300489080775 0.593152378069519 --0.06212901295145131 0.2915271505753827 -0.6084599950657016 0.606865984410564 -0.2811733178595378 0.047885300489080775 1.0 -0.446982409442484 --0.19206608208770093 0.40878761225945304 0.880228639445601 -0.22076449149682695 0.8762364775845148 0.593152378069519 -0.446982409442484 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AB.d b/nearest_correlation_matrices/data/X_G02AB.d deleted file mode 100644 index 640200b..0000000 --- a/nearest_correlation_matrices/data/X_G02AB.d +++ /dev/null @@ -1,8 +0,0 @@ -1.0 -0.32499086422511064 0.18813706419032963 0.5739128316455077 0.006738901197749145 -0.6096507044247871 -0.07218069830824884 -0.1598053100245198 --0.32499086422511064 1.0 0.20483815677603381 0.24258082716446366 0.40603025892212846 0.2737263482817928 0.28701024943514414 0.4235977581494052 -0.18813706419032963 0.20483815677603381 1.0 -0.13218803180471228 0.766133653156408 0.27591992209907573 -0.617050948080334 0.9003875097308778 -0.5739128316455077 0.24258082716446366 -0.13218803180471228 1.0 0.20846854455003783 -0.0890209789283727 0.5954127463233153 -0.18053621187034669 -0.006738901197749145 0.40603025892212846 0.766133653156408 0.20846854455003783 1.0 0.6556061052115361 -0.2779768051435209 0.875650876566524 --0.6096507044247871 0.2737263482817928 0.27591992209907573 -0.0890209789283727 0.6556061052115361 1.0 0.0490251039924178 0.5746086153246388 --0.07218069830824884 0.28701024943514414 -0.617050948080334 0.5954127463233153 -0.2779768051435209 0.0490251039924178 1.0 -0.4550021030394424 --0.1598053100245198 0.4235977581494052 0.9003875097308778 -0.18053621187034669 0.875650876566524 0.5746086153246388 -0.4550021030394424 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AJ.d b/nearest_correlation_matrices/data/X_G02AJ.d deleted file mode 100644 index 103b2ad..0000000 --- a/nearest_correlation_matrices/data/X_G02AJ.d +++ /dev/null @@ -1,8 +0,0 @@ -1.0 -0.3250537665863338 0.1881418341902057 0.5371131830574982 0.025534475569836054 -0.5892805212332436 -0.06253446585578672 -0.19285191653693995 --0.3250537665863338 1.0 0.20484097619200775 0.22489933238446663 0.41435692055270595 0.28406991877718313 0.29140523861712275 0.40808279276304027 -0.1881418341902057 0.20484097619200775 1.0 -0.1461829470349747 0.7883463589306307 0.27182086998472504 -0.6083694620689558 0.8804148513960975 -0.5371131830574982 0.22489933238446663 -0.1461829470349747 1.0 0.21383581644037378 -1.8236085752931886E-4 0.606979993040552 -0.21987411467118548 -0.025534475569836054 0.41435692055270595 0.7883463589306307 0.21383581644037378 1.0 0.6566193796715437 -0.2807146680766071 0.8756492796358128 --0.5892805212332436 0.28406991877718313 0.27182086998472504 -1.8236085752931886E-4 0.6566193796715437 1.0 0.04737540578644875 0.5929601745319638 --0.06253446585578672 0.29140523861712275 -0.6083694620689558 0.606979993040552 -0.2807146680766071 0.04737540578644875 1.0 -0.44707995176268783 --0.19285191653693995 0.40808279276304027 0.8804148513960975 -0.21987411467118548 0.8756492796358128 0.5929601745319638 -0.44707995176268783 1.0 diff --git a/nearest_correlation_matrices/data/X_G02AN.d b/nearest_correlation_matrices/data/X_G02AN.d deleted file mode 100644 index a66f3ec..0000000 --- a/nearest_correlation_matrices/data/X_G02AN.d +++ /dev/null @@ -1,8 +0,0 @@ -1.0 -0.3250029917945835 0.18814425997629136 0.46060526762809 0.00512111817298847 -0.4887229642049529 -0.05790536742916771 -0.12710533688852702 --0.3250029917945835 1.0 0.20484152654833515 0.1948219050550659 0.32454984893978395 0.21834256258510287 0.22942701372832805 0.3391392886204044 -0.18814425997629136 0.20484152654833515 1.0 -0.10596751792243746 0.6124326539394441 0.22109852023486867 -0.49358006312793756 0.7202132326274232 -0.46060526762809 0.1948219050550659 -0.10596751792243746 1.0 0.24319333281783698 0.010073707194754084 0.5159525721067164 -0.2567324055972704 -0.00512111817298847 0.32454984893978395 0.6124326539394441 0.24319333281783698 1.0 0.5319788405341761 -0.26337702263860246 0.7948743038334822 --0.4887229642049529 0.21834256258510287 0.22109852023486867 0.010073707194754084 0.5319788405341761 1.0 0.03932451736851099 0.4769262311870878 --0.05790536742916771 0.22942701372832805 -0.49358006312793756 0.5159525721067164 -0.26337702263860246 0.03932451736851099 1.0 -0.3185151588457599 --0.12710533688852702 0.3391392886204044 0.7202132326274232 -0.2567324055972704 0.7948743038334822 0.4769262311870878 -0.3185151588457599 1.0 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AA.d b/nearest_correlation_matrices/data/X_eigen_G02AA.d deleted file mode 100644 index 3b4e8a5..0000000 --- a/nearest_correlation_matrices/data/X_eigen_G02AA.d +++ /dev/null @@ -1 +0,0 @@ --6.173883426196985E-17 2.550377090501583E-17 0.038046493282210325 0.17308760612514437 0.6893558332540384 1.7117146722540244 1.9217270612302262 3.4660683338543565 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AB.d b/nearest_correlation_matrices/data/X_eigen_G02AB.d deleted file mode 100644 index 0445a93..0000000 --- a/nearest_correlation_matrices/data/X_eigen_G02AB.d +++ /dev/null @@ -1 +0,0 @@ -9.999999999997552E-4 9.99999999999841E-4 0.030520719790230445 0.1646165705339852 0.676371387352591 1.771620208378711 1.8909924571529526 3.4638786567915307 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AJ.d b/nearest_correlation_matrices/data/X_eigen_G02AJ.d deleted file mode 100644 index ccfa05e..0000000 --- a/nearest_correlation_matrices/data/X_eigen_G02AJ.d +++ /dev/null @@ -1 +0,0 @@ -9.999999999997702E-4 9.999999999999124E-4 0.037510930964740785 0.1733826335965124 0.6881675924398503 1.7105895508241635 1.9223622895788683 3.465987002595862 diff --git a/nearest_correlation_matrices/data/X_eigen_G02AN.d b/nearest_correlation_matrices/data/X_eigen_G02AN.d deleted file mode 100644 index 0c6eff3..0000000 --- a/nearest_correlation_matrices/data/X_eigen_G02AN.d +++ /dev/null @@ -1 +0,0 @@ -1.4134713692893524E-9 0.13753724988136337 0.2743711328835331 0.3803668326795735 0.7768482873688412 1.6263475038033162 1.768932428977788 3.0355965629921156 diff --git a/nearest_correlation_matrices/data/alpha_G02AN.d b/nearest_correlation_matrices/data/alpha_G02AN.d deleted file mode 100644 index 9224985..0000000 --- a/nearest_correlation_matrices/data/alpha_G02AN.d +++ /dev/null @@ -1 +0,0 @@ -0.20026985555887222 From 8482813f893b19dd77dcfa9eb0d377985d57db40 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 12:22:09 +0200 Subject: [PATCH 083/196] Made the title a link --- _layouts/default.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index e32458d..a7cf1aa 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -29,7 +29,9 @@

    -

    {{ site.title | default: site.github.repository_name }}

    + +

    {{ site.title | default: site.github.repository_name }}

    +

    {{ site.description | default: site.github.project_tagline }}

    From 46a62bf6b70b0f89a20f17062e8e75107643554f Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 12:57:26 +0200 Subject: [PATCH 084/196] Put image in the center --- nearest_correlation_matrices/Readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index b589930..dbde38b 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -713,7 +713,9 @@ $$ X = \large \alpha T+(1-\alpha)G, \quad T = H \circ G, \quad h_{ij} \in [0,1] * We do this until we converge on a matrix with both properties. - +
    + +
    ## Alternating Projections with Anderson Acceleration From 3a0cca1e701a515b278b7f2f6f7f27c9e2912c4a Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 15:13:35 +0200 Subject: [PATCH 085/196] Fixed title link --- _layouts/default.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index a7cf1aa..b5e8733 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -29,9 +29,9 @@

    - -

    {{ site.title | default: site.github.repository_name }}

    -
    +

    + {{ site.title | default: site.github.repository_name }} +

    {{ site.description | default: site.github.project_tagline }}

    From 293779b7840a69bfde787dc7142f96f33726abe1 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 15:14:38 +0200 Subject: [PATCH 086/196] Deleted ncm notebook --- nearest_correlation_matrices/ncm_nag.ipynb | 2531 -------------------- 1 file changed, 2531 deletions(-) delete mode 100644 nearest_correlation_matrices/ncm_nag.ipynb diff --git a/nearest_correlation_matrices/ncm_nag.ipynb b/nearest_correlation_matrices/ncm_nag.ipynb deleted file mode 100644 index 028cde4..0000000 --- a/nearest_correlation_matrices/ncm_nag.ipynb +++ /dev/null @@ -1,2531 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "94a8239a-e41d-4c24-ae8d-ea3e2132a391" - } - }, - "source": [ - "# Nearest Correlation Matrices\n", - "\n", - "This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*.\n", - "\n", - "All the calculations happen in the [NcmNag.java](./NcmNag.java) file and they are presented here using *Python*.\n", - "For a better understanding, it is suggested to have open NcmNag.java to look up the different functions used." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "94a8239a-e41d-4c24-ae8d-ea3e2132a391" - } - }, - "source": [ - "## Correlation Matrices\n", - "\n", - "* An $n$ by $n$ matrix is a correlation matrix if:\n", - " * it is symmetric\n", - " * it has ones on the diagonal \n", - " * its eigenvalues are non-negative (positive semidefinite) \n", - " \n", - " \n", - " $$ \\Large Ax = \\lambda x, \\quad x \\neq 0$$\n", - "\n", - "\n", - "* The element in the $i$th row and $j$th column is the correlation between the $i$th and $j$th variables. This could be stock process, for example.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "5503d511-81d8-4356-b142-3c0b65f21299" - } - }, - "source": [ - "## Empirical Correlation Matrices \n", - "\n", - "* Empirical correlation matrices are often **not mathematically true** due to inconsistent or missing data.\n", - "\n", - "\n", - "* Thus we are required to find a true correlation matrix, where our input, $G$, is an approximate correlation matrix.\n", - "\n", - "\n", - "* In particular we seek the *nearest* correlation matrix, in most cases." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "a5fb9867-8630-4b22-aff5-8fa6d9d634ea" - } - }, - "source": [ - "## Computing Correlation Matrices\n", - "\n", - "* The vector $p_i$, the $i$th column of a matrix, $P$, holds the $m$ observations of the $i$th variable, of which there are $n$. $\\bar{p}_i$ is the sample mean. \n", - "\n", - "\n", - "$$ \\large S_{ij}=\\frac{1}{m-1}(p_i - \\bar{p}_i )^T(p_j - \\bar{p}_j) $$\n", - "\n", - "* $S$ is a covariance matrix, with $S_{ij}$ the covariance between variables $i$ and $j$\n", - "\n", - "\n", - "* $R$ is the corresponding correlation matrix, given by: \n", - "\n", - "\n", - "\\begin{align*} \\large D_S^{1/2} & = \\large \\textrm{ diag}(s_{11}^{-1/2},s_{22}^{-1/2}, \\ldots, s_{nn}^{-1/2}) \\nonumber \\\\ & \\\\\n", - "\\large R & = \\large D_S^{1/2} S D_S^{1/2} \n", - "\\end{align*}\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "3f5c8aae-0101-4786-a2e0-1d89997a2f8e" - } - }, - "source": [ - "## Approximate Correlation Matrices\n", - "\n", - "* Now, what if we don't have all observations for each variable?\n", - "\n", - "\n", - "* We compute each covariance with observations that are available for *both* the *i*th and *j*th variable.\n", - "\n", - "\n", - "* For example NAG routine **G02BB**.\n", - "\n", - "\n", - "* We then compute the correlation matrix as before.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "d1c9ef9b-e547-4d3b-a3a4-25ca827b9e65" - } - }, - "source": [ - "# Missing Stock Price Example\n", - "\n", - "* Prices for 8 stocks on the first working day of 10 consecutive months.\n", - "\n", - "\n", - "| | Stock A | Stock B | Stock C | Stock D | Stock E | Stock F | Stock G | Stock H\n", - "| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n", - "| **Month 1** | 59.875 | 42.734 | 47.938 | 60.359 | 54.016 | 69.625 | 61.500 | 62.125 |\n", - "| **Month 2** | 53.188 | 49.000 | 39.500 | | 34.750 | | 83.000 | 44.500 |\n", - "| **Month 3** | 55.750 | 50.000 | 38.938 | | 30.188 | | 70.875 | 29.938 |\n", - "| **Month 4** | 65.500 | 51.063 | 45.563 | 69.313 | 48.250 | 62.375 | 85.250 | |\n", - "| **Month 5** | 69.938 | 47.000 | 52.313 | 71.016 | | 59.359 | 61.188 | 48.219 |\n", - "| **Month 6** | 61.500 | 44.188 | 53.438 | 57.000 | 35.313 | 55.813 | 51.500 | 62.188 |\n", - "| **Month 7** | 59.230 | 48.210 | 62.190 | 61.390 | 54.310 | 70.170 | 61.750 | 91.080 |\n", - "| **Month 8** | 61.230 | 48.700 | 60.300 | 68.580 | 61.250 | 70.340 | | |\n", - "| **Month 9** | 52.900 | 52.690 | 54.230 | | 68.170 | 70.600 | 57.870 | 88.640 |\n", - "| **Month 10** | 57.370 | 59.040 | 59.870 | 62.090 | 61.620 | 66.470 | 65.370 | 85.840 |\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "50dccd74-72ea-465f-988d-55c9d115dc20" - } - }, - "source": [ - "\n", - "* We will use NaNs where there is missing data.\n", - "\n", - "* So our $P = \\left[p_1, p_2, \\ldots, p_n \\right]$ is:\n", - "\n", - "\n", - "$$ \n", - "P=\\left[\\begin{array}{rrrrrrrr}\n", - " 59.875 & 42.734 & {\\color{blue}{47.938}} & {\\color{blue}{60.359}} & 54.016 & 69.625 & 61.500 & 62.125 \\\\\n", - " 53.188 & 49.000 & 39.500 & \\textrm{NaN} & 34.750 & \\textrm{NaN} & 83.000 & 44.500 \\\\\n", - " 55.750 & 50.000 & 38.938 & \\textrm{NaN} & 30.188 & \\textrm{NaN} & 70.875 & 29.938 \\\\\n", - " 65.500 & 51.063 & {\\color{blue}{45.563}} & {\\color{blue}{69.313}} & 48.250 & 62.375 & 85.250 & \\textrm{NaN} \\\\\n", - " 69.938 & 47.000 & {\\color{blue}{52.313}} & {\\color{blue}{71.016}} & \\textrm{NaN} & 59.359 & 61.188 & 48.219 \\\\\n", - " 61.500 & 44.188 & {\\color{blue}{53.438}} & {\\color{blue}{57.000}} & 35.313 & 55.813 & 51.500 & 62.188 \\\\\n", - " 59.230 & 48.210 & {\\color{blue}{62.190}} & {\\color{blue}{61.390}} & 54.310 & 70.170 & 61.750 &\n", - " 91.080 \\\\\n", - " 61.230 & 48.700 & {\\color{blue}{60.300}} & {\\color{blue}{68.580}} & 61.250 & 70.340 & \\textrm{NaN} & \\textrm{NaN} \\\\\n", - " 52.900 & 52.690 & 54.230 & \\textrm{NaN} & 68.170 & 70.600 & 57.870 & 88.640 \\\\\n", - " 57.370 & 59.040 & {\\color{blue}{59.870}} & {\\color{blue}{62.090}} & 61.620 & 66.470 & 65.370 &\n", - " 85.840\n", - "\\end{array}\\right]. \n", - "$$\n", - "\n", - "\n", - "* And to compute the covariance between the 3rd and 4th variables: \n", - "\n", - "\n", - "\\begin{align*} \n", - "\\large v_1^T & = \\large [47.938, 45.563, 52.313, 53.438, 62.190, 60.300, 59.870] \\\\\n", - "\\large v_2^T & = \\large [60.359, 69.313, 71.016, 57.000, 61.390, 68.580, 62.090] \\\\ \n", - "S_{3,4} & = \\large \\frac{1}{6} (v_1 - \\bar{v}_1 )^T(v_2 - \\bar{v}_2) \n", - "\\end{align*}\n", - "\n", - "* Let's compute this in Java.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "d9befd83-b685-483d-b30d-2a3847948ca5" - } - }, - "source": [ - "### Import required modules, set print options and define the read_file functions for *Python*" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "nbpresent": { - "id": "bbde4683-adc6-4094-891a-5487f24b873e" - } - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from pathlib import Path\n", - "# Set the print precision\n", - "np.set_printoptions(precision=4, suppress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Select the display backend for Jupyter:\n", - "%matplotlib inline\n", - "# Set the data folder path\n", - "data_folder = Path(\"data\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def read_matrix_file(fname):\n", - " with open(data_folder / fname) as fdata:\n", - " a = np.array([line.split() for line in fdata], dtype = np.float64)\n", - " return a" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def read_data_file(fname):\n", - " with open(data_folder / fname) as fdata:\n", - " for i, line in enumerate(fdata):\n", - " if i == 0:\n", - " itr = int(line)\n", - " elif i == 1:\n", - " norm = float(line)\n", - " elif i == 2:\n", - " a = np.array([float(lts) for lts in line.split()], dtype = np.float64)\n", - " else:\n", - " a = np.vstack([a, [float(lts) for lts in line.split()]])\n", - " return itr, norm, a" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "f9399cc1-faa3-4ec2-a59d-47f60c08759a" - } - }, - "source": [ - "### Initialize our *P* matrix of observations" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "ffa06d72-354c-45f8-95d8-95d411e89091" - } - }, - "source": [ - "```java\n", - "// Define a 2-d array and use Double.NaN to set elements as NaNs\n", - "double[][] P = new double[][] {\n", - " { 59.875, 42.734, 47.938, 60.359, 54.016, 69.625, 61.500, 62.125 },\n", - " { 53.188, 49.000, 39.500, Double.NaN, 34.750, Double.NaN, 83.000, 44.500 },\n", - " { 55.750, 50.000, 38.938, Double.NaN, 30.188, Double.NaN, 70.875, 29.938 },\n", - " { 65.500, 51.063, 45.563, 69.313, 48.250, 62.375, 85.250, Double.NaN },\n", - " { 69.938, 47.000, 52.313, 71.016, Double.NaN, 59.359, 61.188, 48.219 },\n", - " { 61.500, 44.188, 53.438, 57.000, 35.313, 55.813, 51.500, 62.188 },\n", - " { 59.230, 48.210, 62.190, 61.390, 54.310, 70.170, 61.750, 91.080 },\n", - " { 61.230, 48.700, 60.300, 68.580, 61.250, 70.340, Double.NaN, Double.NaN },\n", - " { 52.900, 52.690, 54.230, Double.NaN, 68.170, 70.600, 57.870, 88.640 },\n", - " { 57.370, 59.040, 59.870, 62.090, 61.620, 66.470, 65.370, 85.840 } };\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "3a438349-5641-4df8-bdf1-a86b6ee757ab" - } - }, - "source": [ - "### Compute the covariance, ignoring missing values" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "af5081b7-3d9a-47f5-8dc1-69fcc57821c0" - } - }, - "source": [ - "```java\n", - "public static double[][] cov_bar(double[][] P) {\n", - " double[] xi, xj;\n", - " boolean[] xib, xjb, notp;\n", - " int n = P[0].length;\n", - " double[][] S = new double[n][n];\n", - " int notpFalseCount;\n", - " \n", - " for (int i = 0; i < n; i++) {\n", - " // Take the ith column\n", - " xi = getMatrixColumn(P, i);\n", - " \n", - " for (int j = 0; j < i + 1; j++) {\n", - " // Take the jth column, where j <= i\n", - " xj = getMatrixColumn(P, j);\n", - " \n", - " // Set mask such that all NaNs are true\n", - " xib = getNanMask(xi);\n", - " xjb = getNanMask(xj);\n", - " \n", - " notp = addBoolArrOr(xib, xjb);\n", - " \n", - " // S[i][j] = (xi - mean(xi)) * (xj - mean(xj))\n", - " S[i][j] = matrixMaskedDot(vectorSubScalar(xi, vectorMaskedMean(xi, notp)),\n", - " vectorSubScalar(xj, vectorMaskedMean(xj, notp)), notp);\n", - " \n", - " // Take the sum over !notp to normalize\n", - " notpFalseCount = 0;\n", - " for (boolean b : notp) {\n", - " if (!b) {\n", - " notpFalseCount++;\n", - " }\n", - " }\n", - " S[i][j] = 1.0 / (notpFalseCount - 1) * S[i][j];\n", - " S[j][i] = S[i][j];\n", - " }\n", - " }\n", - " return S;\n", - "}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "80b820b1-7c3b-4c96-a4a6-09b5ef00dacb" - } - }, - "source": [ - "```java\n", - "public static double[][] cor_bar(double[][] P) {\n", - " double[][] S, D;\n", - " S = cov_bar(P);\n", - " // D = 1.0 / SQRT(S)\n", - " D = getMatrixFromDiag(vectorRightDiv(vectorSqrt(getMatrixDiag(S)), 1.0));\n", - "\n", - " // S_ = S * D\n", - " F01CK f01ck = new F01CK();\n", - " double[] S_ = new double[S.length * S[0].length];\n", - " double[] S1d = convert2DTo1D(S);\n", - " double[] D1d = convert2DTo1D(D);\n", - " int n = S.length;\n", - " int p = n;\n", - " int m = n;\n", - " double[] z = new double[0];\n", - " int iz = 0;\n", - " int opt = 1;\n", - " int ifail = 0;\n", - " f01ck.eval(S_, S1d, D1d, n, p, m, z, iz, opt, ifail);\n", - " \n", - " // D_ = D * S_\n", - " double[] D_ = new double[n * n];\n", - " f01ck.eval(D_, D1d, S_, n, p, m, z, iz, opt, ifail);\n", - " \n", - " return convert1DTo2D(D_, n);\n", - "}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "a8b4aa95-2ba3-4f09-8f65-ab45831b1108" - } - }, - "source": [ - "### Compute the *approximate* correlation matrix" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "double[][] G = cor_bar(P);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "nbpresent": { - "id": "f417663e-badf-45d3-8f98-0647907657de" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The approximate correlation matrix \n", - "[[ 1. -0.325 0.1881 0.576 0.0064 -0.6111 -0.0724 -0.1589]\n", - " [-0.325 1. 0.2048 0.2436 0.4058 0.273 0.2869 0.4241]\n", - " [ 0.1881 0.2048 1. -0.1325 0.7658 0.2765 -0.6172 0.9006]\n", - " [ 0.576 0.2436 -0.1325 1. 0.3041 0.0126 0.6452 -0.321 ]\n", - " [ 0.0064 0.4058 0.7658 0.3041 1. 0.6652 -0.3293 0.9939]\n", - " [-0.6111 0.273 0.2765 0.0126 0.6652 1. 0.0492 0.5964]\n", - " [-0.0724 0.2869 -0.6172 0.6452 -0.3293 0.0492 1. -0.3983]\n", - " [-0.1589 0.4241 0.9006 -0.321 0.9939 0.5964 -0.3983 1. ]]\n" - ] - } - ], - "source": [ - "G = read_matrix_file(\"G.d\")\n", - "print(\"The approximate correlation matrix \\n{}\".format(G))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "f3de275a-ac50-402b-a9e9-fb6f14aef20a" - } - }, - "source": [ - "### Compute the eigenvalues of our (indefinite) *G*.\n", - "\n", - "* We see below that our matrix $G$ is not a mathematically true correlation matrix." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "F08NA f08na = new F08NA();\n", - "String jobvl = \"N\";\n", - "String jobvr = \"N\";\n", - "int n = G[0].length;\n", - "double[] G1d = convert2DTo1D(G);\n", - "int lda = G.length;\n", - "double[] wr = new double[n];\n", - "double[] wi = new double[n];\n", - "int ldvl = 1;\n", - "double[] vl = new double[ldvl];\n", - "int ldvr = 1;\n", - "double[] vr = new double[ldvr];\n", - "int lwork = 3 * n;\n", - "double[] work = new double[lwork];\n", - "int info = 0;\n", - "f08na.eval(jobvl, jobvr, n, G1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", - "Arrays.sort(wr);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "nbpresent": { - "id": "b1c83af0-e6ca-42cc-a0ca-50276ebe4f67" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of G [-0.2498 -0.016 0.0895 0.2192 0.7072 1.7534 1.9611 3.5355]\n" - ] - } - ], - "source": [ - "G_eigen = read_matrix_file(\"G_eigen.d\")\n", - "print(\"Sorted eigenvalues of G {}\".format(G_eigen[0]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "7b0f8df4-0484-4a23-b5fd-1ff66bd0000d" - } - }, - "source": [ - "# Nearest Correlation Matrices\n", - "\n", - "* Our problem now is to solve:\n", - "\n", - "\n", - "$$ \n", - "\\large \n", - "\\min \\frac{1}{2} \\| G-X \\|^2_F = \n", - "\\min \\frac{1}{2} \\sum_{i=1}^{n} \\sum_{i=1}^{n} \n", - "\\left| G(i,j)-X(i,j) \\right| ^2 \n", - "$$\n", - "\n", - "\n", - "* In order to find $X$, a true correlation matrix, where $G$ is an approximate correlation matrix.\n", - "\n", - "\n", - "* An algorithm by Qi and Sun (2006), applies an inexact Newton method to a dual (unconstrained) formulation of this problem.\n", - "\n", - "\n", - "* Improvements were suggested by Borsdorf and Higham (2010 MSc).\n", - "\n", - "\n", - "* It is globally and quadratically (fast!) convergent.\n", - "\n", - "\n", - "* This is implemented in NAG routine **G02AA**.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "5fe4edf2-768e-47ef-b5e1-62f64c49ebae" - } - }, - "source": [ - "## Using G02AA to compute the nearest correlation matrix in the Frobenius norm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "// Call NAG routine G02AA and print the result\n", - "G02AA g02aa = new G02AA();\n", - "G1d = convert2DTo1D(G);\n", - "n = G.length;\n", - "int ldg = n;\n", - "int ldx = n;\n", - "double errtol = 0.0;\n", - "int maxits = 0;\n", - "int maxit = 0;\n", - "double[] X1d = new double[ldx * n];\n", - "int iter = 0;\n", - "int feval = 0;\n", - "double nrmgrd = 0.0;\n", - "int ifail = 0;\n", - "g02aa.eval(G1d, ldg, n, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail);\n", - "\n", - "double[][] X = convert1DTo2D(X1d, ldx);\n", - "iter = g02aa.getITER();\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "nbpresent": { - "id": "9d1819cb-4c08-4d0b-8cbe-d9de4ab61a0f" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nearest correlation matrix\n", - "[[ 1. -0.3112 0.1889 0.5396 0.0268 -0.5925 -0.0621 -0.1921]\n", - " [-0.3112 1. 0.205 0.2265 0.4148 0.2822 0.2915 0.4088]\n", - " [ 0.1889 0.205 1. -0.1468 0.788 0.2727 -0.6085 0.8802]\n", - " [ 0.5396 0.2265 -0.1468 1. 0.2137 0.0015 0.6069 -0.2208]\n", - " [ 0.0268 0.4148 0.788 0.2137 1. 0.658 -0.2812 0.8762]\n", - " [-0.5925 0.2822 0.2727 0.0015 0.658 1. 0.0479 0.5932]\n", - " [-0.0621 0.2915 -0.6085 0.6069 -0.2812 0.0479 1. -0.447 ]\n", - " [-0.1921 0.4088 0.8802 -0.2208 0.8762 0.5932 -0.447 1. ]]\n" - ] - } - ], - "source": [ - "X = read_matrix_file(\"X_G02AA.d\")\n", - "print(\"Nearest correlation matrix\\n{}\".format(X))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "jobvl = \"N\";\n", - "jobvr = \"N\";\n", - "n = X[0].length;\n", - "lda = X.length;\n", - "wr = new double[n];\n", - "wi = new double[n];\n", - "ldvl = 1;\n", - "vl = new double[ldvl];\n", - "ldvr = 1;\n", - "vr = new double[ldvr];\n", - "lwork = 3 * n;\n", - "work = new double[lwork];\n", - "info = 0;\n", - "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", - "Arrays.sort(wr);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "nbpresent": { - "id": "9737d750-04fe-4a91-933c-a799449e427e" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of X [-0. 0. 0.038 0.1731 0.6894 1.7117 1.9217 3.4661]\n" - ] - } - ], - "source": [ - "X_eigen = read_matrix_file(\"X_eigen_G02AA.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "nbpresent": { - "id": "85008295-2019-4aae-8de4-10440d7b1192" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "itr, norm, X_G = read_data_file(\"G02AA.d\")\n", - "\n", - "# Plot the difference between G and X as a small shaded square for each element\n", - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, \n", - " vmin=0, vmax=0.2)\n", - "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", - " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", - "cbar.mappable.set_clim([0, 0.2])\n", - "ax1.tick_params(axis='both', which='both', \n", - " bottom='off', top='off', left='off', right='off', \n", - " labelbottom='off', labelleft='off')\n", - "ax1.set_title(r'$|G-X|$ for G02AA', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", - " fontsize=14,\n", - ")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "600de3c9-794b-49c8-87b8-225a1c1c9851" - } - }, - "source": [ - "# Weighting rows and columns of elements\n", - "\n", - "* Now, we note that for Stocks A to C we have a complete set of observations.\n", - "\n", - "\n", - "$$\n", - "P=\\left[\\begin{array}{rrrrrrrr}\n", - " {\\color{blue}{59.875}} & {\\color{blue}{42.734}} & {\\color{blue}{47.938}} & 60.359 & 54.016 & 69.625 & 61.500 & 62.125 \\\\\n", - " {\\color{blue}{53.188}} & {\\color{blue}{49.000}} & {\\color{blue}{39.500}} & \\textrm{NaN} & 34.750 & \\textrm{NaN} & 83.000 & 44.500 \\\\\n", - " {\\color{blue}{55.750}} & {\\color{blue}{50.000}} & {\\color{blue}{38.938}} & \\textrm{NaN} & 30.188 & \\textrm{NaN} & 70.875 & 29.938 \\\\\n", - " {\\color{blue}{65.500}} & {\\color{blue}{51.063}} & {\\color{blue}{45.563}} & 69.313 & 48.250 & 62.375 & 85.250 & \\textrm{NaN} \\\\\n", - " {\\color{blue}{69.938}} & {\\color{blue}{47.000}} & {\\color{blue}{52.313}} & 71.016 & \\textrm{NaN} & 59.359 & 61.188 & 48.219 \\\\\n", - " {\\color{blue}{61.500}} & {\\color{blue}{44.188}} & {\\color{blue}{53.438}} & 57.000 & 35.313 & 55.813 & 51.500 & 62.188 \\\\\n", - " {\\color{blue}{59.230}} & {\\color{blue}{48.210}} & {\\color{blue}{62.190}} & 61.390 & 54.310 & 70.170 & 61.750 & 91.080 \\\\\n", - " {\\color{blue}{61.230}} & {\\color{blue}{48.700}} & {\\color{blue}{60.300}} & 68.580 & 61.250 & 70.340 & \\textrm{NaN} & \\textrm{NaN} \\\\\n", - " {\\color{blue}{52.900}} & {\\color{blue}{52.690}} & {\\color{blue}{54.230}} & \\textrm{NaN} & 68.170 & 70.600 & 57.870 & 88.640 \\\\\n", - " {\\color{blue}{57.370}} & {\\color{blue}{59.040}} & {\\color{blue}{59.870}} & 62.090 & 61.620 &66.470 & 65.370 & 85.840\n", - "\\end{array}\\right].\n", - "$$\n", - "\n", - "\n", - "* Perhaps we wish to preserve part of the correlation matrix?\n", - "\n", - "\n", - "* We could solve the *weighted* problem, NAG routine **G02AB**\n", - "\n", - "\n", - "$$ \\Large \\|W^{\\frac{1}{2}} (G-X) W^{\\frac{1}{2}} \\|_F$$ \n", - "\n", - "\n", - "* Here $W$ is a diagonal matrix.\n", - "\n", - "\n", - "* We can also force the resulting matrix to be positive definite.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "cd0ce132-5f43-471c-8641-aa4ab54591a9" - } - }, - "source": [ - "### Use G02AB to compute the nearest correlation matrix with row and column weighting" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "0a7c5d11-13ec-4f52-b222-c6540fcdd67c" - } - }, - "source": [ - "```java\n", - "// Define an arrray of weights\n", - "double[] W = new double[] { 10, 10, 10, 1, 1, 1, 1, 1 };\n", - "\n", - "// Set up and call the NAG routine using weights and a minimum eigenvalue\n", - "G02AB g02ab = new G02AB();\n", - "G1d = convert2DTo1D(G);\n", - "ldg = G.length;\n", - "n = G[0].length;\n", - "String opt = \"B\";\n", - "double alpha = 0.001;\n", - "errtol = 0.0;\n", - "maxits = 0;\n", - "maxit = 0;\n", - "ldx = n;\n", - "X1d = new double[ldx * n];\n", - "iter = 0;\n", - "feval = 0;\n", - "nrmgrd = 0;\n", - "ifail = 0;\n", - "g02ab.eval(G1d, ldg, n, opt, alpha, W, errtol, maxits, maxit, X1d, ldx, iter, feval, nrmgrd, ifail);\n", - "\n", - "X = convert1DTo2D(X1d, ldx);\n", - "iter = g02ab.getITER();\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nearest correlation matrix using row and column weighting\n", - "[[ 1. -0.325 0.1881 0.5739 0.0067 -0.6097 -0.0722 -0.1598]\n", - " [-0.325 1. 0.2048 0.2426 0.406 0.2737 0.287 0.4236]\n", - " [ 0.1881 0.2048 1. -0.1322 0.7661 0.2759 -0.6171 0.9004]\n", - " [ 0.5739 0.2426 -0.1322 1. 0.2085 -0.089 0.5954 -0.1805]\n", - " [ 0.0067 0.406 0.7661 0.2085 1. 0.6556 -0.278 0.8757]\n", - " [-0.6097 0.2737 0.2759 -0.089 0.6556 1. 0.049 0.5746]\n", - " [-0.0722 0.287 -0.6171 0.5954 -0.278 0.049 1. -0.455 ]\n", - " [-0.1598 0.4236 0.9004 -0.1805 0.8757 0.5746 -0.455 1. ]]\n" - ] - } - ], - "source": [ - "X = read_matrix_file(\"X_G02AB.d\")\n", - "print(\"Nearest correlation matrix using row and column weighting\\n{}\".format(X))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "jobvl = \"N\";\n", - "jobvr = \"N\";\n", - "n = X[0].length;\n", - "lda = X.length;\n", - "wr = new double[n];\n", - "wi = new double[n];\n", - "ldvl = 1;\n", - "vl = new double[ldvl];\n", - "ldvr = 1;\n", - "vr = new double[ldvr];\n", - "lwork = 3 * n;\n", - "work = new double[lwork];\n", - "info = 0;\n", - "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", - "Arrays.sort(wr);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of X [0.001 0.001 0.0305 0.1646 0.6764 1.7716 1.891 3.4639]\n" - ] - } - ], - "source": [ - "X_eigen = read_matrix_file(\"X_eigen_G02AB.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "nbpresent": { - "id": "f769cb44-ca59-43ad-a0b6-29e394f2557e" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "itr, norm, X_G = read_data_file(\"G02AB.d\")\n", - "\n", - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", - " vmax=0.2)\n", - "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", - " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", - "cbar.mappable.set_clim([0, 0.2])\n", - "ax1.tick_params(axis='both', which='both', \n", - " bottom='off', top='off', left='off', right='off', \n", - " labelbottom='off', labelleft='off')\n", - "\n", - "ax1.set_title(r'$|G-X|$ for G02AB', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", - " fontsize=14,\n", - ") \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "d557be83-a9a7-4634-a737-8174d4096889" - } - }, - "source": [ - "# Weighting Individual Elements\n", - "\n", - "* Would it be better to be able to *weight individual elements* in our approximate matrix?\n", - "\n", - "\n", - "* In our example the top left 3 by 3 block of exact correlations, perhaps.\n", - "\n", - "\n", - "* Element-wise weighting means we wish to find the minimum of\n", - "\n", - "\n", - "$$ \\Large \\|H \\circ(G-X) \\|_F $$ \n", - "\n", - "\n", - "* So individually $h_{ij} \\times (g_{ij} – x_{ij}).$\n", - "\n", - "\n", - "* However, this is a more “difficult” problem, and more computationally expensive. \n", - "\n", - "\n", - "* This is implemented in the NAG routine **G02AJ**.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "1865afa3-9b32-4bb5-83d0-ddc9c6f709a0" - } - }, - "source": [ - "### Use G02AJ to compute the nearest correlation matrix with element-wise weighting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "// Set up a matrix of weights\n", - "n = P[0].length;\n", - "double[][] H = new double[n][n];\n", - "for (int i = 0; i < n; i++) {\n", - " for (int j = 0; j < n; j++) {\n", - " if ((i < 3) && (j < 3)) {\n", - " H[i][j] = 100.0;\n", - " } else {\n", - " H[i][j] = 1;\n", - " }\n", - " }\n", - "}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "nbpresent": { - "id": "d477130b-e56d-4bab-b0bd-3a1ddf2c328d" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[100., 100., 100., 1., 1., 1., 1., 1.],\n", - " [100., 100., 100., 1., 1., 1., 1., 1.],\n", - " [100., 100., 100., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1., 1., 1., 1.]])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "H = read_matrix_file(\"H_G02AJ.d\")\n", - "H" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "// Call the NAG routine specifying a minimum eigenvalue\n", - "G02AJ g02aj = new G02AJ();\n", - "G1d = convert2DTo1D(G);\n", - "ldg = G.length;\n", - "n = G[0].length;\n", - "alpha = 0.001;\n", - "double[] H1d = convert2DTo1D(H);\n", - "int ldh = H.length;\n", - "errtol = 0;\n", - "maxit = 0;\n", - "ldx = n;\n", - "X1d = new double[ldx * n];\n", - "iter = 0;\n", - "double norm2 = 0;\n", - "ifail = 0;\n", - "g02aj.eval(G1d, ldg, n, alpha, H1d, ldh, errtol, maxit, X1d, ldx, iter, norm2, ifail);\n", - "\n", - "X = convert1DTo2D(X1d, ldx);\n", - "iter = g02aj.getITER();\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nearest correlation matrix using element-wise weighting\n", - "[[ 1. -0.3251 0.1881 0.5371 0.0255 -0.5893 -0.0625 -0.1929]\n", - " [-0.3251 1. 0.2048 0.2249 0.4144 0.2841 0.2914 0.4081]\n", - " [ 0.1881 0.2048 1. -0.1462 0.7883 0.2718 -0.6084 0.8804]\n", - " [ 0.5371 0.2249 -0.1462 1. 0.2138 -0.0002 0.607 -0.2199]\n", - " [ 0.0255 0.4144 0.7883 0.2138 1. 0.6566 -0.2807 0.8756]\n", - " [-0.5893 0.2841 0.2718 -0.0002 0.6566 1. 0.0474 0.593 ]\n", - " [-0.0625 0.2914 -0.6084 0.607 -0.2807 0.0474 1. -0.4471]\n", - " [-0.1929 0.4081 0.8804 -0.2199 0.8756 0.593 -0.4471 1. ]]\n" - ] - } - ], - "source": [ - "X = read_matrix_file(\"X_G02AJ.d\")\n", - "print(\"Nearest correlation matrix using element-wise weighting\\n{}\".format(X))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "jobvl = \"N\";\n", - "jobvr = \"N\";\n", - "n = X[0].length;\n", - "lda = X.length;\n", - "wr = new double[n];\n", - "wi = new double[n];\n", - "ldvl = 1;\n", - "vl = new double[ldvl];\n", - "ldvr = 1;\n", - "vr = new double[ldvr];\n", - "lwork = 3 * n;\n", - "work = new double[lwork];\n", - "info = 0;\n", - "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", - "Arrays.sort(wr);\n", - "Arrays.sort(wi);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of X [0.001 0.001 0.0375 0.1734 0.6882 1.7106 1.9224 3.466 ]\n" - ] - } - ], - "source": [ - "X_eigen = read_matrix_file(\"X_eigen_G02AJ.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "nbpresent": { - "id": "e07e5a46-5f1d-49ef-9ae7-20b944efd9fb" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "itr, norm, X_G = read_data_file(\"G02AJ.d\")\n", - "\n", - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", - " vmax=0.2)\n", - "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True), \n", - " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", - "cbar.mappable.set_clim([0, 0.2])\n", - "ax1.tick_params(axis='both', which='both', \n", - " bottom='off', top='off', left='off', right='off', \n", - " labelbottom='off', labelleft='off')\n", - "\n", - "ax1.set_title(r'$|G-X|$ for G02AJ', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", - " fontsize=14,\n", - ") \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "39a5aee6-7760-4a9e-a5e3-dee77330a042" - } - }, - "source": [ - "# Fixing a Block of Elements\n", - "\n", - "* We probably really wish to *fix* our leading block of true correlations, so it does not change at all.\n", - "\n", - "\n", - "* We have the NAG routine **G02AN**.\n", - "\n", - "\n", - "* This routine fixes a leading block, which we require to be positive definite.\n", - "\n", - "\n", - "* We apply the *shrinking algorithm* of Higham, Strabić and Šego. The approach is **not** computationally expensive.\n", - "\n", - "\n", - "* What we find is the smallest α, such that *X* is a true correlation matrix:\n", - "\n", - "\n", - "$$ \\large X = \\alpha \\left( \n", - "\\begin{array}{ll}G_{11} & 0 \\\\ 0 & I \\end{array} \\right) +(1-\\alpha)G, \n", - "\\qquad G = \\left( \n", - "\\begin{array}{ll} G_{11} & G_{12} \\\\ G_{12}^T & G_{22} \\end{array} \n", - "\\right) \n", - "$$\n", - "\n", - "\n", - "* $G_{11}$ is the leading $k$ by $k$ block of the approximate correlation matrix that we wish to fix.\n", - "\n", - "\n", - "* $\\alpha$ is in the interval $[0,1]$.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "35cec887-bf5b-4bcd-9482-55523b6c1de6" - } - }, - "source": [ - "### Use G02AN to compute the nearest correlation matrix with fixed leading block" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "// Call the NAG routine fixing the top 3-by-3 block\n", - "G02AN g02an = new G02AN();\n", - "G1d = convert2DTo1D(G);\n", - "ldg = G.length;\n", - "n = G[0].length;\n", - "int k = 3;\n", - "errtol = 0;\n", - "double eigtol = 0;\n", - "ldx = n;\n", - "X1d = new double[ldx * n];\n", - "alpha = 0.001;\n", - "iter = 0;\n", - "double eigmin = 0;\n", - "norm2 = 0;\n", - "ifail = 0; \n", - "g02an.eval(G1d, ldg, n, k, errtol, eigtol, X1d, ldx, alpha, iter, eigmin, norm2, ifail);\n", - "\n", - "X = convert1DTo2D(X1d, ldx);\n", - "iter = g02an.getITER();\n", - "alpha = g02an.getALPHA();\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nearest correlation matrix with fixed leading block \n", - "[[ 1. -0.325 0.1881 0.4606 0.0051 -0.4887 -0.0579 -0.1271]\n", - " [-0.325 1. 0.2048 0.1948 0.3245 0.2183 0.2294 0.3391]\n", - " [ 0.1881 0.2048 1. -0.106 0.6124 0.2211 -0.4936 0.7202]\n", - " [ 0.4606 0.1948 -0.106 1. 0.2432 0.0101 0.516 -0.2567]\n", - " [ 0.0051 0.3245 0.6124 0.2432 1. 0.532 -0.2634 0.7949]\n", - " [-0.4887 0.2183 0.2211 0.0101 0.532 1. 0.0393 0.4769]\n", - " [-0.0579 0.2294 -0.4936 0.516 -0.2634 0.0393 1. -0.3185]\n", - " [-0.1271 0.3391 0.7202 -0.2567 0.7949 0.4769 -0.3185 1. ]]\n" - ] - } - ], - "source": [ - "X = read_matrix_file(\"X_G02AN.d\")\n", - "print(\"Nearest correlation matrix with fixed leading block \\n{}\".format(X))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```java\n", - "jobvl = \"N\";\n", - "jobvr = \"N\";\n", - "n = X[0].length;\n", - "lda = X.length;\n", - "wr = new double[n];\n", - "wi = new double[n];\n", - "ldvl = 1;\n", - "vl = new double[ldvl];\n", - "ldvr = 1;\n", - "vr = new double[ldvr];\n", - "lwork = 3 * n;\n", - "work = new double[lwork];\n", - "info = 0;\n", - "f08na.eval(jobvl, jobvr, n, X1d, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info);\n", - "Arrays.sort(wr);\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sorted eigenvalues of X [0. 0.1375 0.2744 0.3804 0.7768 1.6263 1.7689 3.0356]\n", - "Value of alpha returned: [0.2003]\n" - ] - } - ], - "source": [ - "X_eigen = read_matrix_file(\"X_eigen_G02AN.d\")\n", - "print(\"Sorted eigenvalues of X {}\".format(X_eigen[0]))\n", - "alpha = read_matrix_file(\"alpha_G02AN.d\")\n", - "print(\"Value of alpha returned: {}\".format(alpha[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "nbpresent": { - "id": "4dfd2936-1a71-4f33-b4df-8f271e6caae4" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "itr, norm, X_G = read_data_file(\"G02AN.d\")\n", - "\n", - "fig1, ax1 = plt.subplots(figsize=(14, 7))\n", - "cax1 = ax1.imshow(X_G, interpolation='none', cmap=plt.cm.Blues, vmin=0, \n", - " vmax=0.2)\n", - "cbar = fig1.colorbar(cax1, ticks = np.linspace(0.0, 0.2, 11, endpoint=True),\n", - " boundaries=np.linspace(0.0, 0.2, 11, endpoint=True))\n", - "cbar.mappable.set_clim([0, 0.2])\n", - "ax1.tick_params(axis='both', which='both', \n", - " bottom='off', top='off', left='off', right='off', \n", - " labelbottom='off', labelleft='off')\n", - "\n", - "ax1.set_title(r'$|G-X|$ for G02AN', fontsize=16)\n", - "plt.xlabel(\n", - " r'Iterations: {0}, $||G-X||_F = {1:.4f}$'.format(itr, norm),\n", - " fontsize=14,\n", - ") \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "d9a2935a-ef2a-4279-a5a6-385bb10917d9" - } - }, - "source": [ - "# Fixing Arbitrary Elements\n", - "\n", - "* The routine **G02AP** fixes arbitrary elements by finding the smallest α, such that *X* is a true correlation matrix in:\n", - "\n", - "\n", - "$$ X = \\large \\alpha T+(1-\\alpha)G, \\quad T = H \\circ G, \\quad h_{ij} \\in [0,1] $$\n", - "\n", - "\n", - "* A \"1\" in *H* fixes corresponding elements in *G*.\n", - "\n", - "\n", - "* $0 < h_{ij} < 1$ weights corresponding element in *G*.\n", - "\n", - "\n", - "* $\\alpha$ is again in the interval $[0,1]$.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true, - "nbpresent": { - "id": "4726f42a-663c-4597-9eb8-ba909dcbff64" - } - }, - "source": [ - "## Alternating Projections\n", - "\n", - "* First method proposed to solve our original problem, however, it is very slow.\n", - "\n", - "\n", - "* The idea is we alternate projecting onto two sets, which are:\n", - " * the set of smeidefinite matrices (S1), and \n", - " * matrices with unit diagonal (s2) \n", - "\n", - "\n", - "* We do this until we converge on a matrix with both properties.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Alternating Projections with Anderson Acceleration\n", - "\n", - "\n", - "* A new approach by Higham and Strabić uses *Anderson Acceleration*, and makes the method worthwhile.\n", - "\n", - "\n", - "* In particular, we will be able to fix elements whilst finding the nearest true correlation matrix in the Frobenius norm.\n", - "\n", - "\n", - "* Our projections are now:\n", - " * the set of (semi)definite matrices with some minimum eigenvalue, and \n", - " * matrix with elements $G_{i,j}$ for some given indices $i$ and $j$\n", - "\n", - "\n", - "* To appear in a future NAG Library.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# More on using the NAG Library for *Java*:\n", - "\n", - "\n", - "**https://www.nag.com/content/nag-library-for-java** \n" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "celltoolbar": "Raw Cell Format", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - }, - "nbpresent": { - "slides": { - "1750b204-3948-4055-961a-28e403c34d45": { - "id": "1750b204-3948-4055-961a-28e403c34d45", - "prev": "d13271a9-64b9-4c68-9bbe-90695af58672", - "regions": { - "ca87c654-b4d9-40b6-a45f-a6e18983cbf2": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "d477130b-e56d-4bab-b0bd-3a1ddf2c328d", - "part": "whole" - }, - "id": "ca87c654-b4d9-40b6-a45f-a6e18983cbf2" - } - } - }, - "1987126a-5ef5-412e-9928-9c8d08045ba8": { - "id": "1987126a-5ef5-412e-9928-9c8d08045ba8", - "prev": "a7d10056-58bb-4c47-a55a-1afbd75aec25", - "regions": { - "cf839aea-78b6-4c13-b41b-68e7ee33cc06": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "3eadfa7e-67da-4128-89cc-641d720a8679", - "part": "whole" - }, - "id": "cf839aea-78b6-4c13-b41b-68e7ee33cc06" - } - } - }, - "1d0d6a75-39e7-4be5-ae4e-4152e243553a": { - "id": "1d0d6a75-39e7-4be5-ae4e-4152e243553a", - "prev": "27e2acc3-d9b4-431c-8ad1-872a06af8d8b", - "regions": { - "f0051e25-adcd-4361-b7f6-d97e71c2c334": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "a5652370-f1f9-4b64-b5e6-9d5869e82366", - "part": "whole" - }, - "id": "f0051e25-adcd-4361-b7f6-d97e71c2c334" - } - } - }, - "233f2e7c-f482-4e79-a356-ed9ecede9ae5": { - "id": "233f2e7c-f482-4e79-a356-ed9ecede9ae5", - "prev": "6e4d7fd8-9f0a-411d-9416-52f98e519749", - "regions": { - "239a9bd2-94b2-4e94-8bb7-59a1a2f83daa": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "a5fb9867-8630-4b22-aff5-8fa6d9d634ea", - "part": "whole" - }, - "id": "239a9bd2-94b2-4e94-8bb7-59a1a2f83daa" - } - } - }, - "2758f2b8-e75c-4987-8094-083a882384f6": { - "id": "2758f2b8-e75c-4987-8094-083a882384f6", - "prev": "bab5a454-f4ac-43c3-b83d-c29e8f36f9f8", - "regions": { - "11a6fa65-c82a-4924-bd1e-a8c4539473c6": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "9e7248c0-f11a-4cd7-8454-3545797ad928", - "part": "whole" - }, - "id": "11a6fa65-c82a-4924-bd1e-a8c4539473c6" - } - } - }, - "27e2acc3-d9b4-431c-8ad1-872a06af8d8b": { - "id": "27e2acc3-d9b4-431c-8ad1-872a06af8d8b", - "prev": "2c0ba92c-b372-4d29-9030-dc10d31b5312", - "regions": { - "626d7a2c-b510-4337-ae06-35fa3d5ca710": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "4b56ea69-b9da-428e-980e-d5c7dfedd017", - "part": "whole" - }, - "id": "626d7a2c-b510-4337-ae06-35fa3d5ca710" - } - } - }, - "28d7e77e-5014-4078-b076-c50af5af532d": { - "id": "28d7e77e-5014-4078-b076-c50af5af532d", - "prev": "44f4452c-f3e8-43c3-a8de-eab5abda97a3", - "regions": { - "5897e24d-b94c-48e9-98ce-a34c0672472e": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "06ca320a-cd53-4247-abae-4ed32f3442b2", - "part": "whole" - }, - "id": "5897e24d-b94c-48e9-98ce-a34c0672472e" - } - } - }, - "2c0ba92c-b372-4d29-9030-dc10d31b5312": { - "id": "2c0ba92c-b372-4d29-9030-dc10d31b5312", - "prev": "1750b204-3948-4055-961a-28e403c34d45", - "regions": { - "a86e4c34-f238-41be-a954-e9c9915e7595": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "59164e07-d021-4b2f-8dc8-c526c7e4223c", - "part": "whole" - }, - "id": "a86e4c34-f238-41be-a954-e9c9915e7595" - } - } - }, - "33d8ca1f-2a7d-4ca5-8e8b-421b5a016874": { - "id": "33d8ca1f-2a7d-4ca5-8e8b-421b5a016874", - "prev": "6ecb639b-037d-4196-ac2a-a1621cb984d5", - "regions": { - "96971163-2db6-4981-91cf-ab893f6be265": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "85008295-2019-4aae-8de4-10440d7b1192", - "part": "whole" - }, - "id": "96971163-2db6-4981-91cf-ab893f6be265" - } - } - }, - "3f660f13-9fc3-4dd7-baca-629a5a2cb147": { - "id": "3f660f13-9fc3-4dd7-baca-629a5a2cb147", - "prev": "508aae9e-eea9-4d73-a68a-bc66e6b9011d", - "regions": { - "b199f51a-d45c-44fd-ac0d-a280790e24ef": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "0e839e32-3dfc-4943-8fbd-edd7dbfcebcf", - "part": "whole" - }, - "id": "b199f51a-d45c-44fd-ac0d-a280790e24ef" - } - } - }, - "3fbf2742-1eb1-4218-9a71-4a6265a07186": { - "id": "3fbf2742-1eb1-4218-9a71-4a6265a07186", - "prev": "33d8ca1f-2a7d-4ca5-8e8b-421b5a016874", - "regions": { - "585cf0ab-f9b5-4ea6-bd28-f894d75e25dc": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "055e5346-1aa3-48c0-9cbd-d1ddc326fe00", - "part": "whole" - }, - "id": "585cf0ab-f9b5-4ea6-bd28-f894d75e25dc" - } - } - }, - "3fc14f55-7c07-4275-9768-f09ba7a712ab": { - "id": "3fc14f55-7c07-4275-9768-f09ba7a712ab", - "prev": "ecc2c9e1-d47a-4fce-bd5a-263e42e4da86", - "regions": { - "54c17f30-e1f8-4b63-8e55-26654c2e0059": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "bbde4683-adc6-4094-891a-5487f24b873e", - "part": "whole" - }, - "id": "54c17f30-e1f8-4b63-8e55-26654c2e0059" - } - } - }, - "44f4452c-f3e8-43c3-a8de-eab5abda97a3": { - "id": "44f4452c-f3e8-43c3-a8de-eab5abda97a3", - "prev": "bd118997-da16-403d-94d1-51520a42f60d", - "regions": { - "78003ad1-ddf2-4f83-bbac-9616b40bef66": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "0a7c5d11-13ec-4f52-b222-c6540fcdd67c", - "part": "whole" - }, - "id": "78003ad1-ddf2-4f83-bbac-9616b40bef66" - } - } - }, - "4c81a8ea-daa6-40f1-86dd-950ff1439354": { - "id": "4c81a8ea-daa6-40f1-86dd-950ff1439354", - "prev": "88b3617c-c7ca-4d60-b84c-a0c5559aa146", - "regions": { - "0cca0e01-2042-4b0a-87b4-3ceb1e4badcd": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "7b0f8df4-0484-4a23-b5fd-1ff66bd0000d", - "part": "whole" - }, - "id": "0cca0e01-2042-4b0a-87b4-3ceb1e4badcd" - } - } - }, - "4c88b7ff-ab7b-4376-82a2-82f8fa5e18bc": { - "id": "4c88b7ff-ab7b-4376-82a2-82f8fa5e18bc", - "prev": "28d7e77e-5014-4078-b076-c50af5af532d", - "regions": { - "80232afd-a029-4d29-b2e3-d510c3fa2c97": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "4db463c7-773f-41ec-84a0-ece179fa37da", - "part": "whole" - }, - "id": "80232afd-a029-4d29-b2e3-d510c3fa2c97" - } - } - }, - "4d748b62-46f4-42f4-9138-0a5600e7df2b": { - "id": "4d748b62-46f4-42f4-9138-0a5600e7df2b", - "prev": "bb7ec376-77bf-4dec-bee3-170160f1043c", - "regions": { - "bf83af59-fc65-42c6-833b-a48fef72ddbe": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "3a438349-5641-4df8-bdf1-a86b6ee757ab", - "part": "source" - }, - "id": "bf83af59-fc65-42c6-833b-a48fef72ddbe" - } - } - }, - "508aae9e-eea9-4d73-a68a-bc66e6b9011d": { - "id": "508aae9e-eea9-4d73-a68a-bc66e6b9011d", - "prev": "ad8381ee-ae0f-4ad1-8eda-8c8e1c4fad07", - "regions": { - "9ba5ea72-fa33-48c3-8103-618562d679d9": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "1843a7c6-2730-48f9-9b35-7c7b942c6723", - "part": "whole" - }, - "id": "9ba5ea72-fa33-48c3-8103-618562d679d9" - } - } - }, - "5124f869-6b03-4be3-81f5-55b8832cd6fb": { - "id": "5124f869-6b03-4be3-81f5-55b8832cd6fb", - "prev": "cebab018-f536-404d-9b6f-a7c27a37c8e1", - "regions": { - "2f08a369-9275-4ede-a15b-1ff231c7c60b": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "d557be83-a9a7-4634-a737-8174d4096889", - "part": "whole" - }, - "id": "2f08a369-9275-4ede-a15b-1ff231c7c60b" - } - } - }, - "5aeeb9dc-f16a-4d48-955a-6ef82db4e205": { - "id": "5aeeb9dc-f16a-4d48-955a-6ef82db4e205", - "prev": "846cbfc3-d7b5-43c0-8dd0-149eafbcb726", - "regions": { - "7dbe7c5a-11f3-4a05-8458-17f35c5793a8": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "9d1819cb-4c08-4d0b-8cbe-d9de4ab61a0f", - "part": "whole" - }, - "id": "7dbe7c5a-11f3-4a05-8458-17f35c5793a8" - } - } - }, - "5d0618db-2b6f-4acb-8588-a64be45a74ca": { - "id": "5d0618db-2b6f-4acb-8588-a64be45a74ca", - "prev": "b0ed01c6-fb32-42f0-8dbd-d71adf885c49", - "regions": { - "f63425fb-4081-48ec-a2a1-e26656b6ed44": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "d1c9ef9b-e547-4d3b-a3a4-25ca827b9e65", - "part": "whole" - }, - "id": "f63425fb-4081-48ec-a2a1-e26656b6ed44" - } - } - }, - "5f5a20e8-9906-4ff6-97a3-890c0a93255b": { - "id": "5f5a20e8-9906-4ff6-97a3-890c0a93255b", - "prev": "cbf8b9b5-81a4-414b-8bd6-c356f0d16b82", - "regions": { - "4bc6b307-e4bf-4aad-9179-474b213b6400": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "cd0ce132-5f43-471c-8641-aa4ab54591a9", - "part": "whole" - }, - "id": "4bc6b307-e4bf-4aad-9179-474b213b6400" - } - } - }, - "5f98ec70-b065-4d0f-b9a2-b1a7cfb23af1": { - "id": "5f98ec70-b065-4d0f-b9a2-b1a7cfb23af1", - "prev": "5f5a20e8-9906-4ff6-97a3-890c0a93255b", - "regions": { - "8f35d40c-5091-48e2-9c94-ac72b3877a1d": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "19593268-62aa-4bab-923b-2be26634bedd", - "part": "whole" - }, - "id": "8f35d40c-5091-48e2-9c94-ac72b3877a1d" - } - } - }, - "61701e74-efb2-498b-912e-cbd50b9a851e": { - "id": "61701e74-efb2-498b-912e-cbd50b9a851e", - "prev": "6dc35822-1f47-4f4e-99c4-f70e5376300f", - "regions": { - "5c680c83-711c-4988-b62a-970397a1ec4b": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "f417663e-badf-45d3-8f98-0647907657de", - "part": "whole" - }, - "id": "5c680c83-711c-4988-b62a-970397a1ec4b" - } - } - }, - "627bd4e9-dc44-4809-aa0a-0b6e4d02a767": { - "id": "627bd4e9-dc44-4809-aa0a-0b6e4d02a767", - "prev": "b7898dbe-5f18-4e68-83ba-7edc52e7d955", - "regions": { - "8a7f2a7e-0664-4d7c-a7f9-2a15b62ee93d": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "80b820b1-7c3b-4c96-a4a6-09b5ef00dacb", - "part": "whole" - }, - "id": "8a7f2a7e-0664-4d7c-a7f9-2a15b62ee93d" - } - } - }, - "655c1abb-bbf7-4f69-9665-bf2d14dee3ea": { - "id": "655c1abb-bbf7-4f69-9665-bf2d14dee3ea", - "prev": "d628eace-996b-4d17-aeed-5cfcc5d2e979", - "regions": { - "cc62baa3-89fd-445e-a145-e55383c2f1a1": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "4726f42a-663c-4597-9eb8-ba909dcbff64", - "part": "whole" - }, - "id": "cc62baa3-89fd-445e-a145-e55383c2f1a1" - } - } - }, - "6992f9b3-1914-459f-bcfd-b5f41ee1a69f": { - "id": "6992f9b3-1914-459f-bcfd-b5f41ee1a69f", - "prev": null, - "regions": { - "dde42ffa-f24a-4d08-8e3b-c40e44072904": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "b8c6c01b-a265-4aad-8613-6ee62b70c9d3", - "part": "whole" - }, - "id": "dde42ffa-f24a-4d08-8e3b-c40e44072904" - } - } - }, - "6dc35822-1f47-4f4e-99c4-f70e5376300f": { - "id": "6dc35822-1f47-4f4e-99c4-f70e5376300f", - "prev": "627bd4e9-dc44-4809-aa0a-0b6e4d02a767", - "regions": { - "c3f98a72-0bd6-40c4-a3b5-a4d264362136": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "a8b4aa95-2ba3-4f09-8f65-ab45831b1108", - "part": "whole" - }, - "id": "c3f98a72-0bd6-40c4-a3b5-a4d264362136" - } - } - }, - "6e4d7fd8-9f0a-411d-9416-52f98e519749": { - "id": "6e4d7fd8-9f0a-411d-9416-52f98e519749", - "prev": "dd3f23bd-448f-47dd-8ee3-3d5b1db7635b", - "regions": {} - }, - "6ecb639b-037d-4196-ac2a-a1621cb984d5": { - "id": "6ecb639b-037d-4196-ac2a-a1621cb984d5", - "prev": "8d9daa18-bf6f-48f8-a193-c5426601244b", - "regions": { - "c8d85ee2-7811-451c-8529-6bdce8ec6651": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "9737d750-04fe-4a91-933c-a799449e427e", - "part": "whole" - }, - "id": "c8d85ee2-7811-451c-8529-6bdce8ec6651" - } - } - }, - "73cb7414-e801-4f77-a860-5670a6770f24": { - "id": "73cb7414-e801-4f77-a860-5670a6770f24", - "prev": "233f2e7c-f482-4e79-a356-ed9ecede9ae5", - "regions": { - "c5133c14-935d-48b6-b0bf-762b2e65c9d5": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "edf2075f-e6d6-4b99-88ea-96ba456697df", - "part": "whole" - }, - "id": "c5133c14-935d-48b6-b0bf-762b2e65c9d5" - } - } - }, - "846cbfc3-d7b5-43c0-8dd0-149eafbcb726": { - "id": "846cbfc3-d7b5-43c0-8dd0-149eafbcb726", - "prev": "4c81a8ea-daa6-40f1-86dd-950ff1439354", - "regions": { - "59303c66-2d6f-42f1-8d35-2a9a882fb651": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "5fe4edf2-768e-47ef-b5e1-62f64c49ebae", - "part": "whole" - }, - "id": "59303c66-2d6f-42f1-8d35-2a9a882fb651" - } - } - }, - "849937ae-4396-4f8f-bb05-c5d7c75bca4a": { - "id": "849937ae-4396-4f8f-bb05-c5d7c75bca4a", - "prev": "3fc14f55-7c07-4275-9768-f09ba7a712ab", - "regions": { - "abe75389-8a35-4982-b999-00eead65659a": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "f9399cc1-faa3-4ec2-a59d-47f60c08759a", - "part": "whole" - }, - "id": "abe75389-8a35-4982-b999-00eead65659a" - } - } - }, - "88b3617c-c7ca-4d60-b84c-a0c5559aa146": { - "id": "88b3617c-c7ca-4d60-b84c-a0c5559aa146", - "prev": "e2ad3057-f9de-4212-920c-10278da5df00", - "regions": { - "835c16fd-4bac-4ed5-91ee-6c3758904032": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "51c1d5f6-31c7-4c68-b0b9-0b9d2c074d49", - "part": "whole" - }, - "id": "835c16fd-4bac-4ed5-91ee-6c3758904032" - } - } - }, - "8d9daa18-bf6f-48f8-a193-c5426601244b": { - "id": "8d9daa18-bf6f-48f8-a193-c5426601244b", - "prev": "5aeeb9dc-f16a-4d48-955a-6ef82db4e205", - "regions": { - "78d85b20-9e2a-4b95-b00b-cb5e021efa8d": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "cbf6b8fd-fa7c-47ee-a453-ab971310188f", - "part": "whole" - }, - "id": "78d85b20-9e2a-4b95-b00b-cb5e021efa8d" - } - } - }, - "922e60da-fa80-452b-8260-7c00ca4bb1f5": { - "id": "922e60da-fa80-452b-8260-7c00ca4bb1f5", - "prev": "5d0618db-2b6f-4acb-8588-a64be45a74ca", - "regions": { - "ecd7f2b6-3c5a-483d-a0d0-be98ce1b7a58": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "50dccd74-72ea-465f-988d-55c9d115dc20", - "part": "whole" - }, - "id": "ecd7f2b6-3c5a-483d-a0d0-be98ce1b7a58" - } - } - }, - "9af0f417-6460-4bb7-9de1-c2e3354c72db": { - "id": "9af0f417-6460-4bb7-9de1-c2e3354c72db", - "prev": "eef34a4c-a48f-4a2c-baec-2f5a43ce4d65", - "regions": { - "335f93b0-f268-4fe8-8c7b-00d4ae2c4128": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "450b0475-04e8-4340-a32f-79408ca0a017", - "part": "whole" - }, - "id": "335f93b0-f268-4fe8-8c7b-00d4ae2c4128" - } - } - }, - "a019c2ff-04f0-4074-b3ff-93d32e3fa4a6": { - "id": "a019c2ff-04f0-4074-b3ff-93d32e3fa4a6", - "prev": "655c1abb-bbf7-4f69-9665-bf2d14dee3ea", - "regions": { - "bb63487d-d9e2-4877-bacb-790a24948247": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "4ba39fe8-df1e-4bd5-8154-158d99afd6a5", - "part": "whole" - }, - "id": "bb63487d-d9e2-4877-bacb-790a24948247" - } - } - }, - "a7d10056-58bb-4c47-a55a-1afbd75aec25": { - "id": "a7d10056-58bb-4c47-a55a-1afbd75aec25", - "prev": "2758f2b8-e75c-4987-8094-083a882384f6", - "regions": { - "cd41807b-7dbe-44c3-bbed-ddf908401a15": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "c1a4afe7-e788-495d-a691-f433a82e0e11", - "part": "whole" - }, - "id": "cd41807b-7dbe-44c3-bbed-ddf908401a15" - } - } - }, - "ad8381ee-ae0f-4ad1-8eda-8c8e1c4fad07": { - "id": "ad8381ee-ae0f-4ad1-8eda-8c8e1c4fad07", - "prev": "1d0d6a75-39e7-4be5-ae4e-4152e243553a", - "regions": { - "7a58d25c-d8d4-4c0e-8880-fa9269ad398e": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "e07e5a46-5f1d-49ef-9ae7-20b944efd9fb", - "part": "whole" - }, - "id": "7a58d25c-d8d4-4c0e-8880-fa9269ad398e" - } - } - }, - "b0ed01c6-fb32-42f0-8dbd-d71adf885c49": { - "id": "b0ed01c6-fb32-42f0-8dbd-d71adf885c49", - "prev": "73cb7414-e801-4f77-a860-5670a6770f24", - "regions": { - "bda90826-244a-46bc-b055-ce19dd08a5b9": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "3f5c8aae-0101-4786-a2e0-1d89997a2f8e", - "part": "whole" - }, - "id": "bda90826-244a-46bc-b055-ce19dd08a5b9" - } - } - }, - "b7898dbe-5f18-4e68-83ba-7edc52e7d955": { - "id": "b7898dbe-5f18-4e68-83ba-7edc52e7d955", - "prev": "4d748b62-46f4-42f4-9138-0a5600e7df2b", - "regions": { - "3ebf500f-696d-44c9-8820-406bb7fc848b": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "af5081b7-3d9a-47f5-8dc1-69fcc57821c0", - "part": "whole" - }, - "id": "3ebf500f-696d-44c9-8820-406bb7fc848b" - } - } - }, - "bab5a454-f4ac-43c3-b83d-c29e8f36f9f8": { - "id": "bab5a454-f4ac-43c3-b83d-c29e8f36f9f8", - "prev": "e5c3df08-d8a0-4ae2-9617-e744190a7c35", - "regions": { - "3807a6b6-c377-4c47-878f-f4c074ac429b": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "35cec887-bf5b-4bcd-9482-55523b6c1de6", - "part": "whole" - }, - "id": "3807a6b6-c377-4c47-878f-f4c074ac429b" - } - } - }, - "bb7ec376-77bf-4dec-bee3-170160f1043c": { - "id": "bb7ec376-77bf-4dec-bee3-170160f1043c", - "prev": "f630add5-f257-42b1-882b-680cdb6a54df", - "regions": { - "f3bb3abf-1f11-408e-9f75-6b286beb9dd2": { - "attrs": { - "height": 1, - "width": 1, - "x": 0, - "y": 0 - }, - "id": "f3bb3abf-1f11-408e-9f75-6b286beb9dd2" - } - } - }, - "bd118997-da16-403d-94d1-51520a42f60d": { - "id": "bd118997-da16-403d-94d1-51520a42f60d", - "prev": "5f98ec70-b065-4d0f-b9a2-b1a7cfb23af1", - "regions": { - "76da41ed-2ac7-41ff-a986-c1bdbba6e578": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "0f8ff272-e0f6-417e-8e2e-650964663d0f", - "part": "whole" - }, - "id": "76da41ed-2ac7-41ff-a986-c1bdbba6e578" - } - } - }, - "caaef2f2-6088-49b3-b591-d04cfb3e544c": { - "id": "caaef2f2-6088-49b3-b591-d04cfb3e544c", - "prev": "1987126a-5ef5-412e-9928-9c8d08045ba8", - "regions": { - "a61b242d-cf47-4244-961c-0bf3dc0efe72": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "4dfd2936-1a71-4f33-b4df-8f271e6caae4", - "part": "whole" - }, - "id": "a61b242d-cf47-4244-961c-0bf3dc0efe72" - } - } - }, - "cad25093-0c05-4bbc-9398-d42b2a4f98a1": { - "id": "cad25093-0c05-4bbc-9398-d42b2a4f98a1", - "prev": "ccbf2c4f-d808-4eff-a93c-d460da364a2d", - "regions": { - "cc333814-9223-4442-975c-91474790d6e2": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "d9a2935a-ef2a-4279-a5a6-385bb10917d9", - "part": "whole" - }, - "id": "cc333814-9223-4442-975c-91474790d6e2" - } - } - }, - "cbf8b9b5-81a4-414b-8bd6-c356f0d16b82": { - "id": "cbf8b9b5-81a4-414b-8bd6-c356f0d16b82", - "prev": "3fbf2742-1eb1-4218-9a71-4a6265a07186", - "regions": { - "be48b302-4285-4bd7-abdd-827f8e3cfe3f": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "600de3c9-794b-49c8-87b8-225a1c1c9851", - "part": "whole" - }, - "id": "be48b302-4285-4bd7-abdd-827f8e3cfe3f" - } - } - }, - "ccbf2c4f-d808-4eff-a93c-d460da364a2d": { - "id": "ccbf2c4f-d808-4eff-a93c-d460da364a2d", - "prev": "caaef2f2-6088-49b3-b591-d04cfb3e544c", - "regions": { - "912ea1bf-bcdb-4f21-af48-a348ce16acb9": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "a2b8e702-588b-4e77-80b2-5a3848fcf2c0", - "part": "whole" - }, - "id": "912ea1bf-bcdb-4f21-af48-a348ce16acb9" - } - } - }, - "cebab018-f536-404d-9b6f-a7c27a37c8e1": { - "id": "cebab018-f536-404d-9b6f-a7c27a37c8e1", - "prev": "e2dc3e5b-76e4-4f27-8a5e-8093b1c578ea", - "regions": { - "4b449874-e61d-46e3-8877-937ada7063c1": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "50715556-da1c-4494-ad0a-02a2ab103710", - "part": "whole" - }, - "id": "4b449874-e61d-46e3-8877-937ada7063c1" - } - } - }, - "d13271a9-64b9-4c68-9bbe-90695af58672": { - "id": "d13271a9-64b9-4c68-9bbe-90695af58672", - "prev": "5124f869-6b03-4be3-81f5-55b8832cd6fb", - "regions": { - "58f95339-2e40-46d0-9cfc-eeb4542895d9": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "1865afa3-9b32-4bb5-83d0-ddc9c6f709a0", - "part": "whole" - }, - "id": "58f95339-2e40-46d0-9cfc-eeb4542895d9" - } - } - }, - "d628eace-996b-4d17-aeed-5cfcc5d2e979": { - "id": "d628eace-996b-4d17-aeed-5cfcc5d2e979", - "layout": "grid", - "prev": "cad25093-0c05-4bbc-9398-d42b2a4f98a1", - "regions": {} - }, - "dd3f23bd-448f-47dd-8ee3-3d5b1db7635b": { - "id": "dd3f23bd-448f-47dd-8ee3-3d5b1db7635b", - "prev": "9af0f417-6460-4bb7-9de1-c2e3354c72db", - "regions": { - "0032ae55-ccab-4a39-b27a-502f04a0fc6e": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "94a8239a-e41d-4c24-ae8d-ea3e2132a391", - "part": "whole" - }, - "id": "0032ae55-ccab-4a39-b27a-502f04a0fc6e" - } - } - }, - "df19040a-9a49-430c-ab6a-5f81e101cb75": { - "id": "df19040a-9a49-430c-ab6a-5f81e101cb75", - "prev": "61701e74-efb2-498b-912e-cbd50b9a851e", - "regions": { - "4f401f69-65ae-46c0-b165-c3b664cece31": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "f3de275a-ac50-402b-a9e9-fb6f14aef20a", - "part": "whole" - }, - "id": "4f401f69-65ae-46c0-b165-c3b664cece31" - } - } - }, - "e2ad3057-f9de-4212-920c-10278da5df00": { - "id": "e2ad3057-f9de-4212-920c-10278da5df00", - "prev": "df19040a-9a49-430c-ab6a-5f81e101cb75", - "regions": { - "76aa6de2-e5e4-45f7-a2f8-5e51b92fc31d": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "b1c83af0-e6ca-42cc-a0ca-50276ebe4f67", - "part": "whole" - }, - "id": "76aa6de2-e5e4-45f7-a2f8-5e51b92fc31d" - } - } - }, - "e2dc3e5b-76e4-4f27-8a5e-8093b1c578ea": { - "id": "e2dc3e5b-76e4-4f27-8a5e-8093b1c578ea", - "prev": "4c88b7ff-ab7b-4376-82a2-82f8fa5e18bc", - "regions": { - "407e6681-74ca-4d17-901b-a8b2f39d28c7": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "f769cb44-ca59-43ad-a0b6-29e394f2557e", - "part": "whole" - }, - "id": "407e6681-74ca-4d17-901b-a8b2f39d28c7" - } - } - }, - "e5c3df08-d8a0-4ae2-9617-e744190a7c35": { - "id": "e5c3df08-d8a0-4ae2-9617-e744190a7c35", - "prev": "3f660f13-9fc3-4dd7-baca-629a5a2cb147", - "regions": { - "47d173ad-cd7d-4931-87cb-eb33bd704e54": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "39a5aee6-7760-4a9e-a5e3-dee77330a042", - "part": "whole" - }, - "id": "47d173ad-cd7d-4931-87cb-eb33bd704e54" - } - } - }, - "ecc2c9e1-d47a-4fce-bd5a-263e42e4da86": { - "id": "ecc2c9e1-d47a-4fce-bd5a-263e42e4da86", - "prev": "922e60da-fa80-452b-8260-7c00ca4bb1f5", - "regions": { - "af52f853-6f2a-4c63-9451-2d6c3805ad7d": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "d9befd83-b685-483d-b30d-2a3847948ca5", - "part": "whole" - }, - "id": "af52f853-6f2a-4c63-9451-2d6c3805ad7d" - } - } - }, - "eef34a4c-a48f-4a2c-baec-2f5a43ce4d65": { - "id": "eef34a4c-a48f-4a2c-baec-2f5a43ce4d65", - "prev": "6992f9b3-1914-459f-bcfd-b5f41ee1a69f", - "regions": { - "0c593a45-0474-4ea8-a05d-a74d3f5648ac": { - "attrs": { - "height": 0.8, - "width": 0.45, - "x": 0.05, - "y": 0.1 - }, - "id": "0c593a45-0474-4ea8-a05d-a74d3f5648ac" - }, - "db851132-184c-4809-b880-6acad76c89e5": { - "attrs": { - "height": 0.8, - "width": 0.45, - "x": 0.5, - "y": 0.1 - }, - "id": "db851132-184c-4809-b880-6acad76c89e5" - } - } - }, - "f630add5-f257-42b1-882b-680cdb6a54df": { - "id": "f630add5-f257-42b1-882b-680cdb6a54df", - "prev": "849937ae-4396-4f8f-bb05-c5d7c75bca4a", - "regions": { - "33244afb-06ee-4315-b1fa-0cf05896758b": { - "attrs": { - "height": 0.8, - "width": 0.8, - "x": 0.1, - "y": 0.1 - }, - "content": { - "cell": "ffa06d72-354c-45f8-95d8-95d411e89091", - "part": "whole" - }, - "id": "33244afb-06ee-4315-b1fa-0cf05896758b" - } - } - } - }, - "themes": {} - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} From f9b4871875f72164e9f7d052ee180b2f7a6ea44d Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 16:28:46 +0200 Subject: [PATCH 087/196] Removed unused function --- nearest_correlation_matrices/generate_img.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/nearest_correlation_matrices/generate_img.py b/nearest_correlation_matrices/generate_img.py index a16e400..2a74027 100644 --- a/nearest_correlation_matrices/generate_img.py +++ b/nearest_correlation_matrices/generate_img.py @@ -8,11 +8,6 @@ # Set the data folder path data_folder = Path("data") -def read_matrix_file(fname): - with open(data_folder / fname) as fdata: - a = np.array([line.split() for line in fdata], dtype = np.float64) - return a - def read_data_file(fname): with open(data_folder / fname) as fdata: for i, line in enumerate(fdata): From bec859f667d3f3bac0f39b2da4e1283dbde7d083 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 16:29:28 +0200 Subject: [PATCH 088/196] Made dataFolder final --- nearest_correlation_matrices/NcmNag.java | 2 +- nearest_correlation_matrices/output.txt | Bin 4334 -> 8672 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/nearest_correlation_matrices/NcmNag.java b/nearest_correlation_matrices/NcmNag.java index 961c7b2..70c6ebe 100644 --- a/nearest_correlation_matrices/NcmNag.java +++ b/nearest_correlation_matrices/NcmNag.java @@ -14,7 +14,7 @@ public class NcmNag { - public static String dataFolder = "data"; + public final static String dataFolder = "data"; public static void main(String[] args) { // Initialize our P matrix of observations diff --git a/nearest_correlation_matrices/output.txt b/nearest_correlation_matrices/output.txt index 08a1ffe55a003ad9b136be9d5487a45c55f90cd7..66156a58f1edaa5e3c6476f729c8f9cf934b0b27 100644 GIT binary patch literal 8672 zcmeI2-ELe(5QOI%iFeo+AoA|oUN0}e9XBAvtpP(K@+aGnJU!6gsjYO+%(2KHN-of9 z9dCQ4Pfc}oPtR=r{_FepxZSi(yKXPzb=zLF*X>Dr7N74I`_Eyyjn_?ky4aq?=jSnA zBW`2t>-J^)A}pJ>ZI9a7>BZ--;`c{w-*)XHe#5d^EZcS!uWhkhv_re>#^C3&oiAhL z=Q3vSO3!C8YuAn0#*?nvF~$hf8iEm}Fzw=b=P@@?;&~q!(sCYS@Sm1lAlP@fck%bj z1p%X2|M`Lu+~x`E%t4P}M5&c*Pi!Uvc$+a{V@xs!Q#tDx$l$lfG)JLwu!dknsTIS> z`6*JeoW-YI$0f17IAO{tZDVGSsp`Odj!~F7=n<@=yj++QD~aG33|F4`JnE?`QJB_r zAXMpVjRWH3xU8du$>WJIbYc3d5D)Av5tVf~ephqyGG;_z$JWhhQNy5tN6Ru@CQf7H*>JI=6|x5%GPz z@$8j+8(6QGs(cr9dec5emFAh&Vpb@$&r8Z97ivX3iy4<4FGPlV&m3ukIzvR$B37~@ zT0<2cp>=c^2y+!cwrTs?wE%9>IuGE8+QO zMSc#8@45$4F?c5{sOhT11RfafF`3!FWs zsss6&qp-$7MX-)iyPKFZ0(yrU&8t`i8Z#!1t4j2WXB}h|9_E1k)v;SgNsT;2R8mho zol4eYs<~iHsYKzPb+8tNk%Jz=h*F-<7nHff%9`0Y=YlP%L}zvCAjdcgwj>9hl?WKq zqjYV1mn!{ZSEbP}FMMY-N6WrMQ+19WPW4H%$lYUbB|o4%#NW4Xas>-jE-h4Pa-Pbq zh_jmasnVO+hwfr$dLDbzX6eUY#lP3_nLUd-&rbDh>A_!}_OQpX2WWLF&W-znR@4b!>b{WtOGGTM`4YFx~r|Dq{d%_@8k*QvgQ&cVhJne$$Xv# z`abF~H(L5A%p6n%V_nMi(*yR*9hR)`G1Xj{m1x|f4(2G#9HP9I) zC|Rc{qdbI#aeNkTG9{no8n3+cO87hap?{=3Cb$XOrD06A;qTjrWPn-Bn_bBhygVqjc zz6s@o+jmKvFLeXrT}Jo3x~tQ^qqCK&zIQ#kbowtvM^^QqM$qq1#Fc8^cYw0!4oGUi zq7$x92^w>?SaXc-8R{5%Cf$8oG0dDf=n;%4y*~CdcYyfO8N1$K(na7MOq!+hWyPe^ z-Q0tYQJ~wT2TEVM=`ey3rMcvkUlC~6^DJD+mQ_TfqqLKCB?4ykD8a=0zwbf8 znd+hA&zoLpj`cbZK#59-on~R7f{}HyxChnQ*DHCy`c4hMk8l4rao^3ic)As*&R@q} zgKr>yipu{Y?j3$V#d2iRjQ1ydRyWr)s#UIzF=W9-jAV7z4xA|KWMPEw)@0%KPy0jF zSC62NIsSQGUsZ*Yo1S_y!Vjk?F|JvxrLU?~c1MLV`*@LI*1VoKbI>CgQF?u_V2WtpMl;)D}N3C9-r<0j5X$-OTO5~aPty=`e zPUET$WSOI|#z94}j*?yi7E)o{qV#!)y0ouVJ;8{T=oPQ&z)|o@$l#uXL@;NMXQ7^| zFz%Ce^IkF4Trj3oq8Mf+y$;r*FmiAfa}vSGr95*>s@tTBDYMa8mbqX{D$#kKI><4O zf-T8`XC(s0^eDl^`@`xwO2oI=)%O#9E#SVR&wTdCYT+g!zyARxT^fwbGZu~TZb)4x v0@~MD#Sd@3lk_)|d`I~*>h*Pa;s0aY$35_E^yAcRzN=JK0RMjB0WbdmoM$NR literal 4334 zcmds5%WfPu5WEY}Kgf?PM&*ji+@E38(QK0j66Bxe*O!X&u_)~Uha z7OSftZ0ghfJnbJJFXz|8!~Qx?pU;=eeB56T=hK9R%i;C*W}58I;BT5fn4NbK#$HXF?Gq7km;UnAldbS8P{O)lV*1BCQ!T zfDVa6ENII1oCZ?D3O*&9oqVd`+mMC}%3uNLkT}g79L!^lb;>e@2qbaInueqrVApVA zFlYcP$dm>^^~$OGu9J!gBsVkw)L$3~zz7e?g{t1gieRYX8U-SWh-(d2E;I%WptGcR zwfKf4VWb9uQJ^6r4h>|5F3=DL@`(T=iEeLhZ+44(utM~@7H0u_3}@Vn?^1l`-4pXdE$e!6Z*X=_z8q;#Y1 ztA^OPq+DWULXlK*n%kfviAaSMple2@O{)^;TFip&NnV_u=Bib%f+?k?&tT91IwTIU zfmDE6}yp>>4gC3>07m ziE;xu0+c3d$w@e2O-1CvLj!T)4Fdsqo6@-_lX@9yy&L5v2PSXo2?EZ=m8=82lS~RepR8nmTPG3Ufmf zZ|yOdR=#Lpnr5y*cG23Q(Qj$uDto5?{GH2D(-TcxSI~c?%`rH+x!?jBFt%Pwtp}a} zQYrXkN>wVc#&$&&!@j{|R09~pg@u8Z+6pqosHeHyLRxanO{ZiiA`c!KbQcB#1$dkB zom>v06A4Qch$JFnWoR&57!1(F>0M`u%^{*8Y3wA7BMLM`L=lV{a7A385y?O@o&W># z@0&O?9=}6JQGFM~H*A{-i9IQEUI5FSEm!QWRQVM%Uhcu$8*7M#+2ea-klAAVKasXD z-?E2k+k^ezj2|6oLl2#g^TT|)et0=N&F^(kZ9vNy>|0AR4g&~F1~V__9@cJZ!vijx zKHgzKCBTRpdsCkfFab${;KF5ru;$yih3igNa9eE|gG0NxaAWI$>9W;<2KS{R;kp|g zw7cMh0hnXxU<+Qew7yMe2D65gv0+!oW=v<|9m`)dfH7QH7zn@`GR4$7XffI?(SCa0 zQxV^2&|N@VXbc2k4T&pXy~B;&`<_ODNFpK#4-L|Ap)+Uz-EnNjmEY$*2_s#XD9{iQ zhX%4j7ib6reiDG8<-h8nS-Uf42K6qLqT$IFZy91&gbs$x40Qb6e1ADy@24+^SB&Dv zd4IKCB1h+ zopZLQs*`~T=li-P*Za7UtVn=ETziIw+TNAfjrn-EpbSV@0oE)7$34)+Wv1005da@UBQk zqCg}Ok=R{>#f8qmC_rb4&EDccp-2)&x+zhhAtI8lXdo+efrc>PCjs~;xz7JC008fa zmIb-BKFrCQ>p9E&$L^9#`kcf9kM%p_rCt2Wmn0vO`{U#Ne!9%p=gVon`v_cTj7Kf} E3HXI3 Date: Wed, 13 Jan 2021 16:30:08 +0200 Subject: [PATCH 089/196] Added link to QCQP --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb26580..5721b6a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This repository contains examples and demonstrations using the [NAG Library for ## Directory of GitHub examples * [Nearest Correlation Matrices](./nearest_correlation_matrices) -* [Quadratically constrained quadratic programming and its applications in portfolio optimization]() +* [Quadratically constrained quadratic programming and its applications in portfolio optimization](./QCQP) ## Examples that ship with the product From 18c4ff45f6da08e63b9ae51fbc07577439f56144 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 16:30:29 +0200 Subject: [PATCH 090/196] Added data files --- QCQP/data/abRisk.d | 1999 ++++++++++++++++++++++++++ QCQP/data/abRtn.d | 1999 ++++++++++++++++++++++++++ QCQP/data/b.d | 2 + QCQP/data/relRtn.d | 249 ++++ QCQP/data/sr.d | 2 + QCQP/data/tevRisk.d | 2001 +++++++++++++++++++++++++++ QCQP/data/tevRtn.d | 2001 +++++++++++++++++++++++++++ QCQP/portfolioOptimizationQCQP.java | 50 +- 8 files changed, 8297 insertions(+), 6 deletions(-) create mode 100644 QCQP/data/abRisk.d create mode 100644 QCQP/data/abRtn.d create mode 100644 QCQP/data/b.d create mode 100644 QCQP/data/relRtn.d create mode 100644 QCQP/data/sr.d create mode 100644 QCQP/data/tevRisk.d create mode 100644 QCQP/data/tevRtn.d diff --git a/QCQP/data/abRisk.d b/QCQP/data/abRisk.d new file mode 100644 index 0000000..0b9adeb --- /dev/null +++ b/QCQP/data/abRisk.d @@ -0,0 +1,1999 @@ +0.011926163415986946 +0.011926163701397948 +0.011926163676760753 +0.011925530557598013 +0.011674080365125086 +0.01121728551750263 +0.010560301503705703 +0.01012855287897341 +0.009838093993547129 +0.009589322407877082 +0.009397562119908286 +0.009253164816205679 +0.009134991046157738 +0.00902644419619397 +0.00893946979053034 +0.00886868852760429 +0.008810293065988253 +0.008761598450045493 +0.008705913707296177 +0.008655343713146859 +0.00861198579713324 +0.008568859640028913 +0.008528891235182343 +0.008493829822188633 +0.008462943209892795 +0.008432416250221814 +0.008385642275585102 +0.008343635279991492 +0.008305838186921337 +0.00827008328351682 +0.008237016173084422 +0.008207031466333578 +0.008179670102784413 +0.008154729104746418 +0.008131843257253071 +0.008110864159744132 +0.008091550589154664 +0.008073747305626213 +0.008057288833573999 +0.008042048806982156 +0.008027929448213959 +0.008014749161223118 +0.008002524229932114 +0.007990967580779553 +0.0079798141908701 +0.007969309592497751 +0.007959470551760404 +0.007950271729053241 +0.00794162139798833 +0.007933495770538385 +0.007925825771203746 +0.00791862994419346 +0.007911856109824918 +0.007905366090632148 +0.007899300779446441 +0.007893534278905942 +0.007888069039693182 +0.007882888535579743 +0.007877977634927187 +0.007873295139912613 +0.007868854425476158 +0.00786462972491168 +0.007860553588076502 +0.007856483396873873 +0.007852534243874339 +0.007848749001725105 +0.007845136455721944 +0.007841746259780473 +0.00783838310220677 +0.007835283103288028 +0.007832186646048645 +0.007829293799146028 +0.007826482298339583 +0.007823295277985708 +0.007819895373694884 +0.007816750885063947 +0.00781357704628661 +0.007810546348967067 +0.00780757247402246 +0.007804786794686767 +0.00780210086870595 +0.007799509934319902 +0.007796989942858598 +0.007794581615529801 +0.007792286354012768 +0.007789996916475538 +0.0077878297534425146 +0.007785769707694571 +0.007783740586104103 +0.0077818363883672 +0.007780052908682804 +0.007778311168832208 +0.007776648003497854 +0.007775036458533939 +0.007773482730523476 +0.0077719782442381685 +0.007770511404906637 +0.0077691042068596975 +0.007767727770116548 +0.007766394679046213 +0.007765103923513283 +0.007763851778699699 +0.007762646184791341 +0.007761449367745483 +0.007760396457787946 +0.007759275351666269 +0.007758263374005804 +0.007757271113455812 +0.007756326848466427 +0.007755470401986794 +0.007754508975747878 +0.007753690464915893 +0.007752801035996662 +0.007751982937949611 +0.007751166168925831 +0.0077503951156754685 +0.00774962371135485 +0.007748875903438614 +0.007748156016098186 +0.007747446605121427 +0.007746759608737894 +0.007746096268229604 +0.007745436416782302 +0.00774479153094264 +0.007744166150291947 +0.007743563607792996 +0.007742968164090508 +0.007742384434349985 +0.007741817843980276 +0.007741258042536572 +0.007740718599166451 +0.0077401904687485045 +0.007739677810171705 +0.007739167058662003 +0.007738667788535709 +0.007738197446184663 +0.007737713584225385 +0.007737256228688853 +0.007736799874084591 +0.007736353550391289 +0.007735921971257961 +0.007735498685042023 +0.007735081009096461 +0.007734673729178147 +0.007734277128694752 +0.007733887168550139 +0.007733503863976333 +0.007733139857265122 +0.007732762579207698 +0.007732410676751138 +0.0077320523682233395 +0.007731707479134636 +0.007731367481820734 +0.007731033029959287 +0.0077307100695674594 +0.007730389393869391 +0.007730080636917491 +0.0077297783582088225 +0.007729466657583925 +0.00772917879312651 +0.007728888218088177 +0.007728595747617707 +0.007728317999713712 +0.0077280440559846005 +0.00772777235366867 +0.007727512076038479 +0.007727246308707655 +0.007726993715485305 +0.007726741204657753 +0.0077264947573943725 +0.0077262600066307875 +0.007726021582383338 +0.007725782017282607 +0.007725561855193268 +0.007725327424362141 +0.0077251027476568646 +0.007724882669637197 +0.007724677295347183 +0.007724462360619065 +0.007724258947007267 +0.00772405831549572 +0.007723852485756998 +0.007723649171880169 +0.007723464223223246 +0.007723268207581241 +0.007723086890551895 +0.0077229039436445815 +0.0077227139593473906 +0.007722532769680793 +0.007722358228145141 +0.007722182687002912 +0.007722015053838236 +0.007721852235827163 +0.007721678418070565 +0.007721515507062221 +0.007721356323175431 +0.007721198733988348 +0.007721042889462786 +0.007720889844257735 +0.007720738776363193 +0.007720594477472501 +0.007720446802519217 +0.007720299649822212 +0.007720157512642221 +0.007720020546065368 +0.007719879442167602 +0.007719748120109666 +0.007719610267978473 +0.007719476894547932 +0.007719351364738629 +0.007719218910423103 +0.007719092650389729 +0.007718967122764773 +0.007718845169749834 +0.007718728414250934 +0.007718605995612232 +0.007718490837788646 +0.0077183709974604974 +0.007718255870831177 +0.0077181419897646986 +0.0077180313553374584 +0.007717921264374651 +0.007717812992361775 +0.007717705594004569 +0.007717604443973625 +0.00771749822141848 +0.00771739351042562 +0.007717290785950796 +0.007717191006051694 +0.00771709618956562 +0.007716992826096041 +0.007716903510363228 +0.007716807476151762 +0.0077167083994982314 +0.007716622023821258 +0.007716528601776298 +0.007716440386231342 +0.007716348634576853 +0.007716175482254529 +0.007716084688455814 +0.00771600714090389 +0.0077159227838090256 +0.007715837628564189 +0.007715753664811916 +0.007715675707225123 +0.0077155961972993365 +0.007715516750523171 +0.007715433817239476 +0.007715361470394839 +0.007715284610013499 +0.007715209009967104 +0.007715136753918806 +0.007715062434245045 +0.007714989265851258 +0.007714918226144494 +0.0077148470105047285 +0.0077147783650141 +0.0077147109699723755 +0.007714640692976584 +0.0077145719049862985 +0.007714505358348125 +0.007714439636091349 +0.007714376411887692 +0.007714308868747499 +0.007714247605563098 +0.007714182634986979 +0.007714123889930576 +0.007714059560412676 +0.007713997218200621 +0.007713938866720729 +0.007713883336362443 +0.007713818942742234 +0.007713765304801228 +0.00771370265938812 +0.00771364623820459 +0.007713593192116689 +0.00771353592221541 +0.007713483361539299 +0.007713427528228108 +0.0077133742217294025 +0.007713321693962691 +0.007713264982046852 +0.007713213308983311 +0.007713164006061892 +0.007713109591156253 +0.007713058855957686 +0.007713009144460254 +0.007712957403931545 +0.007712908906754565 +0.007712863227106752 +0.007712810749170497 +0.007712765648283596 +0.007712716187186552 +0.007712671937369942 +0.007712623608616935 +0.007712577058873336 +0.007712539408421016 +0.00771249294882484 +0.007712447901348573 +0.007712401632831529 +0.007712360698021553 +0.007712312731823289 +0.007712273447891819 +0.00771222708658316 +0.007712190791988681 +0.0077121473879502135 +0.007712104796065042 +0.007712063930841175 +0.007712023217703631 +0.007711983228148061 +0.007711944231734024 +0.007711906839036034 +0.007711869578330966 +0.007711836319912938 +0.00771179805861536 +0.007711755695903543 +0.007711715056956674 +0.007711687681894836 +0.007711631048366654 +0.00771161527431368 +0.007711567443888162 +0.007711536496485407 +0.007711505114441724 +0.007711469063576164 +0.007711428680641234 +0.007711397640407886 +0.007711360393130337 +0.00771132773573758 +0.007711297839405225 +0.007711264282960889 +0.007711231806336071 +0.007711195499589277 +0.00771116646338958 +0.007711135713088962 +0.007711101188088584 +0.007711078603738246 +0.00771101008157886 +0.007710978173056317 +0.007710950132852461 +0.007710919287770177 +0.007710891647504272 +0.007710858407993839 +0.007710832169193703 +0.007710800965546735 +0.007710772977705067 +0.0077107432012208845 +0.007710716897216206 +0.007710686878158026 +0.007710661108018126 +0.0077106317843611705 +0.007710607213280974 +0.007710576871278833 +0.007710553367749955 +0.007710524378355408 +0.007710501456004667 +0.007710472559245811 +0.007710447418899052 +0.007710420177028507 +0.007710396707992798 +0.007710372049666533 +0.007710344393506193 +0.0077103249884657435 +0.007710296079359063 +0.007710272142167469 +0.0077102486352967296 +0.007710225530719475 +0.007710201793705383 +0.007710178397177427 +0.007710152276436176 +0.007710132197338422 +0.007710108011368111 +0.007710083140142076 +0.007710061049881108 +0.007710037926305686 +0.007710015916091545 +0.007709994706071426 +0.007709978581878998 +0.007709951405139866 +0.007709928011861717 +0.007709908192832704 +0.007709886622551848 +0.0077098656813746 +0.0077098442739454 +0.007709823747780752 +0.007709805556218832 +0.007709782373066501 +0.0077097634159912845 +0.007709743006440921 +0.007709722795776075 +0.007709702547837933 +0.007709682595197175 +0.007709663645414496 +0.0077096453648937266 +0.007709624979877395 +0.0077096058137543595 +0.007709587448658574 +0.0077095691766798854 +0.007709550521558293 +0.007709530839504439 +0.0077095118896439675 +0.007709493712979997 +0.007709475626749849 +0.007709458113089057 +0.007709440712675973 +0.00770942190662658 +0.00770940474993768 +0.007709388288379295 +0.007709369995428725 +0.007709352263565424 +0.0077093400702005046 +0.007709318782677757 +0.007709301510428598 +0.0077092817831125515 +0.007709268849938694 +0.007709254631056013 +0.007709244277593533 +0.007709218186341277 +0.007709203416648736 +0.0077091888584340275 +0.007709178159424164 +0.0077091572824888556 +0.007709148239273403 +0.007709123751038081 +0.0077091103295144035 +0.007709096033584042 +0.007709078761470504 +0.007709067481125579 +0.007709048927938186 +0.007709041501066614 +0.007709020377063713 +0.007709003423418051 +0.007708996269742408 +0.0077089747163365694 +0.007708961378932747 +0.00770894764546842 +0.00770894007662432 +0.007708916599216596 +0.007708904223854133 +0.007708889918738506 +0.007708877214886233 +0.007708861789994156 +0.007708855596915821 +0.00770883779544304 +0.007708831067732407 +0.007708807446249942 +0.007708797725053255 +0.007708782783865594 +0.0077087674066347815 +0.0077087549667965325 +0.007708744069467916 +0.007708731817980975 +0.007708717405495702 +0.007708707641636281 +0.007708692583009948 +0.007708691349791539 +0.0077086848448535035 +0.007708656579864779 +0.007708642544091475 +0.007708645065877332 +0.007708621220054379 +0.007708606950904632 +0.007708593471706289 +0.007708585404517283 +0.007708572226004613 +0.007708566339418241 +0.007708546370064174 +0.0077085365729511 +0.007708527596436452 +0.00770851892360688 +0.007708500983569558 +0.00770849142660197 +0.007708511451907712 +0.007708475676017976 +0.007708459848965351 +0.0077084451052251875 +0.007708436156367724 +0.00770842503076346 +0.007708414798106335 +0.007708407939039412 +0.007708410500976651 +0.007708382885656884 +0.007708391367138831 +0.007708401270511142 +0.0077083498470506 +0.007708340596328248 +0.007708329821838079 +0.0077083194745730735 +0.007708309466409734 +0.007708300591056432 +0.007708290182113189 +0.007708278342751044 +0.007708270382686759 +0.00770827309053699 +0.007708248925782302 +0.007708242718508157 +0.007708233129139171 +0.007708221359847823 +0.00770821472000514 +0.007708217880386503 +0.007708196547836733 +0.00770818597342855 +0.007708191126515379 +0.007708163567976373 +0.00770815437230381 +0.007708161018963829 +0.007708151575374128 +0.007708127246331161 +0.007708121054306954 +0.00770811395115717 +0.0077081033777664405 +0.007708095547154017 +0.0077080866620198975 +0.00770807687998826 +0.007708070044755339 +0.007708076188874208 +0.007708049194099685 +0.007708041786636095 +0.007708040804923472 +0.007708024282565019 +0.007708017162192811 +0.007708018349505603 +0.007708008191708712 +0.007707992539527976 +0.007707986598534004 +0.0077079804300166956 +0.007707980281356509 +0.007707958908608341 +0.007707950494974905 +0.007707945984617882 +0.007707935830727531 +0.007707926446350498 +0.007707920066857878 +0.0077079165299714465 +0.007707907079995039 +0.007707921330346069 +0.007707890967114611 +0.007707904020972006 +0.0077078782591211755 +0.007707864964832112 +0.007707860366854486 +0.0077078493213164545 +0.00770784490734512 +0.007707845974187735 +0.007707828560316765 +0.007707823893395243 +0.007707817857521753 +0.007707808878617195 +0.0077078020072461634 +0.007707791453787044 +0.007707786263254199 +0.0077078148154870844 +0.007707772438732065 +0.007707763315460878 +0.007707783836771552 +0.007707790891199401 +0.007707746847706967 +0.007707781127115312 +0.007707731373125611 +0.0077077251087343335 +0.007707720260500883 +0.007707743065040217 +0.007707703320156619 +0.007707696927551924 +0.007707691105661459 +0.007707733575620958 +0.007707677763513632 +0.007707698629839215 +0.007707665797585666 +0.00770768699067787 +0.007707705796336731 +0.0077076478998214975 +0.00770770304822703 +0.007707689988646851 +0.007707632015470658 +0.007707627086006134 +0.0077076259331155484 +0.0077076564258850505 +0.007707604608669998 +0.007707627176519446 +0.007707591910246683 +0.007707584382525009 +0.007707577607132878 +0.007707574388132336 +0.007707605037656125 +0.007707560572320927 +0.007707554149646661 +0.007707548691782341 +0.00770754821336179 +0.007707565872279838 +0.007707560184865014 +0.007707527931544322 +0.007707550682310536 +0.007707520648908693 +0.00770751308929117 +0.007707525952332773 +0.007707512723390131 +0.007707553360643299 +0.007707519920302285 +0.007707539527391662 +0.007707485977209722 +0.007707480567699155 +0.007707515824456782 +0.007707495923380793 +0.007707496253777834 +0.007707457576280889 +0.00770745581988307 +0.007707488839758269 +0.007707465062538392 +0.00770745339808899 +0.007707439523198579 +0.007707432939557411 +0.007707463697567677 +0.007707474965220603 +0.00770744286235896 +0.0077074275858385844 +0.007707410347240356 +0.007707410159011659 +0.0077074203435815655 +0.007707438761024468 +0.007707431138736828 +0.007707381951505141 +0.00770739221283499 +0.007707398914743749 +0.0077074123167755375 +0.007707370584143681 +0.007707341401032045 +0.007707383587578498 +0.007707338018414266 +0.007707347715945939 +0.007707328371258388 +0.007707375352080286 +0.00770731615164206 +0.007707308318480919 +0.00770730382684013 +0.007707348141475587 +0.007707300858557234 +0.007707355713701004 +0.007707354182504533 +0.007707313476784436 +0.007707316671731276 +0.007707273187275295 +0.007707275536833467 +0.007707264209082391 +0.00770731214673878 +0.0077072579930831135 +0.00770725045149058 +0.0077072531792928166 +0.007707245007025333 +0.007707290394621818 +0.007707239365358012 +0.007707276161131372 +0.007707235174338827 +0.007707239397094013 +0.007707259053549318 +0.007707225866804152 +0.007707225706919965 +0.007707261906388481 +0.007707199792613005 +0.00770726956431427 +0.007707227023146105 +0.007707194743040679 +0.00770724334636981 +0.007707187199720307 +0.00770717750704116 +0.0077071901149171175 +0.007707183130299398 +0.0077071833381331415 +0.007707230327988555 +0.007707156647326843 +0.007707162522656974 +0.007707163353705887 +0.007707156372187471 +0.007707144048205728 +0.007707159034316898 +0.007707133353245568 +0.007707178950797743 +0.007707131259495264 +0.007707135981736014 +0.007707192257110575 +0.007707117049384626 +0.007707122142198553 +0.007707129912396076 +0.0077071060879786565 +0.007707102709757025 +0.00770715941612714 +0.007707127433502076 +0.0077070875066763715 +0.007707091241718278 +0.007707085380035967 +0.0077071048234859645 +0.0077070775136320714 +0.007707076298123262 +0.00770712477324393 +0.007707099050692586 +0.007707113751104995 +0.00770706233519355 +0.007707056186081636 +0.007707089596478322 +0.0077071183881137735 +0.007707052851144226 +0.007707045188096725 +0.007707076646561142 +0.007707038421457226 +0.0077070755392388 +0.007707061400576576 +0.00770702779884385 +0.007707027047228747 +0.007707088933921609 +0.007707017969243155 +0.007707048578409883 +0.007707056246278699 +0.007707052895992309 +0.00770705227909003 +0.007706999538907748 +0.007706998163279345 +0.00770704431838065 +0.00770699400076218 +0.00770702979441713 +0.007707045493704552 +0.00770698302804263 +0.00770703748587592 +0.007706991834153286 +0.007707040890996503 +0.007707004683429357 +0.007706975679987035 +0.0077069680154166695 +0.007706968005638425 +0.007707006648784053 +0.007706968334014252 +0.007706957002025844 +0.007706989751062303 +0.007706995854350264 +0.007706946529829839 +0.0077069850051435925 +0.007706953293737485 +0.007706940294610062 +0.007706946136050833 +0.0077069922647791805 +0.0077069259321708005 +0.0077069265327000406 +0.007706961614357665 +0.007706924229909465 +0.00770693114654469 +0.0077069712149311015 +0.0077069221222929194 +0.007706964523177396 +0.007706953169884705 +0.007706950568883229 +0.007706934900804169 +0.007706905735998415 +0.007706899484101553 +0.0077069305737330895 +0.00770689729279877 +0.007706928417715089 +0.007706898538891867 +0.007706930358829732 +0.0077069372451027155 +0.007706881825231792 +0.007706886762868642 +0.007706935099712692 +0.007706887265210752 +0.00770692266308348 +0.007706905822976776 +0.0077068631629326366 +0.007706862508839491 +0.007706907930881896 +0.0077069043597871355 +0.007706910712754558 +0.007706874581187594 +0.007706863455177739 +0.00770688910176173 +0.007706889688576099 +0.007706883864970838 +0.007706865912797469 +0.007706875599441272 +0.007706847171970254 +0.007706887272888728 +0.007706835202048913 +0.007706884598892723 +0.007706882619074711 +0.007706854071466349 +0.0077068603746252035 +0.007706844837209573 +0.007706852650517018 +0.007706854098876422 +0.007706854709399585 +0.0077068639802722995 +0.007706803954418215 +0.007706840801910628 +0.007706830351709739 +0.007706848088375918 +0.007706828909869749 +0.007706851317457043 +0.007706842716082961 +0.007706790385308032 +0.0077067812131922896 +0.00770680960426388 +0.007706811682536227 +0.007706820837057719 +0.007706835280505267 +0.0077068155059984485 +0.007706773278777149 +0.007706770826442309 +0.007706804536915852 +0.0077067848413174865 +0.007706789892194032 +0.007706778681997647 +0.007706797639205906 +0.007706752386755651 +0.007706751790270759 +0.007706746903326943 +0.007706749540665038 +0.0077067367284925255 +0.007706782681880451 +0.007706791460393802 +0.007706732666037159 +0.007706730712999078 +0.0077067613299679726 +0.007706727317560921 +0.0077067226726615125 +0.007706723505051437 +0.007706718244977984 +0.007706713277982014 +0.007706754725296396 +0.00770674091495612 +0.007706748045245428 +0.0077067102905591135 +0.007706744310963874 +0.007706763493835869 +0.007706696108863547 +0.007706695795680425 +0.0077066971633102275 +0.00770669214144369 +0.007706686399946069 +0.007706724390880336 +0.007706687792663021 +0.007706678949922719 +0.007706711329957278 +0.007706727420398831 +0.0077067181203015886 +0.007706721913376955 +0.0077067348287414 +0.007706696483927561 +0.007706663990934552 +0.007706666812675657 +0.007706730362622028 +0.0077066648610180505 +0.007706661093124982 +0.007706696353291595 +0.007706684974523005 +0.00770668163596241 +0.007706651493580314 +0.00770665138529843 +0.0077066479116728185 +0.007706645007045166 +0.007706685528119414 +0.0077066420983465285 +0.007706671773809232 +0.0077066681665573485 +0.007706671927492982 +0.007706635001643918 +0.0077066302543092055 +0.00770663053818514 +0.007706626927652181 +0.007706627366411791 +0.007706656413743813 +0.007706618342630508 +0.007706616890942007 +0.00770663719976321 +0.007706651598947973 +0.007706613841566342 +0.007706652249080579 +0.007706611081986305 +0.007706609042976863 +0.0077066137220162265 +0.007706603201427461 +0.007706607323215441 +0.007706622231418505 +0.007706620999477118 +0.007706596831547341 +0.007706597710488965 +0.007706593043413824 +0.007706589886950509 +0.007706590538398632 +0.007706612172632635 +0.007706615531616944 +0.007706589757240932 +0.0077066135844316265 +0.007706600705645143 +0.007706598145959907 +0.007706609181276088 +0.00770657500881732 +0.007706573013501656 +0.007706570639108898 +0.007706569462158827 +0.007706569209035771 +0.007706591011837995 +0.007706563465103553 +0.007706565600631163 +0.0077066117828080505 +0.007706562210463732 +0.007706572601285383 +0.007706558215817364 +0.007706556785706685 +0.007706556966500255 +0.0077065879257078645 +0.00770654739285321 +0.0077065974283813555 +0.007706586501655626 +0.007706543655665657 +0.007706584476909422 +0.007706544601767368 +0.007706558964257081 +0.00770654151861158 +0.007706539152579088 +0.007706574324226263 +0.007706534955845071 +0.0077065344964500635 +0.007706551486230859 +0.007706533507174708 +0.007706556524057728 +0.007706523547723928 +0.007706548229472011 +0.007706522337726513 +0.007706519282696631 +0.007706524633713995 +0.007706521243477694 +0.007706516396108368 +0.007706514046929119 +0.007706514616991221 +0.00770651395785257 +0.007706508083525374 +0.007706527554089663 +0.007706529576940773 +0.007706530723938939 +0.007706505047632577 +0.007706507814992901 +0.007706499899678566 +0.007706518204961291 +0.0077065205502189 +0.007706522061284378 +0.007706496565697872 +0.007706511100554675 +0.007706510342429552 +0.007706493200512622 +0.007706487634579398 +0.007706501344970578 +0.007706491805460332 +0.007706494923446947 +0.007706501733962153 +0.0077064844039760935 +0.007706482401727338 +0.007706491676374482 +0.0077064793205615075 +0.007706481869929632 +0.007706484538978634 +0.007706472187811164 +0.007706477227710735 +0.007706473102309283 +0.007706480506968908 +0.007706486680616433 +0.007706467422388244 +0.007706466151941832 +0.007706479018364592 +0.007706467990723534 +0.0077064751212270145 +0.007706463802896971 +0.007706465838067311 +0.007706460354587267 +0.007706485533729597 +0.007706458866248151 +0.007706458045567901 +0.007706463623917023 +0.007706449294699777 +0.007706448583969234 +0.007706450024635159 +0.0077064455664347005 +0.0077064499320937925 +0.007706448141405691 +0.00770644639275436 +0.0077064456718103965 +0.007706443538270495 +0.007706441852617058 +0.0077064440542065375 +0.007706456348873818 +0.007706434836251647 +0.00770643784465212 +0.007706434424635626 +0.007706434298115467 +0.007706440544303447 +0.007706437181927633 +0.007706431735101488 +0.007706427111154171 +0.007706433750799175 +0.007706425635475385 +0.007706436473864906 +0.007706423347011651 +0.007706426747160721 +0.007706427113242527 +0.0077064161911253115 +0.007706416056945038 +0.0077064254827689865 +0.007706429188389053 +0.007706414475584163 +0.007706421878711873 +0.007706417743876817 +0.0077064096346901685 +0.0077064129983779855 +0.007706408496183081 +0.00770641314815015 +0.007706402945712326 +0.007706407336744237 +0.0077064010782723884 +0.007706400152940805 +0.007706404421177755 +0.007706400015374788 +0.007706407855124325 +0.0077064113296103085 +0.007706396775949846 +0.007706395947023971 +0.00770639468097155 +0.007706389853295699 +0.007706391564179208 +0.007706397777437791 +0.007706402653867496 +0.007706390769139241 +0.007706387341005238 +0.007706382520422517 +0.007706404971312748 +0.0077063900169638926 +0.007706400102095393 +0.00770638441222489 +0.00770638589711873 +0.007706385012894493 +0.007706380622242704 +0.007706381624165768 +0.007706380160364598 +0.007706378979209118 +0.007706375195819152 +0.0077063767943058486 +0.007706384238795384 +0.007706371362437966 +0.007706367579192627 +0.007706365729692148 +0.007706372877185644 +0.007706366720453043 +0.007706371403431387 +0.007706362292089147 +0.007706369147553305 +0.007706362058708805 +0.007706376404952019 +0.007706361157661216 +0.007706361583975829 +0.007706356461681188 +0.007706362211012958 +0.00770635670981032 +0.0077063550719990714 +0.007706370089144967 +0.00770635552419574 +0.0077063530084676484 +0.007706348802087685 +0.007706354192102791 +0.007706361492318232 +0.0077063533895916254 +0.007706352392388497 +0.007706345784496607 +0.007706351153504946 +0.00770634967966568 +0.00770634155894212 +0.007706343709476256 +0.007706343741015879 +0.007706340805911608 +0.00770635106497464 +0.007706339091639373 +0.007706337309892763 +0.0077063363915812816 +0.007706337650912989 +0.007706334804572801 +0.007706333561268215 +0.007706333164796942 +0.007706332355610473 +0.007706328788327017 +0.007706329185845115 +0.0077063261848433085 +0.00770633056405543 +0.007706328405531819 +0.007706329907854002 +0.007706326464270412 +0.007706322571815517 +0.00770632236874532 +0.007706324252028074 +0.007706320590012817 +0.00770632088627205 +0.007706322757966159 +0.007706328065062563 +0.007706322046522247 +0.007706322339268629 +0.007706313354254265 +0.007706315104662113 +0.007706314348602495 +0.007706316405590273 +0.007706315989015793 +0.007706310754332103 +0.007706309341867433 +0.007706325241268262 +0.007706306539478001 +0.007706316089503567 +0.007706308347996019 +0.007706305206817185 +0.007706304535565108 +0.007706307406448154 +0.007706305836864838 +0.007706302378608636 +0.007706305645494918 +0.007706306341893041 +0.007706301952251589 +0.0077063047191788785 +0.007706301774703707 +0.007706303542783823 +0.007706298094362477 +0.007706308155365335 +0.007706294754346931 +0.007706294399209689 +0.007706289617355156 +0.007706289292586338 +0.007706288848701482 +0.007706292186589424 +0.007706293325837793 +0.007706307095137007 +0.007706285992825252 +0.007706290769350048 +0.007706300163382788 +0.0077062924512553655 +0.007706289569919758 +0.007706291965432623 +0.007706296754705888 +0.0077062847056037775 +0.007706286700755181 +0.007706286699261747 +0.007706274678951409 +0.007706286047152951 +0.00770627789633306 +0.007706280434117026 +0.007706284703176259 +0.007706292512300846 +0.007706271393329353 +0.00770628278119276 +0.007706277330077052 +0.007706289412185254 +0.0077062690701999535 +0.007706272610132794 +0.007706274332923051 +0.0077062676819539015 +0.007706274195215762 +0.00770626800032083 +0.0077062710978830955 +0.007706266289676755 +0.00770626964292055 +0.00770627191747147 +0.007706260702854939 +0.007706261503225621 +0.007706282844414089 +0.007706258457071171 +0.00770626023904188 +0.007706260917287779 +0.007706257282351087 +0.007706265040401899 +0.007706254167778397 +0.007706257426749707 +0.007706260731532271 +0.007706256360160409 +0.007706262106953254 +0.0077062606329284964 +0.007706255062999867 +0.0077062679838927825 +0.007706252293190223 +0.007706253984839243 +0.007706264588947744 +0.00770625086620282 +0.007706246643086873 +0.007706258088682212 +0.007706251520327336 +0.0077062498947291546 +0.007706262973109486 +0.007706248722508156 +0.007706246332440407 +0.007706245378245628 +0.007706249910087806 +0.007706248105901022 +0.00770624007981412 +0.00770624185518907 +0.0077062465152705605 +0.007706235730693837 +0.007706250776677238 +0.007706238513432849 +0.007706236774762517 +0.007706236913800705 +0.00770623338070137 +0.007706245089539237 +0.007706232833272231 +0.007706236322815029 +0.007706242380420042 +0.007706236368433491 +0.007706231024226703 +0.0077062387994325954 +0.007706242511244869 +0.007706238956818107 +0.007706245558722718 +0.0077062259938448854 +0.00770622579702638 +0.007706236362322038 +0.007706223911313915 +0.007706223135894043 +0.007706223207169627 +0.007706225499543847 +0.007706222860622891 +0.007706228995959195 +0.007706231385922001 +0.007706217975549774 +0.0077062276134599855 +0.007706215281253558 +0.007706227254235544 +0.007706226119081009 +0.0077062237922428875 +0.007706223798816852 +0.0077062188325974215 +0.007706213466137924 +0.007706221181862307 +0.0077062170536035006 +0.007706217825068946 +0.00770622375404599 +0.0077062170210809135 +0.007706214165308064 +0.007706213319083608 +0.007706211976733457 +0.007706208935416227 +0.0077062102280217966 +0.007706217067424759 +0.007706228408103084 +0.007706210346968176 +0.007706223444194523 +0.007706212175512852 +0.0077062065902840995 +0.007706215390028558 +0.0077062052017995136 +0.007706207816733131 +0.007706205255732553 +0.007706199974565885 +0.007706220438367542 +0.007706197893908521 +0.007706211055067244 +0.007706206268417404 +0.007706198655457005 +0.007706198520250684 +0.0077061985806595994 +0.007706197554393923 +0.007706196183181562 +0.007706199168908334 +0.007706191365374331 +0.007706191214523471 +0.007706206118464583 +0.007706193504198433 +0.00770621686031729 +0.007706193756815735 +0.007706211508016062 +0.00770619819885097 +0.007706190611239469 +0.007706197280519436 +0.007706188754254101 +0.007706195095518382 +0.007706187966491273 +0.007706187297641512 +0.007706191809788106 +0.007706190080025724 +0.0077061932146046215 +0.007706207879019424 +0.007706189573809238 +0.0077061871285435445 +0.007706191389379017 +0.007706182983399724 +0.00770618701774628 +0.007706201834750034 +0.007706182124039874 +0.007706176975345437 +0.007706202527019787 +0.007706191473408749 +0.007706177411607155 +0.007706185489436463 +0.007706188657062196 +0.007706184257287391 +0.00770617913841306 +0.007706196785641848 +0.007706172993871549 +0.007706171968899522 +0.007706197361554096 +0.007706170846647779 +0.00770618161880122 +0.007706175917988705 +0.00770619700031484 +0.007706174841709865 +0.007706182544292026 +0.007706179938667809 +0.007706172168910831 +0.007706179199498296 +0.0077061782472325115 +0.0077061686522869495 +0.007706171891872565 +0.0077061731780708395 +0.007706190358610292 +0.007706186250711531 +0.007706170072157166 +0.007706169954986999 +0.0077061613971263045 +0.007706171163459518 +0.007706172356636129 +0.007706175943226469 +0.007706164650337955 +0.007706163689844754 +0.007706185254679431 +0.007706162126594187 +0.0077061629944447695 +0.007706163631004021 +0.007706160649023667 +0.007706167377178077 +0.007706156456552732 +0.007706161146004058 +0.007706161613830867 +0.007706170113062524 +0.007706158546952043 +0.007706166382812546 +0.007706177478972763 +0.007706168058048644 +0.007706155929470064 +0.00770616499831929 +0.007706165267479409 +0.007706163824955365 +0.00770615597373034 +0.007706147988077059 +0.007706148077182327 +0.007706175429921349 +0.007706156187833121 +0.007706171076864715 +0.007706170380095277 +0.007706145555073604 +0.007706159273133343 +0.00770615554579022 +0.007706150707887828 +0.00770614928168216 +0.0077061546267815865 +0.007706148771743113 +0.007706154942125143 +0.007706155859878512 +0.007706146227070394 +0.007706138327339104 +0.007706154611974608 +0.007706143565975907 +0.007706145887720153 +0.007706148933644562 +0.007706140536742945 +0.007706143749990727 +0.007706138406374727 +0.007706135327942387 +0.007706142499336357 +0.007706146370640595 +0.007706162654136605 +0.007706140617287302 +0.007706139472555966 +0.0077061468948310926 +0.007706138754963826 +0.007706140675738435 +0.007706145067922522 +0.007706146722662043 +0.007706148022536652 +0.007706146961583778 +0.007706135328861318 +0.007706139217290005 +0.007706131073338864 +0.007706139920315818 +0.007706144113456581 +0.007706136681450526 +0.007706149293949404 +0.007706130504377815 +0.007706131648331023 +0.00770613184356502 +0.007706134266211455 +0.0077061365732189226 +0.007706136415020896 +0.007706136747926081 +0.0077061291762046185 +0.007706134440694583 +0.007706130451481512 +0.007706137790999552 +0.007706126736858164 +0.007706136638196564 +0.007706146803115373 +0.007706124249647963 +0.007706145217019778 +0.007706144936608004 +0.007706126747720977 +0.007706126024531195 +0.007706122227023552 +0.007706124350909918 +0.007706133064811418 +0.007706122057707449 +0.007706122369802937 +0.007706140387851207 +0.007706143116139709 +0.0077061299101603324 +0.007706133523377585 +0.007706122175429447 +0.007706115536550079 +0.007706114266632648 +0.007706116291162249 +0.0077061265208653576 +0.007706125361447918 +0.007706119390933873 +0.007706119040347872 +0.007706125549193171 +0.007706122597496084 +0.0077061143135452636 +0.0077061250133159225 +0.0077061176560531165 +0.007706116147878128 +0.007706119315516554 +0.007706122456827728 +0.007706114414236583 +0.007706115667044696 +0.007706111474526074 +0.007706107712069689 +0.007706133069235972 +0.007706111341028248 +0.007706121470074305 +0.0077061114193850986 +0.0077061191986710995 +0.007706120588127091 +0.0077061043354166355 +0.0077061114700552255 +0.00770610403851565 +0.007706108995889872 +0.007706115112264117 +0.007706127086639221 +0.007706105682207014 +0.0077061173470616435 +0.007706102584798094 +0.007706116797739679 +0.007706127372852944 +0.007706107705967514 +0.007706099318514843 +0.007706113438247567 +0.007706107098706759 +0.007706113972474701 +0.007706103921771109 +0.00770610499455364 +0.007706104134928326 +0.007706100211206677 +0.007706111190685634 +0.007706101152083984 +0.007706100383206996 +0.0077061111451300615 +0.0077061064023711155 +0.007706114503325652 +0.007706108632928622 +0.007706094440049854 +0.0077060983017172395 +0.007706118460597631 +0.007706096864724904 +0.007706105727981319 +0.00770611435975005 +0.007706107323889981 +0.00770611662505154 +0.007706115038017729 +0.007706097546721824 +0.007706102500904 +0.007706093927960177 +0.007706100002602944 +0.007706087642585049 +0.007706089621497085 +0.007706093136913096 +0.0077061168225518685 +0.0077061000579195845 +0.007706100502615768 +0.007706101712229118 +0.007706108284271416 +0.007706102179136032 +0.007706098264326104 +0.007706086815500042 +0.007706089474890569 +0.0077060899635697875 +0.007706087649065128 +0.007706083858891937 +0.007706097946941801 +0.00770608875015241 +0.007706082411665999 +0.007706101158691411 +0.0077060810620198155 +0.00770608807369422 +0.007706095684005756 +0.007706084549562804 +0.0077060902433177736 +0.007706082073391041 +0.0077060970710279494 +0.007706112377329747 +0.00770608455459924 +0.007706083612182168 +0.0077060846392185915 +0.007706091838723964 +0.007706082678773367 +0.007706104966721604 +0.007706090316738046 +0.0077060802526370525 +0.007706103414148548 +0.007706082563945393 +0.007706092135438684 +0.007706082318067911 +0.0077060815785265765 +0.0077060905735037025 +0.007706081426150886 +0.007706086619490168 +0.007706088171565989 +0.0077060742438820615 +0.007706076203474758 +0.007706078313554216 +0.007706080206444607 +0.00770608069747153 +0.00770607391114382 +0.007706070752149584 +0.007706078204748281 +0.0077060756050699565 +0.007706085186136955 +0.007706084414790945 +0.007706082310270748 +0.007706073640543879 +0.007706082118068525 +0.007706066576365562 +0.00770607082608029 +0.007706097633562664 +0.007706074582368075 +0.007706065734373925 +0.007706086376830964 +0.007706082075135023 +0.007706080842410721 +0.007706073805221618 +0.007706082813514506 +0.007706065908412966 +0.007706069126134616 +0.007706080198930628 +0.007706082959239288 +0.007706071659095464 +0.007706103193099956 +0.007706063045788626 +0.0077060899020171434 +0.007706075949752443 +0.007706068045276684 +0.00770607722162684 +0.007706067020882098 +0.00770609012800747 +0.00770606593674308 +0.007706060134948732 +0.007706068850382128 +0.007706075908696143 +0.007706079544326892 +0.007706066054903349 +0.00770607258258662 +0.007706075798027345 +0.007706060771773617 +0.007706073866115742 +0.007706080658444374 +0.007706074139437458 +0.007706074604519333 +0.007706061812858037 +0.007706056178493607 +0.007706064137528941 +0.007706069663305546 +0.007706062644327142 +0.007706056569700293 +0.007706069244416647 +0.007706071957448559 +0.0077060639299596796 +0.007706070686052287 +0.0077060616924457545 +0.007706053808483116 +0.007706087731504307 +0.007706083286780825 +0.0077060856385692735 +0.007706061063637384 +0.00770606051402821 +0.007706081548298626 +0.007706071068240302 +0.007706084471550379 +0.007706084929098221 +0.007706065478598602 +0.0077060666960257155 +0.007706065768998778 +0.007706066447092501 +0.0077060662664582185 +0.007706066907149533 +0.00770605450311268 +0.0077060538011593386 +0.007706057353338746 +0.0077060656381490265 +0.00770605371397104 +0.00770605457509912 +0.007706057213941814 +0.007706052047096626 +0.007706077076084056 +0.00770607110830823 +0.007706061978045859 +0.0077060542392788116 +0.0077060642495994265 +0.007706063093324225 +0.007706050963436776 +0.007706075736632411 +0.007706051508255297 +0.007706050904587301 +0.007706059937953244 +0.007706059721522373 +0.007706050906568778 +0.007706061118319325 +0.007706058768830314 +0.007706056836586655 +0.007706074434572978 +0.007706060554984538 +0.007706058128736263 +0.0077060686175018595 +0.007706059892515527 +0.007706077258012066 +0.007706048185210907 +0.0077060711401919805 +0.0077060477861285274 +0.007706040851229952 +0.007706072313220807 +0.007706057616470471 +0.007706073445072197 +0.007706055251654082 +0.007706041309021795 +0.007706040833449919 +0.007706042972701715 +0.007706045038305246 +0.0077060451887206284 +0.007706045727744646 +0.007706065379674858 +0.007706038976273558 +0.00770605150317855 +0.00770603648410957 +0.007706052522867961 +0.007706040381474126 +0.007706052790824271 +0.007706066639782334 +0.007706042645616047 +0.007706052745413861 +0.007706051913969594 +0.0077060408084759285 +0.007706066650834524 +0.007706049689827638 +0.007706047854963755 +0.0077060474081261255 +0.007706051488034257 +0.007706049272641004 +0.007706057869412325 +0.007706051133179988 +0.007706046274204822 +0.007706049480843534 +0.007706038546874867 +0.007706053739232287 +0.0077060506038488154 +0.007706035553004073 +0.0077060479613694005 +0.007706037668269742 +0.007706037051609665 +0.0077060420042272225 +0.007706046295453546 +0.007706056254065687 +0.007706036993497015 +0.007706064935421951 +0.0077060609853844666 +0.007706033688887979 +0.007706037696865027 +0.007706026200925557 +0.007706036600740928 +0.0077060345268678615 +0.007706046478333397 +0.007706034942221085 +0.0077060258825139135 +0.00770606197309922 +0.0077060403723763484 +0.007706047244760842 +0.007706037405112774 +0.007706036261047973 +0.007706057553686219 +0.007706041329515444 +0.007706032477340273 +0.007706033080481031 +0.007706041055685782 +0.00770602959776426 +0.007706033058942296 +0.007706060535787447 +0.0077060374059692025 +0.00770604000255761 +0.007706039340763226 +0.007706037844003287 +0.007706037254234973 +0.0077060453350636555 +0.007706058024539624 +0.007706054400356908 +0.0077060209918617594 +0.007706027617344322 +0.007706036068994057 +0.0077060390028521955 +0.007706025186285173 +0.007706027897755906 +0.007706029395000063 +0.007706039630398324 +0.0077060250122048864 +0.007706026857281195 +0.00770602815287334 +0.007706028593288476 +0.0077060336474764485 +0.007706037629056966 +0.007706036073798358 +0.007706027469632192 +0.007706030471047544 +0.007706022272482625 +0.007706032694037422 +0.007706037241440054 +0.007706022087456656 +0.007706071548390315 +0.007706047823699316 +0.007706034000828181 +0.007706049797470524 +0.0077060483831666625 +0.0077060270295480375 +0.007706037827980268 +0.007706022648100138 +0.007706024060361443 +0.007706033388214668 +0.00770603951038312 +0.007706027744196462 +0.00770604197861597 +0.007706013663473227 +0.007706022152871414 +0.007706022522425384 +0.007706017380445955 +0.007706018797963012 +0.00770602804903023 +0.007706053671649564 +0.007706012879157213 +0.00770603383642487 +0.0077060356340177775 +0.007706026013616624 +0.007706068389395445 +0.007706025132788797 +0.007706036019017556 +0.007706021876853402 +0.007706017724453239 +0.00770604820991321 +0.007706021288043267 +0.007706025261510662 +0.0077060562267378336 +0.007706017207043028 +0.007706027758947168 +0.007706010682265053 +0.007706023252401918 +0.007706021063809313 +0.007706027311524242 +0.00770604319590935 +0.007706040567307392 +0.007706041168531121 +0.007706014005305832 +0.007706014182075684 +0.007706032703814064 +0.007706023192484253 +0.007706032491296051 +0.007706007208382509 +0.007706012881075802 +0.007706028137932287 +0.007706027243144926 +0.007706021054821427 +0.007706022728073641 +0.007706039220660553 +0.007706010837009349 +0.0077060268580690094 +0.007706044818317854 +0.007706011301278469 +0.007706029480475549 +0.007706009297476043 +0.007706017480610938 +0.007706008972044635 +0.00770600215349324 +0.007706003964369377 +0.007706003545795672 +0.007706020358482402 +0.00770602148039572 +0.007706021207195956 +0.007706031639345345 +0.007706017692561782 +0.007706051960024764 +0.007706010553760886 +0.007706001361462862 +0.0077060362833435495 +0.00770600803635123 +0.007706039004890285 +0.007706020822521763 +0.007706019108316173 +0.007706030548099409 +0.007706005386607106 +0.007706023745122408 +0.0077060367471650125 +0.0077060282904733894 +0.007706018155000269 +0.007706018055826728 +0.007706026002765047 +0.007706017213421723 +0.007706003366191363 +0.007706003541876253 +0.007706016939334558 +0.007706007607213052 +0.0077060025437268405 +0.007706049841022665 +0.007706003784189766 +0.007706016060549382 +0.007706048134156522 +0.007706016907448186 +0.007706005784929594 +0.007706018930238741 +0.007706022920464555 +0.007705996455290405 +0.007706014848948391 +0.007706049384012027 +0.007706019240856801 +0.007706028487409283 +0.007706002912360325 +0.007706000104390647 +0.007706026295007335 +0.007706003956979822 +0.007706009380386131 +0.007705995874246846 +0.0077060073889326 +0.007706002109255947 +0.0077059948035548284 +0.007706012677225246 +0.007706001723011752 +0.007706019264458641 +0.007706048745923762 +0.00770601719700921 +0.007706027288062212 +0.007705993307789939 +0.007706008430031336 +0.007706006445671006 +0.007706045718624511 +0.0077060219396742815 +0.007706021803423926 +0.007706010623515112 +0.007706013431185035 +0.007706004915343907 +0.007706010492837497 +0.007706009670888043 +0.007706035561072795 +0.00770604180276293 +0.007705999620600234 +0.007705989208557947 +0.007706012645021536 +0.007706040374786013 +0.007706020789500301 +0.007706011042197169 +0.0077060232422681155 +0.007706012302901573 +0.007705999658253474 +0.007706008416542698 +0.00770601146298469 +0.007705998365634314 +0.00770599382315022 +0.007706013505983516 +0.007706036164459044 +0.00770599074149827 +0.007706026059354053 +0.007705991884366489 +0.0077060023702139584 +0.007705992564013738 +0.0077060113727841035 +0.0077060131432824626 +0.007705990336783446 +0.007706005544747596 +0.007705991715037487 +0.007706010184364022 +0.007706010236979309 +0.007705991851284223 +0.007706015971549596 +0.007706050031836812 +0.007706009662600407 +0.007706045847776089 +0.007706012852022896 +0.007706049928022956 +0.007706021798996728 +0.00770599959615425 +0.007706030216861537 +0.0077059949075492466 +0.007705999974182551 +0.00770600968938446 +0.007706006355505738 +0.007706002671713694 +0.007706045640753541 +0.00770599425936757 +0.007705995568910119 +0.007706020621946178 +0.007705984217842417 +0.00770602439092121 +0.007705999667109097 +0.007706036199322391 +0.007705992146481572 +0.007706010611679647 +0.0077059913424315975 +0.00770603572683087 +0.007706005430590182 +0.0077060168100932845 +0.007706006345884817 +0.007705987030909562 +0.007706021418439002 +0.007706000471444679 +0.007706013969759604 +0.007706044477474904 +0.0077060090171536455 +0.007705999114932962 +0.007705987236967463 +0.007706044775205438 +0.0077059807122333455 +0.0077060199313406155 +0.00770603723605232 +0.007706011495926243 +0.007706017402852711 +0.007705994048710257 +0.007705985300660655 +0.007706009594986249 +0.007706031063545595 +0.007706022992050094 +0.00770601741999221 +0.007706032271934948 +0.0077060429879955514 +0.007705981414279617 +0.00770598502349227 +0.007706016868349488 +0.007706029479788526 +0.007706009635182638 +0.007706012657069485 +0.007706040910039188 +0.00770601560113734 +0.007705998183460474 +0.007706016792863118 +0.007706029754888926 +0.00770601944269661 +0.007706001222474158 +0.007705996643583171 +0.007706041854195661 +0.0077060388293413405 +0.0077060361888210095 +0.007706031593375352 +0.007706015510611991 +0.0077059998634552 +0.007706016541399362 +0.007706038693007798 +0.00770601774355542 +0.007706015361123727 +0.007706002518522644 +0.007706005505067121 +0.007706032844180899 +0.007705984426010916 +0.007705993025302898 +0.0077060593739109815 +0.007706019113118157 +0.007705982882749041 +0.007705967300352226 +0.007706038036509533 +0.007705995547770086 +0.007705994511648448 +0.0077060348213095695 +0.007705994107444894 +0.007706039331047357 +0.007706046030201026 +0.0077059990666486534 +0.007705994375732902 +0.007706005036279353 +0.007706043183394026 +0.007706004278333764 +0.007706007401231513 +0.007706040017674201 +0.007706063966507345 +0.007705991689393192 +0.007706035170761095 +0.007706007192542623 +0.007705984711399898 +0.00770598601945337 +0.007705985841211717 +0.007706009298020196 +0.007706007089799111 +0.0077060163442860125 +0.007706001027084884 +0.007705982480180369 +0.007705997253515346 +0.007706017828391951 +0.0077060168497251925 diff --git a/QCQP/data/abRtn.d b/QCQP/data/abRtn.d new file mode 100644 index 0000000..9e2259a --- /dev/null +++ b/QCQP/data/abRtn.d @@ -0,0 +1,1999 @@ +0.0017027370376681505 +0.0017027370392355859 +0.001702736788426687 +0.0017026912818815223 +0.0016823364039813965 +0.0016338009093208074 +0.0015555537117589782 +0.001497838493026275 +0.0014545361426593314 +0.0014135060743494987 +0.0013790152205888538 +0.0013508023953302574 +0.0013258133479099128 +0.001301211714270485 +0.0012801458284102238 +0.0012618910586694402 +0.0012459066268933614 +0.0012318016433912587 +0.0012147712873898176 +0.0011985444585786488 +0.0011839561028951508 +0.0011687610948982131 +0.0011540760794679472 +0.001140656864112053 +0.0011283542925146477 +0.001115699506410611 +0.0010956466022146848 +0.0010770313841817303 +0.0010597313701613672 +0.001042839057119829 +0.0010267450310654821 +0.001011710312415399 +9.975919781831395E-4 +9.843512694673105E-4 +9.718701479019764E-4 +9.601152716446765E-4 +9.490085232375888E-4 +9.38506254991231E-4 +9.285503530645007E-4 +9.191042929196257E-4 +9.101435910645115E-4 +9.015923753139015E-4 +8.934648919790099E-4 +8.85612543364813E-4 +8.778505573506784E-4 +8.704085639904308E-4 +8.632817040330091E-4 +8.564764306931837E-4 +8.499390360855207E-4 +8.43677811117507E-4 +8.376661703707529E-4 +8.318942118316819E-4 +8.26379425858961E-4 +8.210032597616123E-4 +8.158623058937288E-4 +8.109017338343367E-4 +8.061202226849545E-4 +8.015057621595191E-4 +7.970548803967518E-4 +7.927492582775538E-4 +7.885891540004057E-4 +7.845580062517182E-4 +7.806065735953688E-4 +7.766276310260378E-4 +7.726820537556048E-4 +7.688249709091559E-4 +7.65142016686184E-4 +7.615794014516854E-4 +7.58046644507362E-4 +7.54674952981128E-4 +7.513487112073784E-4 +7.481451368208918E-4 +7.449968056186404E-4 +7.413911404167781E-4 +7.37432686464065E-4 +7.33763072609815E-4 +7.30057862663807E-4 +7.264326464413673E-4 +7.228499601250949E-4 +7.194313961644042E-4 +7.160759365429689E-4 +7.12811362904746E-4 +7.096438753273868E-4 +7.06529853528846E-4 +7.035201345955542E-4 +7.005554066970636E-4 +6.976585213698765E-4 +6.948474669475008E-4 +6.921185690272546E-4 +6.89488477061078E-4 +6.869966973583788E-4 +6.84568147950685E-4 +6.821993321778487E-4 +6.798864488145947E-4 +6.776288889162032E-4 +6.754158886239081E-4 +6.73242816247275E-4 +6.711283193202446E-4 +6.690469091951677E-4 +6.670066334427963E-4 +6.650064634692565E-4 +6.63052333023652E-4 +6.61125760634214E-4 +6.59253578901189E-4 +6.57485161730301E-4 +6.557185195860515E-4 +6.540607034326137E-4 +6.524462029310279E-4 +6.508699975341601E-4 +6.493459502995983E-4 +6.478033452016227E-4 +6.463312206183891E-4 +6.448502354606358E-4 +6.434163977323983E-4 +6.419979218892066E-4 +6.40612487714403E-4 +6.392453568343702E-4 +6.379012527622425E-4 +6.365844969092674E-4 +6.352864895775061E-4 +6.340123623242274E-4 +6.327603436742291E-4 +6.315246803688976E-4 +6.303112137700793E-4 +6.291161376549068E-4 +6.27942846999844E-4 +6.267866861911114E-4 +6.256498220374634E-4 +6.245291303953096E-4 +6.234241395707473E-4 +6.22339974859692E-4 +6.212699682709729E-4 +6.202153129769678E-4 +6.191811185858892E-4 +6.181520858975287E-4 +6.17149756302764E-4 +6.161594585880629E-4 +6.151809683272481E-4 +6.142165413049321E-4 +6.132670159818873E-4 +6.123324598109572E-4 +6.114099017664089E-4 +6.105000576615825E-4 +6.096034823469988E-4 +6.087188213036716E-4 +6.07846729592108E-4 +6.069864678295794E-4 +6.061398633571892E-4 +6.053006564256435E-4 +6.04476033836475E-4 +6.036607648643615E-4 +6.028569365938816E-4 +6.020633792568108E-4 +6.012797049334272E-4 +6.005074461712618E-4 +5.99742864181885E-4 +5.989911372183134E-4 +5.982479358993572E-4 +5.975137435720936E-4 +5.967893999518953E-4 +5.960697653043199E-4 +5.95366275036219E-4 +5.946666420316227E-4 +5.93975691048442E-4 +5.932973919256483E-4 +5.926247054708042E-4 +5.919515507928734E-4 +5.913002642105572E-4 +5.906532830389395E-4 +5.900121252816401E-4 +5.893778409499002E-4 +5.88751749399586E-4 +5.88125353784837E-4 +5.875207177640769E-4 +5.869158428354452E-4 +5.862986415136241E-4 +5.857027885350763E-4 +5.851425366797862E-4 +5.845620144767879E-4 +5.839930958315415E-4 +5.834269745641246E-4 +5.828669868980218E-4 +5.823078204794446E-4 +5.81769082377616E-4 +5.812282652502013E-4 +5.806937510387405E-4 +5.801630708176968E-4 +5.796412093509104E-4 +5.791094522339971E-4 +5.78599218491122E-4 +5.78095781473933E-4 +5.776006137647541E-4 +5.771028643288367E-4 +5.765956782069979E-4 +5.761087943932758E-4 +5.756399668868326E-4 +5.751528070882831E-4 +5.746899491319256E-4 +5.742079178410209E-4 +5.737600891013644E-4 +5.733022573247705E-4 +5.728537567642132E-4 +5.723998742408472E-4 +5.719535820988989E-4 +5.715180272037351E-4 +5.710809801067505E-4 +5.706598397357284E-4 +5.702241241310657E-4 +5.697964334175814E-4 +5.693617266197722E-4 +5.689596315131353E-4 +5.685463205129838E-4 +5.681447572478451E-4 +5.677374003312202E-4 +5.673554452112112E-4 +5.669521151285654E-4 +5.66560760274199E-4 +5.661633812933078E-4 +5.657798534068276E-4 +5.653936118731272E-4 +5.650189668833285E-4 +5.646457953806203E-4 +5.642798908436918E-4 +5.639044346507442E-4 +5.635563370445042E-4 +5.631836450051397E-4 +5.627936723109214E-4 +5.624671775464519E-4 +5.621111624596391E-4 +5.617759168720251E-4 +5.614000789285198E-4 +5.610996072709629E-4 +5.607500815702506E-4 +5.603925525487313E-4 +5.600613777409483E-4 +5.59728772314041E-4 +5.594307301493784E-4 +5.590951440361738E-4 +5.584496837868574E-4 +5.581061535540076E-4 +5.578184709083E-4 +5.575177020161899E-4 +5.572038624118268E-4 +5.568732747500296E-4 +5.565553592055098E-4 +5.562527678369924E-4 +5.559796926045687E-4 +5.556517322625103E-4 +5.553651875822977E-4 +5.550967018197266E-4 +5.54807334221205E-4 +5.545188288222932E-4 +5.542189301842351E-4 +5.539322705683891E-4 +5.53672169424416E-4 +5.53377100883357E-4 +5.531155956712868E-4 +5.528400722934215E-4 +5.525732472903814E-4 +5.522977889935045E-4 +5.520317032568515E-4 +5.517676416464232E-4 +5.514820853049868E-4 +5.512368673607287E-4 +5.509751966916992E-4 +5.507180479005834E-4 +5.504450163634159E-4 +5.502028355718903E-4 +5.49947811698056E-4 +5.496814619811495E-4 +5.49454191537355E-4 +5.492084623653591E-4 +5.489600674483793E-4 +5.487208603769518E-4 +5.48477674185935E-4 +5.482356246382142E-4 +5.47998660983467E-4 +5.477599737394997E-4 +5.475407088951308E-4 +5.472764080256729E-4 +5.470422359100591E-4 +5.468088229396396E-4 +5.465826303333955E-4 +5.463701520382953E-4 +5.461490663640715E-4 +5.459313499046374E-4 +5.457104781791678E-4 +5.454768300993544E-4 +5.452522602737292E-4 +5.450567094677223E-4 +5.448323694402282E-4 +5.446266654582571E-4 +5.444088720603186E-4 +5.44202546097872E-4 +5.439878173450721E-4 +5.437800027209952E-4 +5.435606790417997E-4 +5.433571931523518E-4 +5.43163742915988E-4 +5.429628292846271E-4 +5.427330117279126E-4 +5.425538653251948E-4 +5.423618842505078E-4 +5.421550882796511E-4 +5.419497708104017E-4 +5.417670605034115E-4 +5.415721633766682E-4 +5.413809878777935E-4 +5.411914003588609E-4 +5.410023670441281E-4 +5.408174095317997E-4 +5.406229778580644E-4 +5.404364211902221E-4 +5.402582439933598E-4 +5.400683308051961E-4 +5.398832712945016E-4 +5.397066114074115E-4 +5.395164712507273E-4 +5.393399924908088E-4 +5.391648777812679E-4 +5.389921472856411E-4 +5.388107830491023E-4 +5.386410741141784E-4 +5.384670257739778E-4 +5.382919237769895E-4 +5.38119948131766E-4 +5.379485426291185E-4 +5.377796479319295E-4 +5.376091103669496E-4 +5.374419733381543E-4 +5.372724489704257E-4 +5.371109030516222E-4 +5.369433608844195E-4 +5.367816353381157E-4 +5.366217162964033E-4 +5.364560192665735E-4 +5.361342967838431E-4 +5.359786804197762E-4 +5.358176197235394E-4 +5.356647725923814E-4 +5.355024969096632E-4 +5.353518166774795E-4 +5.351944706623878E-4 +5.350435962538812E-4 +5.348932994455672E-4 +5.347422963556779E-4 +5.345877433209215E-4 +5.344415101422835E-4 +5.342909376388074E-4 +5.341397313928471E-4 +5.339935014088094E-4 +5.338458405672167E-4 +5.336992249573086E-4 +5.335592463253162E-4 +5.334103900727751E-4 +5.332702690802862E-4 +5.331292107130082E-4 +5.329856325638452E-4 +5.328437867115176E-4 +5.327049371243185E-4 +5.325644658088413E-4 +5.324280397089344E-4 +5.32287970365569E-4 +5.321551266931382E-4 +5.320141956158184E-4 +5.318782108306922E-4 +5.317470469639731E-4 +5.316081123569333E-4 +5.314778807072504E-4 +5.313424515211028E-4 +5.31213458428392E-4 +5.310839245957478E-4 +5.309503792348596E-4 +5.308235607346554E-4 +5.306948033067931E-4 +5.305663665020816E-4 +5.304368100570753E-4 +5.303093811659656E-4 +5.301824977781587E-4 +5.300572476864024E-4 +5.299300575934718E-4 +5.29805623136749E-4 +5.296830386309653E-4 +5.295594499282898E-4 +5.294362007484364E-4 +5.293162185145417E-4 +5.291928602596739E-4 +5.29071995564465E-4 +5.289539898035108E-4 +5.288353444466595E-4 +5.287153722917991E-4 +5.285955426740926E-4 +5.284769605945884E-4 +5.283621058306767E-4 +5.282451440143788E-4 +5.281290925615523E-4 +5.280129530502257E-4 +5.278980768599903E-4 +5.277835555868972E-4 +5.276710888006521E-4 +5.275588399181992E-4 +5.274446480158841E-4 +5.27335037266772E-4 +5.272253259728791E-4 +5.271051124638475E-4 +5.269951617246268E-4 +5.268922649420807E-4 +5.267835883839081E-4 +5.26672734324704E-4 +5.2656888255854E-4 +5.264470776797193E-4 +5.263405081889259E-4 +5.262336504395655E-4 +5.261384076734875E-4 +5.260304598127607E-4 +5.259263176592125E-4 +5.258255905102695E-4 +5.257209297451796E-4 +5.256162342888336E-4 +5.255094954722427E-4 +5.254106619088488E-4 +5.253066701325042E-4 +5.252069975027363E-4 +5.251090042012725E-4 +5.250055842969788E-4 +5.249096659906746E-4 +5.248105928881466E-4 +5.247094633976589E-4 +5.245928690097948E-4 +5.245101756276293E-4 +5.244112437182121E-4 +5.24312859541804E-4 +5.242207301034613E-4 +5.241279498381238E-4 +5.240247653393649E-4 +5.239218036790145E-4 +5.238352136845531E-4 +5.237411869033473E-4 +5.236457295428991E-4 +5.235515644820907E-4 +5.234600401133252E-4 +5.233669572440474E-4 +5.232723393472104E-4 +5.231785724128896E-4 +5.230925480776282E-4 +5.23002563332777E-4 +5.229061830901692E-4 +5.228163894924544E-4 +5.227301523627346E-4 +5.226360544634406E-4 +5.225519550725732E-4 +5.22461330502384E-4 +5.223731461189202E-4 +5.222834380951547E-4 +5.221901010628635E-4 +5.221121120464762E-4 +5.220243135169232E-4 +5.219357335925016E-4 +5.21851632294505E-4 +5.217606729316467E-4 +5.216775158744505E-4 +5.215935234902519E-4 +5.215070384424014E-4 +5.214230425690085E-4 +5.213376165691242E-4 +5.212560984002103E-4 +5.211746583471682E-4 +5.210923628630479E-4 +5.210059632385553E-4 +5.209274076588915E-4 +5.20844622366419E-4 +5.207649263169684E-4 +5.206816599112303E-4 +5.205979764571227E-4 +5.205198776977899E-4 +5.204370905186314E-4 +5.203562437570092E-4 +5.202789507565811E-4 +5.201988187149209E-4 +5.201232943128036E-4 +5.20044648651252E-4 +5.199660829326186E-4 +5.198877842947717E-4 +5.198106322189652E-4 +5.19732365459229E-4 +5.196567109025678E-4 +5.195783627642934E-4 +5.195020166149122E-4 +5.194276415956681E-4 +5.19350479007615E-4 +5.192760949381283E-4 +5.192006521958176E-4 +5.191262334627579E-4 +5.19051980932595E-4 +5.189789124922365E-4 +5.189000262203772E-4 +5.188305983059231E-4 +5.187581353337296E-4 +5.186833558899871E-4 +5.186123325338277E-4 +5.185353208254103E-4 +5.184655983994317E-4 +5.183950447475542E-4 +5.183235279058381E-4 +5.182491183347093E-4 +5.18179572905968E-4 +5.181109121065266E-4 +5.180406560692807E-4 +5.179607322828998E-4 +5.178963910526393E-4 +5.17831172456062E-4 +5.177616939041503E-4 +5.176922291248848E-4 +5.176235634098378E-4 +5.175539567423308E-4 +5.174865059315961E-4 +5.174195438786344E-4 +5.173499517698527E-4 +5.172835750345429E-4 +5.172159896882192E-4 +5.17147487260581E-4 +5.170745455144939E-4 +5.170171160031696E-4 +5.169498733726746E-4 +5.168831618470171E-4 +5.168151396801575E-4 +5.167533934948264E-4 +5.166878186672488E-4 +5.166211369564828E-4 +5.16559233085969E-4 +5.164936815775287E-4 +5.164303722199657E-4 +5.163658090739739E-4 +5.163001011549378E-4 +5.162318185012503E-4 +5.161752495782709E-4 +5.161062640532725E-4 +5.160495288757616E-4 +5.15986759351482E-4 +5.159247022937831E-4 +5.158623345332698E-4 +5.157999893686289E-4 +5.157324595052257E-4 +5.156776873326645E-4 +5.156169816435028E-4 +5.155536688119307E-4 +5.154951208617836E-4 +5.154346252616258E-4 +5.153740692415575E-4 +5.15313551313245E-4 +5.152403912118962E-4 +5.151945221661916E-4 +5.151349805948644E-4 +5.15059728611679E-4 +5.149907295566968E-4 +5.149583176861591E-4 +5.148855670286857E-4 +5.148409069328178E-4 +5.147834183010637E-4 +5.147256345116011E-4 +5.146457363458569E-4 +5.14610265093584E-4 +5.145522766238028E-4 +5.144953144710988E-4 +5.144237648267908E-4 +5.143817228430911E-4 +5.142967959867062E-4 +5.142691450697073E-4 +5.141883690932422E-4 +5.141060823851112E-4 +5.140978778400655E-4 +5.139926232146514E-4 +5.139207754680837E-4 +5.139218099874897E-4 +5.13873014057743E-4 +5.138125581084779E-4 +5.137653821409469E-4 +5.137081560147185E-4 +5.13644284588503E-4 +5.136045372471955E-4 +5.135518636777714E-4 +5.134978826276956E-4 +5.134382513049594E-4 +5.133825712107683E-4 +5.133367955660361E-4 +5.13284422982917E-4 +5.132321996593818E-4 +5.131778196674123E-4 +5.13123840440625E-4 +5.130650050889275E-4 +5.130235913507314E-4 +5.129636888221516E-4 +5.129195804214418E-4 +5.128691941874364E-4 +5.128185055428E-4 +5.127670826028352E-4 +5.127072388342844E-4 +5.126629023537365E-4 +5.126036355127019E-4 +5.125636503112397E-4 +5.125133444072037E-4 +5.124612343030223E-4 +5.123998339890794E-4 +5.123613386359186E-4 +5.123135525827793E-4 +5.122637376073283E-4 +5.122108704352176E-4 +5.121624263996501E-4 +5.121139210346173E-4 +5.120659555181563E-4 +5.120169629256732E-4 +5.119653982246802E-4 +5.119144976901708E-4 +5.118711239986984E-4 +5.118238873770085E-4 +5.117755780200213E-4 +5.117271722255601E-4 +5.116780806176018E-4 +5.116284154795407E-4 +5.11579501875301E-4 +5.115380611226489E-4 +5.114891430726947E-4 +5.114424324745857E-4 +5.113939432428389E-4 +5.113508805724692E-4 +5.113085614419097E-4 +5.112577057423736E-4 +5.112166881070643E-4 +5.111657738442451E-4 +5.111237903806058E-4 +5.110703783671191E-4 +5.110340683991471E-4 +5.10987826104171E-4 +5.109428135828485E-4 +5.108908618075138E-4 +5.108524621659986E-4 +5.107945020802186E-4 +5.107497705132567E-4 +5.107123653657515E-4 +5.106664976452672E-4 +5.106304085137279E-4 +5.105850025955848E-4 +5.10542277490571E-4 +5.104878931662098E-4 +5.104544912948934E-4 +5.104110436114881E-4 +5.1036467235464E-4 +5.103234333842276E-4 +5.102700487188911E-4 +5.102353251501619E-4 +5.101849246380502E-4 +5.101486035828326E-4 +5.101062234644313E-4 +5.100563658210548E-4 +5.100228807625453E-4 +5.099783623504358E-4 +5.099268115399691E-4 +5.098983018845733E-4 +5.098446992725813E-4 +5.098085986668977E-4 +5.09770331601211E-4 +5.097153601841657E-4 +5.096889229149909E-4 +5.096496049500516E-4 +5.096039206854173E-4 +5.095640432485899E-4 +5.095200955769229E-4 +5.094672735747222E-4 +5.094451937538536E-4 +5.094003973673321E-4 +5.093600695291617E-4 +5.093207699112492E-4 +5.092832868026704E-4 +5.092380656544615E-4 +5.092039322915097E-4 +5.091492518536132E-4 +5.091237738165952E-4 +5.090799359397161E-4 +5.09024407865899E-4 +5.090058741169963E-4 +5.08961974776681E-4 +5.089212481947288E-4 +5.088876889013865E-4 +5.088483815720666E-4 +5.087909804775109E-4 +5.087609959055679E-4 +5.087329525857497E-4 +5.086940752988649E-4 +5.086552594793667E-4 +5.086084927040489E-4 +5.085803285968427E-4 +5.085378645500408E-4 +5.084852866257581E-4 +5.084559104178758E-4 +5.084094068256001E-4 +5.083907825061348E-4 +5.08353130993269E-4 +5.083011161346998E-4 +5.082555467620366E-4 +5.082405951151773E-4 +5.082037049458148E-4 +5.081526930502111E-4 +5.081308597523734E-4 +5.080773531572592E-4 +5.08044806049779E-4 +5.080222501973689E-4 +5.079837983704777E-4 +5.0792248226844E-4 +5.079114394119232E-4 +5.07861833924392E-4 +5.078231047457203E-4 +5.077857116826599E-4 +5.077457193176733E-4 +5.077318625399776E-4 +5.076967571620612E-4 +5.076367636381489E-4 +5.076240946031015E-4 +5.075688379801023E-4 +5.075280850367108E-4 +5.075192955583659E-4 +5.07457762111113E-4 +5.074426681258372E-4 +5.073849852418521E-4 +5.073612505929303E-4 +5.073417130833069E-4 +5.073092570222746E-4 +5.072736755452105E-4 +5.072146429047453E-4 +5.07202784270225E-4 +5.071707299889328E-4 +5.071145665143452E-4 +5.07075396539029E-4 +5.070691693656871E-4 +5.07012160706815E-4 +5.069968252899027E-4 +5.069678953005172E-4 +5.069305828312735E-4 +5.068674333942573E-4 +5.06872255249132E-4 +5.068339734545837E-4 +5.06774875047326E-4 +5.067666864784786E-4 +5.067327824711479E-4 +5.066687141217536E-4 +5.066656138282819E-4 +5.066025571488652E-4 +5.06574019251155E-4 +5.065386201505895E-4 +5.065099976477113E-4 +5.06503054060014E-4 +5.064720736978414E-4 +5.064134903303162E-4 +5.064028085686365E-4 +5.063443033917281E-4 +5.06341053823501E-4 +5.062791727795618E-4 +5.062426206493071E-4 +5.062445210126739E-4 +5.062078133584389E-4 +5.061417864292477E-4 +5.061447382200926E-4 +5.060811867884861E-4 +5.060569186462671E-4 +5.06054044962263E-4 +5.060211502245752E-4 +5.059628773200767E-4 +5.059247055739543E-4 +5.058898856090839E-4 +5.058732762910594E-4 +5.058449166499985E-4 +5.058046189419602E-4 +5.057680359515382E-4 +5.057357805301745E-4 +5.057188211384029E-4 +5.056786158452454E-4 +5.056783081288929E-4 +5.056098947690453E-4 +5.056170737690502E-4 +5.055495347458047E-4 +5.055120534368238E-4 +5.054947690705971E-4 +5.054628434289686E-4 +5.054384505431676E-4 +5.054027645420271E-4 +5.053711491183131E-4 +5.053379093850432E-4 +5.05305338791044E-4 +5.053148510168979E-4 +5.052515583999315E-4 +5.052243079055897E-4 +5.051859865989143E-4 +5.051647949449445E-4 +5.051259938105324E-4 +5.05096530383815E-4 +5.051038648510846E-4 +5.050766634432127E-4 +5.050187714436214E-4 +5.049876580733759E-4 +5.049521276262263E-4 +5.049134845619304E-4 +5.048967127665249E-4 +5.049013843171309E-4 +5.048744959840749E-4 +5.048106677941361E-4 +5.047914410125506E-4 +5.047563813060253E-4 +5.047351153107426E-4 +5.046959125706267E-4 +5.047048249861521E-4 +5.046760473745841E-4 +5.046483862006744E-4 +5.046116573970078E-4 +5.045824337274713E-4 +5.045262228617977E-4 +5.044913849712676E-4 +5.044959914425207E-4 +5.04465394606377E-4 +5.044166514847671E-4 +5.044112708744529E-4 +5.043861654082957E-4 +5.04353947125289E-4 +5.043268784609336E-4 +5.043028080760239E-4 +5.042514703753266E-4 +5.04229051092364E-4 +5.041973024974707E-4 +5.041860312830346E-4 +5.041398932462159E-4 +5.041189575262633E-4 +5.04111966554866E-4 +5.040828526940791E-4 +5.040517456784791E-4 +5.040267347403406E-4 +5.040026000308502E-4 +5.039504768358931E-4 +5.039441156483107E-4 +5.039225046508739E-4 +5.038734826575744E-4 +5.038390963670612E-4 +5.038150179322695E-4 +5.037893781915466E-4 +5.037761097099396E-4 +5.037427511259548E-4 +5.03736189704285E-4 +5.0370558648358E-4 +5.036690370860719E-4 +5.036523458768717E-4 +5.036259333224595E-4 +5.035848809368165E-4 +5.035581382022221E-4 +5.035324596818041E-4 +5.035246981468542E-4 +5.03497798085408E-4 +5.034725405109673E-4 +5.034466647025232E-4 +5.034013222536942E-4 +5.033956281078655E-4 +5.033486429640055E-4 +5.033296338581001E-4 +5.033010664756843E-4 +5.032922588655742E-4 +5.03269094328217E-4 +5.032415699595717E-4 +5.032188967360969E-4 +5.031902710698435E-4 +5.031494140065903E-4 +5.031448479267676E-4 +5.031189994358261E-4 +5.030829080192829E-4 +5.030526742139451E-4 +5.030414303909163E-4 +5.030001552031839E-4 +5.029934160224586E-4 +5.029679205756193E-4 +5.029396642616819E-4 +5.029205326954908E-4 +5.028920694638318E-4 +5.028597434439794E-4 +5.028298603016331E-4 +5.028233124789584E-4 +5.027955273151872E-4 +5.027739596120903E-4 +5.027499228107047E-4 +5.02724919527701E-4 +5.02688751392604E-4 +5.026636404624824E-4 +5.026506536894306E-4 +5.026138319057476E-4 +5.025941895341984E-4 +5.025682650559408E-4 +5.025386215295522E-4 +5.025346806798285E-4 +5.025127448915397E-4 +5.02488494565159E-4 +5.02465067734694E-4 +5.024389425953906E-4 +5.024065971236168E-4 +5.023952354526831E-4 +5.023702034431376E-4 +5.023221374712036E-4 +5.023213546048565E-4 +5.02289951235033E-4 +5.022757091629076E-4 +5.02254439584496E-4 +5.022288667800098E-4 +5.021872839043426E-4 +5.021855489270478E-4 +5.021399983560032E-4 +5.021180476601528E-4 +5.021185255970114E-4 +5.020763416914801E-4 +5.020693675427227E-4 +5.020382985836997E-4 +5.020237002376241E-4 +5.019991913491465E-4 +5.019633053818469E-4 +5.019578354791079E-4 +5.019381595859888E-4 +5.019055504558195E-4 +5.018888358161697E-4 +5.018536872113418E-4 +5.018501207665987E-4 +5.018133743013546E-4 +5.018024155856914E-4 +5.017820542856298E-4 +5.017559329647091E-4 +5.017388396956295E-4 +5.017176555572218E-4 +5.016926110956843E-4 +5.016750574231519E-4 +5.016493951516381E-4 +5.01628545537562E-4 +5.015978784470793E-4 +5.01573912625319E-4 +5.015486659714314E-4 +5.015436347944869E-4 +5.015182019110731E-4 +5.015015187646376E-4 +5.014670712307057E-4 +5.014465608452121E-4 +5.014234987904806E-4 +5.014165592077513E-4 +5.013783922994061E-4 +5.013606100503473E-4 +5.013505479433882E-4 +5.013299144427119E-4 +5.012986472560751E-4 +5.012898111812931E-4 +5.012587034183224E-4 +5.012363254358833E-4 +5.012283609788358E-4 +5.01205627379179E-4 +5.011783022059094E-4 +5.011612176391674E-4 +5.011384314042776E-4 +5.011150481985829E-4 +5.011005762648058E-4 +5.010740790193747E-4 +5.010608504986535E-4 +5.0103248246708E-4 +5.010061266693251E-4 +5.01001918053967E-4 +5.009808650465002E-4 +5.009472131510209E-4 +5.009391912773634E-4 +5.009089913936221E-4 +5.008985426025226E-4 +5.008766593509952E-4 +5.008574452443811E-4 +5.00823202879027E-4 +5.008113910832078E-4 +5.007930783634875E-4 +5.007679577644803E-4 +5.007587182634556E-4 +5.007387792811183E-4 +5.007211266215359E-4 +5.006993398943227E-4 +5.006751895328184E-4 +5.006553447271662E-4 +5.006341964261497E-4 +5.006207362903233E-4 +5.006002204521956E-4 +5.00581541131E-4 +5.005629487916935E-4 +5.00529274807554E-4 +5.005222148594938E-4 +5.005056352582175E-4 +5.004868169556228E-4 +5.004585257724295E-4 +5.004387892326549E-4 +5.004214003182194E-4 +5.004078081822756E-4 +5.003904351321079E-4 +5.003625754030212E-4 +5.003512956228677E-4 +5.003189887330779E-4 +5.003093090148534E-4 +5.002852006931113E-4 +5.002671465627841E-4 +5.002545242371197E-4 +5.002346523984885E-4 +5.002051947555004E-4 +5.001875013358352E-4 +5.001823218590901E-4 +5.001523283959666E-4 +5.001403823384125E-4 +5.001230659263626E-4 +5.00096170424817E-4 +5.000907393510986E-4 +5.000608720368597E-4 +5.000495173391686E-4 +5.000329913807632E-4 +5.000116604802464E-4 +4.999927712654639E-4 +4.999723368852243E-4 +4.999612681595566E-4 +4.999341852459583E-4 +4.999100192451733E-4 +4.998980722902284E-4 +4.998871402653412E-4 +4.998689021526926E-4 +4.998503202866692E-4 +4.998355658426922E-4 +4.998073580680588E-4 +4.997837382592101E-4 +4.997774345641932E-4 +4.997619093926162E-4 +4.997416655585025E-4 +4.997059730964181E-4 +4.997047165441775E-4 +4.996731286332604E-4 +4.996712713074992E-4 +4.99652329776906E-4 +4.9962778371402E-4 +4.996155687369056E-4 +4.996032083289754E-4 +4.995815740918233E-4 +4.995690674812638E-4 +4.995505658294864E-4 +4.995322431596868E-4 +4.995034718919762E-4 +4.99493387565249E-4 +4.994782701249451E-4 +4.994613570000247E-4 +4.994360692812679E-4 +4.994300012717496E-4 +4.99404681412862E-4 +4.993923384892953E-4 +4.993692263587671E-4 +4.993615898879711E-4 +4.993241733082024E-4 +4.993274350240819E-4 +4.993074343140922E-4 +4.99287451392188E-4 +4.992597866839821E-4 +4.992554117672696E-4 +4.99236744709832E-4 +4.99208999389634E-4 +4.992053744502971E-4 +4.99192170812416E-4 +4.991667981511266E-4 +4.991505494027598E-4 +4.991308243457296E-4 +4.991146692094759E-4 +4.991019840554349E-4 +4.990857781574514E-4 +4.990658648651834E-4 +4.990474677656067E-4 +4.990354247659489E-4 +4.990216887960574E-4 +4.990067352422476E-4 +4.989879447466133E-4 +4.989647978841228E-4 +4.989522982971145E-4 +4.989383737469313E-4 +4.989188600437826E-4 +4.988968364102805E-4 +4.988878064063955E-4 +4.988767945823444E-4 +4.988618010157036E-4 +4.988381029067348E-4 +4.988207126769983E-4 +4.988126832305503E-4 +4.98794982704881E-4 +4.987719643571373E-4 +4.987549693657448E-4 +4.987454783652314E-4 +4.987244194586865E-4 +4.98716964787885E-4 +4.987020637432979E-4 +4.986849692408574E-4 +4.986651173867584E-4 +4.986445238240242E-4 +4.986349165865625E-4 +4.986107803013943E-4 +4.986016793191946E-4 +4.985786847727024E-4 +4.985704627144509E-4 +4.985508547673413E-4 +4.985405312051012E-4 +4.985253765358033E-4 +4.98507556838912E-4 +4.984958682057705E-4 +4.984740122354032E-4 +4.984531805293248E-4 +4.984453982901456E-4 +4.984243772802038E-4 +4.984159203285412E-4 +4.983946948450199E-4 +4.983802328462537E-4 +4.983715144225551E-4 +4.983545477439679E-4 +4.983430411575354E-4 +4.983246431930147E-4 +4.983052565256465E-4 +4.982946098454244E-4 +4.982745780380632E-4 +4.982630080277445E-4 +4.98246495136015E-4 +4.982305273374695E-4 +4.982094874040938E-4 +4.982050093923822E-4 +4.98185229074614E-4 +4.98171292470643E-4 +4.981551790793982E-4 +4.981403260327882E-4 +4.981284324110472E-4 +4.981135516030911E-4 +4.980871200704563E-4 +4.980803207161192E-4 +4.980654864205382E-4 +4.980506074228592E-4 +4.980403697836409E-4 +4.980201453608401E-4 +4.980056161707E-4 +4.979855906394785E-4 +4.979829022795226E-4 +4.979617626165729E-4 +4.979444345685692E-4 +4.979403760033332E-4 +4.979192173511577E-4 +4.979108012734153E-4 +4.978952709489711E-4 +4.978750280873776E-4 +4.978558348729945E-4 +4.978529496659815E-4 +4.97835592886914E-4 +4.978185544518841E-4 +4.977985665772225E-4 +4.977934911007496E-4 +4.977793812130457E-4 +4.977656380289126E-4 +4.977555555339815E-4 +4.977330021458843E-4 +4.977192624928681E-4 +4.977049880224325E-4 +4.976979319484798E-4 +4.976814414204873E-4 +4.976584429612574E-4 +4.976497728084638E-4 +4.97635984519283E-4 +4.976140182148415E-4 +4.976073069492288E-4 +4.97594234095131E-4 +4.975822511870725E-4 +4.975729630399922E-4 +4.975474481298946E-4 +4.975401530886466E-4 +4.975290410425893E-4 +4.975128134512255E-4 +4.974950143314859E-4 +4.974765405339124E-4 +4.974688484761818E-4 +4.974590377952166E-4 +4.974385627984413E-4 +4.974324251847781E-4 +4.974129051137936E-4 +4.973982344522364E-4 +4.973860451556846E-4 +4.973761339558228E-4 +4.973588998214614E-4 +4.973512410784054E-4 +4.973334071935369E-4 +4.973145324540401E-4 +4.973096450651445E-4 +4.972973333907474E-4 +4.972836368993534E-4 +4.97262242178947E-4 +4.972536580645049E-4 +4.972465381519569E-4 +4.972310086152491E-4 +4.972133654672945E-4 +4.972011491065926E-4 +4.971844748650052E-4 +4.971729972566171E-4 +4.971608814403599E-4 +4.971511441726009E-4 +4.971340810391667E-4 +4.971197072229204E-4 +4.971094695641156E-4 +4.970989252166836E-4 +4.970801661527141E-4 +4.97065642672904E-4 +4.97059747257663E-4 +4.970361802456875E-4 +4.970273411759175E-4 +4.970160766984483E-4 +4.969985522601416E-4 +4.969913288881887E-4 +4.969795817163554E-4 +4.969636560449717E-4 +4.969580497031159E-4 +4.969403523736734E-4 +4.96925765185514E-4 +4.969176319334302E-4 +4.969052212449514E-4 +4.968866623288793E-4 +4.968742748780316E-4 +4.968636475488819E-4 +4.968488862798975E-4 +4.968398936549323E-4 +4.968221451669971E-4 +4.96813422901025E-4 +4.967966948344223E-4 +4.967873311934062E-4 +4.967730306483791E-4 +4.967633969523515E-4 +4.967522406896543E-4 +4.967394867444623E-4 +4.967247942348791E-4 +4.967102175055131E-4 +4.966987232041983E-4 +4.966909811546296E-4 +4.966779328332969E-4 +4.966668213420657E-4 +4.966510564625381E-4 +4.966407619717462E-4 +4.966248128182119E-4 +4.966064199368774E-4 +4.966042367694751E-4 +4.965828832951152E-4 +4.965756512660375E-4 +4.965682882288936E-4 +4.965530127563741E-4 +4.965389146872187E-4 +4.965305017653427E-4 +4.965191897099745E-4 +4.965040193627638E-4 +4.964859675785291E-4 +4.964811097528615E-4 +4.964662821483105E-4 +4.964548113809336E-4 +4.964462796487165E-4 +4.964353613280158E-4 +4.964185166176522E-4 +4.96411072511854E-4 +4.96396322396682E-4 +4.963863960398545E-4 +4.963730198612091E-4 +4.963608434267118E-4 +4.963461985907354E-4 +4.963362051703624E-4 +4.963191754108677E-4 +4.963113404845461E-4 +4.962948291875446E-4 +4.9628601899301E-4 +4.962810855495464E-4 +4.962614629302209E-4 +4.962535548833482E-4 +4.962438438044516E-4 +4.962337440692109E-4 +4.962220780944947E-4 +4.96207985839707E-4 +4.961981191856639E-4 +4.961799401631894E-4 +4.961673502207712E-4 +4.961636779400483E-4 +4.961521191939511E-4 +4.961375733053096E-4 +4.961299437698906E-4 +4.961172281042126E-4 +4.960974245636949E-4 +4.960909842100199E-4 +4.96082450347988E-4 +4.960625640365098E-4 +4.960570701602655E-4 +4.96046200735836E-4 +4.960346484883288E-4 +4.960223410348166E-4 +4.960097481330283E-4 +4.960034834248514E-4 +4.959851627653286E-4 +4.959785629301113E-4 +4.959676338282623E-4 +4.959489349014156E-4 +4.959458003789471E-4 +4.959322966203597E-4 +4.959250699815331E-4 +4.959032607490889E-4 +4.95898019706904E-4 +4.958833637058254E-4 +4.958767666691896E-4 +4.958688043662474E-4 +4.958515471511811E-4 +4.958433940916173E-4 +4.958367059831251E-4 +4.958239470530118E-4 +4.958108832950806E-4 +4.957932819790857E-4 +4.957833500615127E-4 +4.957799060911239E-4 +4.957673947746757E-4 +4.957571075781351E-4 +4.957429970721494E-4 +4.957339735258747E-4 +4.957209445796076E-4 +4.957158410189928E-4 +4.957047620047304E-4 +4.956842332807543E-4 +4.956797211614076E-4 +4.95668954037575E-4 +4.956601084513305E-4 +4.956501380638163E-4 +4.956374935979016E-4 +4.956259989595607E-4 +4.956172003455188E-4 +4.956065470925233E-4 +4.955930468751434E-4 +4.955836703542237E-4 +4.955708316363416E-4 +4.955560416783384E-4 +4.955503981079217E-4 +4.955410672043873E-4 +4.955300289350296E-4 +4.955179421466271E-4 +4.955076435299194E-4 +4.955011553816821E-4 +4.95489000242401E-4 +4.954785517449878E-4 +4.954616648195805E-4 +4.95454421366782E-4 +4.954415207420575E-4 +4.954304042103858E-4 +4.954262494599445E-4 +4.954136130223742E-4 +4.954013803953347E-4 +4.953923968512432E-4 +4.953855180199803E-4 +4.953728250909816E-4 +4.953615348740917E-4 +4.95351497986627E-4 +4.953398940066413E-4 +4.953321684142934E-4 +4.953216485296426E-4 +4.953084866475236E-4 +4.952999576896657E-4 +4.952896840727279E-4 +4.952802985549288E-4 +4.952714418856106E-4 +4.95259096691565E-4 +4.952504550431106E-4 +4.952409671165664E-4 +4.952286521072304E-4 +4.952195752242099E-4 +4.952042868395891E-4 +4.952018430054516E-4 +4.951893822913416E-4 +4.95178711100091E-4 +4.951694546085179E-4 +4.951562251510849E-4 +4.951482867190647E-4 +4.951382011833565E-4 +4.951278291241592E-4 +4.951171823110828E-4 +4.951114303244271E-4 +4.950969504334097E-4 +4.950884011384355E-4 +4.950794598975326E-4 +4.950682559269145E-4 +4.95057473899973E-4 +4.950462638171478E-4 +4.95040255022825E-4 +4.950284510057544E-4 +4.950196467026935E-4 +4.950069862942962E-4 +4.949999361049429E-4 +4.949906324571486E-4 +4.949803855332522E-4 +4.949710924334256E-4 +4.949607455909163E-4 +4.949521417464594E-4 +4.949387180336955E-4 +4.949315153021837E-4 +4.949208370820723E-4 +4.949090961841161E-4 +4.949026177653497E-4 +4.948889879683324E-4 +4.948782649945926E-4 +4.94875490133608E-4 +4.948631781442941E-4 +4.948556975044623E-4 +4.94847456809358E-4 +4.948340066607688E-4 +4.94825603169072E-4 +4.948189127823114E-4 +4.948036003842411E-4 +4.947925632150788E-4 +4.947867860212322E-4 +4.947758579593529E-4 +4.947695457395231E-4 +4.947601348591099E-4 +4.947509673102134E-4 +4.947416765149595E-4 +4.947292960472802E-4 +4.947215003870139E-4 +4.947127061073309E-4 +4.947041856344034E-4 +4.946911386856712E-4 +4.94684370371166E-4 +4.946778488547954E-4 +4.946646038774027E-4 +4.946565181098199E-4 +4.946474168415259E-4 +4.946380533275394E-4 +4.946270772979173E-4 +4.946180701963903E-4 +4.946104929735661E-4 +4.946034400409417E-4 +4.945918872317635E-4 +4.945784072946796E-4 +4.945727458402072E-4 +4.945615041217191E-4 +4.945545898272585E-4 +4.945442013452313E-4 +4.945345330203996E-4 +4.945276907569087E-4 +4.945166108830928E-4 +4.945095922503068E-4 +4.944993652982234E-4 +4.944905246185389E-4 +4.944771920673345E-4 +4.944739739041005E-4 +4.944605360330912E-4 +4.944535188654369E-4 +4.944430802953652E-4 +4.944321097893065E-4 +4.944246655631317E-4 +4.944189244072275E-4 +4.944080601491599E-4 +4.944005818316108E-4 +4.943893532160986E-4 +4.943827508246893E-4 +4.943735317367035E-4 +4.943627695603022E-4 +4.943586193533014E-4 +4.943439693323256E-4 +4.943381115352693E-4 +4.943297463502755E-4 +4.943180693630692E-4 +4.943120056644731E-4 +4.9430196134541E-4 +4.942929245469145E-4 +4.942848942723779E-4 +4.942783032879337E-4 +4.942625607984551E-4 +4.942599838277214E-4 +4.942500900868183E-4 +4.942376563083458E-4 +4.942312655477572E-4 +4.942188860460785E-4 +4.942148355788236E-4 +4.942063471140543E-4 +4.94196928291434E-4 +4.941912808337573E-4 +4.94180731192131E-4 +4.94172285064838E-4 +4.941622604599575E-4 +4.941543492867349E-4 +4.941454464842104E-4 +4.9413653358736E-4 +4.941274860072668E-4 +4.941171209427501E-4 +4.941093345090608E-4 +4.940998091299213E-4 +4.940934998777236E-4 +4.94084713945036E-4 +4.940771906751022E-4 +4.9407046252061E-4 +4.940617794127522E-4 +4.940527461559034E-4 +4.940404889741344E-4 +4.940353770749123E-4 +4.940272238659914E-4 +4.940141852358695E-4 +4.940106709956358E-4 +4.940009007333714E-4 +4.939913558318564E-4 +4.939860699366421E-4 +4.939731142918559E-4 +4.939661951759961E-4 +4.939551934957303E-4 +4.939492683488148E-4 +4.939440968940475E-4 +4.939360152483549E-4 +4.939265270705204E-4 +4.939146953216264E-4 +4.939091345949573E-4 +4.938988703493885E-4 +4.938923742786372E-4 +4.938861318006331E-4 +4.938766258060504E-4 +4.938675229102619E-4 +4.938564509000279E-4 +4.938510742672777E-4 +4.938428303072585E-4 +4.938340972443793E-4 +4.938264632598692E-4 +4.938184119869699E-4 +4.938090252952413E-4 +4.938011785259045E-4 +4.937968180723078E-4 +4.937850352296647E-4 +4.937768160282665E-4 +4.937697508729784E-4 +4.937607639618982E-4 +4.937544845555381E-4 +4.937457512216025E-4 +4.937380556447674E-4 +4.937280890740097E-4 +4.937201667594559E-4 +4.937122593809839E-4 +4.937067458762912E-4 +4.936981361372277E-4 +4.936903240019802E-4 +4.936834452713469E-4 +4.936686502841306E-4 +4.936648060864486E-4 +4.936585778114148E-4 +4.936463435187916E-4 +4.936404186480143E-4 +4.936323800923015E-4 +4.936242641650799E-4 +4.936162609350075E-4 +4.936097145297112E-4 +4.936034841086494E-4 +4.93593035014777E-4 +4.935859231638114E-4 +4.935781626440638E-4 +4.935654639807716E-4 +4.935632925121266E-4 +4.935515449835632E-4 +4.935476536308286E-4 +4.935401999431218E-4 +4.935301661393028E-4 +4.935258151785813E-4 +4.935132606509202E-4 +4.935097987802047E-4 +4.935011372325946E-4 +4.9349210262808E-4 +4.93483053737069E-4 +4.93473151358084E-4 +4.934685476465704E-4 +4.934624251856435E-4 +4.934529097030974E-4 +4.934439575307728E-4 +4.934411328030708E-4 +4.93426227472214E-4 +4.934192592930977E-4 +4.934131059031181E-4 +4.934083239846416E-4 +4.934012033069981E-4 +4.933920203918127E-4 +4.933859913605393E-4 +4.933759074444724E-4 +4.933694199042615E-4 +4.933622443128789E-4 +4.933538479587811E-4 +4.933458088341386E-4 +4.933382139456593E-4 +4.933314250059317E-4 +4.933251123154867E-4 +4.933180903539905E-4 +4.933065788306228E-4 +4.933011012319815E-4 +4.932938052634966E-4 +4.932852562384175E-4 +4.932776163734935E-4 +4.932698618422184E-4 +4.932638385611005E-4 +4.932566968586445E-4 +4.932496520813177E-4 +4.932412130811864E-4 +4.932341393898451E-4 +4.932261826826219E-4 +4.932187896147171E-4 +4.93212235230635E-4 +4.932052474261964E-4 +4.931997416646991E-4 +4.931912369762529E-4 +4.931825785802189E-4 +4.931780035646277E-4 +4.931686550512941E-4 +4.931623328794551E-4 +4.931557014260166E-4 +4.931447391339012E-4 +4.931390049640621E-4 +4.931313675664037E-4 +4.931231531404345E-4 +4.931165261168131E-4 +4.931098778788446E-4 +4.931050889928654E-4 +4.930935220588779E-4 +4.930889068432268E-4 +4.930805084096617E-4 +4.930764054290965E-4 +4.930692130187286E-4 +4.930588623668117E-4 +4.930519944878789E-4 +4.930461541971632E-4 +4.930381936278345E-4 +4.930285805886009E-4 +4.930196099291266E-4 +4.930159941801405E-4 +4.930081937828087E-4 +4.930004189345743E-4 +4.929955988015638E-4 +4.929879770950129E-4 +4.929799000185718E-4 +4.929731614996422E-4 +4.929647856903839E-4 +4.929610942560864E-4 +4.929520974637139E-4 +4.929438717261698E-4 +4.929395726997314E-4 +4.929295534284822E-4 +4.929224119791304E-4 +4.929193422234327E-4 +4.929097348315527E-4 +4.929027127899344E-4 +4.928969140775651E-4 +4.928862550572675E-4 +4.928816620791418E-4 +4.928775779854195E-4 +4.928696783325348E-4 +4.928612210708192E-4 +4.928547016890705E-4 +4.928458657633143E-4 +4.928397988525696E-4 +4.928348369630132E-4 +4.928272865908657E-4 +4.928182167049436E-4 +4.928152082337698E-4 +4.928091203021462E-4 +4.927978803593697E-4 +4.927928532994567E-4 +4.927888366280553E-4 +4.927786250682843E-4 +4.927715028332876E-4 +4.927669694395038E-4 +4.92760151492032E-4 +4.927518387063926E-4 +4.927460001452899E-4 +4.9273719803336E-4 +4.927284056725298E-4 +4.927210965288417E-4 +4.927194410178885E-4 +4.92708932421605E-4 +4.92704249235249E-4 +4.926965482745974E-4 +4.92691547541657E-4 +4.926836258819082E-4 +4.926795240861011E-4 +4.92668944269356E-4 +4.926624820381483E-4 +4.926583604852229E-4 +4.926500975178819E-4 +4.926436355752999E-4 +4.926359595069308E-4 +4.926283479613005E-4 +4.926224273819227E-4 +4.926167173913144E-4 +4.926088259172862E-4 +4.926027793838037E-4 +4.925946990427148E-4 +4.925907415649585E-4 +4.925791805972585E-4 +4.925742205389998E-4 +4.925686086253297E-4 +4.925636995336619E-4 +4.925596153903453E-4 +4.925499874362117E-4 +4.925472017798669E-4 +4.925378201911879E-4 +4.925326112276029E-4 +4.925279721039325E-4 +4.925221394542112E-4 +4.925137809111191E-4 +4.925051871761686E-4 +4.924970081660328E-4 +4.924917627611552E-4 +4.924868996875342E-4 +4.924766376180425E-4 +4.924758852609622E-4 +4.924660547946775E-4 +4.924583188987456E-4 +4.924552117609852E-4 +4.924454894267513E-4 +4.924407001821957E-4 +4.924356627243969E-4 +4.924273555143823E-4 +4.924175641540159E-4 +4.924119985667829E-4 +4.924104791340726E-4 +4.92401002228905E-4 +4.923925237235218E-4 +4.923890614046434E-4 +4.923848038746593E-4 +4.923745972181998E-4 +4.923679451564119E-4 +4.923600491442676E-4 +4.923594437901392E-4 +4.92352695022528E-4 +4.923451862021058E-4 +4.923357371073413E-4 +4.923313339011671E-4 +4.923282448504316E-4 +4.923197661667953E-4 +4.923169173908683E-4 +4.923056532617899E-4 +4.922994338012309E-4 +4.922928574922232E-4 +4.922918461846062E-4 +4.922829514327542E-4 +4.922723641171836E-4 +4.922698084623613E-4 +4.922588179830684E-4 +4.922590013919907E-4 +4.922513502057008E-4 +4.922428338560513E-4 +4.922365088558383E-4 +4.9222881527319E-4 +4.922273394119048E-4 +4.922191172663345E-4 +4.922142529466341E-4 +4.922102374856246E-4 +4.921974120291169E-4 +4.921914851802555E-4 +4.921902294870885E-4 +4.92183020934873E-4 +4.921789340112613E-4 +4.921711544376907E-4 +4.92161714652487E-4 +4.921575056504398E-4 +4.921532042789499E-4 +4.921471618325628E-4 +4.92139242646546E-4 +4.921362403161845E-4 +4.921284118293614E-4 +4.921215634462384E-4 +4.921135714519973E-4 +4.921064726849283E-4 +4.921038656833457E-4 +4.920974840127618E-4 +4.920901020577875E-4 +4.920879578276907E-4 +4.920838293640434E-4 +4.92072624615644E-4 +4.920693533744924E-4 +4.920605821008584E-4 +4.920591923851426E-4 +4.920513682832173E-4 +4.920451144376095E-4 +4.920335092558428E-4 +4.920331266007772E-4 +4.920286325272146E-4 +4.919968854379834E-4 +4.920142457247176E-4 +4.920090770367038E-4 +4.920042470600092E-4 +4.919945420003666E-4 +4.919947066560634E-4 +4.919857477327166E-4 +4.919772331551245E-4 +4.919732456251224E-4 +4.91965124572691E-4 +4.919624214388893E-4 +4.919533510230458E-4 +4.919467099971313E-4 +4.919387192442407E-4 +4.919328417744942E-4 +4.919338773380454E-4 +4.919231941936646E-4 +4.919198179813358E-4 +4.919183970664855E-4 +4.919079470822914E-4 +4.919045262358818E-4 +4.918951322013699E-4 +4.918906686391737E-4 +4.918859627845618E-4 +4.91877231065873E-4 +4.918725099585966E-4 +4.91864687088261E-4 +4.918620735933963E-4 +4.918609139250131E-4 +4.918520659839818E-4 +4.918392829687798E-4 +4.918357644279743E-4 +4.918369515892427E-4 +4.918301052965096E-4 +4.9181967009603E-4 +4.9181891825518E-4 +4.918149918381495E-4 +4.918056900653605E-4 +4.91796913672488E-4 +4.917934085329179E-4 +4.917853194150216E-4 +4.917829173013692E-4 +4.917770990630026E-4 +4.917720468109727E-4 +4.917650713439675E-4 +4.917635494267104E-4 +4.917522324703604E-4 +4.917463410385665E-4 +4.917454790463098E-4 +4.917319115173123E-4 +4.917283633178126E-4 +4.917256640001921E-4 +4.917209115646043E-4 +4.917162390090127E-4 +4.917113516725038E-4 +4.917011187998955E-4 +4.916952255005428E-4 +4.91693178761549E-4 +4.91682170467296E-4 +4.916826120276409E-4 +4.916708143988108E-4 +4.916681110455902E-4 +4.916620616954202E-4 +4.916564392758817E-4 +4.916502346806619E-4 +4.916454176814035E-4 +4.916442846110462E-4 +4.916378100935423E-4 +4.916254289167575E-4 +4.916247679777386E-4 +4.916171810909222E-4 +4.916130160380304E-4 +4.916075102969444E-4 +4.916079023118639E-4 +4.916011786615204E-4 +4.915957202329067E-4 +4.91587399708827E-4 +4.915843760045075E-4 +4.915767956830884E-4 +4.915695885106115E-4 +4.915631180937316E-4 +4.915597845682728E-4 +4.915568052900422E-4 +4.915473375568944E-4 +4.915268020675212E-4 +4.915390731204688E-4 +4.91535899437133E-4 +4.915306702385965E-4 +4.91522645399383E-4 +4.915188626074612E-4 +4.91514104514626E-4 +4.915003740092903E-4 +4.91500564150141E-4 +4.914984895102979E-4 +4.914848051471259E-4 +4.914849852449399E-4 +4.914811279830113E-4 +4.914787413957963E-4 +4.914662703301587E-4 +4.914603589672753E-4 +4.914585618226348E-4 +4.914527672254271E-4 +4.914421979455825E-4 +4.914420761287739E-4 +4.914384228237267E-4 +4.914308662342507E-4 +4.914275886692276E-4 +4.914212159177588E-4 +4.914154127800995E-4 +4.914116123884911E-4 +4.913998762161699E-4 +4.914004491976785E-4 +4.913976395706665E-4 +4.913889430352743E-4 +4.913846626417426E-4 +4.913785243151199E-4 +4.913767646826483E-4 +4.913703551483714E-4 +4.913641786642547E-4 +4.913574187438792E-4 +4.913468270215112E-4 +4.913463056928478E-4 +4.913454628547471E-4 +4.913376219188734E-4 +4.913319226592693E-4 +4.913336387999035E-4 +4.913209604128782E-4 +4.913115532378484E-4 +4.913113912797238E-4 +4.913016501537674E-4 +4.913012522011522E-4 +4.912956662323425E-4 +4.912925714138527E-4 +4.912800491667102E-4 +4.912814860885871E-4 +4.91273437149465E-4 +4.912713369796505E-4 +4.912653393096952E-4 +4.912635228486529E-4 +4.912525231270011E-4 +4.912494463703322E-4 +4.912499220497053E-4 +4.91237993216809E-4 +4.912391728352515E-4 +4.912295993956475E-4 +4.912231569476626E-4 +4.91216043144881E-4 +4.912081384649905E-4 +4.91213788241639E-4 +4.91197682302326E-4 +4.912019279746145E-4 +4.912006520349024E-4 +4.911890086580158E-4 +4.911834680143239E-4 +4.911771172714049E-4 +4.911706761472701E-4 +4.91170129598583E-4 +4.911673837735479E-4 +4.911590257945982E-4 +4.91151532481992E-4 +4.911530423030479E-4 +4.91148367893425E-4 +4.91135285729853E-4 +4.911306784719471E-4 +4.911310419502625E-4 +4.911221088605607E-4 +4.911156014398158E-4 +4.911124103928348E-4 +4.911162605469742E-4 +4.911067650238806E-4 +4.910978523376972E-4 +4.910961301188543E-4 +4.910888744193341E-4 +4.910897638476577E-4 +4.91073807316414E-4 +4.910738968951253E-4 +4.910749004117158E-4 +4.910690448552237E-4 +4.910645062658236E-4 +4.910590844062045E-4 +4.910540613723541E-4 +4.910444283027675E-4 +4.910399956791676E-4 +4.91037532274227E-4 +4.910306713433483E-4 +4.910299386999711E-4 +4.910192520634397E-4 +4.910161333044914E-4 +4.910154470490971E-4 +4.910047894084798E-4 +4.90999206740041E-4 +4.910007446607537E-4 +4.909974918792661E-4 +4.909868623486064E-4 +4.909558298812178E-4 +4.909807317555999E-4 +4.909705778786354E-4 +4.909679255496289E-4 +4.90964177114295E-4 +4.909597951440193E-4 +4.909582075188891E-4 +4.909510427970348E-4 +4.909390436445726E-4 +4.909390153635363E-4 +4.909327771022231E-4 +4.909349322124516E-4 +4.909302664606626E-4 +4.909194274673419E-4 +4.909223350064276E-4 +4.909181532429518E-4 +4.909062468621188E-4 +4.909024905274051E-4 +4.908988886514415E-4 +4.908858360198918E-4 +4.908866308095943E-4 +4.90862689800061E-4 +4.9088120539052E-4 +4.908720748106457E-4 +4.908711115257662E-4 +4.908662034273895E-4 +4.908570774658567E-4 +4.90851545765707E-4 +4.908522471891181E-4 +4.908468786263965E-4 diff --git a/QCQP/data/b.d b/QCQP/data/b.d new file mode 100644 index 0000000..4a1921c --- /dev/null +++ b/QCQP/data/b.d @@ -0,0 +1,2 @@ +0.009454184334556939 +6.302044706931986E-4 diff --git a/QCQP/data/relRtn.d b/QCQP/data/relRtn.d new file mode 100644 index 0000000..ab3508c --- /dev/null +++ b/QCQP/data/relRtn.d @@ -0,0 +1,249 @@ +-0.006103910361932196 0.01622160400679855 -0.010857510985116987 0.00441891286930777 -0.005166194968553605 -8.483711913890569E-4 -0.0067279210714126444 0.01740342169810164 -0.010772529662401291 0.003695339841825899 -5.5026960079597E-4 -0.007836865393504913 -0.0033628595919434614 0.014795454412708525 0.014480077806325617 0.019296462311557856 -0.010224549559083737 -0.0034173323731027582 -0.0018382903735922832 -0.009633120027298428 -0.006644463085394878 -7.59289307455425E-4 -0.0011799790683090859 0.012967452171264342 8.691639295874801E-4 0.0029207531320174745 0.0011255909496496292 9.113921374205686E-4 0.0036510717207255813 -0.012096402532358663 +-0.004475913396481629 -0.008758341449945691 -0.005388065831580677 0.00167174656098993 -0.0020320613675307055 -0.00928283816474594 0.0065256898484337186 -0.014569138211382091 -0.00415533738135358 -0.001022683596291333 -0.016846493155948442 0.01669667340934584 -0.01074722609649689 -0.012864550926919245 -0.005919106287917285 0.012029205522169245 -0.014821469005647106 0.005786551650235788 0.003130791954526625 0.004819219355091253 0.0013935060927116386 -0.005166841386164985 -0.025203439222893233 -0.01775227397802003 -0.003733943948108966 -0.0164009814960447 0.0078042858691327556 -0.0025039836102890836 0.008174283006517527 0.006395195707415518 +0.00993305112853458 0.005843009999800576 0.004869761284497871 -0.004304269300923025 0.003167398118384728 0.010912432216833808 0.0030365449821344844 0.01372847382114962 -0.007625884892086383 0.0034807125307125234 -0.003583827936120276 -0.013327437510787967 0.010232402211601653 0.004247543363164184 0.003730883654097138 -0.01130159781761503 0.00205151588902483 0.006072863775060155 0.005323976403084693 -0.011176169117328832 0.01586418035068189 0.002520446174621024 -0.001885254460402561 0.005688313447281206 8.7117578128221E-5 0.014648636891027954 0.01351881436150354 0.014377019625741672 0.003268620694993695 0.023403635801499133 +0.025468548523389572 0.02337774090740325 0.01660303907712726 0.034142065004712195 0.02322956698240858 0.017180931194970866 0.01873671233237843 0.03034054379427151 0.02363341998501643 0.0 0.023715870251591848 0.019845021836533284 0.004001500512673588 0.006728866737756988 0.0166328492398116 0.02857699926775729 0.009099215402620795 0.02234460446891874 0.006939390319188836 0.0031148356359157153 0.007397260273972688 0.021407984969068452 0.005936251783475996 0.018830135588603726 0.02876070295905011 0.018276792838630228 0.018130037320253364 0.008323936820608845 0.02119831634422129 0.01317586722968144 +-0.013932407452829627 -0.012321846366253053 -0.029137953628899656 -0.0036683159557385826 0.003967379412990503 0.009667768855823268 -0.0021685326131470157 -0.023696682464454975 -0.006373881200393217 -0.004284819599462203 -0.013449697772294714 0.005963197614251406 -0.00535558593404435 0.004201231618412255 0.009639236643762514 -0.01283768945847263 -0.0073264313872133885 0.002382390694195247 0.003989880377037979 -0.011799623309219532 -0.004351346206146483 -0.019169141984157603 0.00912017191845964 -0.0056921854035379554 -0.003219222270253988 0.007843091651141996 0.003179852353731482 -0.006470348058902359 -0.0064222206814447055 -0.008744379475088595 +-0.023548633634660355 -0.010793328331557604 -0.016037621569263392 -0.002825601482784536 -0.008561997992579607 -0.009630200255171691 -0.0083709032255458 -0.00524270550161817 -0.004134012711788714 -0.003073709079379265 -0.007567753308250568 -0.00586539391817652 -0.0017530678468185917 -0.01369207024231388 -0.017740895132400073 0.005046564440993661 0.002611593050982294 -0.024387651887599032 1.8059970772043627E-4 0.018718848701012692 0.0038240643588073955 -0.010266205323193974 -0.009436456922819114 -0.0056541308341886325 -0.011983715383861459 -0.009727656390302103 0.0030429566678408554 8.982933055984064E-4 -0.009299399383243543 0.01296841540494548 +-0.008807842860191515 -0.022389145529261634 -0.024832440656622178 -0.011420247393270142 0.002657196634189548 -0.008501411299097586 -0.005032427070594839 -0.007482653295820655 -0.018751760395766287 -0.004111017302733108 -0.005270546500570463 -0.007532086036124861 -0.009031623067842113 0.001638860455831706 -0.01526833506598252 0.001545036723542624 -0.0071348242196548626 -0.005931638346292214 -0.010294383425941552 -0.006874050349219533 -0.010884408163265323 -0.0043795007781558945 -0.01247821028415691 -0.008316141753981869 -0.011182821505376377 4.533625647077917E-4 1.2643155020584365E-4 -0.017724949517612828 -0.013806515567430169 -0.015109779749470227 +-0.0014810113348250492 -0.016089303263931053 -8.478138179673406E-4 0.00390866856358895 0.0011043065614909531 0.0011768213273165046 0.006771104474284537 0.013308077180782316 -0.017067920478428 -0.0033023735128509843 0.0037202129819016152 0.009423261112549507 -0.004177240506329029 -0.0063523001664619865 0.008244117754070242 -0.018897030102255435 -0.0018249800804148151 0.0035162707195796365 0.008211697230140466 0.01819145846589181 0.006327483154194424 -0.0025467046990785462 0.011141304650579031 0.006809037935520674 0.0025228447809355205 0.0028701209759874596 0.02129673845750962 -0.002512585712941586 0.00674378781512866 0.005592434710194683 +0.012925119323287564 0.0011785798988764428 0.0014849081267532729 -0.0015573628385989527 -0.007059430529034552 -0.0035263925057842003 0.009075398782095517 0.012227469201059079 0.002819872491237869 0.005591219598442401 0.004998034284347427 0.004072388922546228 0.0038134359683089044 -0.0035838338547817773 0.003713368049587539 0.005699626460306076 0.018969214513330793 0.004459524315141139 0.007601773755656102 -0.007059417065703578 0.005467386251099609 -0.007117972920696268 0.00940614107514475 0.006051156787562119 0.0017355432442823103 -0.007229929315106668 0.004640801901857546 -0.0048087705431082515 0.005723517313001205 0.004659514574770914 +-0.008053603095349802 -0.020600368166574033 0.0039035585562878297 -0.013084947780156862 -0.01644074723131514 -0.015279187388401566 -0.010599855541635452 -0.027547058718973456 -0.014059449459819393 -0.005148270075200369 -0.01039338917772831 -0.018157925189003006 -0.0039255033059958505 -0.013512199469849346 -0.01894621407444973 -0.00664444036132265 -0.01928901018927925 -0.018076099747909045 -0.018681462859043027 -0.012332124934906883 -0.012234829043904983 -0.00880546234231346 -0.012912685852794713 -0.009199001808710664 -0.007882908733837367 -0.0030345165811248385 -0.020633197704895353 -0.0046019559273344736 -0.023859720833573343 -0.02573300553658766 +0.001159858758323829 -0.002554071591167867 0.01769349777871046 0.005356054134305479 0.002258843460582716 -3.422589787406183E-4 0.013797622058255228 0.012553428033654836 -0.008555988807145403 -0.012833822959349546 0.005985307532965182 -0.007308604741966208 -0.004449605672534769 -0.0012810898320528927 0.0025140098370244443 0.01416480369211867 0.005717553083506681 0.002583679648871564 1.8301299317206786E-4 0.007687162750226668 0.0 -3.1441038477379447E-4 -0.002157842153530902 0.010427024412883174 9.604470528284859E-4 0.016588099476306607 0.002326960641688013 -0.0023115581281350607 0.003843492000721078 0.007447803768127879 +-0.0022116799013695205 0.015665025089095178 -0.0015697627348018885 0.022183414847161603 -0.0013522199989231512 -0.02265465011827634 -0.013529764997846003 0.011294333523229024 0.0033307190008757424 -0.008597190366894403 -7.8581048976619E-4 0.003137035911722818 -0.016217558835846087 0.004637414990378133 -0.005091363614944557 1.940252219985507E-4 0.0026151564280327447 -0.006979426832795953 9.150805438337793E-4 -0.017461822107160338 -0.0016515826230892369 -0.0012582887304722066 0.014191147835954852 -0.002685821393435665 8.722871674135032E-4 -0.006736601493865268 -0.004517511465757732 -0.0037071362372566403 0.007270389424870557 -1.5246550516530047E-4 +-0.035148765783170055 -0.026842607148153785 -0.05188377540402658 -0.028537286153987707 -0.027984675513773954 -0.014129724665622082 -0.026213301199372627 -0.05712457528001467 -0.006639429906719481 -0.008460194764386449 -0.015335417024257511 -0.02935736767684756 -0.008177531046501454 -0.011981948536633215 -0.03532556726387854 -0.01415824254929707 -0.011794068949875296 -0.029087390924933176 -0.010422380881740375 -0.0341531270125129 -0.01847262200165436 -0.023070866141732337 -0.0205224011124414 -0.020907242200967836 -0.04174656687722797 -0.02908816967861842 -0.01021058211999022 -0.005581441860465045 -0.04685231505446447 -0.029041885371722077 +-0.010502209364305515 -0.039012524885132925 0.0043490975414926586 -0.006332401222490796 -0.015091757603900642 -0.023156670779153034 -0.02491872697589344 -0.017767196096685905 -0.006076287222351694 -0.012585323963623708 -0.019909807401270223 -0.0210401544096301 -0.0065436457770634325 -0.020477107762964325 -0.02905784174842816 -0.0289199477111963 -0.01973836377941657 -0.0290678357381909 -0.013118976591259792 -0.012360038629616264 -0.031179664673014938 -0.01418555654066253 -0.00829933333333329 -0.02352515484003568 -0.026739382266649778 0.0032598417652853116 -0.013117658506263495 -0.0100560341466808 -0.0349957300263989 -0.01789919181737776 +0.023991222465159407 0.02251826795879684 0.024828663551401946 0.020977119287206986 0.03866108150217264 0.0474718194801526 0.03111110256410259 0.03395945136680395 0.03117837383463227 0.016850269672709743 0.026658916880228502 0.030089301028204053 0.006586747117020307 0.02141263424586323 0.03922372256429349 0.06320905463514881 0.02435029324163638 0.07570542555632022 0.011795562628721215 0.030675153648433495 0.015946621284626185 0.03540185651871248 0.01522844032416569 0.02461087581664388 0.030838201460831605 0.01965039546574631 0.019550903846971345 0.008504535388398987 0.022659751009194994 0.018305364001684508 +-0.012956218539530714 -0.013027356713987644 -0.023862376435959603 -0.005981742626471468 -0.03132094799543922 -0.025641071351714426 -0.026856739280974318 -0.01474627636240662 -0.022380346489101137 0.005098810282557881 -0.009638348745936451 -0.009519404365893096 0.01806042308282045 -0.012816701185957291 -0.02989646049324272 -0.024580811737804815 -0.016571394285714244 -0.04595860573638956 -0.0053664136682750364 -0.0050668734401419615 -8.562499755634586E-4 -0.010739103053846356 -0.0040540945945946455 -0.010635226373641803 -0.019399873436676034 0.004097056021333749 -0.003354211864888697 0.004684938034315785 -0.019842035510306166 -0.0014129837617787157 +0.008641446262118595 -0.019327451592197644 -0.0034255294504473553 -0.022326931019468668 -0.023898781630740468 -0.01104906762621055 -0.0034923679132475714 -0.01244983289850225 0.02471190152686332 0.014584632961643782 4.5799177470775063E-4 0.004015535408714845 0.013497814455613589 -0.008252817952366901 0.008533527633534026 -0.031060774195365796 0.019988308425741712 -8.941768090512623E-4 0.024930232558139597 0.002477486615239509 0.008283376651435302 -0.00662517565952413 -0.012075970640812958 0.014917681901279779 -0.0015715817984946875 -0.011032129697208088 0.005905562761126732 0.010025670553174812 0.003103710638433197 0.0018866284245470353 +0.011603947636958628 0.02082997917000492 0.024561015780798532 0.017306003877002783 0.029524699951992476 0.007808764003093824 0.022480597016507318 0.015293475742808777 -0.031365514506022506 -0.0037499999999999942 0.019913081366247424 0.005966358353885147 0.00558096172404682 0.019281519999172752 0.009985186870617785 0.050000082661293674 0.013672143568604573 0.021031413144998474 -0.011254292975131601 -0.020594965675057208 0.005382521398938206 0.011008461494780084 0.02472192074500543 5.044167701629713E-4 0.018240749999999965 0.015281173127103509 -0.012814840911183711 0.0025392428439519723 0.013761942811183106 0.00549232653179267 +-0.02444252813510433 -0.0262124945253885 -0.01659144478785765 -0.015783961629393564 -0.043833085657101555 -0.006556240353774275 -0.010282594625917154 -0.023680322171247194 -0.03619983143119239 -0.013801756587202084 -0.02995966590104171 -0.021899147189558904 -0.02371338324562798 -0.01772200283309439 -0.01790675368098646 -0.06067595773133804 -0.03843990065820043 -0.03013038337231456 -0.022030493445373726 0.014953257009345777 -0.012397942383885955 -0.018597973295183572 -0.018630210177855388 -0.028950057403499495 -0.01927801200983891 -0.034918707558136586 0.008568844846884261 -0.017499470412157495 -0.031432256169237366 -0.028014016137995288 +0.01912085714285714 0.02063183396789442 0.02598934669402459 0.023075588436842216 0.009022263302719423 0.010259215693631526 0.00684177723491655 0.008131204448754068 0.0011093502728795695 0.007209499575911863 0.004973979351323813 -0.0014659891366567094 0.013695051325709211 0.007703162063524811 0.013058402755809918 0.01696651745570391 0.014611337886218425 0.013443312701422624 0.015393279519429327 0.03397792404205241 0.01797435144006709 0.011580830622428834 0.024583392179959234 0.015944890713286454 0.013722800439922066 0.04023696006377291 0.01699209347582997 0.016639396139648294 0.01744900332633353 0.030427168118612322 +0.009057623658779821 0.0058433196462413135 -0.010217051352640782 -0.0030479752147003956 -0.004349927396086813 0.019122287660326087 0.005117458182486338 8.272094419854379E-4 0.037042964604811296 0.009052631578947362 0.02117867809561107 0.028495087280810526 0.0075198063665538354 0.015389247945870904 0.008141084618556197 0.004824160804020039 0.004838686468708907 0.02920525057635991 0.00831948604178209 0.018746063596526294 0.012612135650224223 0.0068849009083371965 -0.0019993869101328624 0.011971676327773073 0.015183352873258036 0.025787122599121116 0.008291783352560521 0.01982482665226303 0.005685739327086031 0.016049847321393806 +0.0066252937246144 0.027476888482915608 0.027363767240631765 0.02454575407374865 0.01504851905222041 0.006934339450298078 0.011518270787384655 0.02031968688688403 -0.013127766352380808 0.006467807218860781 0.009524363057660575 -5.83934615362433E-4 -0.003162555224697461 0.01149087701310185 0.012627674226658182 0.00780153999593765 0.006764469080893462 5.414816302073706E-4 -1.833883354714289E-4 0.0012238909417685686 -0.011071159394653855 -7.947046385000334E-5 0.015359876504880155 0.004760787536579822 0.008018731561739491 0.01710023434961212 0.013726587861907795 0.0036166363645282773 0.005102040863228842 0.0023004600168557913 +-0.024309905232799484 -0.026436475353408505 -0.030558856074176906 -0.021570457655635995 -0.02606408417025355 -0.02557869168555508 -0.028797796372674458 -0.03469924948696258 -0.018252141740072912 -0.01575460133687391 -0.026126320936573494 -0.022463104735850836 -0.004695469364385646 -0.01723634299053623 -0.022829432178800183 -0.031560142287412885 -0.012754766262493097 -0.023273371615286007 -0.021456042938860127 -0.022307590884213895 -0.015673159809683663 -0.023854961452688273 -0.015127519670909834 -0.014645653690283476 -0.02493744257072159 -0.029314457784995352 -0.016468417501709354 -0.010810900413923427 -0.02935929966944982 -0.019967874380115234 +0.0025023935370517706 -3.1392246607951017E-4 -0.011161486740486509 0.010630890368928335 0.010802798919715266 0.009918030350456353 0.009260866846071436 6.29393641884347E-4 -0.009768441629613399 -0.011794481887110304 -0.011120676602820422 0.014079796117695529 -0.0034425092439118463 -0.006477339441501565 0.008881069692838847 0.015576921181042876 -0.004729530401902669 0.005984639056257232 0.0524737433944201 -0.005492101096424731 0.008245692820340898 -0.00439883505378245 0.0 -1.457486338797824E-4 0.012008488844384973 -0.0054774682985579875 -1.240558139534892E-4 -0.0020490893464976774 0.00263838869257954 0.010772755155062149 +0.00933363370234025 0.034542314877411176 0.03829687291842727 0.024745602050036185 0.03254797340529391 0.018817976733584627 0.01624715871498303 0.03501533358938593 0.014478918519615604 0.028772422368816032 0.005680888229113872 0.017682867015746038 0.0026867833834808437 0.01675031143681981 0.017367877256291797 0.03471243258753655 0.00197030600336461 0.023245566483823938 0.005876103988603995 0.018228335082446687 0.013818443706103797 0.006054639125718874 0.029384224814309093 0.004590869477253437 0.01911231849434205 -0.002679368859779798 0.009551622143561924 0.003650467549602133 0.019594934632723375 0.005946895457117562 +-0.015053784946236565 -0.01760503896805351 -0.022309835707755833 0.0033656037587817263 -0.0018818631795749165 -0.004675313131313173 -0.007786630154186237 -0.00877846603493732 0.0054893822299052425 -0.014294551481251352 -0.003631356169480688 -1.9304974704310133E-4 -0.0012760749798617895 -0.0056229652079618974 -0.014148204782174649 -0.0033158182172811344 -0.006246304438853775 -0.010981869433092317 -0.0051336694942938155 -0.021561793513526044 -0.00445062574546253 -0.004147706604974843 0.004671078240560707 -0.009212280507672399 -0.016798497612683386 -0.002537283582089653 0.0035018245745082944 0.0 -0.012213079771648592 -0.004760038387715844 +0.01910480391058524 0.026880857706742266 0.0309140593344052 -1.6768972746334252E-4 0.021447089323591885 0.00985848399607416 0.010769752970193208 0.0228217600637121 -0.0010918733256608931 0.0033627573197663294 0.0028925141565861725 0.01744339587124483 -0.006132566991154987 -0.004067499878943463 0.026290796028379856 0.031702603980532526 -0.005587288763250365 0.018724156121008494 0.009608558547890358 0.010545340528490524 0.014808577401269245 0.006533303549203058 -0.0027121141676354184 0.005124804308508773 0.024859879998376064 0.014065464190768847 -0.010530188821603894 9.092293289734249E-4 0.009751299307130996 0.006171318129625813 +-0.003427948654053487 -0.004513359342359414 -0.024297770927831384 0.0057870920291766695 -0.007844946931241426 0.0033880613494204227 -0.0026430990336168596 5.994205448210439E-4 -0.003435368466031152 -0.001675785434613102 -0.0032302607104853862 -0.008603782753043174 0.007455996818922695 -3.9845602548520525E-4 -0.01413767116048645 -0.01631259453124833 0.00690620390963358 -0.00534302189905916 0.00757835715268397 1.7835354579129263E-4 0.0 -0.004381346855983803 0.0080289431749684 -0.00728385207216086 -0.02707947357115262 -0.007672967729362649 6.806150439493029E-4 0.01090163549628985 -0.004158552852403189 0.0014567354918127817 +0.006127045105095569 0.012694635414678314 0.007561923006444235 0.006504327993734535 0.00697672093023255 0.006238259171024099 0.009358153209109757 0.012713859088433904 0.037605781886555875 0.015316806546370259 0.009432812336235852 0.007529780788025864 0.0030623706879276237 -0.0010961634498487926 0.007658670738189012 0.010412668522702184 0.009532655528923068 0.011710313457019625 0.025887774213320787 0.026930658226015064 0.005781910792951439 0.008964216518329503 0.00899287045184335 0.009245066143630912 -8.159927248597402E-4 -0.002825308550185976 -6.182588417301922E-4 0.0038194115398521617 0.010115037859780273 0.008727607132430336 +0.002777809888414715 0.00805851341416172 0.014920011345571148 0.0062966198748124255 0.029792171588733842 0.013764064973561243 0.015753249485229315 0.007690278741227141 -0.003775294415957499 0.009506075831908909 0.002751883387394222 0.01912727227264089 -0.0022897977065283346 0.01925379128598952 -0.01648053326197187 0.021755705276499723 0.01220642617256686 0.020176298612642918 0.010571150534658166 0.03573287491259932 -0.005474870119760918 0.005815370419439071 -0.002673784025034714 -0.0015267684145378773 0.0 0.006710468437532715 0.0056920000713975875 0.004476298119964197 0.010978406214677244 -0.009259274789741711 +0.013743884362413375 0.0075498886358301015 0.012710854678335472 0.019430273500990206 8.970845481048804E-4 -0.002244215601317914 0.005492730076912781 0.017220005442828253 0.004395952639139777 -0.00470827040770809 0.028243107238165872 -0.0753216748412981 -0.002932589570317616 -0.009396094927984735 0.0014587982206600073 0.0013074336700143185 -0.003754288879310918 0.0038513792026648665 -0.005905213430065859 -0.009012823194137673 0.0044040735257872155 0.0021681843906543362 0.01136217256830918 -0.006334607727817446 -0.008075483241770133 -0.01940460615006357 -0.004552476077161294 -0.008244273434842325 -0.0025898133052808694 -0.021602513798204458 +0.07588019808974882 -0.022480150528361602 -0.0010556744868035035 -8.883944435470596E-4 -0.0015684516789502263 -0.02834004224786425 -0.004177409925030289 -0.001603077940424712 -0.014790265173852492 -0.0039078363617407776 -0.015401745385540882 -0.007325734600982295 -0.04156010389616767 -0.0031617429420189324 6.692834645668998E-4 -0.025927998024099896 0.0036542080621218445 -0.0034218269717581503 -0.0047521895706784745 -0.0027072716423164923 0.001096108462805774 -0.007612219368296044 0.00252457709512034 8.792774904428789E-4 0.021953905964141998 -0.0070996075724897665 -0.014090594080595709 -0.004493305077209918 -0.003052104536222551 -0.0013310209729797337 +-0.015434228325655058 -0.007365068500902877 -0.005783237180752303 -0.011316797440116407 -0.01054759850656189 -0.040972233084972845 0.0019360923034534708 -0.015735369603122062 -0.020833348971099157 -0.010943588684699548 -3.9534108430834514E-4 -0.018957366668057574 -0.015343482935696347 -0.006442670298767702 -0.00869493259389333 -0.013213366273202616 -0.010353806011535018 -0.011549276750085529 0.0032401603553915007 -0.0029691084783064923 0.0027375308715448772 -0.006217166026922391 -0.005288315418995688 0.0018302950971607027 -0.0022377371801133444 0.005476844417609458 -0.004763962920854801 -0.012863890479262296 -0.005026300981687008 -0.006977647817068284 +-0.0017858914397669945 -0.006662674035998339 5.019133477282561E-4 0.010383484758130732 0.003628940802903075 -0.0028964276919114904 0.0020934138991967935 0.004828743882544838 0.010638298205203319 0.0158663458928456 0.0036721598687124023 0.006625307382690566 -0.010840148610834119 -8.978052852714472E-4 -0.020995431231274723 -0.008344673167954016 -0.010117325473074507 0.003684189473684204 0.024137310075223177 -0.0030630562670216385 0.004640949914251972 0.003087398389870054 0.007215189873417635 0.002850043930138571 -0.004844361668212325 0.011953412737383184 0.001385658464806717 0.005486922474306242 -0.008587807118254827 0.0013421600713039022 +-0.0016896829173074954 -0.0368902145393358 -0.028863174700308927 -0.008415609185699719 -0.011525378531073516 -0.013919165640306074 -0.02563074100619262 -0.06201703155993796 0.006191981615850834 0.02075622688039464 -0.00788027112731565 -0.002056787316215662 -0.00684931506849315 -0.006889695319227296 -0.01694568870917166 0.006849374044985305 0.004994204529482153 -0.02338746771656988 -0.002655601659750981 -5.120551423070655E-4 0.007065271931121522 -0.01101572178046103 -0.015332436848058238 -0.031698543516681214 -0.0046876047958172365 0.0013457536488823902 -0.010503792361035479 -0.02069122328331052 -0.06832499378532068 -0.005046124654322613 +-0.01652730950762031 0.007280769230769284 0.041937601300295356 0.0014689080996497838 -6.859396119824952E-4 0.004357383032313942 -4.947472704234281E-4 0.005192467388639333 0.014615338461538403 0.00865713745347845 0.006411006649580271 0.0026106348256475335 -0.002758579310344775 0.016991785813309776 -0.013443890192505034 -0.0013605441912430728 0.007396267276046115 -0.008698507022170133 -0.007655167249126366 0.002903223452722964 -0.010253669448093108 -0.005323513600712779 0.014677754044103493 -0.004966917332671796 -0.003804057465662267 -0.004479662468572901 -0.008771961216604899 -0.01485953099605295 -0.011385715423215932 0.004516998105761129 +0.014679125477618123 0.006285386648104766 -2.0409497480435615E-4 0.012222946445380163 0.01143903023196134 0.0034830859816591497 0.04842837264605536 0.007714002235498383 0.011978787504721249 -0.006786427416623776 0.04695869015704774 0.005344655264565528 0.006224024638007223 -0.01295112183981965 0.00359486692463103 0.032502879865650446 0.008833360303621897 0.021124515678139298 -0.0036894347863586897 0.00906770989530128 0.004634623773173382 0.011280387269173806 0.017106930817610024 0.005521070900612078 0.001000090935541243 0.020699040668937727 0.01898160806744122 0.007541833608296023 -0.008801046244237502 0.009861099560411837 +-0.0061857924916953215 0.004372251649402526 -0.005571936024541529 0.019320576241180363 0.011309658704131614 -0.011569808722629301 -0.00841989284828618 -0.01086731612148618 0.005543946824811067 0.03637463972566874 0.003984525070081138 -0.0016358028787090621 8.247147766322077E-4 -0.006109705773626062 -0.001207851242581593 -0.006032026503902532 -0.007391414432762955 0.016549946604074897 0.0010099478202323996 0.013289431773570537 0.004070610804375095 -0.00293112685230416 -0.03796685582529233 0.0018052275698810017 -0.006357820278979466 0.022189492041609304 -0.003775903226276954 0.013099438596491222 -0.0049216145907275 0.002031161707333842 +-0.00863368127061857 -0.016791013681591985 -0.021473852653809883 -0.011925461729771086 -0.009393827094471792 0.018112295916793544 0.0069041741623018385 -0.002487562171865831 -0.009834659367685015 -0.043048322668217974 -0.008902734836859608 -0.010376768442839182 -0.006455184904688417 0.01108534683809288 -0.0061301125171378595 -0.02105065427650288 0.013403574139035609 -0.02400337090377781 -0.01008915402574154 -0.01573819264787806 -0.010540513513513598 -0.018863277959033756 -5.142177591693787E-4 -0.011937802959113892 -0.005667303369884737 -0.01681999760839542 0.05773846384576498 -0.0023089817060959286 -0.008821109749671369 -0.013877024592592982 +-0.0017214987341772835 -0.0028463155330070546 -0.0120517718674408 -0.0019982415314663774 0.012192390783644457 0.02323618005676452 0.004965361088399119 4.156068134135121E-4 -0.015500361873605345 -0.01073957490332622 -9.199025824690735E-4 2.758898873398214E-4 -0.00525293089593208 -0.002691159121077264 -0.006965149104475796 0.03312675383817811 -0.011869715259662118 0.015825524459758017 -0.015118040005402464 0.0019036041092285948 -0.033051050722451396 -0.009904311112703972 -0.010289427652733168 -0.003875455750359115 0.0 -0.004240400705372195 -0.02388915403859109 -0.014348507622043682 0.003240933192247258 -0.003794734821641786 +-0.009636893697770368 0.006818918382192813 -0.016234772270094844 0.005045627061944386 -0.021637317794453888 0.04417504869869724 -0.008862089108899842 -0.003877558563599907 -0.027055885877587553 -0.021917247029905784 0.006932778883908795 -0.017586227586206923 -0.014174499919045154 -0.0043973117009256405 -0.011070245583050154 -0.019126213421105827 -0.012241253300937973 -0.01568418947368421 -0.011728199379096192 -0.014312851653463826 -0.014406863592832496 -0.0038668376249733852 -0.0019492398420755288 -0.021130437749040814 -0.007905874314266145 0.002349544856080623 -0.01688698584328209 -0.0124442122563983 -0.002666413646468801 -0.01991906959893549 +-0.005018928762232779 -3.1502597842087793E-4 0.02004997057250396 0.004143788415711029 0.013223848307709875 0.0018122670176933557 0.006330139412805998 -5.561101031829372E-4 -0.022309535826880316 0.001884816753926773 -0.014630745745129422 -0.0032291471371529742 0.0059204819306318875 -0.00863281443587185 -0.0027344541414084807 -5.735423327558949E-4 -0.0012739518774126754 0.005988642797804593 0.004013961675636275 0.0029554826493258957 -0.0037260247556900193 -0.006751080168776403 -0.003385442576089483 -0.007871017338707056 -0.006300963793568703 -0.019923820101851147 -0.00373407409844727 -0.0040418924383762295 0.00606680205655525 -0.0038056761133602943 +0.01245623854700674 0.01575547477933698 0.011309658524239362 -0.0038092452375327827 0.019351935628981437 0.039233439082104464 0.0077056455417516875 0.018013604242687366 0.02538969950184803 0.007316032608695585 0.010044199901258865 0.013522071500736902 0.014994380395258262 0.024200080514376665 0.006554980394070883 0.009563886946516583 0.015075912730746481 0.011587158498990195 0.003824109226909659 0.007473841746073246 0.0023015536422067787 0.015378122736910553 0.004703436050386214 0.01885169301471513 0.011096624600832302 0.0179371594039713 0.030922019853547953 0.011219909554067877 0.01880625578313474 0.009428619112644252 +0.0023386273988535706 0.006979944051808072 0.01794097457042377 -0.004700047834780886 0.009492296015282412 0.007234956130827758 0.008582950730869336 0.023570486560445775 -0.023664033479642167 -0.00954552831594795 -0.007944663070554286 -0.004794684044341978 -0.006212853789866221 0.013148798553656933 0.009619455949438544 0.010420670906037793 -0.02353476549222864 0.011139102095876284 -0.006406909090909091 -0.008986837871644832 0.0025832376578644174 0.011547125570293297 0.01092322468340117 -0.005550859310338283 0.008669215161855483 0.018208488053112717 -1.8177907157354865E-4 -0.0051936259397159555 0.004514416108976607 -0.004831355103770814 +0.01176705190166264 -0.010628389113628905 -0.006051164827888732 0.013046245989334834 -4.373715285369232E-4 0.0048066482003317375 0.004951253479469722 7.341209108339726E-4 9.631139801462473E-4 -0.014875340456735676 0.00806273161977264 -0.0015361052818313858 -0.007502097492271423 -0.006733040396183367 -8.431576835137827E-4 0.005625332622338917 0.003158968022008138 -0.004261099519215378 -0.010805210686559538 -0.007485670320325393 0.0014314342971656787 0.007444801120397069 0.0045021611654787975 -0.0025583455090183926 0.014812059573592615 -0.012691044862477394 -0.0013939151515151508 -0.007830992117489213 0.00739044260936885 -0.00792940393007216 +0.007619831714855259 0.02802422413089421 0.018116278306532417 0.01698665560559377 0.007219470733307021 0.007041107115703767 0.007236351373503691 0.017875062530017027 0.00930080164687623 -0.013611207996597258 0.007133636240463981 -0.0027272657342656565 0.013017930766575146 -0.017879948738776488 0.019957789029535863 0.01323883995452477 -0.03125729020894084 0.011794217968776222 0.02096552223275267 -0.012153566401558331 0.005431618067467204 0.010838328180980909 0.023562608454993486 0.008471910198292965 0.021803820556875773 -0.007449634932071794 -0.0032165988173430138 -7.175795092662923E-4 0.008327515407764543 0.007340355539186425 +0.008756189054726398 0.013933030651719266 -0.0012481654571843961 7.769266564875771E-4 0.005647219686202941 0.014303970888642333 0.0012228982336562168 0.008911604685724267 0.013822720270459481 0.017680034116428767 0.004292782762970555 0.01142980147654571 0.010777932398317073 0.017105121365358498 0.0070740331290949626 0.011777695988222182 -0.004454563073791384 0.01000620982037935 0.0018981880604281513 0.01963265068091028 -0.003696247011444329 0.008041564389232703 0.02239460778180895 0.008709094412331492 0.007759430111650495 -4.414864065408193E-4 0.0050535921500977025 0.009573982996026477 0.007914664319286894 0.014897546516111297 +3.9456501463502435E-4 -2.9868559964221336E-4 -0.004679326785958339 0.007917939330650785 -0.00799133926547169 -0.007629957132233719 0.006259595419847358 0.005780346783267312 0.004387948528632676 0.03008470275244273 0.016830486923905073 -6.933305361436142E-4 0.003007532385303234 0.0038355625491737445 -0.00213606636431099 -0.0056384503455801606 0.008344358245389764 -0.0021448982884323493 0.028074370856452455 0.019554113487318555 0.013127824967813312 0.0030620870759401385 -0.00538426327234128 0.0028269788039814695 -0.003762358878621471 0.00750886358977808 0.0019385229686213375 -9.483404457087867E-4 6.340779429062126E-4 0.01507778245038345 +-0.001281768907153824 0.008964574929030283 0.006219719254737651 0.004236005983857049 -0.005007598519486162 -0.0023331142124846382 -0.00462752213326778 0.002712114150121906 0.015759120971079482 -0.002673735143433529 0.004046051222174886 0.00111005967191671 -0.0012267138656106272 0.003624982854903632 0.004075440507783941 0.004207133865269229 0.012113241021104858 0.003377707370861101 -1.6751549953955496E-4 0.01938893326921656 0.010140873239436533 0.004016709414764394 0.006766769276165832 -0.009523809523809525 3.5131740425686217E-4 0.005991465731404244 -0.004051018828532629 -0.0023729948356193947 0.0029245027700429225 -0.00927381341203736 +-0.005429983162898812 -0.0056270843421751425 -0.007167941694975869 -0.004984998887836424 -0.0048140261528660236 -0.009088450994051053 -8.383583121063526E-4 -0.017323563996158902 -0.007526835868720034 -0.014435986205981192 -0.016223602509696476 -0.003880789940108368 -0.00450330246320019 0.004685630521561292 -0.009634725765491682 -0.0178507097322146 0.0015404431987254851 -0.00724267068491973 -0.008042878686327068 -0.013997505491910357 -0.0047407137551389545 -0.00344055040549161 -4.888304903131925E-4 -0.0010769153846152991 -0.007638305397044655 0.009587507820308426 -0.010077725776604318 -0.007611798106284374 -0.01628106085441933 -0.007377447364389059 +-0.0014890014192773821 0.013104943764558681 -0.0033613761744618067 -0.001387444065536988 -0.007036059806508362 0.009332712837023052 -0.0016018839846583888 0.007929792461623697 0.01748950599768607 0.0014647415470863934 -0.008511496084934424 0.006191734861843192 0.007950678873914244 0.020598552673893336 -0.0024838177056120733 0.013353134768291412 0.019048746535095112 -0.0017467940813809346 0.009290523491714124 0.009269315240083491 -2.801625183570483E-4 0.001846615772462084 0.002812030776231435 0.002233120266185592 0.002742608181390815 0.026474762589928046 -0.0011652336706150246 -0.004074832117094238 -0.01086901317387453 0.001758179535479381 +0.0062630979724862205 0.0019109951772893167 0.009297046633730046 -7.717737074989537E-4 -0.03764395482728063 -0.006323669062948682 -0.007334448829814667 -7.152210523689724E-4 0.003802859866226342 -2.0900542814442362E-4 -0.005633667624378504 -8.988798693605192E-4 0.005847953295905697 -0.006664175488726475 -0.007719127431798185 0.0031113104522567186 -0.019040973611087007 -0.009984580339998283 -0.011380753138075309 0.005129927167259915 8.407791479821654E-4 -0.0013623818028721635 -0.0017069008183455622 0.004379616029794085 -0.003352717605530911 -0.005606868831335404 -0.009578173069876876 0.018050541950674896 7.491833312808428E-4 -0.01196649400824083 +-0.002272307821850312 -0.0086561614638404 0.020602068027456746 -0.012359075494256643 -0.005752416147087347 -0.0036365954426280118 0.0 0.013143372852581508 -0.025003819518224574 -0.0022987670762285597 0.011277159539446748 -0.0029065605536331665 -0.006895646388529563 -0.003929423190700452 -0.008782960883740034 -0.02390076584745911 -0.010060350575460978 0.0018715013516322529 0.0011850177755206163 0.006914685345724404 -0.0019602352831205702 0.004654530096665436 -0.007083463864806922 -0.006655408455818393 -0.016200442777978365 0.005356611069731662 -0.002045762842300745 -0.0028368558590273246 -0.0069873926582782395 0.0031489705797169295 +0.010397098928549378 0.015687390853929405 0.03613017567567708 0.011809744941265814 0.012497130583131849 0.007085003564865069 0.005618494876698642 0.020615187564663087 0.002486851258119455 0.01445324614774844 0.012645368825582941 0.009786250558214101 0.008304983320829774 0.0012508226691040727 0.0029535738396624313 0.015327102803738323 0.010401757656644603 0.012868378861888996 -0.00963813002431743 0.01332568269018021 0.004489337948634526 0.022845282804612437 0.01205407089591374 0.009934485486277 0.009178484905385155 8.412366797533631E-4 0.0031059759748037264 0.005452821242294853 0.01407311973003707 -0.004185423441491069 +0.006468012480713249 -0.01690217180105671 -0.024455989453924243 -0.008811927371567024 -0.002285668571428557 -0.0025049351781450133 3.826955339753686E-4 -0.017115536334200033 -0.004186000000000056 0.007846396861449516 -0.015385416026650155 -0.002749391616283077 -4.0506347299644073E-4 9.611762629478493E-5 0.00126210771470899 0.0023932437407952877 -0.013489515714364828 -0.0010245696931264216 -0.0020488133856923336 -0.010972170495494229 -0.0022345810680049526 -0.0014057008651534887 -0.007778318033280488 0.002135115160402004 0.007668301245326767 -9.806528851494616E-4 -0.012571210368372833 -0.0037726951190756096 -0.013828281468781792 -0.006547017405859831 +-0.007497536733131447 -0.006373202810534902 0.011802157990602587 0.00366529684676896 6.872393728641543E-4 0.006411610249805427 0.008951097370838799 0.009859206335324068 -0.004982142068403762 -0.0045072934950359115 -0.0010702467241998706 -0.002894741274925812 0.0020262191277350032 -0.011338531757470838 -7.983277310924062E-4 0.013957722425018929 -0.004318111875322794 0.01189747692307693 0.012318169164787514 -0.0037523371656185364 0.006998879983234042 -0.0022679361319793176 0.006246974598811516 -0.0039568102869701775 -0.004601398024928803 4.2067032451755486E-4 0.01360926961949076 0.003550343195266287 -0.0015077800597689288 0.004393401533043604 +7.848719709603967E-4 -0.00984492825410311 -5.845912008611205E-4 -0.016239285537823278 -0.0025183150183150055 -0.0011149235447286852 7.57810101688852E-5 -2.5363255186913595E-4 -0.007823501799405413 0.001028997736159697 0.002571361253242205 -0.00414730772305664 -0.005527136694526869 -0.007580892288666522 -0.0071905807761707295 -0.008331805983187997 -0.0019275267575586939 -0.003547597666831714 -6.759675739721947E-4 -0.00626381327814243 -0.0022241311586285568 -0.0014108794260717491 -0.02288502683177046 -0.001909854938572419 -0.011200951394807595 0.011774657234351506 0.0047642867455849145 -0.0018868395336396528 0.003724799956961765 -0.009720510564289412 +-0.008920733086545776 -0.01009337195360233 0.0030362005571030223 -0.03491034645833381 -0.007115033279779601 0.0022854531688160195 -0.004625066378232252 -0.011731078219360959 0.0018924302160542496 -0.0024670847546686826 -0.0016029281839035744 -0.0029847156181509386 0.007320062653655652 8.813632270946633E-4 -0.004616734317236756 0.01260272146118722 -0.004707290397279226 5.086257859551965E-4 -6.764924627685466E-4 0.009145968922604837 -0.005851184336895729 -0.002904262120812188 -0.019434384680492852 0.0029085726555793893 -0.005124507638465098 9.697977279023715E-4 0.005049621313194303 0.0018904064272211804 -0.001905646619414254 -0.006380359918200439 +-0.03343221628946029 -0.026936539749452683 -0.02113356406602308 -0.006547205065108385 -0.006703583296513319 -0.0036059390857362227 -0.012111494607796355 -0.014308700122860557 -0.013064662569882871 -0.006595197856554056 -0.009901021892394307 -0.01684766093600427 -0.003498788951656133 -0.024559638685703575 -0.033955985574145475 -0.0021644841660260488 -7.275891429491242E-4 -0.00355834685280246 -0.011677068877982784 -0.011349251006522787 5.605661434977747E-4 -0.01511452424714265 -0.0036844238811385263 -0.021521728012834782 -0.04274357336910989 -0.018408332179930702 -0.01586919851060359 0.006603726103597804 -0.01653014126779957 -0.017041236379013412 +0.012996285171957823 0.013293744343036406 0.016199474641981904 0.03105696540948153 -0.0027927157832741047 -0.002128760046687348 0.007325136751867706 0.01197768558708781 0.013397128972932493 0.008298692773886023 0.011297275675675749 0.009913567413159786 0.011343632221054728 0.0029090279283973683 0.009382042062203343 0.00650759219088936 0.020873798037043693 0.00959080686479321 0.02260272182867396 0.011438262472133316 0.009803865271600395 0.008712301105328897 0.039275721481145574 0.015287348046085064 0.022845256301330996 0.01847158822536895 0.007471124625548739 0.010543603561387074 0.015019862700013722 0.013149070131506327 +-0.006970350681287984 -0.010495446666222567 -0.016834635155450202 -0.0068712126279573855 -0.0032671880171382035 -0.0033600266666667265 6.123851853367472E-4 -0.022835474335209594 -0.018098866570681885 -0.01913580325661741 -0.0028862740474910786 -0.009185226797967435 -0.022967031953091577 -0.005101040054979795 -0.014313139041488128 -0.008620671695402288 -0.01878271449895209 -0.0011116827017184944 -0.0031815471670874032 -0.014003457875369779 -0.0033286824779107473 -0.010935000259944563 -0.0031902085889570562 -0.012675685836608774 -0.012367291414255488 -0.005953204792196847 -0.011185341253878454 -0.003014166403566743 -0.0072981530656687525 -0.011159775058611427 +-5.086775022784464E-4 0.03213222536059561 0.012948651034204355 -0.003620313669662618 0.022243058352682078 0.018033981324824287 9.945302861496402E-4 0.010598380341034115 0.007533290712185999 0.0029369206182890987 0.004288410544812502 0.004529042594707197 0.0038266913715098013 -0.0011058610525197384 0.01093501392476061 0.03405798851344224 0.00545186569600352 0.019728906099915306 0.01730223445829393 0.007618777848096945 0.00890620651266352 0.007931405223521872 0.007262481714979773 0.005991199626791247 0.012989439996459401 0.013370459051373525 -0.00531211190900929 0.0027906744186046504 0.011965725538016102 0.013710073222452629 +0.012213709923664084 0.01450807056092092 0.01124133771237561 -0.012838078527865615 -0.001832295006871192 0.008357847761831225 0.01696599845780669 -0.006644111343300904 0.006999649904555407 2.091403428333025E-4 0.021403762324939575 0.00767873211015294 0.009938775082591366 0.008856652487352562 0.006744002450343624 -0.0043798176461171115 0.02928063692687409 0.00873099505178101 0.024108305414327905 0.005259909465545703 0.00551726896551725 0.003815300911140708 -0.010509605022373053 0.0033259186579118047 4.612084785754485E-4 0.014705881948711233 0.006659945798945883 0.008580774781557787 0.0073651086199730854 0.005690211022757497 +-0.0014077325713745682 0.01132134714679043 -0.0017464723776475111 0.0038442744340867617 0.0020650756280368985 0.0077151435363066925 0.0036822046608895377 0.0033442295081967444 -0.006477093309274722 0.0031367837724802 0.003030941664762959 0.004614122149740223 -0.0028309382582907853 -0.0029927773941096155 -0.006742368118414648 -0.005278954591625807 -0.009365429861049747 0.005114625850587703 -0.01015802966784908 -8.176102518577603E-4 -2.7440328465286096E-4 -0.0026922479793155397 -0.0035815857282747166 -0.004239924419982111 -0.005624721225211255 0.0029798319658722286 -0.004618680535397054 -0.00873766342894167 6.963045926220932E-4 -0.0038539894347024858 +0.016715366362206587 0.03166890604903383 0.03182447045002271 0.005296129586177934 0.013510419670731457 0.0034659252337273963 0.020365386648178867 0.02287432268722053 0.004134250344001398 0.009172378378728679 0.008596405037028295 0.007028601399344456 0.005137177164564363 0.019711846713791278 0.017035999247367886 0.00884486129214331 -7.0911129606086E-4 0.0029356687946829967 0.008796237315462354 0.017264661133464077 -0.001646487421692855 0.006907526960877951 0.017104586018839688 -0.0030966478763899373 0.023367999754005903 0.00945303135234169 0.01818415520903331 0.008118719366302183 0.01322069602217745 0.010783651363591154 +0.005051025006922601 -0.008852127229409904 -0.008154804113224352 0.02901606489745654 -0.01378210636159546 -0.0026806320791965045 -0.017904336791196997 -0.0014056738037720453 0.007125827169411629 0.012394092129725398 0.0133271452725273 0.0044917004253895235 0.018964412077052118 0.005495014993817444 0.005253416961691703 -0.020164790814742897 0.004612098027722318 -0.015708859707461376 9.688680768609272E-4 0.0013271747756406843 0.003023666766804017 0.005992761394101877 0.009992676334211097 0.0077657837146607525 0.0039869698805095775 1.3380602006689052E-4 0.04372453985329036 -4.6019329176705975E-4 0.005935475297088774 0.004397760368126306 +-0.0047300254809806855 0.0010083549699899613 0.002632081520180464 -0.004095754600628104 -0.003894661906315692 -0.009097539213879973 0.0067245145464587645 -0.006206321859647187 -0.0031445912938550522 0.003468720810802658 0.011010878432083253 0.005365974096271351 0.018743373317228883 0.014736039672723338 -2.570057861256144E-4 -0.014853292504414958 -0.006945215077523773 0.007434575954636477 0.009517663832306433 0.006827845719782228 0.0049327484279119175 2.3513873279296284E-4 0.008687271067348087 0.011944231734785211 0.0027978158087233365 0.0018726591259320801 -0.003363181575718313 0.011740377802494886 0.0074120492910502 0.005919046364728024 +0.0019801683168316456 0.0 0.0038971637347767056 0.008857924567258282 0.004829783808647732 -0.0024517527770227163 -0.006160019067833714 0.00630952843055177 0.010410031217349054 0.0024399959333062213 0.00660513783486969 0.00301083209943103 0.004534840632288116 0.003558328422052488 0.0029992587642970283 -0.009627593272072476 -7.112138369935902E-4 -0.0057069174173054365 -0.003994886417549172 0.012366387771520352 -0.010089965098989096 0.004388347273815911 -0.005980861387101947 -0.006244341732330276 -0.002520016177481662 -0.004138931798693428 -0.014327150214264337 0.0040955630467448614 -0.007115547840951721 -0.011284813981699343 +-0.004644209623840204 0.004173276850576449 -8.626920749301541E-4 -0.003762903790575474 0.005722133342232395 0.005490786079397313 0.0070942944636162115 0.00761357630940028 -0.005619684846071847 -0.009939107706675611 0.008365052135669558 0.001978394024035975 -0.0037405004996840475 -1.9162434483234125E-4 -0.0062368790847431264 0.005502567865003616 -0.0023725384683557418 0.0025729341146084805 0.0017647520691560367 -7.880723492318881E-4 0.0 -0.002496684130399949 -0.008182912350972531 -0.007049793103448219 -0.00577460965849289 -0.004021920044076629 0.0014414739191100595 0.006344867293340795 -9.75024399742191E-4 -9.783384647533272E-4 +-0.007048604972244395 -0.017340198012900664 -0.01826665881855621 -7.8706325484635E-5 0.0015930587526868812 -0.008217193718624928 -0.0034109965637625843 -0.0176519011476316 0.0032966875463627744 -0.028887501969114878 -0.004967463165937739 -0.0035404712855064864 -0.009968889434720124 0.01897820341266743 0.005158393045643429 0.003830700474279392 -1.1892984825041335E-4 -0.004540519288135745 0.0024023222678143086 -0.0027999329379294613 -0.0022038017136032494 -0.007117684898203851 -0.011040961199732214 0.0010804059101649718 -0.001996560450194116 -0.0024229371056275367 -8.996221651681225E-4 -0.005179013735645055 -1.4639371604914647E-4 7.344214074227019E-4 +-0.002599430191944552 -0.0027709348111417554 -0.003930171709273036 -0.004407004013535792 0.015451057280211582 5.244153202582777E-4 0.004464330556443385 -0.010148070124513674 0.015021170395869197 0.00886071692570814 -0.003195047708003146 -0.007857936131550355 -0.006277010510304511 0.022951764141694433 -7.69824224694721E-4 0.009267708691035959 -0.0035675468458815905 0.005651958466077584 -0.01645628694679667 0.009728346773606013 -0.00165657090953716 0.0 0.004661967742314655 -0.006629663840350921 -0.017641192892232427 0.007961084766413636 0.0028214731321710295 -0.013580760525124476 -0.006149612016933914 -0.0017939574768154184 +-0.01242988146692295 -0.00921317677156381 -0.012526924113321524 -0.019524155884528372 -0.009845580887124214 -0.010272573213743556 7.407851851852414E-4 -0.020373481914414723 0.014336364374763585 0.00501884148891676 0.0043571643647736065 0.0013085537460444485 0.018291867832395562 9.19521839080454E-4 -0.007404220177296473 -0.007742167667587902 -0.001074161581642749 -0.012719394847552684 0.0076347951976153605 0.0025457016210730784 0.0055310011061946995 -2.3631636621532576E-4 -0.015020088106241183 0.003957737048286827 -0.001203341675491481 0.01526103140271884 -0.0035318526752736033 0.012390935640617906 0.006580542980392232 0.0016338288821557117 +-5.074705798053085E-4 5.90420664206697E-4 -0.008773932480525156 0.015559496811032697 -9.039774011298672E-4 -5.295011762233728E-4 0.008142049971485482 -0.008932215466412093 -0.02507600189623096 -0.012484435861746994 7.480253577149718E-4 -0.006259048120634412 -0.01990179710138789 -0.016444648901141976 -0.002285266490904349 -0.03429504564879238 -0.008363166369050124 0.007290562487483086 -0.016766032835177053 -0.004336280245898633 -0.005500577406474778 0.004570120413832776 0.0019835853219148424 -0.013758978656526883 0.002594976782298912 -0.003032634653620003 -0.0010813888767888052 -0.012919311262903707 -0.0039030248138604627 -0.010521172738592538 +-0.01350667194570246 -0.021094556408105182 -0.038394303952029654 -0.0034135111263513653 -0.008821511169905321 -0.01615981201229704 -0.008002907665262174 -0.03618502995221416 0.007170677874647553 0.02191321158687754 -0.007374532788135616 -0.004014410410144304 0.006461049918831667 -0.00896693459680425 -0.01326760885633603 -0.005449097981039191 0.0073494096385541795 0.0 6.557960106313756E-4 -0.007258567255043061 0.0016593196902656765 -0.019138717062337676 -0.0014848181143280992 0.004467497592836253 -0.005823599556295091 -0.017854767651702543 -0.007878265623516196 0.0011480826899674483 -0.023411857994924425 0.010303330036267723 +-0.007411993076096247 -0.007082609899297528 0.00460250651680496 -0.0019913971483877875 -0.001825604746691085 0.004362098073540908 0.0028865294731216 -0.0011863084189886062 0.052468641812898335 -0.00845360824742261 -6.526027580531275E-4 -0.00882549724081282 -0.006288536452547112 0.009896362109262258 -0.0021899088326499568 0.010013206121292343 0.0 0.01001390035679258 0.004096346126435296 -8.299976155244738E-4 0.006626117983817834 0.0024789923435667017 -0.0030978935476292523 -0.02473475266121236 -9.299860270575787E-5 0.006194438292635601 -0.014608734832946925 -0.007798165495328608 -0.006570023604844802 -0.004324051562372436 +0.002177961049117593 -0.009257854139594074 -0.014677982931057258 -0.021550043726155006 -0.013260218872417984 -0.005576369973190401 -0.0071586789667896404 -0.025152000798155546 -0.003088220588235239 0.011228966521106188 0.006178400580888079 -0.009675418576897694 0.0077785631583010394 -0.011759243830905364 -0.0036871695820815424 -0.02375607975600604 0.007176151092259876 -0.007166034931794337 -0.0016318374939920748 -0.0036390926279743826 -0.004388370937695409 -0.014996793115852006 -0.009446799606468466 -0.012320993876646064 -2.789566646926446E-4 -0.010438958639735424 -0.012487690852456849 -0.003929681180290383 -0.012924060854967112 -0.004834513234722175 +0.006209314070453643 0.026348054937929705 0.003701948661944575 0.020474770225133217 9.268072289157491E-4 -0.00291172748634695 0.005946651348744928 0.002938457700411716 -0.0026552588485727682 0.023236623005621633 -0.014477529973316762 2.1238230088498167E-4 0.01295130787673187 0.004249664786567769 -0.004229412357554186 0.0059398544920454925 0.0072438072348153925 -0.007217668649571594 0.004740127492644716 0.009845551668766333 0.005785096578101927 0.01125688343237245 0.02120711453865939 0.007776484595621372 -0.016370588477898084 -0.006897511309236914 0.025042073288743995 0.003713158505453622 0.005012254398276301 0.011445031159613804 +0.013473186872163393 -0.015223835820895575 -0.02274937862265051 -0.019904053076004066 -0.021064814327203456 -0.014871295856276183 -0.03251318211020208 -0.024010289781187695 -0.005472607521481873 -0.00321543421283907 -0.005217562327793556 -0.01762461790504397 0.004649373627792805 -0.017773171629609646 -0.019821303073687187 -0.03409525714285708 0.01945297099740631 -0.020117567169900697 -0.006344541949820418 -0.014388442316083697 -0.003560586335830613 -0.0020821814187030976 -0.020152360044938353 -0.005546201895468184 -0.009078004728132352 -0.014707912297426221 -0.0288058639537065 0.007630104046242783 -0.003562325699745528 -0.0020351677640888235 +-0.003348914112554225 0.005001439602844467 3.018598924445982E-4 0.012641733850079684 0.006147978100071529 0.012405967090146224 0.01237310079135197 -0.00761465064263213 -0.009964277512322454 -0.006048367179369638 -1.018637309842218E-4 0.0020895526668122085 0.0026995628911226813 -0.001819004360526656 1.8059493213037043E-4 -0.020508795513878905 -0.005666682020739192 0.0070129383780153315 -0.005893925805699825 -0.003749363702103802 0.0 0.008265773146089664 0.01128669453942052 -0.00889102805616692 6.680026656359434E-4 0.002902557094749246 0.00688321139957701 -0.0057365761479313375 0.003983651624356735 -0.00195772907929616 +-0.01272782825300711 -0.010556432229118696 -0.004467193038352931 0.014819554934937014 -0.0051703173953070915 -0.0014639104822826165 -0.011542806226869746 -0.00686138444761465 -0.0046567222472584215 2.0288032865883155E-4 -0.00682418513534236 -0.011504213236925374 -0.003974333333333245 -0.0028774505490610273 -0.006318300331092205 -0.0183209187968962 0.010583809819127439 -0.015543005338251705 -0.013833991867029174 -0.006405917341459496 -0.004672952043074344 -0.010187822430657661 0.013268849370893385 -0.010438810705297386 -0.015449198784577515 -0.016675854924913226 -0.021689179747953983 -0.00600050745439615 -0.008444419488814608 -0.006048197892083353 +1.0315594165796213E-4 0.00823046779103088 0.014644311738190028 -0.002698380952380947 0.014410511957925254 0.007276259616067415 0.013127773984803087 0.010548978452202764 -0.09900393603972424 0.0314337856127806 9.742744134083299E-4 0.01862086903173906 0.004633813756369795 0.007791439089952351 0.014715256167711825 0.010049262102102566 -0.011854045481114647 0.011174861480676007 0.00701399453884444 -0.013176467850074288 0.004142557419015491 0.0019298568516415697 0.003182009584897928 0.009147857562151205 0.016369643866130323 0.004905382057614029 -0.006987619196895102 0.00928723009055034 0.005386840810453958 0.003206964861385069 +0.010621831384739325 -0.0034770066975960768 0.0025698969532927294 0.006127614001985915 0.0020959478829982343 -0.002102420485175142 -0.002184782198855577 -0.002646482413044869 0.0053601171631471635 -0.010813999000904408 -5.635008250370213E-4 -0.0024278493073047604 1.2805893165679082E-4 3.8179823561500643E-4 -0.012756203676986823 0.00934008121827418 -0.0024458303931302805 -2.0273750996875847E-4 0.006633532448317298 0.0017966599051857106 -0.002200274966989147 0.0034510514197600892 0.009271709048777492 -8.983340358921928E-4 -0.0069570475555133 0.11129711762749461 0.0023669075193937824 0.00897170441748997 0.003827116375837545 -0.005409868852459022 +0.01020408163265306 -0.002275500675834413 0.0016988375398993144 -0.017242743019852937 -0.005112665700968221 0.011182496833328767 3.7752360235994415E-4 0.0045698755004036865 0.01849385204931684 0.0021863843731587266 -0.005535632838473656 0.001145340038912205 8.967333050663148E-4 0.004961396907955291 0.01219562005091653 0.0098572120269002 -0.019264471237256955 0.014197353065638883 -0.003953904382966928 0.008722589202292097 0.0013782525186950474 0.0 -0.01172489985283811 4.087216089168729E-4 0.0084453457325915 -0.01669179216867479 0.0011487203886818259 -0.002508002678796038 -0.006100025385827424 0.001977962814503422 +-0.011717212121212128 -0.009426714737420513 -0.009372750898136616 0.0038632032193158666 -0.00327033395771236 -0.017416364579092614 -0.007924550943396256 -0.018049681754697882 -0.006052723604568515 0.0055534115649905555 -0.0020616894740400652 -0.0020734591586339768 -0.0029437477131862987 -0.012247232274807986 -0.012899713627602618 -0.01454183237964471 0.005238119047619129 -0.009599029905028861 0.004134965334683515 -0.002020365314698001 5.503990888852419E-4 -8.797968557929598E-4 0.005870792419990399 0.003104812510048313 -0.013989350704428007 -0.02641989856847215 -0.0024861287207919454 0.00548575999999993 0.0015855052867122861 0.009294266996310818 +0.007052361285869271 0.014121227502034345 7.50908615193465E-4 -0.006012987909572968 -0.0025778534135389437 0.008046955285417086 0.013997687653047368 0.014794858928568197 0.02666232806656769 0.011439802535704018 0.00408020359674112 0.013326545150921945 0.016816392379553412 0.012495145977555263 0.0016335420266461343 0.025874246495365877 0.0015395309914841815 0.007168086607730807 0.015318728633153159 0.014252182593767634 0.014305392809100034 2.401456970883833E-4 8.51167335874609E-4 -0.0013846949918879955 0.0010616735733840928 0.0035396434653859935 0.005368168593255869 0.01523068810044609 0.007710738827444867 0.018661894048259294 +-1.0151223080800057E-4 -0.002118964734372429 0.004382081849674512 0.0012904984362680384 0.0035243890149345538 0.013861958377409679 0.00600197345647699 -0.002945247079673919 0.014748284470210246 0.003900175583076753 3.600226251732055E-4 0.007424189012015321 0.0012624542515143429 -0.005316090955613817 0.004756672901226097 0.012216729064039408 -7.094477947261809E-4 0.014033700600767838 0.009085042327791037 0.0010379041916167805 0.006509411622170018 0.0036014806787070548 2.4303244424814753E-4 0.004730848364287962 0.0032780273498068785 -9.144349739608421E-4 0.013348531061278103 -4.4785042543648673E-4 6.081433182960882E-4 0.006 +0.014108881875016674 0.012437433641741135 0.02175471454004082 0.014902521466912504 -9.36572253256286E-4 0.013885199692050921 0.010664539060766223 0.04106045960976421 0.006793064878247426 -0.014374475524475525 0.00822709807131016 0.013405411662139499 -0.018282650820392106 0.011834300551959347 0.02795442623960039 0.00953868034920532 0.016802721173761265 0.006820818235633904 -0.002893906705885699 0.011604733841217333 0.0013473187456933694 0.010207320411366549 0.006923357052754687 0.018022422471180334 0.030943696539375398 0.010460198334458843 0.003261849244283645 -0.005376277002156798 0.015547411582944051 0.002385709741550726 +0.0 0.015880119850187162 0.015325195369596667 0.012699404916253744 0.004452847642505098 -0.0012068212697363696 0.008633397029710776 0.0019862310989130494 -0.00831631884512783 0.01182495026310812 0.0078029323969509325 0.002216275380679249 0.025173374965664286 9.43406931052834E-5 -0.005000214812048401 0.005784785850659735 0.014895833818224012 0.0026510064339912666 0.00451465656239917 0.007371762584237562 0.007265877287405897 0.0029996684559518965 0.009167695798125555 0.003748014294290014 -0.00615208805138045 0.003752600980235384 0.004251550528303708 0.012837814737035436 0.004737430831982381 0.01055132065328074 +0.003903502996556812 -0.02226802897118489 -0.018896180217811056 -0.031899044812259386 -0.006766238759537048 -0.012976101508502166 0.010681044543404131 -0.03178764601769909 0.007278465074707772 0.0 -0.0033399321727649546 0.0015893510391441167 -0.008268554247055783 0.018956918032225954 -0.005245765785873601 -0.01840488880368091 -0.007797271044573601 -0.001370936113270586 -0.006420497695353078 -0.00371760595610565 -0.005877664974619191 -0.017157256684357813 -0.012789958747790658 -0.006514657825184871 -0.00215723122799006 -0.0027072192858063207 -0.012451749858415823 -0.004002668356623048 -0.018860448061553483 -0.008949591983425804 +0.008474566047620126 -7.541930277137965E-4 0.01594243365926414 0.005990973267267781 0.0237256753582335 0.01676598848291489 0.01266739106771152 0.01945015426477596 0.0034558749607289264 -0.0019477600311649096 0.00507743089734599 0.010418069402262073 -0.003410876533053202 0.001943715272642364 0.006913041621677938 0.02246087846756095 -1.1558997013278673E-4 0.021670905422507297 0.01227783482139461 0.00573467937836792 0.008331120890382172 0.019778996311154592 0.001210873045689548 0.007756849074205938 0.004323705276094572 1.2929162190677927E-4 0.003152187717569907 -0.0026792363768868184 0.008296307456870499 0.01204058954436929 +-0.006426119497259136 0.001660392452830142 0.01375606165290895 -0.0017704892681395285 -0.041303417104019496 0.001570449675812456 -0.003430993713981145 0.009539535354174998 0.020194066684501254 0.0033176813693332734 0.0037383430725689603 -0.0037555685303291867 0.0053238560695125624 0.016166281755196306 -0.0035648138211213628 -0.0024832283661213495 0.013638465567676714 0.011901314677007108 0.0036705872965210103 0.01034963532199045 2.6649786780366284E-4 0.016961107451293436 0.007497835107078437 0.004840501622928934 -0.004585840048401334 1.291715084980164E-4 -0.003833584836399632 0.0015671368510022609 0.00933165730823997 -0.014323747427618178 +0.001890567164179173 -0.009644363929409835 0.015137252669017748 -0.008545614249067987 0.017233150244929482 -0.002195149718338585 -0.00688560474660172 -0.018969790408525703 -1.5335277438563146E-4 0.003501264345458215 9.562786153679669E-4 -0.003015675243961985 0.0027739377827245763 0.001818154545454511 0.022216323974801073 -0.00402150509342197 -6.841277314980195E-4 -0.004932144550886902 -0.00477021791652437 -0.006648631311234824 -0.00399674937374756 -0.004092340517811028 -0.009842756207964298 0.012319395379911361 0.03967657916814044 0.004781636267057454 0.0017033878526082858 -2.2355832706489524E-4 -3.4790735875999833E-4 -0.009846724370682123 +0.004568477414470542 0.020389485386648074 0.0021903931110856967 -0.008700593380209917 -0.003764705882352861 0.0028285212334918275 0.008522258705360304 0.006300658946977627 0.007212906248440413 -0.0031013762357046653 0.011162514803838607 -0.013543255226159819 0.006286935826567783 9.07495487499946E-4 -0.0018147165415250582 -0.0049990003845030535 0.006275707511133173 0.009913191882062987 -9.586355647868166E-4 -0.02603322326108851 0.007223140523725524 0.0134130179380684 -0.002182082729593554 0.004680482023863429 -7.234762032288012E-4 -0.0036012733118971534 0.006109088084828596 0.011625307399955358 0.004773536846633464 0.035447902230364904 +0.018091952187998927 -0.007008679004135876 0.00938692544571111 -0.0031170944756920608 -0.0030704062352385456 -0.0054844764505272035 0.009023166779025855 0.015617114406990542 0.008075682221957097 -0.005638751701341564 -6.464693989119585E-4 0.007178193352212955 -0.0038735224774900635 0.003535802261038951 9.523028144350493E-4 -5.796908212559721E-4 -0.001360721139342005 -0.007833827498834184 0.0065568528155582366 0.02049624492977625 2.655511147116527E-4 0.007497474925542636 -0.0010933908660767648 0.009395194236868933 0.009321257918552069 -0.011359300227710041 -0.01139284507042256 -0.002872950276243095 6.432919062550053E-4 -0.010146371232697978 +-0.02728689957408517 -0.006757726791273515 -0.013602486884414452 0.0011519707163002864 0.0045013741886133956 0.007773167261759572 -0.005464790864362856 -0.01204646442908389 -0.01859135316860008 -0.0076261049594467745 0.008259959156789847 0.0326598454840895 -0.012418439382608637 0.01300925986070536 -0.006962463091107376 0.005027049400095592 -0.003974100147609821 -0.006849324385959124 -0.006831919396757493 -0.009748668935468384 -0.007965985130111517 -0.010099483482428541 -0.0025541108908524127 -0.03707692307692302 -0.014704563926338782 0.004700365828456198 -0.003292528481274672 -2.2158688434374877E-4 -0.0029673145840847298 -0.0145539980934116 +-1.9962064888936224E-4 -0.004838206907139655 -0.001210123028541423 0.00493136360534827 -0.00919820711329206 -0.002293115429093399 0.006137158133976982 -0.018648623133676913 7.70106268288766E-4 -0.0025615960591133012 -8.883580691813882E-4 -0.019364774210507356 -6.351200062826059E-4 -0.005796789595918803 0.008970940012826204 -0.001346671796844946 0.0038759347483363206 0.01791182915877725 1.600064040955507E-4 -9.093267163455774E-4 -8.02971070584194E-4 -7.671524948822881E-4 -0.007438117121372579 1.597459658091499E-4 0.012649012764118785 1.2998051189007931E-4 0.0035575693143366535 0.0037685213086118014 0.0017360664165852683 -7.146577621938383E-4 +0.01068396384055984 -0.0018231996353691429 -0.004592857220504723 -0.007687863114939067 0.001190264279469775 8.880014533222709E-4 -0.006809035860378846 -0.003946849673820001 0.005540058223758514 0.0025681746852661935 -0.0010866930267230202 -0.004441468898880752 -0.002160625317742841 -0.003498448057989352 0.008934321645868909 0.007705663648622677 -0.0048830457615952946 0.015997026893677175 0.0027191138835572157 1.583221229717714E-4 -0.003214652921797244 -0.006832489130680642 0.0 -0.007667723825903896 0.018601716558246873 -0.004807731351451771 0.0049376400269821085 -0.007287941857065771 -0.015399856628866317 0.00619784674132457 +0.004840920718821174 0.01856927025430474 0.014153480781522032 0.020769768057862608 0.007845886641800207 0.007254313411333831 0.0 0.012400954009399374 0.0026018673156943685 0.014975330049261144 -0.0011867230615976642 0.004667179231307843 0.006113819739808437 -0.0035106581514324935 0.00906917370527839 -0.0024852035464499422 0.003765856570781273 -0.0028711401049259567 0.011644584648980444 0.004035728336715064 0.013168557193457513 0.037644045669167785 0.019778869292902467 0.004104974309481236 0.007057821033221379 -0.01383988843660464 -0.005102349606299259 0.006896484829889164 0.009253656392147496 0.021558904403985796 +0.00904530536864922 0.009115376841463695 -0.006559232065625308 0.008478030011756652 0.018164685495746142 0.009430088082901574 0.01863886323387023 0.01819232428649474 0.018165088744769024 -0.011648185270750863 -0.00490125736667018 0.0016394998756830037 0.0060767567053235825 0.004336070578213391 0.003433936674708742 0.004791107704101188 -6.820941414516801E-4 0.029444527979025456 0.016871649854041312 0.0043348282695229706 0.007692334013465852 0.0037991282851934007 0.006987037537958369 0.012264521042084198 0.00902319738899353 0.02158089529433195 0.0060149233124613755 0.018338533731265306 0.018437373575152634 -0.005720516344152025 +-0.0012666569599529757 0.010661942998103647 0.009552691267180844 -0.0076061247781245385 0.00857272937905468 -0.0031310952575831375 -9.814848638633887E-4 0.014948790288974721 0.012593763684877041 0.005303476723629997 -0.007960228855721431 6.13913538873068E-4 0.007801623155887502 0.020957024644720212 0.0017744686993581523 -0.0051497234407782404 0.0037542775027467664 -0.01091761236276073 -0.00744295262654528 0.008396762895720104 0.004474808924727081 0.008089024118738505 0.00777607406513096 0.02541974996372935 -0.0028650981073103615 0.012830455529784575 -0.017307571384653355 0.003254545454545314 0.01751640039347283 0.01290626702325727 +0.013170712195121946 0.00175828571428567 0.003701399794306519 0.016296926574350785 -0.022053733564294277 -0.016631537426390137 -0.01256135438596498 -1.4030018038574675E-4 0.016286615097918036 0.016217233294255635 -0.011333977271834841 -0.010633310105424492 0.0061181923395275725 -0.007840709931447302 0.0022352410179441473 -0.08588957055214719 -0.0011334693029534792 -0.017697527339056815 -0.008123730413256402 -0.004085614785992233 0.006551362683438156 -0.00964367666795286 -0.02754036152754886 0.009575959163798036 0.010274279673910001 -0.016122878666081128 0.008582022598834595 -6.488537781636247E-4 -0.002596696392686685 0.009748265349618248 +-0.02888781952600519 -0.004680415181494042 -0.026590866933440142 0.014765428159359918 -0.009396335447498252 -0.0056026391371377625 -0.030061905973752034 -0.01971098512501387 0.007575830529950876 0.009229071687331999 7.101552232432282E-4 0.0023424802897339704 -0.00471587230787109 8.874089623320338E-5 0.005512531583540393 2.097105704698099E-4 0.00851015574186392 -0.02145242384843991 0.02079061203998696 -0.008243801620360959 0.004686279614683854 -0.010629547391879457 -0.002197265678644265 0.0028303374230961324 0.006032957045875633 -0.012095201093707996 0.007366033969165131 4.3282840148932904E-4 -0.011088627047426757 0.004712998752269042 +-0.013187913003230757 0.010580366910490802 0.014926195037464729 -0.01220374697326524 0.0028456961273746555 0.002000889853069685 0.0019051070312164765 0.028980343470483033 -0.02226721964909088 -0.016193617214950648 0.0012165703630199049 -0.00384914413880184 0.008478803309681007 0.008257134198449726 -0.006361180243078221 0.008597169398137315 0.003937961429049028 0.006738151084611778 0.016355578347649447 -0.002442463795185441 0.03472402176729713 0.019834702336527232 -0.0028137509863897948 -0.007322707521462803 -0.01524891591067637 0.012506648400561518 -0.006933976342246316 0.008652411853774675 0.03510146341413481 0.0026481501497791324 +-7.033762269909171E-4 -0.011778363171951385 -0.00993538624536794 -0.00696917732563184 -0.010167888149257781 0.0589101235607276 0.011042818083851932 -0.03657865014091825 -0.017450472458571026 0.0017428544102023275 -0.006176594650129697 -0.00986678444123016 -0.0028436573755066087 -0.005195465043949691 -0.005854357246264107 0.014760977744739208 -0.01109497889403855 0.001885341216339819 -0.005769014463229903 5.923465737605475E-4 0.008514901076884634 -0.006188381973317329 -0.013740681787739337 -0.009067097042163023 0.006176659578338262 0.00819135310407737 -0.003935476879194841 -0.005146943917071692 -0.024821042889283627 9.054859370513507E-4 +0.0028155455851848867 -0.02236605389002418 -0.008589406151791502 -0.012999417920084704 0.016005685236366807 0.02923076426799002 0.004846278481012605 -0.0038255956891812904 0.008127648761961046 0.004832785617630002 -0.0032603106990274334 -0.003763017421602855 0.016738970446646725 -0.001947428503607753 -0.00868491806810049 0.01372667458048192 0.005893064503469278 0.01213775886467584 -0.004122721152014749 0.010695788978485903 -0.015396026818972 -0.005782053630039477 -0.005970829779460532 -0.004885274238547326 0.004236537982481826 0.014315204870838174 -0.00962269958734008 -0.004526816221746488 -0.007341241139706721 -0.010479485905303641 +0.010628677109334964 0.005719415842281074 -0.0036885853642111307 0.002343253032591287 0.007053915049469054 0.0028931289015532886 0.006478613683826942 0.0036229260061925225 0.0035831291318395423 0.005579068872643445 -1.022436859400126E-4 0.03315605601502248 0.004024414634146259 0.01188466518847006 4.273302186562073E-4 0.003031548100242586 0.009463677118889647 0.00436925722785173 0.010886215717782808 0.0044517887295894305 0.022446379700056408 -0.0017148524349408147 0.0036289949378552843 0.010675562835259588 0.008092931414671854 0.0011442593478891367 0.005147693066142665 0.009527912516240803 0.008563197628391007 0.005333310476190447 +0.0012897807194188144 0.014067674348997411 -0.005366763256992569 0.0020153163559375326 0.010973546067076984 0.005192566825506868 -7.867257509149863E-4 0.007003111941488384 0.0029752602949233878 0.004017600918308661 2.5558679337349513E-4 -0.011306689464590798 0.0023077249530494407 0.016215321806129328 0.007860212018628862 -0.006649244274647513 7.81250017438699E-4 8.3298777459285E-4 0.004398619748217647 -0.0017883173867183145 0.012333497475740073 3.7346329355043015E-4 -2.493391614464697E-4 0.0023130532531932427 2.5627296118446935E-4 0.009779070606529609 0.003264797241831031 6.435650073694911E-4 -0.0028462348397108274 5.305570412404324E-4 +0.010404310551016751 0.005607983895868289 0.012089918098423465 0.00707962171167448 0.006466582135486901 -0.009374878913167075 0.004079822285027968 0.020791576449428716 -0.005487911761729849 -3.8111661585353465E-4 0.006949772528491318 0.006710922459158545 0.001454217212344294 0.005347558990036814 0.008053274515207617 0.00811363099621971 0.0011151890513033894 0.006936095633110949 0.005436439060156416 0.0034662095549847106 -0.0048733185947045475 0.004106338597785028 0.013594375155899185 -4.6152307692313326E-4 0.0036714479933885147 0.012828536968216949 -0.004338999461849076 -0.0032154768182003643 0.009046976425452042 -0.004241758695901947 +0.00794349310636966 -0.007044247241623857 -0.008495868728023034 -0.010385069499920145 0.005965993301239478 6.759644600648178E-4 0.002851397225915238 -0.018752619091423832 -0.008352050334733078 0.004574952431851875 0.004922613474915787 -8.162438207008622E-4 -0.003509208658146326 -0.022134480475883303 -0.006138868047438433 0.005231347983272738 0.0031191490404082357 0.005602507501905946 0.0016521477425010238 0.004502247339466327 0.013956904995102673 0.0016358241640335564 -0.0066444446897175 -0.00561793896232203 0.002041667323479353 -3.7251956255461593E-4 0.01845683881823798 -0.0075268387096774055 -0.006856249470231906 -0.0022060625631945825 +0.0020431893563259934 0.020100397865776106 -0.011674041094007683 -0.010897626999458189 -0.0013686359489052658 0.00786492159227991 -0.004762567766121459 -0.00851766473678575 -0.0048127539423296894 0.005882295903561799 3.029895908900564E-4 -0.014432534647916969 -0.011536077997233208 0.0015792331572407863 -0.010957380610005027 0.0036028823779600096 -0.011549150087202148 0.001643985782153424 -0.010346408446651521 0.010741462932200857 -0.00990099009900982 -0.0034889909849087444 -0.00507869422474818 0.002708698870359299 -0.007725647272895436 0.009441018633540374 0.0023911716887890424 0.004333607612844713 -0.011393260651700522 2.2870321306251497E-4 +-0.013690611004769674 -0.018545335491683714 -0.01253926739049442 0.0066106015393013725 0.0 -0.006463069550386153 -0.0019998500821316626 -0.018769895501880057 0.004836028557836637 -0.01018670100685534 -0.008986263035276037 -0.0020032326586106905 3.685257894711868E-4 -0.012964295271047765 -0.017837274436809252 -0.02572798216449912 0.013144567730714204 -0.006109218676196262 0.0010606060606059573 -0.004702056725441406 -0.0017073170731707386 -0.008492244916111176 -0.011205204183266764 -0.00532574105164789 -0.009839100184097426 -0.006522261714933303 -0.003892090322182905 -0.005825156669909652 -0.013770837063047419 -0.003429855261353369 +0.002264185818779565 -0.01697670554994703 -0.0030936595492925428 -0.007296854460737881 -6.852215780086372E-4 0.006456878554699868 0.0034352752718892973 -0.006621498037396914 -1.5032336141751018E-4 -0.004764627315330144 -0.01100358617926264 -0.012250754768847098 0.0011052069261942375 -0.004969799432019966 -0.011976830225265318 -0.00818827055018506 -0.005988035041029094 -0.00724771559633031 0.009838065687906815 0.002112532768812459 -0.002931810408013681 -0.0069121935276247205 -0.010828506946071865 -0.006362939643165076 -0.015899109585264536 -0.007184454087038691 -0.0034030377099903654 -0.005425346986747092 -0.010497182246582002 -0.004053529636711309 +0.0036342403228415126 0.014566782674082061 0.0023053257908142145 0.0011434171652495264 0.005714285714285714 0.004213170972690507 0.003922601615732131 -7.40675433545444E-4 0.03279183065018822 0.012447299646738737 -0.00535692286678121 0.004554649065359662 -0.002576042783711222 0.005618952757252451 0.011901600053329789 -0.006811186649923915 0.013498427192084153 0.012475732487530998 -0.0038969124116170215 0.009850166573145181 -0.002450428756421652 0.0018157437790150017 -0.0031822811400784405 -0.003982834736833236 0.006673132028036962 -1.2480349033550293E-4 0.01555588096342418 0.001309120606191611 0.0034027622778774803 -0.005529112229080664 +-0.006557036602074836 -0.0162818092445769 -0.021760938472565623 -0.037852830186770485 -0.0031817954545455248 0.002336138259833118 -0.005967583332181924 -0.021494174644147213 0.0010195018339934222 0.006998354586690969 0.004609005553319293 0.0038365164352919846 0.012175685947009995 8.869002217294844E-4 -0.001350400778449246 -0.01371571100822335 -0.006934474561023139 -0.01734204120741215 0.013692506977016367 -0.010892765599588485 0.011053819971845078 -0.005059643634792931 -0.017494522219244423 0.00964405669088866 -0.008286131560643187 -0.007112540642782013 -0.004483194103990234 0.004140401049038969 0.004338694308025192 0.007181413127413097 +0.011230420426944731 0.009328964931221215 0.042862311825949025 -0.002374071521552172 0.029639739406298687 0.014649933061027123 0.005217238496529995 0.032116276863618363 0.01294922102651444 0.019346317830716952 0.007216835733366739 0.009936710167835358 0.01688941615226919 -0.003278644276094741 0.016357688113413305 -0.0061104299644002035 0.09332739865520515 -1.8581645231963403E-4 0.021968159924232192 0.009554587864313844 0.0063167638483965765 0.011840592030360586 0.01377694271440223 0.012192218305747769 0.009410730239509219 0.0060324619831596165 0.011571121729699648 0.003038172611190492 0.008739237344154332 0.015717266809943047 +0.003701870361385897 0.010584361640299453 0.0012138938281032715 0.0011898605748815298 0.015721855624446487 0.019969974030612157 0.004834753139058187 0.02260385375766387 0.005314492732785475 0.00958173945089356 8.70049648754123E-4 0.004953915094369438 0.0 0.0 0.0016309227467811642 -0.0014839941269448491 -0.0080089315491579 -5.573857353901485E-4 0.003050109021063352 -0.0029267160107932138 0.01617580956908795 0.00847651351701307 0.0033333589743589753 6.137947096452192E-4 0.0 -0.0037476950500551984 -0.003586236408489168 0.008221484028094155 0.007974452610616408 0.015021173460784196 +0.007764757912886998 0.01017852175573788 0.012528857029945517 -4.244736734005329E-4 0.007630303196649372 -0.00974351953540297 -0.0027594990057384612 -0.00480836815870169 0.0 -0.0025551925067494705 0.012119017305369316 0.0030809051496768895 -5.974787764971471E-4 -0.004356374350381165 0.010283631624740056 -0.012738811581265871 -0.01890646947177249 -0.006599730310471609 0.01607298048285512 2.6686617416702535E-4 0.005702114516512162 0.005206761303082964 0.007027804573784614 0.0076675357716229995 -0.0013069095052778176 0.030470219435736762 0.0032888552263923986 0.0027897426090017752 -8.30189953016715E-4 0.017922242746172174 +0.009438466542647277 0.0051109664817041095 0.008638875196409832 0.0016136050955414597 -0.009519731511905568 -0.001949382652716523 -0.006385759807212029 0.009519052563915116 0.0037148450840075757 0.004757511262305095 0.011620285360187952 -0.0036857144114980497 0.0031085964025417733 0.003571756470609127 0.012172342913615793 0.024086 8.333541666665963E-4 -0.00832787475452771 -0.014251104866783663 -0.002705762256991514 -0.004016111315090506 0.006215754078849824 2.5382566308401804E-4 0.002206734168417791 0.006107110292083977 0.009369639815040026 -0.0039584365889970465 -0.01091373849775291 0.005327448524121671 -0.011177666160956112 +0.009731934161471887 -0.0010169983723085348 -0.010571812523079888 0.008309275762094694 0.0045872215943036695 4.654948068192171E-5 0.007854941837936103 -0.0025716121661684722 -0.008683288256227713 -0.014022964851575188 -0.00629273847660669 -0.005001000171261216 -0.006078700689423077 -0.004003888281910174 0.002891271809543901 -0.01196976085614786 -0.0042673188120873114 0.010190554533198086 -0.0018793841804072774 -0.0036302953599274884 -0.002134724857684922 -0.020149956468597068 0.01433460575073946 -0.01746262909241212 -0.003035024280263587 -0.003737167103212712 -0.003042660340900573 -0.006274361612411123 -0.006952243600055919 -0.005467343680797447 +-0.004346584062239707 -0.0094531847163123 -0.007285055587478332 -0.006895391976040963 6.522722047284579E-4 0.002046045077246489 0.006801806764927204 -0.0203395538086531 -0.005169442923168328 0.0025858884851474315 0.005980816173388822 8.9500134621995E-4 -0.001798788845170788 5.359835530465071E-4 -0.012534470001411715 -0.0014877577361904473 -0.005121751962407274 0.004670278435835578 -0.0010139049679331173 0.002608050264940202 0.0030901117185642983 -0.00465333215801071 -0.011005465370253481 8.500115647938134E-4 -0.002087483673240987 0.0032672435051699067 -0.009342883662232009 -0.005007598519486162 -0.00739251462333583 0.0037144342640633363 +0.003701233642367867 0.01615031542871361 0.005467923160621727 0.007705368462410988 0.0065189048239895075 0.003109188289266549 0.01477826116347939 0.010380978672906141 -0.001010392624284065 0.009211496116645103 0.005695438535263106 0.00460891534047326 0.0014416506833649489 -6.249999999999391E-4 -0.005204345522625812 0.014474244359301825 -0.0024165055683968333 0.007809631978609813 0.0010149340145726169 0.01094019530937745 0.004739360077266356 0.0055798976617366216 0.006828540545560479 0.007643537441521415 -4.3583194188524154E-4 -0.005548268939897826 0.002074831774759586 -0.0015317286316908457 0.012527709001233093 0.006217126739566711 +0.012197437363891159 0.023118032410316854 0.01247920584350554 0.011259524220493663 0.005829015544041518 0.008234631601875831 0.008321754680757699 0.027711350886481176 0.0033232625823330906 0.0012778203957251406 0.003378007897992908 0.004450897227857187 9.597048829211264E-4 0.003573679978557906 0.031857449568893484 0.014477507343684491 -0.004318020146962117 0.011070073596493096 -7.242612873079737E-4 0.010594778305565386 -0.019339621729263134 0.01499700048742501 0.00979652060550668 0.01057393343705197 0.01770142134635498 0.002425773284139773 0.0069016875736701636 0.0013148805322182706 0.014808364283007197 -0.007576307633166066 +0.0021484912989680146 -9.88560965642072E-4 -0.007152143018944439 -0.004071433387144738 0.007727001502468274 0.008075594126130198 -0.0013754952424550734 -2.8156154583878156E-4 -0.0023041906018378745 -0.003646235319826242 -4.948509851442679E-5 -6.817506212862358E-4 4.7939835859531156E-4 0.002225585289315672 -9.481079732537964E-4 0.004550196672190161 0.01618361522970567 0.006021934416458664 -0.00521816220374433 0.0053542873656048425 -0.0019240499315031382 -0.006353435236750708 -0.001492574589736913 0.002957009651656869 -0.00488390030746203 -8.469449280836967E-4 0.007228333928921515 -0.00700372087992386 0.005280041229971229 -0.0044470131106879255 +-0.005313199154671947 0.009895448399645233 -0.002904214077440666 0.0030035040630443464 0.011288583359135532 0.014929444901175868 0.012603319819627872 -9.859084507041471E-4 -0.008949119644184794 -0.0014638974761611234 -0.001435896413150982 0.00648064005677438 1.19729272170768E-4 -0.0011547788034325763 -0.004002149688537133 0.0037059913526868377 -0.004475913396481629 0.015962225358929376 0.0026227744116029917 0.0018248481686026434 0.0 -0.006542788104089303 0.007224738505539757 0.0028727321051762542 -0.003271887405475206 0.002542976446040901 0.00909429602260776 -8.815737465632216E-4 0.004918178075859431 0.0040202052699417085 +-0.004498135174755272 -0.01735729234722041 -0.00939492270256191 -0.003410439166441225 -0.006950252737994866 0.009193663273722561 -0.001972345793187465 -0.019737790640506223 -0.012525501746256771 0.0032985156679494177 -0.011999197163795978 -0.010912295488586701 -9.581267447149685E-4 -0.004713197102175018 -0.008285004348425957 -0.010461497435897499 0.0048096926475291605 -6.24888429518592E-4 -0.003923804793599753 -0.0022676022304832515 0.0 -0.007708419686739064 -0.004328456538109576 -0.007613523063062731 -0.004923980564547616 -0.016789455045422733 -0.0019005456323920157 -0.008382991026561173 -0.0011403876842026046 6.673290770625537E-4 +-0.002353384099970326 -9.971510397641923E-4 -0.01184775171832374 -0.011267832589397063 0.013149479823988184 0.011554041734675596 0.0010221752411688442 -0.0015100820007202915 0.011209365285721142 -0.006940657534246576 0.007578084100624396 0.0037689510476438095 -0.005515009926147522 8.934864348371131E-4 -0.006641587468043066 0.003938598510008411 -0.002497367377676766 0.0033944172414760946 7.294280605568647E-4 2.6072504970051487E-4 4.819277108434488E-4 -0.006712414411717889 -0.004223127456884094 -3.797037772746486E-4 -0.005295598484319964 0.009827948161475421 -0.003501271434251779 -0.008453859656198897 0.003329830637761229 -0.0019266024881794072 +0.009718805159875337 -0.005846228682998613 0.010093616818336155 0.003461117706070559 -8.373456144024754E-4 0.0032069410181667386 0.006195139261999824 -0.004393237116604886 -0.013710545907542124 -0.02170314551596736 0.021467340310457966 -0.005461517079779302 -0.0030138638823579466 -0.010444554823546408 -6.307304203417924E-4 -0.00970474912244469 -0.005215939857960152 -0.005519478224526311 -0.009330792204740807 1.8631826594980494E-4 -0.003612740847784276 0.001518580140893976 0.0014968567168979717 0.004027347840698454 0.004974690085971611 -0.031630159305236924 -0.0031436541488912046 0.00426291227282932 -0.010999393239136979 -0.00720172979134707 +-0.012428763434655326 0.004733247206924272 0.0012418570397112621 4.2058550297176137E-4 -0.00963754452126532 -0.006524811672250878 -0.0347090994308032 0.016999355577280377 0.009168810595882449 0.011844350664492399 -0.004534854646627198 0.006727148867998575 0.007134268698945751 -0.008840730876693407 -4.20794405103095E-4 -0.0050041285447065985 0.013213108082916234 -0.02882464442596581 0.009860280052698175 -0.0032400840475184413 0.011602586695735705 0.006671759211755622 0.013326690580063551 0.003481351567344618 -0.004863273905978754 0.004020100603520208 0.009398985843439366 0.013851720904902564 0.015484160628451754 0.016003589470508714 +-0.002649489023467129 4.282512307671057E-4 0.013239864118723415 -0.031029221847111117 2.1152951131782165E-4 -0.016617397994829513 0.012826817310251926 0.0069707022397240154 -0.003077359410239084 0.008732831661092462 0.008523169488802418 -0.0018410268146453728 -0.007683983579253446 0.003549640387285719 -0.012796741983471506 -0.00963962678877564 -0.0017595321333202687 0.002304359891314589 0.011075400273590866 0.007510009293640142 -0.0016726165673891505 0.005573166181451744 -0.011061971348795838 -1.5075798026277623E-4 -0.004276097539963261 0.006006056206357686 0.0030629746672698275 0.008594072089156699 0.004295911775518885 0.007434079144456782 +0.006451612780804241 -0.0011415810176488472 -0.0056651295650538315 -0.005467369466266499 -0.004864636312703748 -0.008068144112914115 -0.008996560553633244 -0.0017659107695035996 0.002351947704717785 -0.005341701872504969 0.0016513526720645182 -0.006421217340127127 -0.008953393612743046 0.0064393160449969546 -0.002601057434742384 -0.017139167039321557 -0.006428149500097994 -0.004874002296744604 0.004179893521759646 -0.005080641685458436 0.01005270488398058 -0.011309234232797031 0.0170271317055323 -0.018707180124083348 0.0019281507787580663 -0.0012437686257768606 9.770917009560122E-4 -0.0010923967664408932 -7.990880699659312E-4 0.0032878791293885503 +0.011406476029289767 8.571142857141873E-4 -0.021243741471723896 -0.001047076807104333 4.251009654644329E-4 -0.013420700224753257 0.0061452864415912755 0.005165553098224796 0.008945607598017035 0.0022222037037037032 0.021626369037024046 0.0013750223728089606 0.005737919387722192 -0.002613327902916659 -0.00855029697660986 -0.0032293217819306533 0.011165605527170995 0.010812291015731428 -0.0015788718696391182 -0.03186964377467433 -0.0033175354664091257 0.012423294160415571 -0.0014664914709399247 -0.019140580187272924 -0.005335907977606691 0.02241587712020379 0.0071385786627912355 0.007436570266041689 0.0016934938521218194 -8.010486046655505E-4 +0.009506915746976173 2.855266995582862E-4 0.009916384334949308 0.004716928597564827 -8.498194178883307E-4 0.025282846834765293 0.009786250558214101 -1.4082365066898401E-4 -8.721656596439953E-4 0.011086511660874264 0.014998357634454885 0.00576732601856478 -0.004491320872468628 -0.009757878568847194 -0.007330416845665684 -0.029589611870186 -0.00268320943894302 0.017004946526008743 -0.006900460232905699 0.0050436913122065335 0.005943889540088218 -2.9923682600375794E-4 0.014074189377973199 0.0019592476796120328 0.006331905780774922 0.006455529998916731 -0.002726188773954648 -8.684541713317944E-4 -0.005400807954753431 0.009474440155082956 +-0.003970095170715358 -0.01198635810541206 0.023635058653149934 0.006694522866315151 -0.0029768233675699944 -0.01241902580069622 0.007423204088830759 0.015841723691063323 0.023858001857957622 0.004568713366799829 -0.00874449355872362 5.461259967873402E-4 0.013412985894086392 -0.0012773631619957065 -0.008948407703232457 0.0 -0.0069329263962431 0.004225107950828948 0.011291241711313264 0.006244268862249332 0.002363483754112812 0.0020956365384652434 0.0032584600137768056 -0.007508791670063196 -0.011797588045093187 0.004477829038284933 7.290122928263225E-4 0.004780573663624377 -0.02393990000916004 0.006136784569229156 +0.00723032092779904 -0.004621606141582979 0.005800591315462556 0.004404542668585002 0.007464342236390191 0.024155230609822085 0.007232025307879035 0.008732977604193122 0.0014209435104123886 -5.457886020413787E-4 -0.011935083723654772 0.0162379060267084 0.00409091560472968 0.011054257363916206 7.889897205082331E-4 0.014244380146895183 -0.008856913526550858 0.010742144935477123 0.013884926798097188 0.010735816273020836 0.010374864418769225 0.01217421026345673 -0.009743739074115566 0.01528885661036221 0.0038910062983551273 0.005662662650602365 -0.014204266899227084 -0.008866781623409026 0.011320187319233236 0.003803085506579307 +0.008282661208074246 -0.004933198053778433 0.012209523180908375 0.009286276630620545 0.003386960059823954 -0.011351123866417021 0.0014224140952918225 -0.004397409858333697 -0.0028377410823888977 -0.007098653205290385 -0.0018142277653028197 -0.004162437143251428 0.0019173637597614378 -0.012740544189763215 0.003985472745714726 -6.583059030064442E-4 -0.005571982582885302 0.0040740322708694285 -0.012000550275291491 -6.779615306775603E-4 0.0025671179727943983 0.016824077130340134 0.007288605442177036 0.00915930281519359 -1.7615398633250134E-4 2.395711005203366E-4 -0.009605899369675956 0.003491162841319461 -0.005596737542261564 -0.0028593466499345133 +-0.0032858799431522163 0.0034995332896024115 -0.010672587904588764 0.0011075566819106072 -0.006118164298811711 -0.02662612181247538 -0.011228375574360927 0.0091097795352566 0.0024188674220099594 0.00274980756644928 -0.0032047303657478307 -0.002629272532471312 0.007654574720074493 9.152388629829683E-4 -0.005889050648031558 -0.0026351119315960706 0.0024315890657188935 -0.010849466062023425 0.0062874389988238555 -0.005427624329483392 0.0011638501202013453 -2.9033381080550676E-4 0.005909382679917502 -9.229751912536774E-4 0.002995559471365633 -0.002754773092700276 -0.01678685070347816 0.007175429129139924 0.007937242449075333 0.0033694313796891313 +0.00402932245501808 -0.011479235687300053 0.021406888955674837 0.005276104071549611 0.007429377893666495 0.001652285623914802 0.009919360168528775 0.01949121857822999 0.006103619848273476 -0.005667312510652371 0.012572025313973894 0.0041908611032735734 -0.002967359050445104 0.0015544806002699904 0.004388081988626452 0.014971378906709765 0.006433241932081984 0.009541644458191882 0.0 -0.0021979990563156656 0.011625203981641663 0.013211433406338348 0.0026374893831680227 0.011394225971161952 0.004040820591736533 0.024021138024954647 -0.0023396673981260665 -0.008419689119170997 0.009545172574548622 0.004143940918779888 +0.004195539987190224 0.010289637076137436 0.00451073782562187 0.011682087827361893 -0.003792667589394741 5.956286520429299E-4 -0.0014225224743440108 0.02475338986198612 0.005643369313348033 -0.016363283992706142 0.003127613437065407 0.003365643556349536 0.0 0.00237379715487809 0.029228026690672575 0.0010846855134354079 -0.0019910091166300626 -0.013338062126473477 -0.006248154110995719 0.007748026625651485 -0.005745805826054048 0.006591187754818864 0.011957431972644934 0.008601697823007539 0.029046368441477583 -0.009734951683439947 0.008936990329289692 6.531460918790259E-4 0.007516645428623034 -5.691333711680163E-4 +0.009173506070363394 0.018914534311892977 0.0061332621265722444 -7.531085138798116E-4 0.009517787849361003 0.007601795292434819 0.012345726663217049 0.021209774195135294 0.022586981237191085 0.008411233644859819 -0.002928925833817411 0.014021172870269225 0.01619048809523806 0.01666820278105283 0.007725579355415681 0.022751873336863553 0.005354914014172912 0.016741298569596174 0.01143178001864343 0.003995130787836613 0.011326907597175499 0.009608583629893292 0.0022451022892035566 0.01245278490566032 0.008586923773501402 0.011133518891389199 0.010114336416637571 0.014795474647421113 0.01008825567962317 0.010821507363302422 +-0.0018900098830887085 -0.004855019346780181 0.012981059480840156 0.014319201378650134 0.017389503456945378 -0.010771235789534395 0.005427485746867989 0.002435929487179559 0.00150913707654183 0.008711714389032158 0.006301530430223834 0.0013232683290745958 0.005388929177730402 -0.010929949536016375 -0.008677329621162412 -0.011440698910154763 0.0015666005221932182 0.006075565730386607 0.004521037079980683 0.0010510829394261558 0.0070857371428571375 0.0016214028217947333 0.004126361707144702 0.0021618189561752816 -0.00657505706587857 0.0021084689431252195 0.02804907143692701 -0.0012863851047681784 0.004924039486709014 0.0063389845425831075 +-0.009468025077222282 -0.02138047004217349 -0.011390862839374908 0.01230088365312181 -0.0024712108222567685 0.014380175238809715 -0.00626459167748229 -0.015219368997973949 -0.010958945205479504 -0.016170471009572675 -0.02071657809085442 -0.008721552346684439 -0.018061092985317988 0.02146734562559159 -0.0103679869188067 0.005357908272610373 -0.010219019599186181 0.0035882722984724494 -0.004500689296784449 0.002587362531834472 -0.002950544644790181 -0.012246663678960209 0.016789949907008245 -0.011975602321100719 -0.00958843461329548 -0.014962080129909523 -0.012038747512908373 -0.010948947576258156 -0.013035672231908008 -0.01686732863706167 +1.8211197418499368E-4 -0.003665689310807448 -0.0020652165022205823 0.006116457198259896 6.193641746359902E-4 0.006340907850837166 0.003152042095419182 5.843896103896981E-4 1.3853186171185113E-4 -0.00915207304534785 -0.0025481897555606394 -0.007465140355030044 -0.013646541366318153 0.007626141907230869 -0.0017174495934078574 -0.02131741632914091 0.0018963337946972206 -0.0019185576335320992 -0.0018366346685029342 -0.014399967145419955 -0.003186865467789736 -0.004489019651960252 -0.0011547113430649197 -0.011593834049629824 -0.00282729606899158 0.006170689670251206 0.018982340566803382 -0.008465378771434785 -0.013441974929557815 -0.013027706890953944 +-0.01692910666435494 -0.015599676921251271 -0.00599082845655557 -0.011510139948687534 -0.0012378997062535 -0.007966173023392836 -0.0020724561830130694 -0.005970523874892052 0.010386373222356644 0.0016965127558249984 2.8919790791296875E-4 0.018131736803929068 0.0016842997467168414 0.01390479663569817 -0.015569870967741888 -0.004574145066434247 -0.005362797168513085 -0.0041065444501497 -0.004529370006245823 -0.0022769761194271427 -0.0025120118174922377 -0.0010737169313861888 -0.008323710982658918 -0.013633887542365926 -0.011770787969505864 -0.012855336562621429 -0.003906069252903708 0.003721497373029765 0.0020414356344542854 -0.0034621682303964995 +-0.0014813813261479313 -0.023321827228611706 0.006465265886270433 0.0042640755456517165 -0.001652509812022232 0.020551669726446526 0.005024452200054875 -0.0045700659994785415 0.011650205751784576 0.008468216192476787 -0.0032768310856431298 -7.255523994093972E-4 -0.00480423961555998 0.007204253165560808 -0.0049807758436566565 0.00393873076720501 -0.004863082983955261 0.0037726003569240503 0.005545272130093259 0.006618196240261658 0.005036675824175846 8.598094132961276E-4 -1.1660060756121092E-4 -0.002934401544401631 -0.004347070188151718 0.010035890443341444 0.0046452945416654975 0.003489640283081445 -0.004548282409447178 4.3425737017212197E-4 +-0.012610106863423395 -0.015613102231345412 0.012275725566466436 -0.0015514166608032662 0.006621146011953409 0.0035119271417460847 4.665511140768492E-4 1.3119957938480064E-4 -0.012328898857306467 -0.0037320582198171358 0.001498733349424252 -0.0019141452145215163 0.004465387346543714 0.007755954776318927 -0.01536840222691661 0.030732344578632345 -0.002337118952633158 -3.4962851675106777E-4 0.0031108738247898294 0.005252276710801684 0.0038723916231256585 9.307345827258973E-4 -0.008744316500325866 0.004569485926637478 -0.014669935766763984 0.002129169598661261 0.004563706266520821 0.0039122149059862416 0.0028556755849045907 -3.6176385210707525E-4 +0.013240717686932446 0.007930368774074601 0.027937658423301846 0.01725547936911579 0.004522034757573069 0.00673336566994409 0.0046638484819467654 -0.0013771787862423691 -0.0060357062815993385 0.008428563559253865 0.0021723968768254717 0.011837794571360676 0.005286495063565123 -0.005986009817239501 0.004860849873777032 -0.017762740161498335 0.0052177401674905685 0.010841986250538088 0.008316844986838268 0.011502018104352153 0.004538234626730266 0.007939346369205907 0.009291943400091974 -0.005705080256452334 0.005849025375718736 -0.0030689565265703913 -0.0037061093068490782 8.660099776143451E-4 0.007023847709330684 0.011000969979025405 +0.004541214002943229 0.0 0.010672489220088458 0.002813722990704396 0.0028647227924028214 0.008888515552418277 -0.007427515432008921 0.01667985301208204 0.014214725561892483 0.010772622585438265 -0.01372835220438292 0.004901960784313725 0.008246719451337743 0.012216156438681295 0.003284094410117639 0.0355220013881162 0.007944915085912815 -0.003978885875106915 0.003075646624851712 0.0056856148862366625 -0.0011294104359611402 0.003760992105605932 0.007574886553429395 0.004186973682352745 0.00414097797356825 -0.020009495856138867 -0.00893985131025199 0.006056629894008354 0.01658892957642744 0.005655336736268407 +5.535381543826115E-4 -0.006633770441221693 0.01534796458508629 0.004569504642768979 0.0026525404061432532 0.012168562509458141 -0.00200442977222465 0.021960947204969397 0.004218329139157193 -0.0023887725978968804 -0.00493282051282053 -0.0034471479674796986 -0.01576578928679711 -0.0063742986104267 0.007563993219144721 0.013721414291950776 -0.011350519992632343 1.736517555597274E-4 -0.005296125435540112 9.976314341050602E-4 0.013342378712293476 -0.003039894019934098 -0.003585438394464886 2.3162691034005664E-4 0.009388435470839448 -0.003262015341138693 -0.003148014420850651 -0.01376046070782465 2.317370468585319E-4 -0.010321732924878473 +-0.006546786718675486 -0.005901491006390651 -0.005888345833954008 -0.0028728832953935322 -0.015465975080707735 -0.017580910401747897 -0.017473388815471176 -0.009290867088289276 -0.006233156928191513 0.01344628820323666 -0.02400117247469386 -0.012465755041993435 -0.013368674134272805 -0.006671858466449096 -0.0013170734977481662 -0.012920365583280028 0.0014882427979164782 -0.020665078070071712 -0.0021017513478316743 -0.009523761746558094 -0.002454809139593624 -0.004467486754574275 -0.006616366648488382 0.009649529624414909 0.0019992698018144127 -0.02812121212121204 0.00692335097963448 -4.360366347511933E-4 -0.008898771989682286 0.0023017118773050117 +-0.004733571649036076 -0.012810544827041246 -0.009025844483854453 0.0030412565756203825 -0.005167424448792385 -0.01622883424209753 -0.009539343470269213 -0.0219457862838915 -0.011317071792586397 -0.0014540348964013608 -0.012421427837422325 -0.01506839620736763 0.0028076660841714605 -0.011624886204035631 -0.007780855596638966 -0.022854809415025847 -0.00955313671110434 -0.005851617999365039 -0.002667817991184705 0.00327968461926896 0.004697964100716603 -0.009473616421921776 -0.0028044635941933487 -0.005046165879066897 -0.005638882770162704 -7.48278872536915E-4 0.004644173619224845 6.543729838330782E-4 -0.0030396278159302847 -0.0017940436974218715 +-0.0022382261800365376 -4.747428465698134E-4 -0.001811297120575253 -0.003909726260117621 -0.01267402840901659 -0.0023183780651328907 -0.02387178024303964 2.6096145405989936E-4 0.022617569366499266 0.0014561521925037326 0.010337096182475273 -0.00429443739042107 0.0030432135595078865 0.010803258501509483 -0.0015949713740427234 0.0 0.01478945482348005 -0.011415312889021157 0.006053780178146878 -7.058023459523199E-4 0.008238677354709418 0.0038112901454234608 0.009257101441626546 0.011757465159553135 0.006107110292083977 0.0013729405377081606 0.00720416011028922 0.013077571641726791 0.005534935920681666 0.0020847806433594352 +-0.003084344388902589 -0.03673210892970224 -8.553983187116634E-4 0.01586033373471106 -6.31271043771174E-4 0.013853469833248913 0.002960032440341468 -0.025366800442120734 -0.007956897964749987 -5.452199200291927E-4 -0.013406602219513017 -0.007749807990766228 -0.002427245086717406 0.007498724551768429 -0.01082761009555962 -0.010206251545954677 0.02524025714985185 0.012719928059899474 0.012314539774902643 0.004088974235568305 0.004196157336487726 -0.026577771375536123 0.004411993651874817 -5.317332361616287E-4 -0.0069372441900796885 0.002368129040204702 0.01227870269348034 -0.0019363382099826546 -0.01842607217488621 -0.0013630963581540215 +-0.028970597075919924 -0.024983563445101956 -0.046622044693741906 -0.03327552436524203 -0.039166159647666406 -0.04632606440529951 -0.047712698302476306 -0.038404962740300114 -0.016992931402744195 -0.012002181778425769 -0.010472556832694784 -0.03090194814921396 -0.009245681602640318 -0.03447684176984214 -0.035978667875309886 -0.037593985770010434 -0.013597033094416225 -0.05433812481136424 -0.0261266118953062 -0.026026427716102304 -0.02111288715388417 -0.03503098193144769 -0.02300317829145347 -0.02598980244668463 -0.026632868319058787 -0.06814220512664027 -0.008596873242691351 -0.01530500140773884 -0.039302367068742204 -0.010560352239088026 +-0.019214038814328475 -0.005731625084288662 -0.02547151053018891 -0.03401303481261062 -0.03309230696707633 -0.008827897907062844 -0.013208441168582021 -0.019134427921413667 -0.019499322901377934 -0.01840603650263072 -0.0204439445603089 -0.025720078131332515 -0.03155696140577219 -0.015151506156729489 -0.008934794587625238 -0.012723192248285603 -0.019214744795013613 -0.002354935857010706 -0.029524401541138452 -0.02265467650338602 -0.0381935986606875 -0.0133465532850272 -0.03454802536256602 -0.03011625232295002 -0.029963254418558707 -0.0057379235191374394 -0.03207218720889071 -0.02276709719789835 -0.02681176433772238 -0.02824366596220613 +0.013979109785802198 0.011529331976941332 0.005584876389302577 -0.0055729376002702285 0.03603807878599461 0.03571930103594273 0.04733419718340534 0.00780312117611468 0.03667133888092132 0.007500430995671002 0.01438808858469251 0.013163587594199807 0.0024089640265386593 0.013135393375881326 0.004225919123698517 0.014695930364006403 0.009476150116612932 0.03455760420894699 0.02106179518523637 0.009684155446564851 0.0226582101691611 0.0020098168821914425 -0.002696090752355121 -0.005309275284518889 -0.01091279046276129 0.01878945057604482 0.005215720652784482 8.960797691773385E-4 0.007624663399068031 2.2414077179123076E-4 +-0.0036892912621359518 -0.012068404290982172 -0.0034155676077685317 -0.0070475929450859775 -0.022752155387271034 -0.021385799732628878 -0.020205640728339917 -0.0019004996600021293 0.01659865306122444 -0.0024195421552205007 -0.006754314923082501 0.001987923238001166 0.013534012485049773 0.007370579812000978 0.006312273958766435 -0.007798618364558492 -0.010441915630037246 -0.017979392169389374 -0.005013594184603714 0.0024652942374308344 -0.015075377228765964 0.005399961220397979 -0.006881261005699101 -0.0021027334880269356 -0.005703609323149368 -0.01211969373628278 -9.156940153226302E-4 0.005147717099373251 0.0035817283676885755 5.97609643594948E-4 +0.016078678150106922 0.0223956400134992 0.02610899149981905 0.004874294426641049 0.02574439336218463 0.022037141046939823 0.032864600535294025 0.013469703523207869 0.020877917279471227 0.0018657276815570209 0.012606601586092055 0.02827173427790906 0.010982216809517626 0.02424188955849983 0.030108707229306256 0.03166404742115543 0.021210807930078877 0.03159853218584633 0.02533835337371658 0.047339123919308265 0.018784810268664427 0.016726716539143427 0.004701769364018845 0.011021971075629857 0.02144072866055024 0.03320449481809556 0.002443997097134512 0.012914762859051444 0.01704031349109977 0.019484890320676986 +6.713244654643626E-4 -0.011450348869908736 -0.00746775288526816 -0.0018721895690206553 0.0026189218681798333 -0.004321368561459424 0.005009115104800509 -0.016491621213267194 0.009176769915793952 0.004841675887492126 -0.04344459093455333 -0.07628164540661668 0.010492519183001587 0.008090153918751081 0.02967975682922543 -0.0010883761664861411 0.007827993066026367 -0.002612621621621655 0.008424585672218635 -0.019334552095454843 0.0145686319144093 -0.018413614761663824 0.0036946183631017104 0.013547110220440937 0.011139743754195958 -0.01290655603098002 0.016456371578017888 0.008133633408061842 0.0029654079675242064 0.0212361529179283 +-0.014376078756989792 -0.016619070001678695 -0.01682624897400819 0.0015346576729928802 -0.01044841119826748 -0.02337356098039184 -0.022183250730429895 -0.03919621591046323 -0.005196167633300861 0.012787305648393307 -0.02554407328988576 -0.026109659990085937 -0.019789921575984307 -0.00811062088561307 -0.014587357694880695 -0.020047897582216107 -0.0040389396031261975 -0.0199620541953035 0.005430228348649445 -0.001833108948736569 -0.012788871438187127 -0.008687667711127372 0.004294453987730053 -0.010281580033508729 -0.015842720279655408 -0.011506341075849554 2.3981530875304884E-4 -0.005451373627314139 -0.012565850726659143 2.8677038572075877E-4 +0.03782581827404969 -0.018607032481835754 -0.008598847776281893 0.005703566819583212 -0.0026396612987167017 0.015230043232477708 0.0056716852588254325 -0.03298966053778364 0.010054792111392295 0.004574565248872269 -0.003269762765797271 -0.011106832375944075 0.08798610638051117 0.023411964193492802 0.008935363533256656 -0.021569957269958775 0.010190329836546257 0.0014746912442396378 0.0019387758196756533 -0.005659495563580876 0.011363636363636364 -0.002016511524484051 0.001466133206258563 0.007431684572731937 -0.0016652049834472988 -0.01838623064513842 0.004076536227762493 0.01578603341841636 -0.0026449694918412826 -0.003225784946236532 +-0.02080015869576989 -0.024699981746391254 -7.859400217274795E-4 -0.007872016318537524 0.00926329951477723 0.006110054316812246 0.003997694117679848 -0.019875113165353498 0.0038785262799877675 0.0014571584168611912 -0.006116241108159916 0.007126242891111813 -0.008018384604179274 -0.005298612190099013 -0.0236164999765795 0.02295450000000007 -1.0296448578557458E-4 0.008926863282648162 0.0030408017426620223 -0.01172252597312591 -0.0029213707865168546 -0.017718302176158773 -0.010003647553938615 -0.015864202427222973 -0.014363848971778406 0.00929797883436172 -0.005134634750294414 -0.007770364439008591 0.007555641504459117 -0.0026609851996911337 +-0.0012439479237594602 -0.02479044052077761 -0.01665830332254247 -0.03250573357653553 -0.007430070254810837 0.009426703179516096 -0.010807764581966474 -0.07559632872990206 -0.005022536895749218 0.04056018552200812 -0.0012307748251748046 0.009152460878250628 0.006466582135486901 -0.0035511880498314734 -0.0137184472819915 -0.011330771443269183 0.006794358727551569 -0.013956025192630476 -0.006476533002618077 0.010183389830402465 -0.006085215372666576 0.028639255875961136 -0.01614301870257503 -0.002176166680099858 -0.010436263534822616 -0.020694311863970326 0.06313382154672552 0.008483793594000432 -0.04375247296507516 0.001802711368755261 +-0.024334173912651136 -0.036576444769568395 0.013140997450912661 -0.028130537422741884 -0.029722546443088776 -0.03430162141250156 -0.03493387129578308 -0.05580775619916565 -0.0396065871186491 0.00367066952754179 -0.00873801606866086 -0.03048554063410723 0.026388192914722625 -0.05294863899785558 -0.04291729999009247 -0.0467416179775281 -0.002454038779528572 -0.053468992663626196 -0.021636574802678853 -0.03224336813278918 -0.036734650192047684 -0.06114446820044712 -0.02780552494015659 -0.0180937394646106 -0.018622318289786187 -0.016768848446321736 0.0011290545118506478 0.00798099637659628 -0.041599635809925144 -0.010508832315279824 +0.017282031315083712 0.004555770690964312 0.02571548048581108 0.012430841234287617 0.031767665078284615 0.02189784317072557 0.04662601842045351 0.029286105724981543 0.020754731297361155 -0.017241345079809997 0.011866451873953528 -0.005974388852876259 -0.005141951767739191 0.02284744178077737 0.02309017191715848 0.04455452826754023 0.016605186892275397 0.058444126270523956 -0.008222313464384661 0.030898809237314053 0.021892655367231634 0.019087425247808695 0.008889396719038985 -0.002632444926496241 0.015199922401007558 0.013588393777521092 -0.011502723039095924 -0.00470793922533691 0.0024385608381375995 0.00727431434295254 +-0.02268337881628144 -0.017384694534568947 -0.012370454232275879 -4.481358586101261E-4 -0.026830898904092907 -0.015923566661643768 -0.01978365300928972 -0.005015947548627881 0.00646956711036613 -0.016303420166578 -0.03819741292577268 -0.013127687144191807 -0.012808977528089922 -0.008496863752737727 -0.007709892241247855 0.03114416539959005 -0.0024198225448679163 -0.012373074449499392 0.0062893511476465915 -0.022933686154014588 -0.018659341165629978 -0.009405136504740605 -0.009960401224885607 4.1242989792860107E-4 -0.013732624320688211 -0.01409026030342718 -0.01123724843120467 -0.01268544453603295 -2.1627114394640005E-4 -0.010832671258520466 +-5.925728395061048E-4 0.0013461538461538515 -0.06591141404800172 -0.023312104575559055 -0.009265536723163765 -0.018770217030463967 -0.024756809033076404 -0.009300303973047331 0.007739695353284937 0.017474365608876326 0.005632009652952651 -0.04126934817477885 0.004325028405132878 -0.0013252142181250526 0.010030156291061541 -0.006347056387547735 0.00869214657990402 -0.029076299823076822 0.014914701280832287 -0.00642963841121498 0.014788780037031869 -0.017365957542011885 -0.006191100299124212 0.008492035547101607 0.013827113011547269 0.001665075620924292 -6.345909919140279E-4 0.011759604170714548 0.004541746491620724 0.004234518476786808 +0.008795335333623042 0.01075477242173996 0.042671140888240394 0.01762597998714764 0.016879607664233506 0.004994336482417663 -0.011687686865366115 0.030531636325715837 0.02577457693309048 0.030099150141643112 0.017552009541893933 -0.035439627511197176 0.010766138050003208 0.015215861507290648 0.022332014957993064 0.051982288458930076 0.02625245412066774 -0.0011554646346743594 0.01987412259793378 0.00686110274236744 -0.007864931760351464 0.012635288219845987 0.02245289983960156 0.029022261281883618 0.01764424449488303 0.032137414264097025 0.030364308269105984 0.02518299666773554 0.021637360199480697 0.02326424522142683 +0.006367564530416087 0.02451067785463275 0.014146440351559595 0.00721699607067202 0.026244906853077298 0.026066563158932573 0.03833994570427638 0.032862259772367244 0.0123095680592804 -0.018734960467514546 -0.002042669029656378 2.599480024272979E-4 -0.005718152130997823 6.099686195543389E-4 0.027772692574665622 -0.01842539859402848 -0.020894347215277265 0.029692421776947184 0.010155042809590661 0.011886352067083725 0.003963674608619055 0.012966856639205916 0.011424232183602886 -0.005879129120224093 0.02174320585969658 0.00711312556400151 -0.008908123454867986 0.005248792667461838 0.0023707760641775897 -0.005399609236234483 +0.012751854003158234 0.08067511426836484 0.023135947548439367 -0.004299184875966181 -0.0021857486338797676 0.015352279926198049 0.02161767044101543 0.02786017969007586 0.0016297480868652538 -0.018216868102995335 0.026040492778016344 0.012128580091830429 0.010261569688768521 0.01105979254446069 0.007099463262622905 0.02858361713772155 0.0029916534003953227 -0.008332553287754826 -0.006656676991486523 -0.0016070900721539799 0.01416620961063145 0.027131495267140267 0.012424673694779115 5.594182184787647E-4 -3.668501293391816E-4 0.023320895211608537 -0.01141881892884621 -0.0029239556615715838 0.010301724227418343 0.00592900900317853 +-0.0031718761709739647 -0.009267204393341449 -0.014652840767428017 0.03202307334754103 -0.0037240305049713635 -0.06633068550836699 -0.00745581896675684 0.008741010635309058 -0.007509374029802863 0.010347939524494913 -0.0029370163994285685 -0.009928990671420057 0.002455653642399915 -0.007924186183017786 0.011983966991302945 -0.023019493508513334 0.007556114385442209 0.00226591771650141 -0.011624808056968946 3.0666079847707655E-4 -0.016945226331359114 -0.0011757485314978003 0.015867100926418635 -0.002396126255498198 -0.0055056522617272586 -0.00273471802663488 0.010693017763808897 0.005446124614741387 0.0030693840231538184 -9.942763317715773E-4 +0.014463407718285679 -0.0017321843062531933 0.011823930118798016 0.03669483909976025 0.014511851363236725 -0.028388278935575006 1.431106033989894E-4 0.004928873480174286 0.0084489025807476 0.010241885745331407 0.01256049067928323 0.03795279740559852 0.015477107571030156 0.0023441309255078082 -0.0042230876030903445 0.018255147139563988 0.015492481369349978 0.012716634788370951 0.011761533627848266 0.0 0.013743303051479232 -0.0014125402181590428 -0.003782770120174539 0.013050416124092641 0.006551015128741849 0.01240528826311614 0.020594053748231905 0.014374979166666671 0.0022820497098910435 0.010804692036059457 +-0.002186065984089591 0.006767291223888806 0.01240397221823399 -3.3630401317805803E-4 0.007802362544481132 0.010814068372718191 0.007081473381656551 0.02309942178310513 0.007877916620258678 0.0 -9.880179923374124E-4 0.02548729844223389 0.003399177743394047 0.010913833111663053 -0.0022735396892552486 -0.015009401396510361 0.004081216438394002 0.001953297331349657 0.0025983997839824505 0.009693111003673672 -0.011718795955882353 0.005422412573673924 0.00428710196334026 0.0163598120316116 0.004675057463564304 -0.012382290885880321 0.012861067757974774 0.008626042485644672 0.010608036222509722 0.0026020394360487063 +0.02219465549072233 0.0311961737331954 0.015144453802099847 0.01656855312752641 0.03010756989247313 0.030328276383603525 0.028340124997378143 0.04461458216013945 0.016253176581964696 0.007691015691155619 0.02867974915333631 0.013970053265836928 -0.0024041197157879677 0.0029132379651550465 0.013496941457015039 0.031111132275132347 0.00958093468342331 0.039361288160403934 0.024144101054265482 0.04208088192028553 0.03231816007059562 0.020400195085193112 0.012684486222331702 0.013063708566234405 0.01715333060498776 0.01828393626746772 0.008428618800282842 0.005294196593480075 0.030670711254418188 0.015290684526655007 +0.011089386098022357 -0.0065185189196550605 -0.003360034506102843 -0.012492777054038793 0.011273423328875844 -0.00695399867045485 0.003108143411439008 -0.027461190490250743 0.006470491687437913 0.010754518273910944 0.004112610246490633 -0.011694961925503396 7.667871533925515E-4 -0.008970550816645462 0.0015997708474565877 0.0055418923328838495 0.005368069401840586 -0.0018756609670923297 0.005327663683333456 0.0073553106478660615 -0.01238747691948305 0.006051267574463478 -0.015897868431866503 0.005449846526326675 0.0080731429474397 -0.0024368602996425854 0.006675690637720488 -8.10147879484454E-4 0.01381098960046163 0.0037996753022452767 +-0.0020276589861750816 -0.012785986083209735 -0.003856819706084746 0.001256710780356002 -0.027456606677469242 -0.01928151903492928 -0.00895133950151733 -0.034096925444074236 -6.065380735920384E-4 0.003260665865797155 -0.010691462765957466 0.0012968390654118811 0.011493027457388096 0.017241379310344827 -0.03885171695709174 -0.01796286924013598 0.006483610025274792 -0.019507829977628698 -0.00821412262000042 -3.614892541801667E-4 0.009806180606895289 -0.004796627220850709 -0.010280210626364092 3.0532100521720866E-4 -0.009699199404676966 -0.018256595760563158 0.0024800841595877155 0.007095033160550031 -0.014553833969339729 2.752443164093377E-4 +-0.016531224755552534 -0.016700732788002718 -0.03332971552856141 -0.01773912613607016 -0.031628146218888785 -0.05037415244107132 -0.029250275861543325 -0.015050066502243595 -0.007039701505519013 0.004447519747648303 -0.035270777050627 -0.021369588624173663 0.0031381126225251054 -0.011016974576271219 -0.0745564403653206 -0.03034709976414252 -0.01600980515365296 -0.024641754129780015 -0.002270892302018404 -0.015078586805073383 -0.003839159978300805 -0.018437792601449305 -0.012860157801651173 -0.03045102671488229 -0.021026183655079737 -0.016500824823195034 -0.00844362150754416 0.0038244565217391354 -0.02018902475815937 0.0019265103048439276 +0.012865086165181418 -0.003986135112891885 -0.021062625048490543 -0.017377979532992447 -0.010960105457257901 -0.009991255188662014 0.0 0.007679991999999971 0.0013445789352056169 -0.0010218153776939964 -0.0023964388161125108 -4.963275352137822E-4 0.008306408035806087 0.0012853556457246796 -0.004853190902404403 0.015862743157009994 -0.0089535089355874 6.549920280250194E-4 -0.0010711072145909164 -0.011601453638272597 -0.013375674147003393 0.006391207956557764 -0.022923737368815214 -0.0018104770008621977 0.005874245228294986 0.001331544642650947 -0.0019525953775720677 -2.0048125527339714E-4 0.006749908887785937 -0.006455171214639808 +-8.344520597584022E-4 0.008874177677498098 -0.013704926505538418 0.0032076550187716255 -0.017508799146914868 -0.028247376127500914 -0.001646120801273111 -0.006827572299361458 -0.004882824826240879 0.004773252642345784 0.00502789944134074 -0.005296251416625362 2.139402994122531E-4 0.002310697514945594 -0.01248474987830167 -0.006330428493995108 -0.01369732827477508 -0.01842155379798862 -0.006969642045709095 -0.015823527168027988 -0.014016544117647209 -0.0017812578137104164 -0.0078205256410256 -0.02972949341107938 -0.020622265557889118 0.0 -8.694582052458397E-4 -0.0020056758522727235 -0.0015627212169863766 -0.0029720280674881984 +0.016980616599627407 0.012935494998275269 -0.009137833577576629 0.010629070077522725 0.05504168486164297 0.02467880581350945 0.016847020687969845 0.034532374652795704 0.009445584253394907 0.0023753478516346785 -0.014118916535372322 0.010316181621868183 0.003636795456985605 -8.539958797644555E-5 0.006173144200376705 0.02166067105542564 -0.0196000986861036 0.022006268248011232 0.010122824139442524 -7.544157864954631E-5 0.006991353996737516 0.00651716197158176 0.010337291773320784 0.020724926684615317 0.025528724018844238 -0.011569082908341114 -0.0015774163205629717 -4.0184889074967644E-4 0.034585509790826 0.0017331022530329288 +-0.0012773631619957065 0.007832436574152961 -0.01645342063069361 0.018041907260587593 -0.00898015822108197 0.011075675020622315 -0.011703349173811436 0.0041725313579435985 0.002794944673776342 0.01912655656308209 -0.0019169880361018432 0.001070470996863013 -1.0659703492279652E-4 -0.007855853404014488 -0.007951359380795183 0.014965724070552472 -0.01858548303611125 0.009414634688801592 0.016301470673515187 0.0232882273474128 0.006942814324064198 0.003083396379662352 0.009847768004916912 0.025320551805734597 -7.26828381938705E-4 0.005515888456454053 0.021954663564552914 0.008644872993772753 0.01995996252091242 0.010311453287197207 +-0.011054257363916076 -0.023483696967117714 -0.04467929591858452 0.003023685587496933 -0.012944941227397666 -0.0396320882531498 -0.038664561782365 -0.030624836762281754 -0.00727095276069868 0.006809500196138462 -0.01937638641110858 -0.010364415563050096 -0.005649104668514064 -0.0066271106527737225 -0.01929543883077967 -0.016997787548728757 -0.00931521119223647 -0.03389046048674436 0.0038127794849535266 -0.018664000885102075 0.015398805580271381 -0.017520993717014086 0.0032928318552790264 0.013590121500656317 0.007637094420167126 -0.02970298447158102 -0.004637747313561524 0.006776958611798298 -0.01636362679425834 0.011918562507070286 +-0.019953847575057745 -0.02474048485710181 -0.010095313702901945 -0.02780103881763595 -0.02754093989071045 -0.04777792398699068 -0.010314633805084475 -0.02944916583308855 -0.026000940576194873 -0.019135599127937903 -0.026153540553108888 -0.02584989653145865 -0.01275595441359256 -0.03075719166101536 -0.034708934342099935 -0.012708354166666602 -0.02707165764694834 -0.02781498677647716 -0.020563183249854122 -0.01710200415419671 -0.014712562245359963 -0.01447006671052118 -0.028401918348877578 -0.01647263970356614 -0.021474374781658825 -0.019304937367827065 -0.01612036195308293 -0.02237174905451398 -0.02466196590464088 -0.008664448890934809 +0.0038646810769980677 0.010643995221642695 -0.0011961126397440603 0.01266151615265311 0.008990716610891727 -0.0011300542689581495 0.007872857759348375 0.01308584312797516 -3.75974428174323E-4 -0.005045391944927661 0.0014788523842853762 0.011689445691709335 -0.007491791693632813 0.010369142476915878 0.006585188807048966 -0.007596539514592657 1.061384831717515E-4 0.013764644713053243 1.337523419865259E-4 -0.0036329330783939394 -0.009878268088175175 -0.0023015952380952675 0.007665285076454615 -0.004751834725864005 -0.007468861432979045 0.01757592726760712 -0.0053889606568900406 -0.013163243961862275 -0.009076819337609633 -0.03045402588844027 +-0.007136169014084507 -0.009478690372499795 -0.015756964230748932 -0.033767134473079816 -0.007796792332296698 -0.025398834853483588 -0.01153104465899489 -0.012513142507956538 0.013164442999888504 -0.00878973968897893 -0.0026579857768815056 -0.011638677574428493 0.0014221309956402915 -0.008404821803103885 -0.01817237741934442 -0.010418839260447357 0.009875756820128557 -3.8794490943709457E-4 -0.0016045326700824215 0.004106724426331704 9.280974908630791E-4 0.026489491897935768 -0.026689015644378863 -0.009079555274271213 -0.009197296629480668 -0.012159803282031052 -0.004323598925549482 0.00595115945003091 -0.009512300472974926 0.001690196433192628 +0.03726122635258615 0.021796916533758585 0.012935380089178916 0.012147931551900177 0.023125257675679075 0.013523722181589379 0.023105344438373795 0.020274713865271507 0.0110134763275208 0.009038182282370034 0.005744749573772572 0.020223534086124397 0.004369685335703712 0.004193442109324825 0.027710152478789482 0.019553072205563633 5.258044274617258E-4 0.032987299893276444 0.010312093486329008 0.01735344808029676 0.004636091901624761 -0.008214430079828144 0.019737780361313514 0.029541848807928213 0.024472573380729983 0.017065338286902685 0.010773407768998227 -0.003059995920032704 0.015548770088179354 -0.006046551530522515 +0.003920505105762127 -0.00832466181061389 0.005278840811678445 0.0020003130457389175 0.012069321922317307 -0.0021760967293578968 -2.2067088096707684E-4 -0.0016026041281425644 0.022276622605016835 0.025012743789513073 0.02002116275969764 0.003931089058733596 0.008483782717342006 0.011994659831328452 -0.0035504889070802547 0.01306636431893858 -0.001156079849583155 0.006292833602960206 0.011929930754773738 0.018748083577576055 0.016843562528841644 -0.041412743208015 9.093270625100832E-4 -0.005600698345886111 0.00421013171865031 -0.008527066545551692 0.004024177519300669 0.010231225910194923 0.004152912017647701 0.013086270534281392 +0.025247461399986786 6.995627841903415E-4 0.048643213057394705 0.025431820375243705 0.02536864755786306 0.0384526905861831 0.040247228599890446 0.049518508017953586 0.013409986113864437 -0.009727963405508229 0.024304306521739368 0.02474382258388585 0.0031277070413319318 0.01931515330438711 0.024270653992377687 0.016434387351778587 0.025462941651273684 0.037147694951910476 0.0116584627539147 0.036142423812851064 0.018833719083276614 4.075888490380631E-4 0.01816994088890551 0.008409813992671638 0.011119221553780432 0.03564999504230797 0.017440290921294163 0.0068867734836292665 0.01818722389568774 0.02248290027591884 +-0.013995934219115458 3.4954560731296553E-4 0.02716641079460272 0.0060098104453174764 0.0010572848158748567 -0.007682098953441976 -0.016126742957747128 -0.004129448523990259 0.0024810846228861165 -0.010156509987404087 -0.009975703487741273 -0.0123576991869919 -0.002042812556868958 0.004392790773346935 -0.017645575468245762 -0.02374130119235971 -0.0017442848527013893 -0.0083693392268896 0.008804881180698703 0.005694877848946202 0.013585656410438521 -0.012466438218859982 0.007775666326666614 -5.355164621770034E-4 -0.00793225152456743 -0.004286203895729786 0.007505930023765854 -0.014685154187993576 0.0010766467862708279 -0.004028926467782929 +0.008624553205005093 0.010656813044835366 0.01226066097770124 7.572907153099617E-4 0.011195585128855018 -0.005402400355292649 0.01876348589086317 0.04177226573822511 -0.0021213907394552044 0.014297695301973156 0.026528537480848616 0.022966693538853528 0.018207304460245714 -0.009604690767475398 -0.02134977609392537 0.03375261983747127 0.00370028776132911 0.006352636240082799 0.01835440799104565 -0.004211654753282064 0.015820743389177775 0.005280519932686163 0.005565418810154876 -0.001990430912101875 0.010267163552011094 0.010492427252753655 -0.0039628025986157295 0.028991465904450876 0.016425498791801833 0.007199094664418353 +8.016745560258037E-4 0.022644806314427137 0.03806661846618351 0.014545114939547419 0.018174284900235677 0.034942350375827616 0.023216377372700363 0.024176303149941847 0.012046817339005962 -0.03548920456864358 0.007874877688974316 0.0083688824745042 -0.012591281079435454 0.0021646896210007725 0.004929482354297834 0.016629486582245258 0.01126470023011366 0.010821507898110778 -0.0015124149993655529 0.017664210495319802 -0.005191390871728314 0.014445190887892019 0.02163523270440247 -0.0019942779011380466 0.009443259116048878 0.03753992129100434 -0.016656941718130196 -0.014087360552088875 0.004040001000769589 -0.004696984534934713 +-0.04200784939473251 -0.04513181203515889 -0.048505365697711675 -0.028424629625004274 -0.02851875139438849 -0.043988771194019116 -0.04386207586206904 -0.0693054351055509 -0.03349284552473244 -0.0012035763411278057 -0.03543524718181885 -0.029606576164816427 -1.0717959708529861E-4 -0.024796915928752678 -0.03819864744041521 -0.04747657994261759 -0.029772172151898806 -0.031849398941900184 -0.012749330816090245 -0.027171443276040912 -0.01848234318406844 -0.022087338545102586 -0.022038918714123012 -0.026285442884594275 -0.044636449476772116 -0.027585334165118484 -0.001780234174360198 -0.002213664765821386 -0.03142363554856383 -0.0012311606003820698 +0.005667047618608738 -0.010090351917495017 -0.030948922627737248 -0.011344200125284882 0.021964119195950205 -0.011149476358034092 0.017383179582971687 -0.007346210551937375 0.001448949529099417 -1.7211223962821585E-4 0.003764997083314291 0.018996760180867777 0.002572125229281547 0.012935226022807816 -0.0011936520123015453 0.0129842722513089 -0.010854827488880541 0.006174023392204879 0.0020458253681859876 -0.006102969209246483 -0.003544506059913874 0.004798494130921791 -0.01309330227873604 -0.010103386058830485 -0.019024535511763342 -0.0032985881607258453 0.0022157588386851404 -0.004033904637599658 0.0023738674931829988 -8.217147217813593E-4 +-0.014503464203233193 -0.038805401960135974 -0.02615243494098999 -0.0036235526314018656 -0.0402975829778381 -0.035657028184197415 -0.027933370550867642 -0.03754765278287956 -0.02109958955631566 -0.006887086539700888 -0.018015536905496832 -0.036881670990826544 -0.011758481718060527 -0.020554526011466324 -0.02400998476853691 -0.04403549811940254 -0.01667189036631495 -0.040021997618426765 -0.021053999449253572 -0.02770457949710134 -0.02356607381058242 -0.01646768258051089 -0.009567547003030322 -0.01475166207633649 -0.018062562637844642 -0.029123708907549582 -0.013426745970775108 -0.005872843137447418 -0.02190639507274899 -0.0032897744283523593 +-0.008342697787776557 9.302139534883662E-4 0.009683822134509499 -0.004762282531167704 0.009043970909646157 0.006587933806518738 0.0056159579489755826 -0.0012950546023054383 -3.6947899077531966E-4 0.01022884882108189 -0.00636605732138676 0.014999170940143183 0.006273683275511707 -0.0010716377637532257 -0.004675215725220775 0.020977442864297594 0.008048073654939937 0.02642621637092164 0.009124048369081884 -0.009844691540652685 0.010929053320995164 -3.348095521508929E-4 -0.014167929085109845 -0.00453219495843625 -0.018685254926079503 -0.011317071792586397 0.009236920284988851 0.0030556528824606543 4.03561329611586E-4 -0.0011689335637937667 +-0.0036865393356032114 -0.010037193495115058 -0.013237343099665922 0.004611092663805499 0.004908215857699331 -0.005719345316532573 -0.0077604218247598975 -0.0012156657850366233 0.008008797042444607 0.009953629655053994 0.003028743630627936 -0.001981325897333259 0.00945936804750473 9.83372063442047E-4 -0.0113515572180109 0.003600974446112499 -9.581008950798991E-4 0.00929454444816598 -0.004004094652650466 0.0025888342872805456 -0.008783873478203842 -0.00401979720225111 0.0018290958736726837 -0.016504056910569137 -0.009767146707111813 0.01461864530082337 -0.0057405796612155805 0.00609258707991116 -0.004336425825156478 0.008536452173222204 +0.01973435446424371 0.020465641023869288 0.014470710848277267 0.0012990560206195948 0.007007814822679894 0.0027871730182300373 0.007236349787827615 0.017283390413557108 0.007700819159047209 -0.02718773244478274 0.011613726953742009 0.0022334767328436953 0.00127776589169353 0.002143413395164656 -5.656447867820884E-4 0.009497699250787275 -0.007884890951196424 0.00451244145915609 0.011671650736977726 0.01279849557369016 0.0034083618908592886 0.006138098040864322 -0.008607237871674533 0.008597181048217101 0.006475978684587731 0.010194372706266141 -5.991611874103076E-4 -0.006459426595489839 0.011901098534854286 0.004095604095563192 +-0.007257219745332536 -0.010487562483443014 -0.0037344301708993467 0.002767678530504881 0.0010544707319473906 0.010940218417260072 -0.0018868649806923013 0.004227478561997033 -0.0014556283004458648 -0.0027947598253274513 -0.0019517363316563184 -0.0035490342175954724 0.026161852878462715 0.010515996885446964 -0.0044142558757372455 0.009617373630885407 -0.0016110192072707704 0.0033919599671441425 0.012818869047074246 0.0055792895222829 0.009284420289855157 -0.0034264080419051358 0.01262833514713231 -0.004180001570690902 9.899624130853357E-4 -0.01870290635091478 0.016078030653543268 0.005079235979698578 0.01161106562845771 0.0050305232482451825 +-0.009372071491248496 -0.018594273309674104 -0.02064706725459476 -0.01819906816975916 -0.03475881536214847 -0.03199766654573265 -0.017812978949330004 0.006910206403332725 -0.04348884839650138 -1.7512699246808653E-4 -0.009087260858321063 -0.00687485280688675 0.0015545756359120575 -0.010494770354482558 -0.01790583240002079 -0.00890453491603779 -0.011940630507106578 -0.03124712739827661 -0.032021249664061564 -0.026198806383218157 -0.017276217186448298 -0.003773559748427641 -0.01818655424058639 -0.007818905349794207 -0.008208089155218807 -0.0054847250788427684 -0.016842783446330906 -0.0026278754269683565 -0.029832280467217143 -0.10037876353838654 +-0.04276250830924801 -0.020841209186078177 -0.008219592156862798 -0.012123385537672195 -0.035355718027062416 -0.009306224542089106 -0.027315138864909144 -0.01814306266805392 -0.032004026720955765 -0.019796793279719928 -0.025073957719645466 -0.03169311039711243 -0.04004555091106737 -0.014081943335524325 -0.02755113092432409 -0.016297513240753937 -0.01175831272201003 -0.029614260394362546 -0.016344141618299887 -0.026224369060705206 -0.015753379355100048 -0.02937714572279944 -0.02037577347510509 -0.005143118909752304 -0.012762977238378964 -0.03626081671392278 -0.013639588059780218 -0.02047016619375766 -0.01672615451118346 -0.02902256390977452 +-0.0015813698359359875 0.01180342492260056 0.03773761683899643 -0.024099591572243406 -0.003167420742818548 0.01299258859347831 0.00958911763725038 -0.001606845009987529 -0.009708711496868125 -0.005361912325971177 0.01232358151858327 0.0047373299696353245 -0.0030182064143001283 -0.01057680318450182 0.020772603439456066 0.014018690993258594 0.003415280491856683 0.010496666444714352 -0.011963325323807355 -0.019762102769269037 -0.016469473058003323 0.004075977869672763 -0.027552687364226315 -0.005253039272909222 -0.004747005257105199 0.017882689044844375 -0.00597370452909979 -2.0695219503611992E-4 0.009023913166853081 0.009911716043919156 +-0.02227281792534601 -0.0024861540928255107 -0.025940407400721933 -0.017404738789953383 -0.02088066225872298 -0.03119171302256894 -0.010553361659780916 -0.01561112937018909 -0.029014333769965442 0.0037735668005905243 -0.014584774771191635 -0.0018860008249292084 -0.00789270208439187 -0.0021013796829980713 -0.013119533527696793 -0.04545458544387989 -0.005819049059748478 -0.002693074899556743 -0.007534037198061554 -0.010515092657172377 -0.010141532540493681 -0.017101364804813998 -0.016944458333333284 -0.0011735037424936451 -0.012685203849348448 -0.030639507220252844 -0.0030605029134521365 -0.008692011589403966 -0.023643046090080742 -0.021545752515653282 +-0.030373596143776334 -0.02147237346625767 -0.020341105442319717 -0.02643048267772449 -0.015067153803133053 -0.025234613868075056 -0.019046168636529356 -0.006376187257807692 -0.05021148792179723 -0.014142516753624775 -0.020291203393306444 -0.029288009963067962 -0.008500424836520859 -0.020325956598370627 -0.004963048744460937 -6.583059030064442E-4 -0.03611268792558737 -0.021024206364659986 -0.00379556745813618 -0.031440997414733766 -4.765308440188773E-4 -0.03673110623731712 -0.030375841062105703 -0.015441456346376151 -0.008634021907349014 -0.020878671583606224 -0.030587245354158347 -0.007515678183061538 -0.013581816724190683 0.005172031931885991 +-0.046361022648878335 -0.008816633839799361 -0.027152213147505377 -0.007334768317733808 -0.015062461046718652 -0.038895657222525616 -0.03494868883770928 -0.012176083615563634 -0.03375950245999849 -0.002723842382422383 -0.02241720218281663 -0.01840377858088243 -1.099362461001465E-4 -0.025981299065420595 -0.04964076243356649 -0.01537112394881136 -0.0017186297172162048 -0.032312076991191506 -0.008028248959810821 -0.016911425367831745 -4.767818718288136E-4 -0.03138116133786267 -0.007431065456698272 -0.010739873849301059 -0.02363918165803561 0.07167190984261666 0.0027061320759035057 6.31026490723121E-4 -0.01937242450174986 -0.0014033522599717595 +-0.020037249095866586 -0.029650128483890096 -0.03411585752549749 -0.03089915584779918 -0.037514912187092644 -0.02587404036022128 -0.020360525988081052 -0.02598486716082283 -0.02973535445330495 -0.03404950961578695 -0.01458123790082853 -0.030376797721709196 -0.03968341167765844 -0.03713301633915737 -0.023117756517630282 -0.027876895628902762 -0.015034971251060755 -0.04173883614764822 -0.0240054863098632 -0.02265668410936795 -0.03291202003338898 -0.03880205311734802 -0.03831475168901559 -0.02955368825699954 -0.02155674889151005 -0.05900241568319401 -0.022222194276963276 -0.03384488122766443 -0.02791839455782319 -0.04098680743186231 +0.048491575418994404 0.06396414748421253 0.06720828369311556 0.06337262230661697 0.05436946510351222 0.07042154777059789 0.06982660634617747 0.06678071996872308 0.03769535587816863 0.02620169700662955 0.06412040005134953 0.03551175048805438 0.03124994240785325 0.05460890990750188 0.04208498079622708 0.05964668501949981 0.053484082964344065 0.06830979714149986 0.04005619001950273 0.044689636432646784 0.04044389742155112 0.03870276383897252 0.04777891779029411 0.04030898624635499 0.04145865033056917 0.07209991401174491 0.022022551221649936 0.021322889933048015 0.04277236711377142 0.03150442141010813 +0.008951449656924617 0.021060731380432768 0.010225279748915168 0.0179718876801553 0.01036023050717595 -0.006489813660238134 0.01366811836498869 0.015309361729571043 0.00945067912801715 0.013041936315979734 0.012122700333507848 0.021456145268481424 0.02142303347421621 0.006519843021452559 0.015221328831702524 0.0036804936930177603 0.013051564514918046 0.006165493360491253 0.018648608108108148 0.010766365051990131 0.01564349408967749 -0.002358268043424808 0.00437067314059844 0.012801911970673584 0.011254710413242162 0.009039802519112473 0.00965355404041568 0.012569237592016062 0.023837657678450988 0.005524465358096991 +-0.0027461132234896496 -0.005812900588302945 -0.002396449404216691 -0.006128777899743803 -0.00326264274061975 5.123407177332806E-4 -0.00810539383779244 -0.008368177285358524 -0.00453478635847289 0.0021758476092168136 -5.871653117064961E-4 -0.006591668189415259 -0.009128418032876014 0.007322625065413775 -0.01438851908860351 0.008412402752105272 0.005895851332933825 -0.00780787705080059 -1.3258159190436227E-4 0.0010977110985172544 0.0025671179727943983 -0.00397131233034584 -0.011169190276495787 -0.00362349378315492 -0.002164045732027666 -0.004479462589370607 -8.537305447832745E-4 -0.006942941446306285 -0.006974315788793681 -0.0010988697559415907 +0.009531900223086072 0.008675971331572873 0.01934381093394324 0.0012885319597141203 0.013093336450783193 0.009665295005192195 0.0076370855714512674 0.011623270347716949 0.0041146067252927155 0.01718836620227972 0.009399635710259499 0.0056622047745041836 0.008115792937047598 0.021901201624383894 0.024658063084451103 0.0038502673796791385 0.011071366907783549 0.011754168858991523 0.0137986063235264 0.011695865584473133 0.016061522720240223 0.010822166729529752 2.934428720388129E-4 0.012770653125349344 0.00815863868308093 0.010908140764011002 0.01144912863350566 0.003177902475044419 0.006178370549146506 0.013986061459559869 +0.0037767519932859176 0.019446522064323228 0.004062009302325604 0.017464849549914088 -0.008769928051238033 0.0011410738829379147 0.007427588185120688 -0.005430101518847802 -0.004244123979390335 -0.00355747058773621 0.0034338084970511177 0.013547998830790772 -0.006962565425643319 -0.0062015593944084405 0.02981140922218361 0.0031962923503089844 0.0020396564242693054 -0.004430412523382852 -0.010731683772716482 -0.022599510729758937 -0.009163848377372368 0.017092411238944154 0.021997359671583522 -0.019874713987473928 0.01731197447310052 -0.0010790531572573933 -0.008503739035162602 -0.008870074292294578 0.0021518002260028763 -0.010073637890577993 +-0.023515886287625416 -0.03686724137931034 -0.03986907161526252 -0.019152606032114928 -0.04377184997038766 -0.09960737208216024 -0.03603666169179435 -0.038534539607561494 -0.010435023362213214 0.0035701713673688025 -0.02204050177969937 -0.019963501605446552 -0.0070113935912729415 -0.024226842027834827 -0.01464863113787497 -0.0550127419280909 -0.005142436474927665 -0.03678798348136913 -0.020505292790331614 -0.027270109095443112 -0.02797685549132956 -0.04450600061386893 -0.015353694494082663 -0.017977344688318676 -0.02215282493510871 -0.017688334261094542 -0.006588685750183951 -0.0061794374600468065 -0.03765384714826674 -0.015890403131115487 +0.04506046237825105 0.042277701096084475 0.05204243587087372 0.02072395689416966 0.04504499634769903 0.04268930947761018 0.04308115807846866 0.05464564143452152 0.03326894301889372 0.002490216960330425 0.02971350436087108 0.039057619730489004 0.020410404020414837 0.0308473520013665 0.032682485773184056 0.06136207860813327 0.006245972364355349 0.04650921875751097 0.030118800241507288 0.011695118977535432 0.022835370531984606 0.03420945010989232 0.03686970109867241 0.029672027942529506 0.03686542027736165 0.02611686597938145 0.019325358010018064 0.019939987563035694 0.04114068461963117 0.016783335851230204 +0.005428093050267275 5.481088982277762E-4 0.00314907068893817 0.012994062443602301 0.006756780370772705 -0.0022258330711531957 0.018032204326174642 6.242840713672407E-4 0.005749619088687699 0.006387508758206135 0.0196981805004661 0.007074684623252707 -0.004000378505792626 0.008667064969737535 0.005541279539423923 0.004659000324883449 0.01177224931994326 0.001275365446875172 -0.01101346575377467 0.0019197354544641348 0.005348837209302253 -4.671650289805863E-4 0.005200210676030662 -0.003201862150320214 6.952030848106764E-4 0.014333542817587542 0.01088177031008393 -0.013033403405507672 -0.0022998222031216666 -0.006414769515531989 +0.004889518282357445 0.011504766672927928 0.037853203400682794 -0.004364911734100954 0.008100023330248084 0.01906311859286037 0.005438813838583155 0.012009732886523683 0.02000860340133482 0.02926657212153428 0.0048012089562157806 0.01421921262430442 0.0036907944955234025 0.007778581906269695 -0.0036928132327505876 0.006323840774111245 0.006981129606715283 0.0072506860131430805 0.007424075301604044 0.013370505553394665 0.004626416840157364 0.01804245098586102 0.007270749745696999 -0.0038884783460234103 -0.0018856887279538452 0.013338642190456391 0.0021085617461516454 0.011288583359135532 0.004191051860041521 0.02322655659827476 +0.0018246325022881662 0.004152374149708811 0.009690740932343062 0.013420417287834408 -0.005509664703634866 0.01698174461028197 0.011769012899802221 0.0038529705216006622 0.012049880395829595 -0.022781808448410275 0.010343453877921552 0.00717683372816779 -0.01633140835314091 0.01121881190484315 0.006272486921152091 0.005655550663780998 -0.0032562816152188864 0.014299552111880772 -0.007632504477760339 0.001438637058943806 -0.002072300253281057 0.0038567308749911 0.005274805590299797 0.007128343758599648 -0.0016903450333100583 -0.001824670852678021 -0.0017165724789621427 -0.019165964616680638 0.0032346098844025298 -0.007925622841802357 +-0.005767479393554937 0.001078766650103675 0.025535870435873232 0.0015891233757161008 -0.0018466759002770854 0.0031961711981758453 0.0018784335849018983 0.020649442829524977 0.0034611655768586914 0.009640648722886037 -0.003727802898298582 0.009114251236817418 0.0024189225646704593 0.0011538564152632454 -0.002663347862733884 0.011456009641991585 7.376962876771996E-4 -0.006425616373615166 -0.012332594492370062 0.00504841571600893 -0.0237655514536226 0.00997076472740585 -0.00510901698726922 0.013397345803842237 -9.96314721188705E-5 -0.0022195849181137514 0.006988796100291568 0.010736525660296328 0.006760285905975798 0.006049903376633196 +0.002951363668810059 -0.007183926005747183 8.224639469582739E-4 -0.00802111964798018 0.005781683358849059 -0.009818010211612245 -0.004398932781408025 -0.0064681178905171294 -0.010623675056967095 0.007291701642073039 0.0019546856020850574 -0.0027095984669546678 0.0065811013838126525 -0.0013297960639238914 0.005284051136363614 0.007619419118216245 -0.0012637215802834725 -0.007721959608531996 0.00563908409079957 0.011434651272811125 0.013471992118364647 -0.00416635253450407 -0.004580180239548462 0.001662958385207183 -0.004781302966244699 -0.004972481156045084 0.004516617936932697 0.0057361376673040814 -0.007179746678313725 3.0832624964710484E-4 +-0.0011161947909833843 0.0018090087157925506 -0.007197532001091499 -0.007286298140338628 -0.006438330354640903 -0.015037054995465196 -0.006953440633832254 -0.002271029419938132 -0.014781718237089861 1.723371251291525E-4 -0.003344328558177721 -0.00880948467651472 -0.006755966222816842 -0.002041757620208421 0.010117041037807537 -0.011853709380748015 0.001159858758323829 -0.0072957196314478705 -0.020427222418498783 0.001574675992850837 -0.01189370308083715 0.008185548199696661 -0.0012549358441865236 9.130986891914852E-4 0.010309257919757528 6.574828950882782E-4 -0.006305828982448525 -0.004013476975073991 -2.0815253391046255E-4 -0.011329487475915194 +-0.004571353015616628 -0.006681166365453785 0.00536592385114979 0.0035803973900787973 0.018745684303302104 0.02046671333333336 0.0017504740298844765 -0.00842185868539025 0.016135866492969143 0.0012062554059324181 -0.01308649978285896 0.01113052588363252 0.009434997050246904 -0.00587080601086656 0.006658476909923418 0.005170631030843063 0.013691448563184303 0.02900537886314414 0.01540134869559707 0.035515589256757185 0.008496601569426445 0.0018944519962913644 5.584392248404495E-4 0.010283612368823813 0.007331067815909097 0.023524787673796222 -0.0011036143852575975 0.008907698455664958 -0.016808013912764885 0.008419098911904477 +0.014491336146368742 0.007089693040890449 -5.109925196170094E-4 -0.006421699792498189 -0.0013630395274874998 0.012216599689578564 0.0 0.007422159194702544 0.002925184525349098 -0.017555869795382765 0.0032299654149149882 -9.036391792416158E-4 -0.006955754658064273 -0.007605565361389305 0.09543659395394168 -0.00967072056258108 0.001038940259740253 0.003523426273242076 0.0014765234899328443 0.01786894572875273 -0.014509688743271706 -0.0017107419721004871 -4.1857124092571705E-4 0.003940264324413156 0.00806451612903219 -0.0025680149936317563 -0.009225488692398838 -0.013664116039520719 0.0028580183882924233 -0.010204143396690304 +8.046876247988003E-4 0.02960286896740538 0.019968181673397548 0.0050269029618149885 0.0056869883004319445 0.005937775836610732 -4.3685016562844403E-4 0.021874441079312315 -1.3891666666666759E-4 -0.0043798176461171115 -0.012257106223450996 0.004686720818449659 -0.00798953678484605 9.016138886804059E-4 0.010198873450386945 0.007064200975188083 0.004047742689107275 0.007022262488771886 0.013268958406795926 -0.006463711688875537 0.008549038030182107 0.017137133116159532 0.00683972650530048 0.005233025219140862 0.0040975414634147 0.018666284757981412 0.009813186178538536 0.0029838662823472436 0.011769110444777455 0.008200586202781218 +0.009950799275320082 0.017882187624786387 0.01570641082409883 0.021525580756748673 0.018547840274775695 0.006159412253564612 0.008886953736064613 0.01531152896670656 0.006111987945881133 0.004575013036248055 0.026934334846867348 0.013339863927655769 0.008605461259989683 2.702369107245279E-4 0.017328831530038283 0.014854507636589418 0.010233667774109282 0.014982999953364112 0.003571494803478667 0.022058017641137097 0.001412714824282512 0.010020440099860932 0.011922931315247343 0.008703432427144366 0.01622617598573984 0.016681410969849944 0.008061432234214348 0.011687207571457492 0.021647247657760615 0.012394500345324815 +-0.006468958803673634 -0.031346864771841856 -0.018726227055661723 -0.01774947054954609 -0.0055518544426350095 -0.022446141071783016 -0.003249075812274341 -0.031918014703454775 -0.011597459616181242 -0.001751585216325214 -0.013754321040713632 -0.010499135842351718 -0.010719711457442821 -0.003962563004659954 -0.023995261024819 -0.018702968463162543 -0.002455796507035782 -0.018846894613748808 -5.272307686610178E-4 7.156384180790684E-4 -0.006113308396738816 -0.02493418744628299 -0.015070544323072825 -0.013305386447780261 -0.01577583003253956 0.0037290616679575986 0.010954701885945592 0.0023104389348785467 -0.018380506390378335 -0.014461695394265806 +-0.0012020735009100468 0.003378342696360551 0.001983769242533159 -0.00845644502248332 0.015185350942058013 0.004044324774083591 -0.007533560140523867 -0.0031760283130660236 0.0016762537603717282 0.013511071643759658 -0.0012421771710114902 0.08463926096896644 0.04865097194491429 0.004701672779415399 -0.0039457660239799975 -0.006836565154340229 0.012514114524856143 0.00974639477668423 -0.005143083076801005 0.005005784899651651 -0.0026023184291461207 0.05384479657563123 -0.008206927364124728 0.005393886847058842 -0.002525762531071255 -0.0030959752321981426 0.008235297948490676 0.011525544603404339 1.5602829907493854E-4 0.0 +1.0031090262070975E-4 -0.0017720715931242134 -9.480940693828843E-4 0.019032256208207678 0.0032996481148183376 -0.00792620202606809 0.005036143530988324 0.006903269243491968 -0.005438558157001273 -0.01194594916710355 0.0022612584219643805 -0.0027090074701557132 -0.005693726515973234 -0.005129589494341475 0.004570893994034411 0.03796410175144148 -0.0035457198211500274 -0.004779327193133983 -0.03009019008244459 -0.0033330238808452154 -0.02870016603415551 -0.01264527501157498 0.0014025104599223767 0.01105511325935083 5.843202181534194E-4 -7.453167701862498E-4 0.006878386949935638 -0.01201576548580905 0.0011961672909312053 -0.01374226676066149 +0.010529442333238718 0.025386045610294897 0.01655182734270273 -0.0025548497479544025 0.011401008300789188 0.03313685723255127 0.007044306616796777 0.031115837598608916 0.007992134043746634 -0.011739933415104252 0.017541886867805237 0.010865479596057288 -0.007423170495551357 0.0048846041189161745 0.01486350836910752 -0.05466232132887156 -0.01443675259824357 0.009133719655378245 -0.0030067104826217235 0.007214455205830707 -0.007570256225390501 0.002163378369044278 0.004481778585944517 0.004823975031933739 0.0063266596520666 0.002113363945465715 -0.017985777285205076 -0.006710002237576064 0.017556565186857113 0.009446563878190664 +-0.0038701995793450363 0.006405869335383235 -0.0033772953307865086 -0.009274006277389007 -0.008237610920494019 -0.009254513477894062 -0.01932640829777755 -0.09126112749334273 -0.004312101882210484 -0.023581594908454087 -0.0031596009920043843 0.002239329683964127 -8.547115567245607E-4 -0.0025204609783225323 -0.005081219361332586 -0.007015348490319829 0.0012378378122994698 -0.019501689269416738 -4.112268846287883E-4 -0.004775224985273923 -0.027312992798056084 -0.006303393598193482 -0.006692735545276923 4.0003199551857314E-4 0.004739317194499633 -0.0035975809006627323 -0.0021738804347825676 -0.004222102685710429 -0.013782527221516894 0.005926920562330803 +0.0057780635319205405 0.006709082974211597 0.005344802586040685 -0.0030310778823408155 0.004590142076502806 -0.010364747081930687 -0.007279983554673717 0.01736749978208175 -0.00111765853261632 -0.03250410386780468 -7.785130314351816E-4 4.4684589418800735E-4 2.1390077675045405E-4 8.122371773710124E-4 0.003905462628152118 -0.003639434888448761 -0.0036060066681641275 -0.020365435470775746 0.004251302914188089 0.0021366983675213014 0.031368606915472136 0.02398326339966527 0.003790061869457101 -0.0016795889120978917 0.002791692417934934 -0.0012450074701194826 -0.0077887143424168245 0.0048760655024831885 0.019409938189595313 0.010388378541422733 +0.016937391213722282 0.01298699589883789 0.06250855484904713 0.010551730116216997 0.01631853821406741 0.06833467467250276 0.01925930370370376 0.028293701322166354 0.0015384755244754811 0.013513532535914715 0.0138571482680489 3.722400004133387E-4 0.010476758493941002 -0.006943237025369915 0.009875291770573565 0.021486892533586325 -0.01974972618911921 0.03341747555046673 0.0019117847093356062 0.011333878377106104 0.019867598724552297 0.010862245786226925 0.010907551086350182 0.008492204774875901 0.002303983916751097 0.013213637332166168 -0.0021957183092245103 0.009704619843686847 0.011779675223858997 0.010051384791661257 +2.921885709980188E-4 -0.09227392193444532 -0.0054162952506543694 0.014511989832545978 0.01241708440199267 0.007201222390317656 -0.018822753539705542 0.023441726051481433 0.009076958398590207 0.019629648148148143 0.007410286814535159 2.976112406007225E-4 0.020630597353912237 0.012621447724183634 -0.022076259819760153 -0.008834707428802888 0.010864968010602166 -0.018330485570515632 0.01444728031427244 -6.287051194419779E-4 0.020923495867075714 -0.008814665661148479 0.013694812371077432 -0.0027009533532162326 -0.00871567824094711 0.0073818652483004996 -0.01644938622546323 0.005641454123663791 0.005168861240149338 0.010938947211629945 +0.0035053652435841545 -0.006318528037195099 0.004693734825653963 0.032446584693474285 0.0010572848158748567 4.806656995834899E-4 0.03807124798426952 -0.01689696554830383 -0.005258856760064815 -0.009262658749316043 0.0045768866374809114 -0.002380538645745144 0.010365916757894509 -0.0019726865666970903 -0.007423877769402468 0.034168103441598055 -0.020557246779562798 -0.015800067030546806 0.027139553943302287 -0.005477464597595911 0.010129563954545012 0.007707317692894074 0.03602618771869802 0.007567285267107782 0.0036714685990338457 -0.004518747112313682 -0.01152253054884516 0.01184292516428579 -0.0056914577280361665 0.008415952683859959 +0.0034931108770253775 -0.006358705697424681 0.02470125486645009 0.011573835982753189 2.11195606252555E-4 0.028404971693370844 0.009632579791619597 -2.2915742940451858E-4 -0.005843044206025868 -0.0093491844060346 0.011173173812799678 0.008128232298512984 0.005745336967832876 0.004492362861841073 0.006003907815342125 0.010055427867843353 0.009695248138767936 0.028799367861445456 0.00549386548700585 -0.001897923482070925 -0.01026124043234047 0.0013447301728510353 -0.014488909759981993 -0.0035575698246117153 0.0035618310616624006 0.005888798775885196 0.004696706628017773 0.011293613731137289 0.005272157957980378 -0.009836006181132664 +0.004641307380415864 0.021268529620392874 0.033198974811083186 -0.0021713295836200326 -0.001900739256630936 0.017109448175182458 0.0072791448763251144 0.008557418682861364 -0.002099090429598287 0.0018504440812280236 -2.1452556724607715E-4 0.0026629262125464808 -0.006018535203698174 0.007692316430438708 0.0014666902616493878 0.01605032474501574 0.008758056624186616 0.013996624058948784 0.003642500183068858 -0.007083975480987935 -0.007775636375486327 0.0136813665744617 0.01029131248329332 0.0011107505465665862 -0.004412460431654641 0.010611086976730954 1.1266685250351774E-4 2.030050761421941E-4 0.004545167415133243 0.0 +0.010202088350296621 -0.01935125393849074 0.002267277819179177 -0.005021811055696018 0.004655141965939013 3.445401447455587E-4 -0.007296667419467302 -0.011060659090909017 0.0022437667155733652 -0.006464684271604926 -0.008959697456728848 0.005680590062399336 0.004926067222371361 -0.01109533069073919 -0.007019847659710384 -0.002199480191940868 4.184205108456564E-4 -0.011098694169943094 0.0031107841060069247 0.011978528872205513 0.005224435876883581 0.004885352443951731 -0.00436557768834912 -0.004992843556823609 -4.817708788730409E-4 -0.0018103065193059876 -0.007827977390348404 0.0 0.0072096859389839145 9.030327775799582E-4 +-0.0054306402956424684 -0.019357245242571864 -0.014448620118044595 -0.005467648186431285 -0.016427948609940957 -0.018939410613538515 -0.009329330365067157 -0.01348241224434573 -0.0037778647855342853 -0.004089998064881917 -0.003518806823739636 -0.022960716250550156 -0.007965676224789175 -0.004128955959825695 -0.01805507115387723 -0.013426893249423191 0.011396947003313888 -0.007167801633196281 -0.007365279847077009 -0.0018552875695732839 -0.014883084579112471 -0.005273566205722103 -0.007706643430596683 0.00963758638858811 -0.013109707212448538 -0.0038689397154991283 -0.005108377998402988 0.0032480715894466048 -0.013476876663187311 -0.007142834586466137 +0.001245310865459444 -0.00900730164814098 -6.417281428968145E-4 -0.005497766924695106 0.0104924623020886 -0.0031004913642156515 0.0014982307412176657 -0.0013976782217555077 -0.01516845569530009 0.00709354116109763 0.002553300277757939 0.003904234493516996 0.005867819702159902 0.0050473638138088806 -0.007251302373444319 -0.007921998781230824 -0.011888772504225015 0.0037997626237227227 0.00911217130955494 -0.02639407434944241 0.01270980784868558 0.014662002860652756 -0.009373286020353647 -0.0076522640004375855 -0.009962844597465714 -3.640975890776038E-4 -0.0030237277671367607 0.0016188183577020856 -1.0002502201816288E-4 0.002650442953795227 +0.008515183941308352 0.0056082190216247465 -0.0023708774555246596 -0.005358096523930975 0.008264526557841208 -0.005750900633744428 0.0029918648314622336 0.0025659952146502114 0.00499141450407524 0.0018535310129095153 -0.008778557827299891 0.002094069144727561 0.005731225112385963 -0.018563357213463177 -0.0017738613426603422 -0.001433251433251439 0.006486660253470208 -0.003974619172416438 -0.01044889101324407 -0.01817479613993419 -0.013023916646933394 0.0018777288248465513 0.001621992364612407 -0.002941434112875132 -0.004735635312395014 0.016027185332355812 -0.0028040343347639283 0.002222242424242362 0.005454894213871099 -0.00302110285594116 +0.015083919359304827 0.026153865384615324 0.016759472209150496 0.015134707528038673 0.006515279255347714 0.008617163786343265 0.008451718569920717 0.02900802918681611 0.015467532063750032 0.006845495038769566 0.014213896940891108 0.0153742661626142 0.010074336320576019 -0.002193028103197683 0.016515982684200195 0.02542542546647529 0.008004199833810807 0.015581938242280314 0.02359533338020259 0.024733548374413817 0.004558517274472175 0.010267291311381264 0.017543914103749385 0.014670738553193034 0.017049970768734223 0.012308783460802932 -0.0016641455774172793 0.0010078411407409503 0.02817183259824144 0.016363666666666565 +0.005233626168224235 -0.004122975934726722 -3.408989084025831E-4 0.007159695020555103 -0.008143641848896323 -0.004154754544764161 0.010564123862098604 0.0032411849437128585 0.01215765824923603 0.0011025726241297772 0.015577834937950877 0.010804858269646611 -2.015313277950582E-4 0.009157509409089087 0.001028315054030649 0.00919822072378408 0.010003103949643257 -7.484423308864469E-4 0.006367804624343019 0.0011384743833016502 -0.0040601386209729706 0.003548919094638273 0.011273182724849257 0.006129113529324081 0.004775809059957291 0.008145472885674387 0.0010346209057042891 0.0026178211840515516 0.01524903854991878 0.0021615458508782524 +-0.00873926196986352 -0.00903272504766149 -0.0018509913392345677 -0.011792222129296584 0.0189474105263158 0.0036432602274229014 -0.0022998187225654497 -0.0036063935263836036 -0.0044180450089743185 -0.0082599302496329 -0.0037152857339783096 -0.007562594311733733 -0.007859724060050905 0.004174292309645022 -0.011094575878631862 0.006736675119146446 0.005921941884379343 8.426551978777074E-4 -0.0010123386868769017 0.005799844843055991 0.006474819988613504 -0.0023308230562743113 2.622557377049652E-4 -0.008669111689189195 -0.006499156329388087 -0.00843093657070399 0.00987654929233013 -0.08435430639979287 -0.022840015149532638 -0.001041271871504682 +0.00712806207668186 0.030003835928598566 0.01988676458150578 0.010071038927859198 0.02128094953384504 -0.002224853590898422 0.012224084598377073 0.026994436246208633 0.01830535267916596 0.020914325761879064 0.024932032526108205 0.01135699769510547 2.031688015759591E-4 0.01744073676339284 0.031008159928365222 0.016728970345818273 0.014920838862794487 0.012347979188999414 0.011020977678718404 0.02185964001121353 0.010245436972946395 0.029243575990741358 0.018880320658724983 0.014259867643582995 0.030560486829925508 0.008266379310344782 0.023312708913194702 -0.0076770783066463354 0.019177319739624523 0.015412158668932478 +-0.008195166926667012 0.006452765248791962 -0.004091181175464318 -3.3514872786178225E-4 0.004450778879223163 0.002992577197424938 -0.0032434061626276257 -0.002936813574232255 0.013618412093149937 0.005076124002900719 -3.1185092942373493E-4 0.004854002788190939 0.015333011311951358 0.008171294366153107 8.564130982367383E-4 -0.005032868757258923 0.02210220066211019 -4.620495244681211E-4 -0.007141962339104347 -0.0026555563261984523 0.004716886569958151 0.006887891250972185 0.006691597049177676 0.0027963413548105047 -0.0035054759780537093 -0.00948696449356879 -0.004000672312048253 -0.009062775903502317 -0.002154538915280502 -0.005059414684726097 +0.00262909859154933 0.03022535262868645 0.012708350244838466 0.008130089818625348 -4.0283986292690587E-4 0.006435418270917542 0.0020077125172014826 0.033210566276644364 -0.035335173988982976 0.00577198783860012 -0.002495689674042638 -0.00504684221442338 -0.00710070021203517 0.0014976477579482974 -3.5230281725771677E-4 -1.9461088736917834E-4 -0.022700587750506422 -0.009429564748628414 0.002397804199843706 -0.0033282570418511305 -0.00938960137979347 -0.0016325093410486798 0.003834794688682388 0.00495738939005153 0.00484884959117703 0.003192574198888567 0.006917740585774039 0.006022663126358973 5.757641077537582E-4 0.00486405770706684 +-0.0015920397227200457 -0.017425390560974623 -0.009417628070244348 -0.00947788501394983 -0.004432822800064087 -0.005638557261166968 -0.005043847303084288 -0.010191668593709166 -0.01852370396140523 0.006994333105965993 -1.5636694845870194E-4 -0.001159449275362221 0.005036261130502227 0.005365948275862041 -0.011278977504159775 3.8920024108180065E-4 -0.004905867187801376 0.021091945476585244 0.00503590582903168 -0.01153951944122606 -0.001421848307539074 -0.0164291296037056 -0.00904111815918921 6.16633242768932E-4 -0.0020815686993743317 -0.010490323455460832 0.012853858583471206 0.016851508507827375 -0.0036445355759101286 -0.006820740440598257 +0.007785395293261558 -0.0052478648298177576 0.015494039947848285 0.0020983716812017095 0.014167192875936053 0.01116569053157588 0.012986076388888811 -0.0014401785195789355 -5.676316082355316E-4 0.013713196305852295 0.0029714940006231204 0.010229280621859467 0.004710372867411998 0.008399676188645726 -0.0018333723679295106 0.021007624975685674 0.001609860163093479 0.014258266547545284 0.011774958993487315 0.0026651314414068727 0.019458946831014404 0.011478760291323706 0.007710074530969078 0.009243544409915153 -0.0044562529206764335 0.009648660261417329 0.001969257720794818 -0.012647230426357828 0.0076045722172677415 0.008713690868611703 +-0.004746853969716047 0.020192850278463646 0.006650175875019792 0.0019264930222504975 0.013570145408697951 0.00728447125348634 0.001302550260593473 0.019685687466107604 0.01249464716740006 -0.0024595749283055682 -0.0125266542571165 0.0015081292639137543 -0.00678304239401503 -0.014403505422993498 0.01352037755102037 0.011621184544820602 -0.004319437338439928 0.00558705050385647 -0.004828525621958369 -0.0093967995992362 0.0027933659868101244 0.003913336555842578 0.0010201734511647556 0.01121966841032913 0.010476171428571423 0.0048371400463157925 -0.0030572528586257967 -0.007508834088092544 0.005875309122274398 -0.0029283234438511763 +9.353782848592599E-5 -0.003566351513325558 -2.3427741741372004E-4 0.002675129509903205 0.007678657064803033 5.739884193075892E-4 0.006709537268376536 -0.02425576623277648 0.0023840275524899513 -0.0024656569648758443 -0.008842999449268312 0.001864290742506603 0.0026112483679823248 -7.92288081425756E-4 0.0012584948781825787 0.002448248679783331 -0.004338185905825589 0.006900304934144792 0.004478738659320886 -0.006122429944313823 -0.0013928040207611232 -0.008419754941303294 0.002038267515923576 0.005887229002670833 -0.007634279125999566 0.007397029644171143 0.0032857236554090985 -0.0055629729764791495 -0.005698532570058558 -6.607635975203809E-4 +0.004488460735207391 -0.02075876841877645 0.02031542335091417 0.001167250272348556 0.008010941774130592 0.0030975333781042536 0.0012242111573004945 0.011595927282096801 -0.0015388919331746451 0.001412464714203126 -0.024588448891315267 -0.003936465760546365 -0.009215646414591805 -0.006343621145374417 -0.004022061458684533 1.87901559271089E-4 -0.005876998563643863 -0.0016910199208701516 -0.0014861902770916958 -0.049053192107441135 -0.0020920502092051 -0.002280053427469922 0.010297444175059992 -0.004877384111131349 -0.0012346566508248302 0.0043122958865164955 8.186998213477544E-4 0.005594092763349581 -0.001671630488307647 -0.0017633237692799837 +0.0029789611427845416 -0.027229549940980566 0.010380279669390617 -0.004163890670155052 0.0034890482651676624 -0.009835884080627992 0.006113259026536703 -0.01604818718945135 -0.002522082001313494 0.003526040135295417 0.008003490041960997 -0.007472824710394703 -0.0036396823924908232 5.319826257490536E-4 -0.007067183026738582 -0.005259259757353006 0.008969493334323817 -0.0012480966612837337 0.008310567787996817 -0.03142994616578742 0.009783321686466333 -0.009692702762920318 -0.005536705605427043 0.002186766784299741 -0.0076074835447895554 -0.0051061275410498475 0.0026177737640828347 0.008900779014258616 -0.00784576380350083 0.005667211513476542 +0.010766697805210659 0.0020665038512118457 0.0015001454984574151 0.02048835055212669 -0.0069538342669500965 0.010511158319762945 0.009114272519385432 9.465924259964506E-4 -0.06433489073367367 7.027582818959995E-4 1.6203413720448202E-4 0.007746267728000045 -0.0011161947909833843 0.010368717134658537 0.00762582624747066 0.006419939698261631 -0.010708132350906736 0.004463090283523077 0.0044286012494943496 0.016224890528342438 2.3074972229520152E-4 7.957269164593831E-4 0.012273832877057182 9.028289548468991E-4 6.707454899316254E-4 0.016680286363690018 0.006581848489596302 8.822452580502122E-4 4.822122594253332E-4 0.012514688323439016 diff --git a/QCQP/data/sr.d b/QCQP/data/sr.d new file mode 100644 index 0000000..90a8b89 --- /dev/null +++ b/QCQP/data/sr.d @@ -0,0 +1,2 @@ +0.010000337076106716 +0.0014792757640981423 diff --git a/QCQP/data/tevRisk.d b/QCQP/data/tevRisk.d new file mode 100644 index 0000000..be3ac18 --- /dev/null +++ b/QCQP/data/tevRisk.d @@ -0,0 +1,2001 @@ +0.009642292503290033 +0.009604957165683369 +0.009566898361221862 +0.009528527998399546 +0.009490162790142885 +0.009451983283982019 +0.00941444346130541 +0.009377779838884472 +0.009342199257130038 +0.009307944748277425 +0.009275163371582873 +0.009243998854110272 +0.00921446047694108 +0.009186657678973576 +0.009160047875302491 +0.00913110162573916 +0.009103554023135969 +0.009077776686034458 +0.009053617371827746 +0.009030957848355864 +0.009009921424894127 +0.008990263463396066 +0.008972041031832613 +0.008955106173971853 +0.00893933719257061 +0.008924716899764077 +0.008911145837580937 +0.008898433778599139 +0.00888611012800408 +0.008874407511544507 +0.008863644091841998 +0.008853516617469604 +0.008844025739883086 +0.008835079410699083 +0.008826898915988606 +0.008819068642066335 +0.008811632337732482 +0.00880428555946261 +0.008797359989803678 +0.00879081988323178 +0.008784645741640295 +0.008778855504013573 +0.00877336984016006 +0.008768221649204013 +0.008763319133998927 +0.00875865094879259 +0.00875425958321757 +0.008750026625189797 +0.008746099746228985 +0.008742317244770608 +0.00873873452246859 +0.008735224530094114 +0.008731771791284103 +0.008728409986041503 +0.008725243842269347 +0.008722271512629432 +0.008719475769021608 +0.008716853295529505 +0.008714352176273041 +0.00871197051653795 +0.008709682467471731 +0.008707491971926856 +0.00870540347376778 +0.008703377078941622 +0.008701464669460687 +0.008699622695541082 +0.008697827439080787 +0.008696140070468676 +0.008694506580984095 +0.008692933814280284 +0.008691413591953833 +0.008689961593866907 +0.00868856928048351 +0.008687221989891691 +0.008685912390271246 +0.008684662064117145 +0.008683454355960409 +0.00868229702714555 +0.0086811683561602 +0.008680070842806134 +0.008679031146724445 +0.008678020347285273 +0.008677034286842435 +0.00867608565245282 +0.008675174943338958 +0.00867428236397756 +0.008673429657491707 +0.008672605254368873 +0.008671786166983567 +0.00867099290399451 +0.008670262888291641 +0.008669530607906597 +0.008668822302624434 +0.008668132779938546 +0.008667461329917721 +0.008666819406471474 +0.008666196989905683 +0.008665581261926831 +0.008664988592435094 +0.008664410787659041 +0.008663848784042043 +0.008663305808946508 +0.008662798203045679 +0.008662274240414958 +0.008661761251697759 +0.008661293252458636 +0.008660817126046222 +0.008660359438218175 +0.008659910383954188 +0.008659491358489714 +0.008659085648811416 +0.008658684500816648 +0.008658264796874345 +0.00865786782651485 +0.008657485675307275 +0.008657112112975167 +0.008656745053363604 +0.008656411501630929 +0.008656044096709725 +0.008655715839137169 +0.008655386691881815 +0.00865506086030629 +0.00865475276507607 +0.008654445929771564 +0.008654144182892105 +0.008653851638383489 +0.00865356739369742 +0.008653292563430837 +0.008653021456413921 +0.00865275044234681 +0.008652495833878 +0.008652239551052302 +0.00865199504603906 +0.008651730215140745 +0.008651514031451691 +0.008651280053291865 +0.008651053015857193 +0.00865083147720781 +0.008650613912091177 +0.00865040067145658 +0.008650193608227913 +0.008649989159064248 +0.008649789214484293 +0.008649592741942394 +0.008649399753371863 +0.008649214426707914 +0.008649027053079399 +0.00864884740334039 +0.008648672558386812 +0.008648495930258215 +0.008648329426634833 +0.00864816238131899 +0.008647998465319906 +0.008647835763324289 +0.00864768049740465 +0.008647524254624853 +0.008647375124342565 +0.008647224780139505 +0.0086470797688337 +0.008646939320765374 +0.008646796875757966 +0.008646657902199921 +0.00864652231119806 +0.008646391344941468 +0.008646260524975132 +0.008646131220935457 +0.008645991009063707 +0.008645881557467185 +0.008645760647087383 +0.00864564172441534 +0.008645525572989405 +0.008645409311572481 +0.00864529568953023 +0.008645183569946058 +0.008645072573538923 +0.008644961402615876 +0.008644861658881106 +0.008644748328772133 +0.008644656200531833 +0.00864455391145823 +0.008644444801949683 +0.008644373054114541 +0.008644253262676883 +0.008644171366684574 +0.008644077268741925 +0.008643985125004344 +0.008643894117972985 +0.008643802514331155 +0.008643720379980483 +0.008643633544792913 +0.008643547018582545 +0.008643465802052212 +0.008643375838545669 +0.00864330660658456 +0.008643227886123655 +0.008643144055987095 +0.008643067489220608 +0.008642998601066331 +0.008642923076444282 +0.008642844807621019 +0.008642779941117062 +0.008642703404149346 +0.008642635254009342 +0.008642565613988159 +0.008642499665635064 +0.008642434380754063 +0.008642361673950685 +0.008642303119858898 +0.008642237468550607 +0.008642173065523395 +0.008642113169794175 +0.008642049019787426 +0.00864199094398726 +0.008641931121460666 +0.00864187128646729 +0.008641808563583436 +0.008641755595784036 +0.008641697057239302 +0.008641641750600072 +0.008641588193975536 +0.008641533859143647 +0.008641478713868065 +0.00864142728256284 +0.008641374269025993 +0.008641322246218287 +0.008641271461544647 +0.008641222707423707 +0.008641173678956983 +0.008641124533387395 +0.008641076727820902 +0.008641027439480947 +0.008640982729424774 +0.008640936330045791 +0.008640888309683402 +0.008640845813699265 +0.008640799316141194 +0.0086407566870224 +0.008640712344412976 +0.008640671561092978 +0.008640626703364147 +0.008640591731055303 +0.008640543971989281 +0.008640501623101109 +0.008640462957509818 +0.008640423775390323 +0.008640381687793564 +0.008640344765939216 +0.008640304811637977 +0.008640268863475319 +0.008640228571126398 +0.008640196268564597 +0.008640156528981506 +0.008640120087491697 +0.008640085298527094 +0.00864005034901687 +0.008640016543323184 +0.00863998415938708 +0.00863994565377581 +0.008639915741517103 +0.008639879809756255 +0.008639848461737808 +0.008639815936881358 +0.008639780668932442 +0.008639751882639185 +0.008639715165546038 +0.008639688595072494 +0.008639658156883076 +0.008639622869661483 +0.008639601480329315 +0.008639552668618215 +0.008639533820084772 +0.008639512535701437 +0.008639479679882633 +0.008639450056002891 +0.008639423345618588 +0.0086393973129923 +0.00863937080975737 +0.008639347870050162 +0.008639310129347919 +0.008639287173259784 +0.00863925599587022 +0.00863923464865393 +0.008639203228720945 +0.008639179253039187 +0.008639152999182727 +0.008639127738775199 +0.008639107104414826 +0.008639080029525797 +0.008639055164290576 +0.008639035481472029 +0.008639011037031647 +0.008638986823329827 +0.00863896007262503 +0.008638936984800307 +0.008638918408896743 +0.008638891559504466 +0.008638868490032339 +0.008638846434472016 +0.008638832252205266 +0.008638810711328595 +0.008638782977680337 +0.008638765200573715 +0.008638738156289894 +0.00863872252162888 +0.008638706104851068 +0.008638683428505647 +0.008638653908782913 +0.008638637510621317 +0.008638618089411862 +0.008638601775640397 +0.008638577312387832 +0.008638553357326906 +0.008638541133831825 +0.008638519784007379 +0.008638506594120021 +0.00863847798633233 +0.008638469841211029 +0.008638449829867896 +0.008638427798981633 +0.008638420917319537 +0.008638395903374941 +0.008638380721592247 +0.00863836320702427 +0.008638349659969976 +0.008638333101369848 +0.008638304381939594 +0.008638293795278725 +0.008638279161392929 +0.008638258472938134 +0.008638239499053377 +0.008638229001187225 +0.008638210991935624 +0.008638195485176487 +0.008638174596960717 +0.008638159169901021 +0.008638143397553642 +0.008638126868631978 +0.008638114166457812 +0.008638106789002915 +0.008638094954529388 +0.008638068994191188 +0.008638061766580198 +0.008638045950663331 +0.00863803317523477 +0.008638010642288786 +0.008638004785647042 +0.008637991284221588 +0.008637976345652708 +0.00863795765529524 +0.00863795039293202 +0.008637928384904127 +0.008637922790024465 +0.00863790237464614 +0.008637889170883477 +0.00863787576977289 +0.008637864193680851 +0.008637853037657585 +0.00863784527431759 +0.008637831509472319 +0.008637819730674233 +0.008637807472689265 +0.00863778693379698 +0.008637776326899667 +0.008637762357041695 +0.00863775654382732 +0.008637740463230357 +0.008637728897782804 +0.008637723812058209 +0.008637711493959165 +0.008637694059396692 +0.008637688832993075 +0.008637671700459525 +0.008637663868924995 +0.008637659158900577 +0.00863764377874036 +0.008637632076915884 +0.008637622917062366 +0.00863760880516721 +0.008637601044853208 +0.008637590876803143 +0.008637579940522172 +0.008637563776016936 +0.0086375591138008 +0.00863754410078575 +0.008637538402645268 +0.008637528288933726 +0.008637515988098053 +0.008637501180891812 +0.008637498079126334 +0.008637492780011594 +0.008637479007419074 +0.008637466052991236 +0.008637459906431387 +0.008637450402945985 +0.008637440810665522 +0.008637431615211659 +0.008637419129773219 +0.00863740974303017 +0.008637400599159744 +0.008637394951671958 +0.008637385990767498 +0.008637376826894227 +0.008637372184211246 +0.00863735900583834 +0.008637349279935818 +0.008637341496483675 +0.008637333234129666 +0.008637322455440593 +0.008637316261244879 +0.008637308101180291 +0.008637294868154859 +0.008637286480789003 +0.00863727821195777 +0.008637271148476362 +0.008637262170777446 +0.008637256487044767 +0.008637249266151385 +0.008637241571566784 +0.008637233570389825 +0.008637219555362584 +0.008637211488722657 +0.00863720155211464 +0.008637195370370616 +0.008637195657026855 +0.008637177656808818 +0.008637173555464159 +0.008637164589646373 +0.008637165209390934 +0.008637147761052623 +0.00863714189022676 +0.00863713391466161 +0.008637135315851035 +0.008637119586995468 +0.008637112057242043 +0.008637105279543526 +0.008637099832467686 +0.008637093965755885 +0.008637086429260366 +0.008637071010069462 +0.008637076213780754 +0.008637063776046972 +0.00863706740678055 +0.008637062077060668 +0.00863705524496446 +0.008637049182409763 +0.008637042165194673 +0.008637035280250907 +0.0086370280430987 +0.008637020251155455 +0.008637012943111259 +0.008637007468479544 +0.008637002066333848 +0.008636995987890276 +0.008636989322690263 +0.008636988920906316 +0.008636982408017515 +0.008636972551871751 +0.008636966426620091 +0.00863696587456789 +0.008636950689196234 +0.008636950044990179 +0.0086369419258192 +0.008636936707287346 +0.008636931184606182 +0.008636926770798003 +0.008636920532736223 +0.008636914489969399 +0.00863690949546257 +0.008636905194947276 +0.008636900030019793 +0.008636895165988602 +0.008636890063109165 +0.008636878272372363 +0.008636868519809647 +0.008636873768991657 +0.00863686457247392 +0.00863685732416451 +0.00863685697399813 +0.008636849432981264 +0.00863684388895765 +0.008636843914920572 +0.008636833550499512 +0.008636830846094384 +0.008636823719625514 +0.008636820694931165 +0.00863681494994007 +0.008636809979788116 +0.008636803057947081 +0.00863680073303623 +0.008636794620650047 +0.008636789619192928 +0.0086367839859534 +0.008636780992693318 +0.008636775789509754 +0.00863676909319158 +0.008636764962132172 +0.008636759874802807 +0.008636756502592496 +0.008636750529404932 +0.008636748678471959 +0.008636739829698464 +0.008636725619698069 +0.008636731532771693 +0.008636728669168816 +0.008636722733878272 +0.008636722025993977 +0.00863671415939325 +0.008636709860206801 +0.008636703980757637 +0.008636700673229775 +0.008636696945785975 +0.008636692188398572 +0.008636686996994342 +0.008636685149867223 +0.00863668208359936 +0.008636673891590214 +0.008636670433281693 +0.008636665699943655 +0.008636659843880155 +0.008636657916092213 +0.00863665410188947 +0.008636648954471983 +0.008636644007894842 +0.00863664075253974 +0.008636637545980994 +0.008636633220703838 +0.008636628856711868 +0.008636625019846479 +0.008636620835869394 +0.008636617174015012 +0.00863661318873038 +0.008636609328932185 +0.008636606599391378 +0.008636601932519972 +0.008636603312226992 +0.008636594507218986 +0.00863659126792767 +0.008636592495101573 +0.008636583166422677 +0.008636585323429228 +0.008636574937047621 +0.008636572292374703 +0.008636568462215161 +0.00863656500974245 +0.00863656182537983 +0.008636557323241267 +0.008636554135869261 +0.008636551104352184 +0.008636547039615325 +0.008636545142555878 +0.008636541165412789 +0.008636537001381303 +0.00863653219207939 +0.008636530168821367 +0.00863652632800216 +0.00863652409880172 +0.00863651980776176 +0.008636517004695796 +0.008636514526510077 +0.008636510574662573 +0.008636506911752368 +0.008636503445238804 +0.008636500557041939 +0.008636497010379805 +0.008636493656867337 +0.008636491109126029 +0.00863648732646395 +0.008636485046202172 +0.008636480897495946 +0.008636478561448037 +0.008636474972899108 +0.008636472409733281 +0.00863646937232863 +0.008636466317639082 +0.008636462661621436 +0.008636459520382164 +0.008636457095336825 +0.008636453990726536 +0.00863645122431029 +0.008636448163366827 +0.008636445556501204 +0.008636442511026726 +0.008636438921088532 +0.008636436353321451 +0.008636432905543737 +0.008636430170149327 +0.008636427995326426 +0.008636425250311238 +0.008636422071661862 +0.00863641901829292 +0.008636416596490792 +0.00863641407349365 +0.008636409578498698 +0.008636406689236847 +0.008636405460380399 +0.00863640300284336 +0.008636400314657143 +0.00863639712698457 +0.008636394262777698 +0.00863639226382062 +0.0086363886723644 +0.008636385809729459 +0.008636380919630947 +0.00863638094287254 +0.008636378438811055 +0.008636375523803218 +0.008636372177467062 +0.008636370668157992 +0.00863636816942885 +0.008636364027315418 +0.00863636307402699 +0.008636360131203074 +0.008636357302521968 +0.008636354741671017 +0.008636352591946008 +0.008636350226751221 +0.00863634729367475 +0.008636344500799245 +0.008636339746518182 +0.008636339438798737 +0.00863633751296476 +0.008636335400238835 +0.008636333251999877 +0.008636330658458397 +0.008636328381705605 +0.008636325773271707 +0.008636323415948353 +0.008636321065657033 +0.008636319995159398 +0.008636317259920161 +0.0086363150001252 +0.008636316404204479 +0.00863631082819083 +0.00863630834711291 +0.008636306108138689 +0.008636304112895348 +0.008636300584861978 +0.008636297862022324 +0.008636296025344397 +0.008636296648520102 +0.008636292351352591 +0.008636290728953068 +0.008636295171912627 +0.008636284448206397 +0.008636284943687077 +0.00863627894291812 +0.008636278352080334 +0.008636275271703875 +0.008636274037369034 +0.008636271914893223 +0.008636262307799705 +0.008636267078257518 +0.00863626585816853 +0.008636263388953812 +0.008636262313818152 +0.008636259325046641 +0.008636256790687413 +0.008636256008879684 +0.008636255349135806 +0.008636251571435829 +0.008636249531206225 +0.008636248667179061 +0.008636246644938781 +0.008636242643285734 +0.00863624175880556 +0.008636242535827019 +0.008636232540350793 +0.008636235515146288 +0.008636233370043944 +0.00863623243915757 +0.008636228931936283 +0.00863622906559581 +0.00863622655459243 +0.008636223142048533 +0.00863622915784541 +0.008636225417172353 +0.008636217821730751 +0.008636216070165244 +0.008636213626911202 +0.008636219233677907 +0.008636213403399245 +0.008636209133709348 +0.008636206277663695 +0.00863620500569209 +0.008636202895622887 +0.008636201400875829 +0.008636199685386453 +0.008636200617654006 +0.008636195987911887 +0.008636194282411568 +0.008636192984594069 +0.008636190827248393 +0.008636189441806141 +0.008636187594020432 +0.008636185919984595 +0.00863618633362941 +0.008636183007409868 +0.008636180894161348 +0.008636179134466168 +0.008636178600101305 +0.00863617553187876 +0.008636174362732379 +0.00863617163635027 +0.008636176477150493 +0.008636174386579576 +0.008636167177559072 +0.008636165478645213 +0.008636164222476537 +0.0086361627598324 +0.008636160811163451 +0.008636159434057903 +0.008636157998160327 +0.008636156964749554 +0.008636154454690494 +0.008636153269941283 +0.008636151662467508 +0.008636150109841246 +0.008636148348778648 +0.008636146949442081 +0.008636145088276542 +0.00863614364594104 +0.00863614270708857 +0.008636140937172274 +0.008636139720411776 +0.008636137750037824 +0.008636136360161644 +0.008636134850196233 +0.00863613290042309 +0.008636131708541979 +0.008636130339811737 +0.008636128887506374 +0.008636127374719164 +0.008636125955511506 +0.008636124462840995 +0.008636123088599934 +0.008636121671217259 +0.008636119852704897 +0.008636118749190014 +0.008636117298040686 +0.008636115905291264 +0.00863611447167688 +0.008636113085613987 +0.00863611225158496 +0.008636109712728083 +0.008636107717222731 +0.008636109808068664 +0.008636105736183746 +0.008636104874005117 +0.008636103990221923 +0.008636101465471056 +0.008636100642574475 +0.008636099314641005 +0.008636097478159887 +0.008636096125518352 +0.008636094774087087 +0.008636093434973556 +0.008636092604764006 +0.008636089759051887 +0.008636089395694577 +0.00863608851384401 +0.00863608686402763 +0.008636086067560455 +0.00863608429257873 +0.008636083569480434 +0.008636081405169523 +0.008636080863857204 +0.008636078758304742 +0.008636077649861188 +0.00863607684833899 +0.008636075586026092 +0.00863607369593291 +0.008636073043500302 +0.00863607170450452 +0.008636069913671857 +0.008636068849547327 +0.008636067982034625 +0.00863606591453715 +0.008636064836718088 +0.008636061353066046 +0.008636062740493727 +0.008636061923465428 +0.008636060589110659 +0.008636059075143723 +0.008636058252537125 +0.008636055451073573 +0.00863605538482106 +0.008636054607218361 +0.00863605266531111 +0.008636057731146006 +0.008636050506513757 +0.008636049383623709 +0.00863604874915778 +0.008636046997301939 +0.00863604567184833 +0.008636044376724435 +0.008636045037575785 +0.008636042064070421 +0.008636040803118283 +0.008636039747813327 +0.008636038933976844 +0.008636036717315406 +0.008636038130252294 +0.008636035974123848 +0.008636035110366584 +0.00863603386669727 +0.008636032615773228 +0.008636032724967376 +0.008636030345585506 +0.008636031373865942 +0.008636028392418508 +0.00863602642888719 +0.008636028589942009 +0.008636022640326318 +0.00863602452608974 +0.008636021481282653 +0.008636022797701981 +0.008636021531110932 +0.00863601614063945 +0.00863602125648633 +0.008636018225146657 +0.008636021263842233 +0.008636018595058711 +0.008636016715315886 +0.008636012501813863 +0.008636015504289366 +0.008636013556901178 +0.008636013018559456 +0.008636010561866211 +0.008636008837478325 +0.008636008223649145 +0.00863600381498526 +0.00863600260613724 +0.008636004579328558 +0.008636006271229704 +0.00863600327866241 +0.008636002495441787 +0.008636001921064881 +0.00863599832035786 +0.008635996182515294 +0.008635999738301417 +0.008635995698224336 +0.008635997324069696 +0.008635994051850341 +0.008635993424766139 +0.008635991264863457 +0.008635993889100638 +0.008635991840077038 +0.00863599030490453 +0.008635989945220048 +0.00863599098034558 +0.00863598609266722 +0.00863598702702768 +0.008635985753135426 +0.008635984183256118 +0.008635982490762435 +0.008635982020233227 +0.008635979278455818 +0.008635981933084395 +0.008635978870571897 +0.008635976367456954 +0.008635976381440064 +0.008635975543639075 +0.008635976052555583 +0.008635975785257226 +0.008635971841283212 +0.008635974518702152 +0.008635969309602878 +0.00863597239865492 +0.008635970024802122 +0.008635970896483628 +0.008635968156197686 +0.008635968950445112 +0.008635968276679173 +0.008635969133867915 +0.008635965622987645 +0.008635965318486854 +0.008635963696203435 +0.008635963312630912 +0.008635962704829843 +0.008635961511102208 +0.008635960616092574 +0.008635959633949164 +0.008635959303446043 +0.008635958775492981 +0.008635957954498279 +0.008635956663104257 +0.008635955451504078 +0.008635956151894327 +0.008635954543817744 +0.008635953427505665 +0.008635951305196963 +0.008635951580219485 +0.008635950994971001 +0.008635951302102667 +0.00863594954805287 +0.008635948480123105 +0.00863594750851152 +0.00863594927404734 +0.00863594594842009 +0.008635946689704644 +0.008635945888461923 +0.008635943026568848 +0.008635943063324865 +0.008635942236703316 +0.008635940786569155 +0.008635940166916815 +0.008635939905004743 +0.008635941833353363 +0.008635936265431533 +0.00863593715541863 +0.008635933520968505 +0.008635936542882918 +0.008635935960131009 +0.008635935295176483 +0.008635933240804366 +0.008635931870604305 +0.008635931886339434 +0.008635931908826626 +0.008635931213114694 +0.008635930779015593 +0.00863592899473195 +0.008635927519672286 +0.008635926514862995 +0.008635928284213461 +0.008635926478515327 +0.008635926237384423 +0.008635925230624035 +0.008635924046169342 +0.00863592301027688 +0.008635922217719931 +0.008635921762464275 +0.008635921624960451 +0.008635919174775492 +0.008635918705347656 +0.00863591763264087 +0.008635919268326008 +0.008635917113801475 +0.008635915881739143 +0.008635915082630815 +0.008635915389297779 +0.008635913128746758 +0.008635912726250696 +0.008635912285084696 +0.008635912620807715 +0.00863591050559857 +0.00863590986321249 +0.008635911090891612 +0.008635908915491566 +0.008635909827865832 +0.008635908998508543 +0.00863590641526127 +0.008635907238123401 +0.008635904383242805 +0.008635904624801469 +0.00863590333597005 +0.008635903844412145 +0.00863590528341627 +0.00863590199009764 +0.008635903145746885 +0.00863590220292682 +0.008635902107215385 +0.008635901375101163 +0.008635900963710015 +0.008635899172806062 +0.008635898907026984 +0.008635899551150577 +0.008635897875421064 +0.008635897008531668 +0.00863589593985273 +0.008635895268449005 +0.008635894680062133 +0.008635894754619601 +0.008635894402783372 +0.008635893067394769 +0.008635892383305806 +0.008635892080205054 +0.008635890688832163 +0.008635891356207069 +0.008635890823498336 +0.008635888131591486 +0.008635890153643511 +0.008635888644879828 +0.008635886990503893 +0.00863588771421812 +0.008635885689934236 +0.00863588531086508 +0.008635885438504095 +0.008635883985066435 +0.008635884245666919 +0.008635883538374908 +0.008635883442316632 +0.00863588311768375 +0.008635882755994468 +0.008635881550623555 +0.008635882371732332 +0.008635879810268471 +0.008635880098692405 +0.008635880016899312 +0.008635878171430229 +0.008635876439415813 +0.008635875362125922 +0.008635873040686196 +0.00863587237745249 +0.008635872803284112 +0.008635873960025771 +0.008635874803675638 +0.008635874549588174 +0.008635872723243319 +0.008635873494469277 +0.008635872235279968 +0.008635873590276217 +0.008635871923211838 +0.008635871330648623 +0.008635870142263871 +0.00863586895461206 +0.008635869619919568 +0.008635867911626365 +0.008635868936081563 +0.00863586707551618 +0.008635866313835892 +0.008635865893383741 +0.008635866432545023 +0.008635865748040867 +0.008635864897130273 +0.008635864793100993 +0.008635864471075418 +0.00863586343800682 +0.008635861646444991 +0.00863586227529686 +0.008635861690693055 +0.008635860667327374 +0.008635856123737172 +0.008635860849082815 +0.008635859409044844 +0.00863585877980535 +0.008635858434958817 +0.008635857964156952 +0.0086358595090944 +0.008635857328710788 +0.008635856103367147 +0.008635855422082448 +0.008635855137539776 +0.008635855109600724 +0.008635854303274173 +0.008635854961259723 +0.0086358541558237 +0.00863585220509095 +0.008635852414547535 +0.00863585174688308 +0.00863585321621376 +0.008635849533442104 +0.008635850846429932 +0.008635850472029331 +0.008635849056573663 +0.008635849392670392 +0.008635846890611672 +0.008635847829593023 +0.008635848044299723 +0.008635846212603373 +0.008635846670438605 +0.008635846379812134 +0.00863584574970736 +0.008635845925420589 +0.008635844273254607 +0.00863584437378521 +0.00863584367607503 +0.008635843523671735 +0.008635843034149548 +0.008635841963386298 +0.008635841828041186 +0.008635841206323096 +0.00863584054717273 +0.008635840717133653 +0.008635837896587213 +0.008635841050947779 +0.008635839028817668 +0.008635838084417953 +0.008635838157823657 +0.008635836646875129 +0.008635837638763466 +0.008635836019073027 +0.00863583632173228 +0.008635835558495248 +0.008635835793612046 +0.008635834109483693 +0.008635832444577956 +0.008635835691410009 +0.008635834145172829 +0.008635832835786094 +0.008635831829789777 +0.008635833074120176 +0.008635831047219949 +0.008635830254754987 +0.00863583130396879 +0.008635829950349196 +0.008635829499214766 +0.008635828525649161 +0.00863582871759334 +0.008635828749445957 +0.008635827769808221 +0.008635827383648292 +0.008635828003632107 +0.008635826516353189 +0.008635825686371354 +0.008635825756108951 +0.008635826862238813 +0.008635824918005916 +0.008635824956817773 +0.008635824831948411 +0.008635824096319435 +0.008635824223001179 +0.00863582394748448 +0.008635822258974087 +0.00863582185986379 +0.008635821392584129 +0.008635822152983948 +0.008635822168636597 +0.008635820863465413 +0.008635820547400789 +0.008635820832366758 +0.008635819307504206 +0.008635818426969567 +0.008635818168380284 +0.00863581849958723 +0.008635817760414867 +0.008635816483612896 +0.008635817384307142 +0.008635816999292174 +0.008635815390454228 +0.008635816005389551 +0.008635814479213084 +0.008635814634418572 +0.008635814354295827 +0.008635814922276178 +0.008635814252109447 +0.008635812724225278 +0.008635813399198503 +0.008635812243462247 +0.008635811566094215 +0.008635811314146325 +0.008635811908730579 +0.008635810355894691 +0.00863580995219749 +0.008635809999900048 +0.008635809516651926 +0.008635808857433978 +0.008635808982210511 +0.008635808503392428 +0.008635809032657392 +0.008635807275100377 +0.008635806947204236 +0.008635807094560813 +0.008635806405501129 +0.008635806191598637 +0.00863580614666743 +0.008635805331390637 +0.008635805842465347 +0.008635804257414698 +0.008635804443728043 +0.008635805211951496 +0.008635803458450152 +0.008635802881579167 +0.008635802983235755 +0.00863580373029195 +0.008635801658898254 +0.008635801605954068 +0.008635801429782895 +0.008635802058747448 +0.008635801369647297 +0.008635799878455242 +0.008635801305028846 +0.008635800352764853 +0.008635799432757952 +0.00863580019443182 +0.008635799493528286 +0.008635798335730022 +0.00863579941444453 +0.008635798736178356 +0.008635798092155807 +0.008635798265987652 +0.008635796772568732 +0.00863579651377121 +0.008635798224559826 +0.00863579565653079 +0.008635794621711873 +0.008635794908011666 +0.008635793910765188 +0.008635794102432091 +0.008635793681534654 +0.00863579429207683 +0.008635793588755308 +0.008635792894139844 +0.008635793120445429 +0.00863579155066767 +0.008635791203286867 +0.008635791399595048 +0.008635790933459545 +0.008635790350025915 +0.008635791210528107 +0.008635790582660355 +0.008635789826520216 +0.008635789377821161 +0.008635788722396457 +0.008635788292690023 +0.008635789525367057 +0.008635788511599258 +0.008635787390346093 +0.008635787212571265 +0.008635787148498525 +0.008635787584462878 +0.008635788146327636 +0.008635786790400234 +0.008635785981825843 +0.008635786241560745 +0.008635786022442552 +0.008635785181659522 +0.008635785409048148 +0.00863578350460575 +0.008635783563967103 +0.00863578335020751 +0.008635783120007184 +0.008635784754643598 +0.00863578330564574 +0.008635782082510412 +0.00863578173005901 +0.008635781415960293 +0.008635781145603339 +0.00863578087641728 +0.008635782133978899 +0.008635781696785015 +0.008635781057345067 +0.008635779665183762 +0.008635779310650363 +0.008635778709463271 +0.008635780206554242 +0.00863577846466865 +0.008635778411361745 +0.008635777926862898 +0.008635778509236572 +0.008635776786670487 +0.008635777297722207 +0.008635776285228425 +0.008635776411058926 +0.008635777827890411 +0.00863577659408463 +0.00863577566889136 +0.008635775168861312 +0.008635775016132259 +0.008635775532011747 +0.008635774457510037 +0.008635775281360962 +0.008635775538225872 +0.00863577458940706 +0.008635772765682127 +0.008635772085170218 +0.008635773191816402 +0.008635772609626568 +0.008635771869708231 +0.008635772590938102 +0.008635773190666477 +0.008635771804240838 +0.008635771210043025 +0.008635770636809929 +0.008635769896075628 +0.008635769957815644 +0.008635770292437431 +0.008635769521332996 +0.0086357695541441 +0.008635768508335088 +0.008635768969916857 +0.008635768229427363 +0.00863576800023595 +0.008635768666065484 +0.008635768387681703 +0.008635766164081913 +0.008635766627769772 +0.008635766862784472 +0.00863576767725029 +0.008635766007196306 +0.008635765384697885 +0.008635765478463231 +0.008635765534533102 +0.008635764522049715 +0.008635765016622393 +0.008635765681769514 +0.00863576477209595 +0.008635763438371528 +0.008635764047416963 +0.00863576473246915 +0.008635763899586344 +0.008635763625188614 +0.00863576369499132 +0.008635763189120198 +0.008635762559113868 +0.008635762299882293 +0.00863576133206551 +0.008635760805351207 +0.00863576182019944 +0.008635761664548745 +0.008635760148374126 +0.008635761562872645 +0.008635759518950169 +0.008635759175315354 +0.008635759718887847 +0.00863575982375025 +0.008635759216939503 +0.008635758334195102 +0.008635758776405711 +0.008635758529864276 +0.008635757476692523 +0.008635759081239893 +0.008635758821957553 +0.008635756976592305 +0.008635757397490618 +0.00863575723631201 +0.0086357562281181 +0.008635756989312973 +0.008635755582610368 +0.008635755175644858 +0.008635755745575712 +0.008635755639240452 +0.008635755004481127 +0.008635754691181566 +0.008635755282388573 +0.008635754555660211 +0.008635754392632118 +0.008635753943010532 +0.008635754622133273 +0.008635752775059012 +0.008635753954002378 +0.008635753229557952 +0.00863575373497472 +0.008635752995843678 +0.00863575233902224 +0.008635751899383074 +0.008635752491109637 +0.008635751804875339 +0.00863575153054184 +0.008635751041357732 +0.008635751974240968 +0.008635750759925592 +0.008635750169903247 +0.00863574958221867 +0.008635750518807283 +0.00863575029295304 +0.008635750181055193 +0.008635749010084948 +0.008635748700359592 +0.00863574865809319 +0.008635748014959104 +0.00863574779085457 +0.008635747948493134 +0.008635747714249532 +0.008635747585968096 +0.008635747464792808 +0.008635746619713289 +0.008635746630883123 +0.008635746612427657 +0.008635745178734468 +0.008635746679292008 +0.008635746506744792 +0.008635745263483792 +0.00863574547245916 +0.008635744874172185 +0.008635744947432434 +0.00863574392082291 +0.008635744288229155 +0.00863574461302054 +0.008635744495651427 +0.008635743325655318 +0.008635744332988814 +0.008635743692441885 +0.00863574334249117 +0.008635742610166693 +0.008635742670279192 +0.008635742167144468 +0.008635742234592937 +0.008635742474424519 +0.0086357404040557 +0.00863574117645835 +0.008635741982627801 +0.008635741404150148 +0.008635741169497509 +0.0086357413203232 +0.008635740663618406 +0.008635740466242133 +0.008635740428041218 +0.00863573984020712 +0.008635739962336431 +0.008635739427346207 +0.00863573938920788 +0.008635739110211548 +0.008635738712662745 +0.008635738603127751 +0.008635738371483025 +0.008635738274380226 +0.00863573805118825 +0.008635736984502268 +0.008635736693198774 +0.008635738656220743 +0.008635737005287062 +0.008635736553266013 +0.00863573661750773 +0.008635736468671546 +0.00863573588648887 +0.008635736160146823 +0.008635736426917772 +0.008635735502640062 +0.008635735563584443 +0.008635735818733037 +0.008635734649394346 +0.008635734583296589 +0.008635734463285234 +0.008635734773321243 +0.008635733775607562 +0.008635733861438703 +0.008635733537544843 +0.008635733694694153 +0.008635733371836356 +0.008635732553742594 +0.008635732774884731 +0.008635732489815999 +0.008635731954668801 +0.00863573237710345 +0.00863573193044606 +0.008635732480216658 +0.008635731814800197 +0.008635731530246065 +0.008635730256767843 +0.00863573137785891 +0.008635729370789538 +0.00863573083605193 +0.008635730407971626 +0.008635730452506896 +0.008635730215563787 +0.008635729772415793 +0.008635729544997148 +0.008635730424819505 +0.00863572922050305 +0.008635729231867525 +0.008635729150114397 +0.008635728484900474 +0.00863572846052635 +0.008635728286492055 +0.008635728335801627 +0.008635728154010808 +0.008635726859035147 +0.008635727772064259 +0.00863572769495333 +0.008635726627692693 +0.008635727355122814 +0.008635727099470624 +0.008635726568845764 +0.008635726564706302 +0.00863572643027519 +0.008635726209535193 +0.008635726134180994 +0.008635725611605128 +0.008635726111430582 +0.00863572548162477 +0.008635724999549987 +0.008635724983915145 +0.008635725394418984 +0.008635724392739703 +0.008635725035988986 +0.008635724833402204 +0.008635723864293437 +0.008635723780168877 +0.008635723614705154 +0.008635723329248933 +0.008635723160143762 +0.008635723184905054 +0.008635723278890114 +0.008635722798061083 +0.008635722610567793 +0.008635721857491957 +0.00863572195603797 +0.008635721592726868 +0.008635721622005151 +0.00863572144430544 +0.00863572165650304 +0.00863572142506423 +0.00863572123339255 +0.008635720662016972 +0.008635721027906409 +0.008635720667096286 +0.008635720306923512 +0.008635719963840327 +0.008635719996813397 +0.008635719679516433 +0.00863572005536219 +0.008635719583310806 +0.00863571935446468 +0.008635718843108514 +0.008635718639047002 +0.008635719459053455 +0.008635718647347277 +0.008635718593870542 +0.008635718249505145 +0.00863571795352275 +0.008635718076153603 +0.008635717582974756 +0.00863571760409795 +0.008635717780981798 +0.00863571716395577 +0.008635717438700237 +0.00863571685862384 +0.008635716704796166 +0.008635716657492336 +0.008635716744819907 +0.008635716208431272 +0.008635715771347956 +0.008635715744126936 +0.008635715897941704 +0.00863571611004982 +0.008635715069906335 +0.008635715352427537 +0.00863571563872265 +0.008635714064473042 +0.00863571437693803 +0.008635714180089238 +0.008635714423368815 +0.008635714205105532 +0.00863571397486161 +0.008635713895382176 +0.008635713773596787 +0.008635713694813155 +0.008635713463334645 +0.008635713060475288 +0.008635713079657098 +0.008635712523894615 +0.008635713357498428 +0.008635712458685595 +0.00863571125784142 +0.00863571176274317 +0.008635712013828085 +0.008635711901936698 +0.00863571246281119 +0.008635710898013675 +0.00863571089576797 +0.008635710726261648 +0.008635711036607813 +0.008635710542308881 +0.008635709485732317 +0.008635709448442263 +0.008635709784714837 +0.008635710527091464 +0.008635710410986151 +0.008635710168909091 +0.008635709785656786 +0.008635709856592177 +0.008635709651160502 +0.008635709577957278 +0.008635709043989437 +0.008635708117864413 +0.008635709937876839 +0.008635707511920379 +0.008635709979494232 +0.008635706802718735 +0.008635707346159288 +0.008635708095252713 +0.008635707074308826 +0.008635707733990467 +0.008635707874148394 +0.008635708628837368 +0.008635707659256923 +0.008635706936117479 +0.008635707378091911 +0.00863570720614407 +0.008635706066423793 +0.008635705429823616 +0.00863570657671189 +0.008635705451163633 +0.00863570656166184 +0.008635704750643569 +0.008635703078291685 +0.008635706604451659 +0.00863570581687681 +0.008635704957921122 +0.008635705510172778 +0.008635704848916842 +0.008635704212162735 +0.008635704818288632 +0.008635705002992877 +0.008635705316840905 +0.00863570465922469 +0.008635704250400182 +0.008635704410209782 +0.00863570313194707 +0.008635703602475975 +0.00863570306242679 +0.008635702684997642 +0.008635703640284095 +0.00863570431194512 +0.008635704084068926 +0.008635702430392017 +0.008635702992065836 +0.008635702951934186 +0.008635701906181471 +0.008635702660330655 +0.008635701639454662 +0.008635701526706435 +0.008635702153923163 +0.008635702286389648 +0.008635701789220681 +0.008635701823601943 +0.008635701601363184 +0.008635701493432988 +0.00863570058576352 +0.008635701088135803 +0.008635700615513865 +0.008635700502651632 +0.008635700746062111 +0.00863570054300291 +0.008635699802977485 +0.008635700430333309 +0.008635700132458098 +0.008635699904154609 +0.008635698459277818 +0.00863569977558552 +0.008635699692048065 +0.008635700204240777 +0.008635699452840869 +0.008635699334708197 +0.008635699207065433 +0.00863569906706323 +0.008635698952232176 +0.008635699469170017 +0.008635699375119753 +0.008635698596735637 +0.008635699478739657 +0.00863569782906299 +0.008635698368981402 +0.008635698338934399 +0.008635698051171415 +0.00863569871904834 +0.008635697549059174 +0.008635697407372746 +0.008635696993384004 +0.008635697318541255 +0.008635696135196068 +0.008635696633349725 +0.008635697914762888 +0.008635697167406964 +0.00863569573862908 +0.008635696596824116 +0.008635696155670534 +0.0086356960860156 +0.008635696276295414 +0.00863569589151419 +0.008635695617656121 +0.008635696273332183 +0.008635695546988426 +0.008635695407685742 +0.008635695159818086 +0.00863569385007652 +0.008635695040521403 +0.008635695838790605 +0.008635694624832648 +0.008635694639798023 +0.008635694488875453 +0.008635694523748906 +0.008635693830170103 +0.008635694025084618 +0.008635694402208488 +0.00863569391572859 +0.00863569458185853 +0.008635693982434045 +0.00863569426660694 +0.008635693404306323 +0.008635693282057579 +0.008635692565354154 +0.008635692959079708 +0.00863569363298074 +0.008635693385563269 +0.00863569262665789 +0.008635693213647065 +0.008635691996850936 +0.00863569221429794 +0.00863569117273027 +0.008635692628668945 +0.008635691944160856 +0.008635692285175972 +0.008635692139526573 +0.008635692051272712 +0.008635691541850378 +0.008635692277767016 +0.008635691672333459 +0.008635691225886144 +0.008635690825086334 +0.00863569082122975 +0.008635690583753294 +0.008635691172712144 +0.008635690542678933 +0.008635690854084842 +0.008635690206365893 +0.008635690461804226 +0.008635690161152272 +0.00863568986789861 +0.008635689895678731 +0.008635688683849292 +0.008635689796296352 +0.008635689580139763 +0.008635690199196215 +0.008635689303731089 +0.008635689152430709 +0.008635689714082073 +0.008635689300087228 +0.00863568870681845 +0.008635688426085945 +0.008635688553075976 +0.008635688615758306 +0.008635689272487241 +0.008635689166466527 +0.008635688138483581 +0.008635688017781506 +0.008635687730048401 +0.008635687388114256 +0.008635688183232381 +0.008635687491856238 +0.008635687609932281 +0.008635687335021852 +0.008635687557383705 +0.00863568669131219 +0.00863568733912229 +0.008635686589815398 +0.00863568681367803 +0.008635686814143036 +0.008635686519416413 +0.008635686866667587 +0.008635686519700194 +0.008635685846409632 +0.008635685712674831 +0.008635685625444258 +0.008635686024531972 +0.008635685721122294 +0.008635685003767808 +0.00863568575425509 +0.008635685353688135 +0.00863568498127821 +0.008635685145521793 +0.008635685433002957 +0.00863568496223337 +0.008635684837542274 +0.008635684455972206 +0.008635684610870201 +0.008635685073697526 +0.0086356845066906 +0.008635683923235745 +0.008635684718811924 +0.008635683950412597 +0.00863568388495032 +0.008635683837404607 +0.008635683949045916 +0.008635683571349608 +0.008635683569125372 +0.008635683452731321 +0.008635683927867734 +0.008635683894947697 +0.00863568304859038 +0.008635683023730217 +0.008635682879363308 +0.008635682914739073 +0.008635683586286323 +0.008635682516152012 +0.008635683134567824 +0.008635683043909263 +0.008635683174245495 +0.008635681999692448 +0.008635682888605388 +0.00863568204955698 +0.008635680857359574 +0.00863568280417856 +0.008635681675484425 +0.00863568157094858 +0.008635681229861289 +0.008635681370101117 +0.008635681270553494 +0.00863568209866237 +0.008635681482261681 +0.008635680942410524 +0.008635680768193188 +0.008635680518274213 +0.008635680496847525 +0.008635680374082036 +0.008635680380512562 +0.008635681453704946 +0.008635680266676654 +0.00863568077515163 +0.008635679994688708 +0.008635680000892865 +0.00863567976042658 +0.00863567921339137 +0.008635680074930756 +0.00863567950825114 +0.008635679333634972 +0.008635679371675569 +0.008635679405954147 +0.008635679220124096 +0.008635678730297063 +0.008635678928949758 +0.008635679815343529 +0.008635678649356132 +0.00863567864084711 +0.008635678519380841 +0.008635679531931329 +0.008635678840625927 +0.008635678251240064 +0.008635678632826039 +0.008635678343624404 +0.008635678046337926 +0.008635677631497857 +0.008635677883011542 +0.008635677767199066 +0.008635677749102696 +0.008635678218126084 +0.008635678018813068 +0.008635677417980516 +0.008635677225802075 +0.00863567686301497 +0.008635677333260186 +0.00863567695589168 +0.008635676764346694 +0.008635677157592002 +0.008635677735051998 +0.008635677064211582 +0.008635676567290114 +0.008635677137237655 +0.008635676337804541 +0.008635677182239565 +0.008635676072808459 +0.008635675945065622 +0.008635676666171146 +0.008635675638539729 +0.008635676052473628 +0.008635675583557906 +0.008635675535307473 +0.008635675668864369 +0.008635675546694489 +0.008635675698700275 +0.008635675620870432 +0.008635675211839078 +0.008635674894921437 +0.008635675137242097 +0.008635675069752859 +0.008635674152131394 +0.008635674551449047 +0.008635675152783379 +0.00863567417631317 +0.008635674536506328 +0.008635673530642587 +0.008635674170353963 +0.008635675248265282 +0.00863567395321585 +0.008635673917113984 +0.008635673937463466 +0.008635673666998427 +0.00863567241889691 +0.008635674372593233 +0.00863567345835134 +0.008635673749226996 +0.008635673523091077 +0.008635674319686214 +0.008635673107766494 +0.008635673225852323 +0.008635672857873259 +0.008635672764874359 +0.008635671657847411 +0.008635673288472806 +0.008635672114235006 +0.008635673746640317 +0.00863567236559449 +0.008635672272205876 +0.008635672091987822 +0.008635671968017235 +0.008635672219205645 +0.008635672700961914 +0.008635672122697747 +0.008635671847512327 +0.008635671969093105 +0.008635671685612514 +0.008635671610721348 +0.008635672720993663 +0.008635671542539306 +0.008635671167784149 +0.008635671551695964 +0.008635672055416523 +0.008635671167430622 +0.008635671484136256 +0.008635670901760734 +0.008635670088934006 +0.008635671061796317 +0.008635670744340237 +0.008635671065490695 +0.008635670325268465 +0.008635669966516192 +0.008635670226183877 +0.008635669985275507 +0.008635669950617847 +0.008635669851858555 +0.008635670089920241 +0.008635669903246202 +0.008635669883308996 +0.008635669376235854 +0.008635669760849342 +0.008635670093111012 +0.00863566934437984 +0.00863566914136418 +0.008635669640276513 +0.008635668280990999 +0.008635669517123036 +0.008635668623739642 +0.008635669330624726 +0.008635667329529195 +0.008635668638112111 +0.008635668890222756 +0.008635668857860945 +0.008635668802740451 +0.008635667992662969 +0.008635668291014939 +0.008635668211564355 +0.0086356684018986 +0.008635667246268759 +0.00863566825192707 +0.00863566842076614 +0.008635667401817013 +0.00863566783098288 +0.00863566796667549 +0.008635667908245763 +0.008635668059685023 +0.008635666530620282 +0.008635667273276028 +0.008635668096069844 +0.0086356674872395 +0.008635665899535057 +0.008635667411581397 +0.008635667360613341 +0.00863566720934516 +0.00863566721327639 +0.00863566611084907 +0.008635667451433009 +0.008635666403687537 +0.008635666802408352 +0.008635666445049421 +0.008635666732024797 +0.008635666080857479 +0.008635665975975777 +0.008635666015082345 +0.008635666260370607 +0.00863566639519634 +0.008635665918231361 +0.008635666313146568 +0.008635665629523151 +0.00863566543602155 +0.008635666104419884 +0.008635665702368693 +0.00863566632356311 +0.008635665744740105 +0.008635665768496354 +0.008635665427704843 +0.008635665573278665 +0.008635665424102136 +0.008635665990763788 +0.008635665446371425 +0.008635664601935983 +0.008635664534428364 +0.008635665060123037 +0.008635664774000292 +0.00863566463866783 +0.008635664845756967 +0.008635664850074165 +0.008635664701021928 +0.008635664273531579 +0.008635664206762476 +0.00863566429966813 +0.008635664417003763 +0.008635664562721426 +0.00863566387184672 +0.008635663801694777 +0.00863566413403132 +0.008635663840606489 +0.008635664324427852 +0.008635663911913121 +0.008635664145790868 +0.008635663953883264 +0.00863566315511989 +0.008635663248162803 +0.008635663970004046 +0.008635663088801739 +0.008635662523325828 +0.008635663408932622 +0.008635662910084512 +0.00863566293046849 +0.008635662852764502 +0.008635662793077266 +0.008635663158818405 +0.008635662425562119 +0.008635662400687036 +0.008635662739357815 +0.00863566275974695 +0.008635662689748105 diff --git a/QCQP/data/tevRtn.d b/QCQP/data/tevRtn.d new file mode 100644 index 0000000..637bf53 --- /dev/null +++ b/QCQP/data/tevRtn.d @@ -0,0 +1,2001 @@ +0.001028253113118877 +0.0010278945876659857 +0.0010268035925053624 +0.001024967697363686 +0.0010224150425216351 +0.0010191608094495485 +0.0010152666472148626 +0.0010107920801003096 +0.0010057967817012068 +0.001000368992878492 +9.945842311101377E-4 +9.885278185202508E-4 +9.822607036913025E-4 +9.758681129278363E-4 +9.692756251807392E-4 +9.615979135844963E-4 +9.538149100820388E-4 +9.460837662514961E-4 +9.384216611130969E-4 +9.308428639889348E-4 +9.234450605892397E-4 +9.161936202050148E-4 +9.091579095786476E-4 +9.023293634727374E-4 +8.957002556380783E-4 +8.893030999701996E-4 +8.831323193181145E-4 +8.771334910186266E-4 +8.711078392546835E-4 +8.651847304628206E-4 +8.595531039475626E-4 +8.54081907710943E-4 +8.487923160674736E-4 +8.436520475677945E-4 +8.388123246512072E-4 +8.340463509329739E-4 +8.293914418592774E-4 +8.246683295110001E-4 +8.200978258169865E-4 +8.156698415920245E-4 +8.113842774662383E-4 +8.072656826485944E-4 +8.032702401945834E-4 +7.994323718113015E-4 +7.956939937892604E-4 +7.920537043524639E-4 +7.885542980960737E-4 +7.85108709093131E-4 +7.818444627509486E-4 +7.786364031583181E-4 +7.755360845555681E-4 +7.724380525845068E-4 +7.693319612270772E-4 +7.662496153309026E-4 +7.632931560828262E-4 +7.604675659694932E-4 +7.577619864748269E-4 +7.551786472401407E-4 +7.526719953481697E-4 +7.502444931890054E-4 +7.478728769938565E-4 +7.45564839364679E-4 +7.433288304919562E-4 +7.411241307824033E-4 +7.39010660294734E-4 +7.369437925446023E-4 +7.348982550381663E-4 +7.329461693428255E-4 +7.310288752705602E-4 +7.291558291005007E-4 +7.273191884968385E-4 +7.255401898394447E-4 +7.238098561799561E-4 +7.221126925178302E-4 +7.204404442048469E-4 +7.188222572101982E-4 +7.17238785439914E-4 +7.157006996574131E-4 +7.141821148222742E-4 +7.126859984511942E-4 +7.112513770068934E-4 +7.098399089712289E-4 +7.084453208599505E-4 +7.070863629288889E-4 +7.057676575947482E-4 +7.044584954439499E-4 +7.031940077468534E-4 +7.019572569144348E-4 +7.007140842753262E-4 +6.994966643276227E-4 +6.983633002610271E-4 +6.972142595502273E-4 +6.960904579226388E-4 +6.949849647759546E-4 +6.93896280294236E-4 +6.928449822892713E-4 +6.918149152394032E-4 +6.907848684450729E-4 +6.897831951142254E-4 +6.887967378375485E-4 +6.878277984813474E-4 +6.868817811434427E-4 +6.859891638806058E-4 +6.850584300189348E-4 +6.841388622135182E-4 +6.832907664919538E-4 +6.824206127997366E-4 +6.815760210780571E-4 +6.807396531485318E-4 +6.799520436248224E-4 +6.791830165556987E-4 +6.784161959703705E-4 +6.776055587684607E-4 +6.768322843106227E-4 +6.760812494475139E-4 +6.753406583799847E-4 +6.746077205836526E-4 +6.73935004085982E-4 +6.731868416026764E-4 +6.72513236242724E-4 +6.718323707576388E-4 +6.711531563460864E-4 +6.705046066201003E-4 +6.698542804658556E-4 +6.692091025741896E-4 +6.685792930016815E-4 +6.679611836127756E-4 +6.67359134134005E-4 +6.667610195824728E-4 +6.661581980270945E-4 +6.655876506323964E-4 +6.650085508767033E-4 +6.644522122727115E-4 +6.638459133460694E-4 +6.633452230197294E-4 +6.628005168171021E-4 +6.622683430391796E-4 +6.61744874508949E-4 +6.612272841102964E-4 +6.607161991573175E-4 +6.602162898314522E-4 +6.59719302906731E-4 +6.592298089184973E-4 +6.587452722892613E-4 +6.582660029521409E-4 +6.578027843572721E-4 +6.573310892869212E-4 +6.568759958423688E-4 +6.564297809798219E-4 +6.559758860255109E-4 +6.555452693322424E-4 +6.55110356503471E-4 +6.546808175041476E-4 +6.542514363038211E-4 +6.53839256341068E-4 +6.534217396040673E-4 +6.530204670264567E-4 +6.526134280918373E-4 +6.522184535210192E-4 +6.518335575390097E-4 +6.514405195620213E-4 +6.51054605753375E-4 +6.506759758137324E-4 +6.50307731023889E-4 +6.499379344869746E-4 +6.495703237206141E-4 +6.491690328865168E-4 +6.488530731926368E-4 +6.485029622611606E-4 +6.481565613261893E-4 +6.478161256601101E-4 +6.474732088810066E-4 +6.471361365532313E-4 +6.468019451436196E-4 +6.464688856720453E-4 +6.461336516774457E-4 +6.458304287295531E-4 +6.454853733874364E-4 +6.452012118426028E-4 +6.448858213840283E-4 +6.445465957186469E-4 +6.443228711232155E-4 +6.439469837435155E-4 +6.436883481873337E-4 +6.43391146650047E-4 +6.430965391518576E-4 +6.428045659450763E-4 +6.42508246565967E-4 +6.422428375309975E-4 +6.419594373651115E-4 +6.416760636743415E-4 +6.41408548517491E-4 +6.411099604827536E-4 +6.408799805743835E-4 +6.406165569452297E-4 +6.403330948877657E-4 +6.400754737581441E-4 +6.39841215224594E-4 +6.395836712153067E-4 +6.393147131232421E-4 +6.390914092888805E-4 +6.388260880689052E-4 +6.385884338884915E-4 +6.383445305245224E-4 +6.381123009049522E-4 +6.378819954533755E-4 +6.37623050961569E-4 +6.374147186679024E-4 +6.371787528815713E-4 +6.369467984738501E-4 +6.367301971488417E-4 +6.364962633762707E-4 +6.362843600395679E-4 +6.360646938320368E-4 +6.358439280961621E-4 +6.35610965673828E-4 +6.354138029944144E-4 +6.351935953624358E-4 +6.34986534686043E-4 +6.347845991685584E-4 +6.34578658785067E-4 +6.343677623949446E-4 +6.341702641038848E-4 +6.339675573929196E-4 +6.337663376561076E-4 +6.335678400666856E-4 +6.333788988096826E-4 +6.331861428969197E-4 +6.329938713079003E-4 +6.328042529760696E-4 +6.326097112922743E-4 +6.324299517267792E-4 +6.322439139042898E-4 +6.320524449663424E-4 +6.318798417707435E-4 +6.316923970566711E-4 +6.315180268764858E-4 +6.313385769423489E-4 +6.311706077997026E-4 +6.309845300073604E-4 +6.308389819262392E-4 +6.306430339851658E-4 +6.304663562091065E-4 +6.303038379031056E-4 +6.301382672565484E-4 +6.299616901689061E-4 +6.298042805560283E-4 +6.296345576663572E-4 +6.294790946374185E-4 +6.293078160614896E-4 +6.291688328003294E-4 +6.289963606109742E-4 +6.288380017243756E-4 +6.286858941687357E-4 +6.285330150091492E-4 +6.283850159061032E-4 +6.282417603691233E-4 +6.28069010971803E-4 +6.279373906502123E-4 +6.277754139594588E-4 +6.276347083364311E-4 +6.274897164727342E-4 +6.273312277245452E-4 +6.271991681477143E-4 +6.270328921408408E-4 +6.269108144766408E-4 +6.267712892022587E-4 +6.266094710523226E-4 +6.265111178758893E-4 +6.262847540919749E-4 +6.261962307632182E-4 +6.26096867365927E-4 +6.259424483870418E-4 +6.258035233208809E-4 +6.256776806085413E-4 +6.255536420740018E-4 +6.254270383163065E-4 +6.253174097623246E-4 +6.251368555390114E-4 +6.25026090211102E-4 +6.248756892046363E-4 +6.247719676638112E-4 +6.246191767287938E-4 +6.245022763084056E-4 +6.243735459167967E-4 +6.242492354546935E-4 +6.241472902903306E-4 +6.240134418204905E-4 +6.238898299216107E-4 +6.237914785971566E-4 +6.236691354645159E-4 +6.235475567071434E-4 +6.234130752148039E-4 +6.232963095891895E-4 +6.232020737745343E-4 +6.230654207408371E-4 +6.229474592901888E-4 +6.228343627493538E-4 +6.227617315336509E-4 +6.226504645192E-4 +6.225069399597061E-4 +6.224146363274148E-4 +6.222741136098928E-4 +6.221919191572421E-4 +6.221060552759563E-4 +6.219863058167241E-4 +6.218299295954236E-4 +6.21743835416715E-4 +6.21640363652637E-4 +6.215534016073761E-4 +6.214224545749726E-4 +6.212931518816622E-4 +6.212278892828888E-4 +6.211124375698883E-4 +6.210409961400041E-4 +6.208847659949841E-4 +6.208409160653498E-4 +6.20730962612095E-4 +6.206104615077445E-4 +6.205729196271239E-4 +6.204344950496787E-4 +6.203505992281955E-4 +6.202532159864984E-4 +6.201760543475497E-4 +6.200863194642215E-4 +6.199237401882663E-4 +6.198641207118568E-4 +6.197819571055233E-4 +6.196647145913942E-4 +6.195567110565545E-4 +6.194968166072897E-4 +6.19394021745193E-4 +6.193051824581657E-4 +6.191846780299167E-4 +6.190956330946136E-4 +6.190045497084327E-4 +6.189077932760856E-4 +6.188344479068037E-4 +6.187917773273075E-4 +6.187227610874379E-4 +6.185696889276306E-4 +6.185275818079975E-4 +6.184340345128377E-4 +6.183586598044967E-4 +6.182242335823898E-4 +6.181896495457E-4 +6.181090541902891E-4 +6.180193524115271E-4 +6.179070371072227E-4 +6.178636256906788E-4 +6.177301475135361E-4 +6.176967431915337E-4 +6.175723698675113E-4 +6.174917841132715E-4 +6.174095785549913E-4 +6.17338533371398E-4 +6.172699378070558E-4 +6.172223628095756E-4 +6.171372669310472E-4 +6.170643073788463E-4 +6.169881511318996E-4 +6.168596323380836E-4 +6.167933983443531E-4 +6.16705120367929E-4 +6.166694050701663E-4 +6.165685864713914E-4 +6.164945920719473E-4 +6.164625206243318E-4 +6.163844444306714E-4 +6.162729322081483E-4 +6.162398662936065E-4 +6.161294143839607E-4 +6.160795807372715E-4 +6.160494134119324E-4 +6.159501365080243E-4 +6.158743574560693E-4 +6.158150288360414E-4 +6.157244170246733E-4 +6.156725052139146E-4 +6.156059084976026E-4 +6.155342810944015E-4 +6.154287743021324E-4 +6.153970879583485E-4 +6.152975310178837E-4 +6.152600337070543E-4 +6.151926659104841E-4 +6.151107295218587E-4 +6.150112182632228E-4 +6.149909283965628E-4 +6.149554003100914E-4 +6.148626502063551E-4 +6.147751199433418E-4 +6.147336119094602E-4 +6.146691484660773E-4 +6.146039091563173E-4 +6.145412241394849E-4 +6.144557386558603E-4 +6.143912627087169E-4 +6.143284832098455E-4 +6.14289702593551E-4 +6.142279020915399E-4 +6.141643652262269E-4 +6.141353276320933E-4 +6.140405943222094E-4 +6.139744734718569E-4 +6.13918318136742E-4 +6.138603708857192E-4 +6.13784544744989E-4 +6.137410388667878E-4 +6.136834314100078E-4 +6.135906126432607E-4 +6.135307093114239E-4 +6.134716818361956E-4 +6.134189292501882E-4 +6.13356603373622E-4 +6.133153022359229E-4 +6.132635146932045E-4 +6.13208219962909E-4 +6.1315034217424E-4 +6.130494606826777E-4 +6.129908520107733E-4 +6.129184363592398E-4 +6.128729617306963E-4 +6.128753145440765E-4 +6.127437195718208E-4 +6.127130799921221E-4 +6.126472667425864E-4 +6.126516918021033E-4 +6.125225831031662E-4 +6.124800214435519E-4 +6.12420398214756E-4 +6.124300334915185E-4 +6.123134062291168E-4 +6.122568094832344E-4 +6.122059200440848E-4 +6.121657452057486E-4 +6.121201018861365E-4 +6.120640366972464E-4 +6.119451891185726E-4 +6.119866905428455E-4 +6.118919029711402E-4 +6.119184898684505E-4 +6.118782241736517E-4 +6.118265088475923E-4 +6.117822708410836E-4 +6.117258532098974E-4 +6.116724967141106E-4 +6.116166444678826E-4 +6.115548687200267E-4 +6.114973707630995E-4 +6.114566482981968E-4 +6.114149368701147E-4 +6.113663948368274E-4 +6.113153948748944E-4 +6.113129509450592E-4 +6.11261176513563E-4 +6.111833838267572E-4 +6.111356883541355E-4 +6.111330607075901E-4 +6.110108487309333E-4 +6.110056898226818E-4 +6.109440957878856E-4 +6.108995524959728E-4 +6.10855307081673E-4 +6.10819992009969E-4 +6.107734605763773E-4 +6.10721468907469E-4 +6.106815370743729E-4 +6.106458710344164E-4 +6.106050605885971E-4 +6.105669992877429E-4 +6.105256156391984E-4 +6.104277070171112E-4 +6.103493646911499E-4 +6.103912507747672E-4 +6.103161734135534E-4 +6.102569585908415E-4 +6.102529549216568E-4 +6.101936556648469E-4 +6.101454788334611E-4 +6.101460132342717E-4 +6.100602005711099E-4 +6.100386079677266E-4 +6.099795801382359E-4 +6.099552487789648E-4 +6.099066717902984E-4 +6.098644269444341E-4 +6.098054269959022E-4 +6.097861654491985E-4 +6.097346624868423E-4 +6.096924730758043E-4 +6.096444870054261E-4 +6.096208165731997E-4 +6.095759089604905E-4 +6.095171644343271E-4 +6.094834780860895E-4 +6.094384689957969E-4 +6.094107097053614E-4 +6.09361083097637E-4 +6.09341962491202E-4 +6.092670900979389E-4 +6.091442315592817E-4 +6.091948766524261E-4 +6.091698490961791E-4 +6.091180802427279E-4 +6.09114257992666E-4 +6.090444706992489E-4 +6.090067352891548E-4 +6.089541814040552E-4 +6.089260001140801E-4 +6.088931827466817E-4 +6.088509799949078E-4 +6.088047814258291E-4 +6.087884932573873E-4 +6.087633215606647E-4 +6.086884623784992E-4 +6.086580123834274E-4 +6.086158056263535E-4 +6.085628857880321E-4 +6.085458421155261E-4 +6.085125268915379E-4 +6.084657339752361E-4 +6.084224242724406E-4 +6.083956690820186E-4 +6.083624370677237E-4 +6.083231416403478E-4 +6.082835563408909E-4 +6.082486910886858E-4 +6.08215163345648E-4 +6.081773044640613E-4 +6.081406565844467E-4 +6.081052904159715E-4 +6.080804287426523E-4 +6.08037239501792E-4 +6.080508893401611E-4 +6.07971706908506E-4 +6.079413175944478E-4 +6.079508493944592E-4 +6.078636905376119E-4 +6.078845054280538E-4 +6.077929005419325E-4 +6.077627822619726E-4 +6.077308290652565E-4 +6.076942541347045E-4 +6.076644002346006E-4 +6.076254841803689E-4 +6.0759203406119E-4 +6.075688929316824E-4 +6.075301902903853E-4 +6.075123967562938E-4 +6.074704612624918E-4 +6.074297863551614E-4 +6.073827581245706E-4 +6.073680384896939E-4 +6.073324900707375E-4 +6.073086917351022E-4 +6.072687857892303E-4 +6.072401687081399E-4 +6.07217653385894E-4 +6.071816951756729E-4 +6.071410593800711E-4 +6.071111909840488E-4 +6.070840191086418E-4 +6.070479840237389E-4 +6.070173948538889E-4 +6.069925339256887E-4 +6.069529757488267E-4 +6.069335439175858E-4 +6.068887637926528E-4 +6.068699907439437E-4 +6.068330710294056E-4 +6.068086120816867E-4 +6.067780846310986E-4 +6.06749830553662E-4 +6.067106725712243E-4 +6.066779878106682E-4 +6.066558546725037E-4 +6.066274623213943E-4 +6.065969638118241E-4 +6.065660381328963E-4 +6.065397604961075E-4 +6.065104482096984E-4 +6.064726464413727E-4 +6.064464810626384E-4 +6.064142363678826E-4 +6.063863487906497E-4 +6.063628455862698E-4 +6.063357226426353E-4 +6.063059023572536E-4 +6.06271671010891E-4 +6.062486385093392E-4 +6.062228444248138E-4 +6.061741030695345E-4 +6.061446603229406E-4 +6.061347062651136E-4 +6.061082824244867E-4 +6.060815286915178E-4 +6.060468426265277E-4 +6.060183688906312E-4 +6.059981869683512E-4 +6.05958999056386E-4 +6.059315892273144E-4 +6.058818602838908E-4 +6.058796982327007E-4 +6.058528572178115E-4 +6.058215364104418E-4 +6.057868782181662E-4 +6.057738363779816E-4 +6.05746347734272E-4 +6.057024597032198E-4 +6.056936576186585E-4 +6.056636959836833E-4 +6.056304216866846E-4 +6.056033273697761E-4 +6.055819965773843E-4 +6.055553009175897E-4 +6.055241482327305E-4 +6.054948254837762E-4 +6.05449019831561E-4 +6.054416246997627E-4 +6.054197148255478E-4 +6.053970910761708E-4 +6.053740655635322E-4 +6.053463666597025E-4 +6.0532184224973E-4 +6.052936546482546E-4 +6.052681652519197E-4 +6.052427656843746E-4 +6.052313375784919E-4 +6.052061103905068E-4 +6.051777334124685E-4 +6.051962715262493E-4 +6.051317793751732E-4 +6.051078015766918E-4 +6.05082454734317E-4 +6.050595957138798E-4 +6.050199457477017E-4 +6.049898789332788E-4 +6.049704332320077E-4 +6.049760586925454E-4 +6.049343707400943E-4 +6.049140704760928E-4 +6.049612321780233E-4 +6.048419710306481E-4 +6.048504285215898E-4 +6.047803700580909E-4 +6.047736932274166E-4 +6.047391387686869E-4 +6.047251953400948E-4 +6.047022414625661E-4 +6.045954428801711E-4 +6.046473642155139E-4 +6.046343547347107E-4 +6.046083373252915E-4 +6.045927036336017E-4 +6.045595087434472E-4 +6.045294278236848E-4 +6.045222221802482E-4 +6.045152345343226E-4 +6.04471361329771E-4 +6.044473825435799E-4 +6.044362279096061E-4 +6.044199247864111E-4 +6.043735758426461E-4 +6.043592947119013E-4 +6.043714278214468E-4 +6.042560421455133E-4 +6.042884991029838E-4 +6.042637979254172E-4 +6.042516985155018E-4 +6.042104518547768E-4 +6.042126497430447E-4 +6.041829074173223E-4 +6.041433001563143E-4 +6.042126894462277E-4 +6.041676644595765E-4 +6.040779445596984E-4 +6.04059877971881E-4 +6.040263593951914E-4 +6.040930993313964E-4 +6.040294116367456E-4 +6.039783070592622E-4 +6.03947111219829E-4 +6.039301319208051E-4 +6.039071726678752E-4 +6.03881842055833E-4 +6.038683065358576E-4 +6.038789728127566E-4 +6.038255512716837E-4 +6.038051728091029E-4 +6.03786275926782E-4 +6.037639737946026E-4 +6.03745645705231E-4 +6.037249012518834E-4 +6.03703314023446E-4 +6.037084207172618E-4 +6.036661780765693E-4 +6.036410533528669E-4 +6.036208774788843E-4 +6.036162274969896E-4 +6.035797599832503E-4 +6.035637417200183E-4 +6.035338991063579E-4 +6.035894588866117E-4 +6.035637934742177E-4 +6.034752169816854E-4 +6.034533284666606E-4 +6.034426422805272E-4 +6.034221126245891E-4 +6.033954409232199E-4 +6.0337624560501E-4 +6.03363808729887E-4 +6.033536769317573E-4 +6.033183500671809E-4 +6.033066476441835E-4 +6.032877099701431E-4 +6.032650409745968E-4 +6.032431398336004E-4 +6.032295105026602E-4 +6.032076022428007E-4 +6.031842395029534E-4 +6.031711133732395E-4 +6.031537320560327E-4 +6.031339353864021E-4 +6.031154812569672E-4 +6.03097545691066E-4 +6.030788462452784E-4 +6.030542468113394E-4 +6.030374673991626E-4 +6.030199108969414E-4 +6.030038803632517E-4 +6.029850837845022E-4 +6.02967006308598E-4 +6.029480027594001E-4 +6.029278209524952E-4 +6.029129444406663E-4 +6.028892327717588E-4 +6.028754887938319E-4 +6.02857539384296E-4 +6.028394398684538E-4 +6.028205393740149E-4 +6.028034102288089E-4 +6.027883791240921E-4 +6.027638159555509E-4 +6.027357922167613E-4 +6.027591043720855E-4 +6.027091123800337E-4 +6.026980508791659E-4 +6.026820235318142E-4 +6.026543632940781E-4 +6.026433134530506E-4 +6.026263597682829E-4 +6.026062480256799E-4 +6.025885067102605E-4 +6.025706101483883E-4 +6.025528268586289E-4 +6.025383783749317E-4 +6.025072502773227E-4 +6.025000269398945E-4 +6.02485049892828E-4 +6.024625928313687E-4 +6.024529863536488E-4 +6.024306807321194E-4 +6.024176521886725E-4 +6.023916043333322E-4 +6.023842881564493E-4 +6.023609989474818E-4 +6.023453513599224E-4 +6.023312074717839E-4 +6.023144498387456E-4 +6.022929971908668E-4 +6.022806499896286E-4 +6.022627849805969E-4 +6.022383069092282E-4 +6.022247649817114E-4 +6.022130379930186E-4 +6.021848835759104E-4 +6.021743840089673E-4 +6.021255267458856E-4 +6.021407503394092E-4 +6.021313675153014E-4 +6.02113910956836E-4 +6.020932563570085E-4 +6.020813393183998E-4 +6.020442252927566E-4 +6.0204357639828E-4 +6.020318580986766E-4 +6.020091064706435E-4 +6.020756174164497E-4 +6.019756798069791E-4 +6.019647570330183E-4 +6.01952297513883E-4 +6.019332115970584E-4 +6.019121424234768E-4 +6.018961044371595E-4 +6.019019891917212E-4 +6.018611165940024E-4 +6.01846586798391E-4 +6.018308012238012E-4 +6.018176699469656E-4 +6.01792068529424E-4 +6.018055475994644E-4 +6.017778536711401E-4 +6.01765237797283E-4 +6.017488268674657E-4 +6.017327981495039E-4 +6.017316541236819E-4 +6.016982214318666E-4 +6.017116498045287E-4 +6.016721609023796E-4 +6.016426385843929E-4 +6.0167071873471E-4 +6.015921935706909E-4 +6.016185257547872E-4 +6.01573916539443E-4 +6.015923793174519E-4 +6.015754749736983E-4 +6.015042164552514E-4 +6.015705770288369E-4 +6.01528599020099E-4 +6.01571870211319E-4 +6.015359207622133E-4 +6.015086768861759E-4 +6.014466538845053E-4 +6.01494994139477E-4 +6.014646426809663E-4 +6.014546369882769E-4 +6.014196372417843E-4 +6.013944771265249E-4 +6.013862414120594E-4 +6.013226540772955E-4 +6.013040129296987E-4 +6.013375427217382E-4 +6.013578523072094E-4 +6.013146321009291E-4 +6.013036515485535E-4 +6.012932691930938E-4 +6.012425316422867E-4 +6.012099653601066E-4 +6.012635235630051E-4 +6.012041737084522E-4 +6.012313806871374E-4 +6.011810587458759E-4 +6.011713934610724E-4 +6.011395547836127E-4 +6.01179618883668E-4 +6.011527387535354E-4 +6.011318383032498E-4 +6.011210949701927E-4 +6.011379835554415E-4 +6.010636926234922E-4 +6.010781677038375E-4 +6.010597395262559E-4 +6.010368331883508E-4 +6.010143092836091E-4 +6.010049076312254E-4 +6.009706731074499E-4 +6.010035424940743E-4 +6.009602814519172E-4 +6.009255835892734E-4 +6.009252503765365E-4 +6.009132066171E-4 +6.009177937702074E-4 +6.009132226775106E-4 +6.008542145838751E-4 +6.008931141215323E-4 +6.008177007605254E-4 +6.008675287818869E-4 +6.008265566685558E-4 +6.008390330693254E-4 +6.00799222769758E-4 +6.00813314136364E-4 +6.008000262325385E-4 +6.008117694177373E-4 +6.007605983740985E-4 +6.007551667398936E-4 +6.00731094431545E-4 +6.007258300215223E-4 +6.00716557448164E-4 +6.006974844054195E-4 +6.006857249330741E-4 +6.006771201881921E-4 +6.00664479794479E-4 +6.006643222184631E-4 +6.006450450640609E-4 +6.006241524781642E-4 +6.006042709268644E-4 +6.006182526783972E-4 +6.005937240429952E-4 +6.005740226436407E-4 +6.005412567885908E-4 +6.005523237834348E-4 +6.005363873579164E-4 +6.005426399186612E-4 +6.005144854838955E-4 +6.00498270163557E-4 +6.004898216825643E-4 +6.00516272335774E-4 +6.004639428597477E-4 +6.004700153944534E-4 +6.0045713942016E-4 +6.004138204993554E-4 +6.004149923508899E-4 +6.004025418496858E-4 +6.00377893717025E-4 +6.003689171167587E-4 +6.003635477835744E-4 +6.003952036603564E-4 +6.003072931279106E-4 +6.003211357095193E-4 +6.002663364434664E-4 +6.003151752877691E-4 +6.003026316729185E-4 +6.002925779720979E-4 +6.002666678647735E-4 +6.002418926360499E-4 +6.002378299406413E-4 +6.002384471518449E-4 +6.002273484062408E-4 +6.002229617304224E-4 +6.001954668338528E-4 +6.001721206058467E-4 +6.001578947994719E-4 +6.001808453112543E-4 +6.001524509074822E-4 +6.001501921786617E-4 +6.001321868129687E-4 +6.001135110451621E-4 +6.000964625790593E-4 +6.000835714691111E-4 +6.000767370584735E-4 +6.000764133094812E-4 +6.000360383069868E-4 +6.000292409778591E-4 +6.000118657855192E-4 +6.000437538522631E-4 +6.000014248473075E-4 +5.999864109138912E-4 +5.999714591461299E-4 +5.999809994159153E-4 +5.999363658897337E-4 +5.999325617883451E-4 +5.999236630326156E-4 +5.999286654261806E-4 +5.998946655363361E-4 +5.998853825934867E-4 +5.99904792153564E-4 +5.998678621800679E-4 +5.998844633678661E-4 +5.998703857019208E-4 +5.998272743929512E-4 +5.99840462154109E-4 +5.997922201995595E-4 +5.997992001331438E-4 +5.997744625350685E-4 +5.997844499830033E-4 +5.998097074952441E-4 +5.997537612511071E-4 +5.997736414210705E-4 +5.997578032053668E-4 +5.997529475833917E-4 +5.997427835660895E-4 +5.997395732302097E-4 +5.997077583078905E-4 +5.997027080129027E-4 +5.997192425173924E-4 +5.996863888757462E-4 +5.99671655150368E-4 +5.996533348516504E-4 +5.996421058860449E-4 +5.996363237495634E-4 +5.996348206207236E-4 +5.996279990775428E-4 +5.996051827921151E-4 +5.995933892837906E-4 +5.99591284898272E-4 +5.995638140546867E-4 +5.995765080034378E-4 +5.995671651504192E-4 +5.995236103387943E-4 +5.995562807135024E-4 +5.995310407489701E-4 +5.995024699315843E-4 +5.995147147074109E-4 +5.994771931853685E-4 +5.994737075772997E-4 +5.994776652997782E-4 +5.994520007384762E-4 +5.994565712395183E-4 +5.99444579878826E-4 +5.994417744411191E-4 +5.99436528881762E-4 +5.994310563793278E-4 +5.99412075846002E-4 +5.994226366419175E-4 +5.993803759434267E-4 +5.99384407266711E-4 +5.993842848800838E-4 +5.99351774955579E-4 +5.993219047884288E-4 +5.993088513180205E-4 +5.992648950055947E-4 +5.992559101170568E-4 +5.99264930996773E-4 +5.99279540775783E-4 +5.992945791057271E-4 +5.992894717824818E-4 +5.992616691604828E-4 +5.992720162769341E-4 +5.992551379410791E-4 +5.992739125998146E-4 +5.992438203190111E-4 +5.99233427427764E-4 +5.99215357539966E-4 +5.991933524318425E-4 +5.992024375918525E-4 +5.991727629713243E-4 +5.991920356544083E-4 +5.991620799929118E-4 +5.991480089406063E-4 +5.991389861110141E-4 +5.991460009628087E-4 +5.991337425881845E-4 +5.991208442173513E-4 +5.991187472814373E-4 +5.991147442511395E-4 +5.990978763472191E-4 +5.990688060104237E-4 +5.990727279713478E-4 +5.99062953838252E-4 +5.99048799911095E-4 +5.989685973514174E-4 +5.990499594143503E-4 +5.99025753733741E-4 +5.990114260129168E-4 +5.990062064843984E-4 +5.989975376497764E-4 +5.990330609318875E-4 +5.98985977513306E-4 +5.989638666093064E-4 +5.98956684282331E-4 +5.989489191412095E-4 +5.989494718677574E-4 +5.989375708149824E-4 +5.989450871827516E-4 +5.989286926654317E-4 +5.988913986125385E-4 +5.988992156357324E-4 +5.988905088176667E-4 +5.989182084203548E-4 +5.988472064244099E-4 +5.988701139798619E-4 +5.988624523966445E-4 +5.988373509297424E-4 +5.988424061507474E-4 +5.987963868203803E-4 +5.988141434628908E-4 +5.988188593022405E-4 +5.987861061278126E-4 +5.9879239202423E-4 +5.98790206899178E-4 +5.987762558417495E-4 +5.987847839067661E-4 +5.987556545633218E-4 +5.987576566169808E-4 +5.987379294374331E-4 +5.987375403189358E-4 +5.987293943927554E-4 +5.987099547643309E-4 +5.987077272811974E-4 +5.987019756872632E-4 +5.98680096682263E-4 +5.98683794314733E-4 +5.98636728669151E-4 +5.986959577010411E-4 +5.98651965388317E-4 +5.986405888761E-4 +5.986403004168483E-4 +5.986079306384073E-4 +5.986291198422642E-4 +5.985982292427303E-4 +5.986041530200204E-4 +5.985886195350767E-4 +5.985919030758254E-4 +5.985634726862505E-4 +5.985345316073676E-4 +5.985974181356461E-4 +5.985699451567577E-4 +5.985453111934841E-4 +5.98519576184602E-4 +5.985467451032254E-4 +5.985032341536096E-4 +5.984900807934893E-4 +5.985127312717399E-4 +5.984843275699427E-4 +5.984731138354219E-4 +5.984585999651071E-4 +5.984602429572542E-4 +5.984594981856762E-4 +5.984440317179986E-4 +5.98433824126925E-4 +5.984449602162136E-4 +5.984165652709849E-4 +5.984010359330331E-4 +5.984039727208275E-4 +5.984289570164026E-4 +5.983901209714212E-4 +5.983860432582269E-4 +5.983892507384389E-4 +5.983696625747666E-4 +5.983727480386817E-4 +5.983684637695467E-4 +5.983379754019378E-4 +5.983273696680071E-4 +5.983183846002038E-4 +5.983407342174909E-4 +5.983363641636527E-4 +5.98308139334269E-4 +5.983025367006736E-4 +5.983109489366974E-4 +5.982786688816233E-4 +5.982614374416899E-4 +5.982562236105175E-4 +5.982627801407203E-4 +5.982494048773746E-4 +5.982237386319779E-4 +5.982415190742135E-4 +5.982349305361758E-4 +5.98202399060539E-4 +5.982165811839087E-4 +5.981849368648108E-4 +5.981922283107853E-4 +5.981829976935957E-4 +5.981954924069268E-4 +5.981831330231942E-4 +5.981504017358924E-4 +5.981667822200372E-4 +5.981421476828234E-4 +5.981280573966246E-4 +5.9813028175421E-4 +5.981379691140418E-4 +5.981041347271966E-4 +5.980969310275517E-4 +5.980983450639496E-4 +5.980895595342618E-4 +5.980748932729396E-4 +5.980774904753731E-4 +5.980685828928804E-4 +5.98082513206517E-4 +5.980427862265744E-4 +5.980365191858299E-4 +5.980388158854646E-4 +5.98028940524013E-4 +5.980207677004559E-4 +5.98022078278447E-4 +5.980063722748693E-4 +5.980137292070837E-4 +5.979827579305337E-4 +5.979875363720039E-4 +5.980028784344863E-4 +5.979675509531931E-4 +5.979548881566523E-4 +5.979576951191613E-4 +5.979773346169997E-4 +5.979315651213637E-4 +5.979373488108868E-4 +5.97928616695531E-4 +5.979388793492659E-4 +5.97927151559077E-4 +5.978950128158583E-4 +5.979277697773157E-4 +5.979071079755525E-4 +5.978873119712148E-4 +5.979038405381436E-4 +5.978895050095738E-4 +5.978633761471509E-4 +5.978881382206419E-4 +5.978738451957478E-4 +5.978597660889208E-4 +5.978660662213297E-4 +5.978338836776023E-4 +5.97828278398888E-4 +5.978648794818435E-4 +5.978083318200728E-4 +5.977886348100131E-4 +5.977952559712744E-4 +5.97774596348292E-4 +5.977785276477059E-4 +5.977757867593281E-4 +5.977813869997518E-4 +5.977668335557556E-4 +5.977520774310423E-4 +5.977570423254351E-4 +5.97725470380767E-4 +5.977178341387374E-4 +5.977244904299704E-4 +5.977133186826405E-4 +5.977004669599392E-4 +5.97721105128225E-4 +5.977046192487403E-4 +5.976884630908458E-4 +5.97679312841699E-4 +5.976673777539263E-4 +5.976578351118774E-4 +5.976840305819064E-4 +5.976629079372549E-4 +5.97639148476768E-4 +5.976351872474299E-4 +5.976341973412096E-4 +5.976444828274413E-4 +5.97656401519823E-4 +5.976268579508139E-4 +5.976103870897645E-4 +5.976157919051809E-4 +5.976114996924599E-4 +5.975938903902065E-4 +5.976007408041877E-4 +5.975652461197784E-4 +5.975590594146881E-4 +5.975543584936587E-4 +5.975505342027367E-4 +5.975864286190855E-4 +5.975553618310889E-4 +5.975301422800771E-4 +5.975204786837435E-4 +5.975215830627369E-4 +5.975076673383071E-4 +5.975034816531262E-4 +5.975307252445948E-4 +5.975214476971155E-4 +5.975074527819076E-4 +5.974770822126878E-4 +5.974697040048997E-4 +5.974642900278708E-4 +5.974904902382708E-4 +5.974518336412604E-4 +5.974500211547263E-4 +5.974411682609902E-4 +5.974523735652121E-4 +5.974185297517718E-4 +5.974280851375805E-4 +5.974039634998727E-4 +5.97407994692407E-4 +5.974420912918521E-4 +5.974118350159252E-4 +5.973909178136266E-4 +5.973822233586438E-4 +5.973767920447585E-4 +5.97388479187838E-4 +5.973659536605314E-4 +5.973838366105055E-4 +5.973937646370823E-4 +5.973698725279139E-4 +5.973274410233602E-4 +5.973184955710696E-4 +5.973380725241744E-4 +5.973259945415535E-4 +5.973095212200096E-4 +5.973256247583223E-4 +5.973417385214935E-4 +5.973092394223621E-4 +5.972956796546468E-4 +5.972827095679712E-4 +5.972716453178647E-4 +5.972686065664992E-4 +5.972767282055393E-4 +5.972583921559891E-4 +5.97257976995373E-4 +5.972345746751541E-4 +5.972460054982807E-4 +5.972287691641446E-4 +5.972248903577692E-4 +5.972397666996333E-4 +5.972336582066828E-4 +5.971931935324553E-4 +5.971934636142953E-4 +5.972007719266781E-4 +5.972224467922843E-4 +5.971805698702832E-4 +5.971664605691724E-4 +5.97170367315683E-4 +5.971710895676921E-4 +5.971472018908073E-4 +5.971596925877347E-4 +5.971745926915885E-4 +5.971544850782625E-4 +5.97132985381019E-4 +5.971393637607906E-4 +5.971546004278488E-4 +5.971342596822779E-4 +5.971287071806722E-4 +5.971329558359258E-4 +5.97120282440334E-4 +5.971045057827834E-4 +5.970987154185879E-4 +5.970795518170364E-4 +5.97073948553988E-4 +5.970883552987135E-4 +5.970849791104936E-4 +5.970490727276226E-4 +5.970839338533503E-4 +5.970355242886067E-4 +5.970277904077197E-4 +5.970423129106493E-4 +5.970442159369103E-4 +5.970291012642203E-4 +5.970100935408102E-4 +5.970197457406532E-4 +5.970145508986097E-4 +5.969895826561004E-4 +5.970297236055253E-4 +5.970233946028827E-4 +5.969814013777755E-4 +5.969878411502691E-4 +5.969856059401729E-4 +5.969639674685185E-4 +5.969802109130142E-4 +5.969573601515336E-4 +5.969374096893396E-4 +5.969505709629652E-4 +5.969499410684877E-4 +5.969339465750061E-4 +5.969268849175219E-4 +5.969419951332377E-4 +5.969237440788748E-4 +5.969211679441481E-4 +5.969093052250831E-4 +5.969254485185715E-4 +5.968822509989162E-4 +5.9691181751632E-4 +5.968941657396186E-4 +5.96907332712277E-4 +5.968882019530061E-4 +5.968733749155936E-4 +5.968622938033318E-4 +5.968785600645237E-4 +5.968617370174914E-4 +5.968552017355453E-4 +5.96842794516091E-4 +5.968670572124221E-4 +5.968383910237662E-4 +5.968227349098064E-4 +5.968105987345967E-4 +5.96832361424254E-4 +5.968278311000263E-4 +5.96824919012892E-4 +5.967953085813724E-4 +5.96790280559043E-4 +5.967876251368935E-4 +5.967742464657868E-4 +5.967675003873032E-4 +5.967714659322462E-4 +5.967653099326796E-4 +5.96763049484842E-4 +5.967622116028405E-4 +5.967392844580715E-4 +5.967389834146627E-4 +5.967401291026416E-4 +5.967147323630113E-4 +5.967422083305984E-4 +5.967388724395687E-4 +5.967085927242471E-4 +5.967137009790405E-4 +5.966986358336576E-4 +5.966992845865441E-4 +5.966743688467171E-4 +5.966845122328358E-4 +5.966924457016244E-4 +5.966906901190428E-4 +5.966659540226522E-4 +5.966876509801188E-4 +5.966709323994657E-4 +5.966630551037513E-4 +5.966455921208545E-4 +5.966466677302312E-4 +5.966348851044142E-4 +5.966365300154728E-4 +5.966422605981938E-4 +5.965927159179705E-4 +5.966128304164752E-4 +5.966325035482527E-4 +5.966173967541066E-4 +5.966131944209008E-4 +5.966146251064788E-4 +5.966004272926297E-4 +5.965948206539129E-4 +5.965941014673095E-4 +5.96579991288869E-4 +5.965829339741693E-4 +5.965706036685456E-4 +5.965696267326429E-4 +5.965632321844221E-4 +5.965524778448699E-4 +5.965506833629652E-4 +5.965446785448832E-4 +5.965402854942761E-4 +5.965376862767856E-4 +5.965102906511423E-4 +5.965065560319295E-4 +5.965519204559438E-4 +5.965113209545493E-4 +5.965049933304401E-4 +5.965028516389443E-4 +5.964988491345857E-4 +5.964848788646586E-4 +5.964922817455624E-4 +5.964993695034227E-4 +5.964749722708895E-4 +5.96478048323752E-4 +5.964847279775515E-4 +5.96454454154026E-4 +5.964523205514405E-4 +5.964499283688185E-4 +5.964570677250287E-4 +5.964380976374394E-4 +5.964403185194957E-4 +5.964287277445085E-4 +5.964333048603498E-4 +5.964242612243178E-4 +5.964086231115096E-4 +5.964093515307691E-4 +5.964022168972258E-4 +5.963862238990614E-4 +5.964000712294497E-4 +5.963866752229235E-4 +5.964020129480195E-4 +5.963851337344794E-4 +5.963771752185544E-4 +5.963448288299597E-4 +5.963758371066405E-4 +5.963248698436192E-4 +5.963610309574378E-4 +5.963504008542284E-4 +5.963546135942155E-4 +5.963473826118787E-4 +5.963341148634929E-4 +5.963323964595712E-4 +5.963532331132574E-4 +5.963210893170802E-4 +5.96321961054755E-4 +5.963195542902444E-4 +5.963070742882605E-4 +5.963090066637073E-4 +5.962968904591161E-4 +5.962987160733846E-4 +5.962940913021474E-4 +5.962664554187636E-4 +5.962841773949542E-4 +5.962828879915846E-4 +5.962584059539556E-4 +5.962739679618364E-4 +5.962681473751637E-4 +5.962557530153329E-4 +5.962646065538663E-4 +5.96249824256198E-4 +5.962552545408859E-4 +5.962441446500198E-4 +5.962297023842866E-4 +5.962426043442431E-4 +5.962364209794899E-4 +5.962155611917931E-4 +5.962132183764817E-4 +5.962244823264683E-4 +5.962043561593825E-4 +5.962247132558899E-4 +5.962181561229133E-4 +5.961907054545775E-4 +5.961923468531655E-4 +5.961788744308233E-4 +5.961771214419895E-4 +5.961693872737737E-4 +5.961692636910307E-4 +5.961799073175256E-4 +5.961688329664699E-4 +5.961534487119172E-4 +5.96135600245089E-4 +5.961431135412256E-4 +5.961377483817115E-4 +5.96128446350945E-4 +5.961340578945403E-4 +5.961298041567457E-4 +5.961234079920313E-4 +5.961300738163399E-4 +5.96104061544594E-4 +5.961142373425793E-4 +5.961038088858603E-4 +5.960989692412699E-4 +5.96094750982716E-4 +5.960875926783934E-4 +5.960817083696962E-4 +5.96089387164327E-4 +5.960820569721275E-4 +5.960713057238407E-4 +5.960566419297575E-4 +5.960515803359126E-4 +5.960730839218697E-4 +5.960545679151314E-4 +5.960505227164034E-4 +5.960413625884345E-4 +5.960405061375141E-4 +5.960375838180826E-4 +5.96028554692115E-4 +5.960282607178852E-4 +5.960306012252983E-4 +5.960132304135269E-4 +5.960207655346749E-4 +5.960122313605814E-4 +5.960075949912382E-4 +5.959998526574567E-4 +5.960119635548016E-4 +5.959885317296902E-4 +5.959773041949576E-4 +5.959763023465185E-4 +5.959811415730871E-4 +5.959871520329708E-4 +5.959590594448751E-4 +5.959665835713321E-4 +5.959748618766302E-4 +5.959332537045965E-4 +5.959532586750943E-4 +5.959359760594683E-4 +5.959457816310101E-4 +5.959398643400665E-4 +5.959363589775077E-4 +5.959323898736512E-4 +5.959251770264705E-4 +5.95923170665156E-4 +5.959191521029173E-4 +5.95906894626604E-4 +5.959098664116717E-4 +5.958961579016816E-4 +5.959147823793785E-4 +5.958897443802293E-4 +5.958618359607047E-4 +5.958744299444662E-4 +5.958790348703071E-4 +5.958748856806091E-4 +5.958915064155825E-4 +5.95849291623668E-4 +5.95848208216289E-4 +5.958436938440139E-4 +5.958519211012114E-4 +5.958391526025358E-4 +5.958150788167438E-4 +5.958108306460685E-4 +5.958193670954258E-4 +5.958381964758191E-4 +5.958357087431238E-4 +5.958290774496224E-4 +5.958200113134819E-4 +5.95821295763478E-4 +5.95815921395861E-4 +5.958129349295723E-4 +5.957988700757591E-4 +5.957743432061977E-4 +5.95824866086045E-4 +5.957619014603683E-4 +5.958334086212991E-4 +5.957399369670702E-4 +5.957535046151533E-4 +5.95773234369132E-4 +5.957523241625829E-4 +5.957634213671393E-4 +5.95770126048864E-4 +5.957897999362137E-4 +5.957611974742328E-4 +5.957425416745276E-4 +5.957545745836089E-4 +5.9574895340694E-4 +5.95718584383425E-4 +5.957051611805865E-4 +5.957332419503084E-4 +5.957038754863121E-4 +5.957321053521247E-4 +5.956878833673641E-4 +5.956496755211307E-4 +5.957422520410679E-4 +5.957149224555074E-4 +5.956879471020778E-4 +5.957060372490331E-4 +5.95685418330518E-4 +5.956697268014718E-4 +5.95684083210892E-4 +5.95689952705264E-4 +5.957040506538237E-4 +5.956833380072904E-4 +5.956689855786687E-4 +5.956758724054752E-4 +5.956395566846322E-4 +5.956509941399234E-4 +5.956374354395178E-4 +5.956274318063141E-4 +5.956541850065291E-4 +5.956778331240571E-4 +5.956712291041064E-4 +5.956198268618471E-4 +5.956377101390709E-4 +5.956359382107773E-4 +5.956050694747163E-4 +5.956277517911767E-4 +5.956095997592305E-4 +5.956063941220102E-4 +5.956161254055134E-4 +5.95616429419584E-4 +5.956011317726944E-4 +5.956034348054534E-4 +5.956093790322185E-4 +5.95593313965206E-4 +5.955680691820826E-4 +5.955821201017999E-4 +5.955681036807485E-4 +5.955652431221601E-4 +5.955728463741362E-4 +5.955659147014257E-4 +5.955465613108946E-4 +5.955641542523223E-4 +5.955563774774733E-4 +5.955588342799136E-4 +5.955168522219748E-4 +5.955446819364128E-4 +5.95542251397523E-4 +5.955570453673218E-4 +5.955365081976308E-4 +5.955352298664602E-4 +5.955295659264163E-4 +5.955276568752311E-4 +5.955242600912665E-4 +5.955377094353316E-4 +5.955379765857042E-4 +5.95512838994577E-4 +5.955461076424215E-4 +5.954898324628342E-4 +5.955167652054349E-4 +5.955051829286983E-4 +5.954966193991142E-4 +5.955163062003345E-4 +5.954886975836267E-4 +5.954821091978466E-4 +5.954800658215473E-4 +5.954757930297654E-4 +5.954483552275631E-4 +5.954667442222174E-4 +5.954939855376199E-4 +5.954720530540138E-4 +5.954445109075674E-4 +5.954553853329314E-4 +5.954557456271631E-4 +5.954410736598292E-4 +5.954461959757441E-4 +5.954367379699975E-4 +5.954278561401182E-4 +5.954479193210914E-4 +5.954272931605713E-4 +5.95423670113599E-4 +5.954212253285843E-4 +5.953766402387504E-4 +5.954127441094621E-4 +5.95439073512672E-4 +5.953988584108869E-4 +5.95402772374134E-4 +5.953995911232772E-4 +5.954037910674367E-4 +5.953763152549307E-4 +5.953821380557473E-4 +5.953926664492653E-4 +5.95380335350515E-4 +5.953990008143736E-4 +5.953818208198438E-4 +5.953892563327867E-4 +5.953657122058799E-4 +5.953621777460091E-4 +5.953408222901245E-4 +5.953611348715712E-4 +5.953709612515248E-4 +5.953639368889053E-4 +5.953457803944906E-4 +5.953595856692367E-4 +5.953296144044337E-4 +5.953353830582239E-4 +5.95299028636186E-4 +5.953417571948187E-4 +5.95323549823599E-4 +5.953319513571408E-4 +5.953275785424234E-4 +5.9533591085429E-4 +5.953113016315764E-4 +5.95331865545014E-4 +5.953140337930054E-4 +5.953018655617393E-4 +5.952978573061919E-4 +5.952952569822783E-4 +5.952909551417956E-4 +5.953103449084272E-4 +5.952824827182669E-4 +5.95290382294291E-4 +5.952763682435577E-4 +5.952780702486452E-4 +5.952808942456112E-4 +5.952616590833887E-4 +5.952706921013067E-4 +5.952351743838305E-4 +5.952618121879375E-4 +5.952538723413863E-4 +5.952812743006842E-4 +5.952457313978446E-4 +5.952418946562182E-4 +5.95255083186756E-4 +5.952559998891813E-4 +5.952346120157071E-4 +5.952188894762992E-4 +5.952241468498843E-4 +5.952252610675968E-4 +5.952547393552603E-4 +5.952512439801757E-4 +5.952119635860002E-4 +5.952085991969646E-4 +5.951992766453672E-4 +5.951875533655415E-4 +5.952202484838085E-4 +5.951993790029455E-4 +5.952018605936998E-4 +5.951913678073738E-4 +5.951951014957809E-4 +5.951679132923326E-4 +5.951867372163444E-4 +5.951780334138274E-4 +5.951729720025376E-4 +5.951713687674513E-4 +5.951639342175527E-4 +5.951785828168135E-4 +5.951660442310581E-4 +5.95150404454149E-4 +5.95151622974414E-4 +5.951350135922509E-4 +5.951467016392715E-4 +5.951416287650521E-4 +5.951258443259832E-4 +5.951433442488797E-4 +5.951298100673673E-4 +5.951154756211324E-4 +5.951210807318941E-4 +5.951288305336548E-4 +5.951199782866156E-4 +5.951132086525843E-4 +5.950997704777278E-4 +5.951051157633504E-4 +5.951213356378569E-4 +5.951038404542223E-4 +5.950978003999707E-4 +5.951109727963173E-4 +5.950847263930695E-4 +5.950837785055593E-4 +5.950827297595294E-4 +5.950869109997918E-4 +5.950731639733629E-4 +5.950728251054395E-4 +5.950702727609627E-4 +5.950866950123062E-4 +5.950856258191292E-4 +5.950629510773916E-4 +5.950576434881006E-4 +5.950523526187625E-4 +5.950578189449168E-4 +5.950769943571341E-4 +5.950475862605764E-4 +5.950619277440062E-4 +5.950588128447099E-4 +5.950662063860734E-4 +5.950267219955163E-4 +5.950546418233301E-4 +5.950275112332646E-4 +5.949965777058601E-4 +5.950522790526502E-4 +5.950178359050265E-4 +5.95012928846292E-4 +5.950015908597537E-4 +5.950067964849153E-4 +5.950036548424315E-4 +5.950315713268139E-4 +5.950119232281361E-4 +5.949963457010651E-4 +5.949942412315597E-4 +5.949797043423998E-4 +5.949798750462058E-4 +5.949760549422858E-4 +5.949788660574223E-4 +5.950125149362765E-4 +5.949724271003358E-4 +5.949895279494148E-4 +5.949645177186871E-4 +5.949659169211451E-4 +5.949567164945993E-4 +5.949522634484941E-4 +5.949667693822487E-4 +5.949494425112324E-4 +5.949528321026624E-4 +5.949453911884619E-4 +5.949477004988214E-4 +5.949401927138044E-4 +5.949291919882507E-4 +5.949307660101971E-4 +5.949617232253276E-4 +5.949227760952873E-4 +5.949218243378075E-4 +5.949183443861527E-4 +5.94950699139241E-4 +5.949254399402115E-4 +5.949134052659851E-4 +5.949237611605825E-4 +5.9491356651822E-4 +5.949037547400279E-4 +5.948898665523521E-4 +5.948989136220536E-4 +5.948958429312653E-4 +5.948945922449049E-4 +5.949087429702719E-4 +5.949029781608456E-4 +5.948843881918384E-4 +5.948819640474403E-4 +5.94865766800564E-4 +5.948845257993618E-4 +5.948712654144374E-4 +5.948633565572204E-4 +5.948765961668289E-4 +5.948962898687073E-4 +5.9487228892898E-4 +5.948570166224952E-4 +5.948762448959865E-4 +5.94854272711757E-4 +5.948774945303499E-4 +5.948416776695916E-4 +5.948371275725626E-4 +5.948649403659115E-4 +5.948274545030992E-4 +5.94841566797353E-4 +5.948256902754478E-4 +5.94831688974455E-4 +5.948289007552037E-4 +5.94826694972679E-4 +5.948294761005672E-4 +5.948295348246584E-4 +5.948157699535241E-4 +5.948042001524233E-4 +5.948130649230435E-4 +5.948105362482052E-4 +5.947851697741691E-4 +5.947931981184583E-4 +5.948134577903574E-4 +5.947806644608755E-4 +5.947944113841374E-4 +5.947774366111068E-4 +5.947812272623938E-4 +5.948177935298079E-4 +5.947741163865954E-4 +5.947783402232948E-4 +5.947743344759433E-4 +5.947642988427108E-4 +5.947282907190816E-4 +5.947881324241811E-4 +5.947587616456778E-4 +5.947673998703436E-4 +5.947614574133289E-4 +5.947868571113556E-4 +5.947475062615353E-4 +5.947507219271694E-4 +5.947390900162368E-4 +5.947359364554824E-4 +5.947041245538408E-4 +5.947539433376719E-4 +5.94726758840382E-4 +5.947707877342882E-4 +5.947230663393496E-4 +5.94720352183289E-4 +5.947268516465623E-4 +5.947249951488692E-4 +5.947179026155052E-4 +5.947369923110461E-4 +5.947155919558399E-4 +5.947067470498679E-4 +5.947107011491292E-4 +5.947021395424634E-4 +5.946988540354967E-4 +5.947376401726092E-4 +5.946973121677367E-4 +5.946840009856485E-4 +5.946977429841134E-4 +5.947246207399629E-4 +5.946835780026918E-4 +5.946942420787086E-4 +5.946761337422659E-4 +5.946532728469076E-4 +5.946824866590492E-4 +5.946713939337029E-4 +5.946810657776165E-4 +5.946558409571697E-4 +5.946582336982893E-4 +5.946538392649942E-4 +5.946478121752155E-4 +5.946487051170105E-4 +5.946428096896417E-4 +5.94650032425279E-4 +5.946429807217633E-4 +5.946418746104507E-4 +5.946285609686077E-4 +5.946382314292948E-4 +5.946493366711053E-4 +5.946303788078198E-4 +5.9462119918838E-4 +5.946348838437576E-4 +5.945890952090736E-4 +5.946351298475453E-4 +5.946076954242296E-4 +5.946262822089541E-4 +5.945522776191778E-4 +5.946062115368361E-4 +5.94609341104876E-4 +5.946111531169612E-4 +5.946063354076746E-4 +5.945768250308729E-4 +5.945889696172255E-4 +5.945863280815983E-4 +5.945935011583504E-4 +5.945534058031303E-4 +5.945885232238762E-4 +5.945949922235657E-4 +5.945661857613172E-4 +5.945767205914537E-4 +5.945778343483709E-4 +5.945812234655205E-4 +5.945838436294488E-4 +5.945299199188338E-4 +5.945663487201656E-4 +5.945826947641593E-4 +5.945757526372313E-4 +5.945136958628444E-4 +5.945697786332448E-4 +5.945598296176973E-4 +5.945532434307759E-4 +5.945629411583498E-4 +5.945143107891509E-4 +5.945619839232312E-4 +5.945308160868737E-4 +5.945404025572271E-4 +5.945425847332241E-4 +5.945392370901913E-4 +5.945241216035219E-4 +5.945242685010748E-4 +5.945126885448395E-4 +5.945308733680025E-4 +5.945268546299941E-4 +5.945112851379445E-4 +5.945244195781514E-4 +5.945066084048458E-4 +5.945008765707657E-4 +5.945183737692772E-4 +5.94503720698537E-4 +5.945240155288716E-4 +5.945050170950906E-4 +5.945058431553157E-4 +5.944940256221651E-4 +5.944991798823917E-4 +5.944942151538719E-4 +5.945133995418173E-4 +5.94494134214465E-4 +5.944699188616464E-4 +5.944678099131088E-4 +5.944818850811875E-4 +5.944713304749396E-4 +5.944668817134482E-4 +5.94474332029875E-4 +5.944756142334482E-4 +5.94469414651613E-4 +5.944546787728475E-4 +5.944521518139664E-4 +5.944559200102337E-4 +5.944598793050294E-4 +5.944658926640148E-4 +5.944405315126974E-4 +5.944382846516362E-4 +5.944501870431333E-4 +5.94440160059798E-4 +5.944558213117176E-4 +5.944428903216035E-4 +5.944497168714445E-4 +5.944454567764502E-4 +5.944282579548695E-4 +5.944193246144205E-4 +5.944442878576955E-4 +5.94414048503093E-4 +5.943950429573998E-4 +5.944252539069507E-4 +5.944087220351313E-4 +5.944082194328296E-4 +5.944072926533004E-4 +5.944040596781122E-4 +5.944171765247711E-4 +5.943928645661707E-4 +5.943913356166081E-4 +5.944028528923799E-4 +5.944035082958851E-4 +5.944010948243778E-4 diff --git a/QCQP/portfolioOptimizationQCQP.java b/QCQP/portfolioOptimizationQCQP.java index e21c616..2db40b6 100644 --- a/QCQP/portfolioOptimizationQCQP.java +++ b/QCQP/portfolioOptimizationQCQP.java @@ -21,6 +21,8 @@ public class portfolioOptimizationQCQP { + public final static String dataFolder = "data"; + public static String dataFile = "data" + File.separator + "djia_close_price.csv"; public static void main(String[] args) { @@ -87,6 +89,8 @@ public static void main(String[] args) { } } + printMatrixToFile(relRtn, "relRtn.d"); + // Mean return double[] r = new double[n]; for (j = 0; j < n; j++) { @@ -153,16 +157,16 @@ public static void main(String[] args) { double[] blx = new double[n]; double[] bux = new double[n]; - Arrays.fill(irowa, 1); + Arrays.fill(irowa, 1); for (i = 0; i < n; i++) { icola[i] = i + 1; - } - Arrays.fill(a, 1.0); + } + Arrays.fill(a, 1.0); bl[0] = 1.0; bu[0] = 1.0; // Input for bound constraint: x >= 0 - Arrays.fill(blx, 0.0); + Arrays.fill(blx, 0.0); Arrays.fill(bux, 1.0e20); // Set step for mu @@ -205,7 +209,8 @@ public static void main(String[] args) { } idqc = -1; - e04rs.eval(handle, 0.0, nonZeroLength(invertSignR), idxr, invertSignR, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + e04rs.eval(handle, 0.0, nonZeroLength(invertSignR), idxr, invertSignR, nonZeroLength(q), irowq, icolq, q, + idqc, ifail); // Set linear constraint e'x = 1 e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); @@ -243,6 +248,9 @@ public static void main(String[] args) { handle = e04rz.getHANDLE(); } + printVectorToFile(toArray(abRisk), "abRisk.d"); + printVectorToFile(toArray(abRtn), "abRtn.d"); + // Maximizing the Sharpe ratio // Input for linear constraint: e'y = lambda @@ -324,6 +332,8 @@ public static void main(String[] args) { srX[i] = x[i] / x[n]; } + printVectorToFile(new double[]{srRisk, srRtn}, "sr.d"); + // Portfolio optimization with tracking-error constraint // Generate a benchmark portfolio from efficient portfolio that maximize the @@ -447,6 +457,10 @@ public static void main(String[] args) { e04rz.eval(handle, ifail); handle = e04rz.getHANDLE(); } + + printVectorToFile(new double[]{bRisk, bRtn}, "b.d"); + printVectorToFile(toArray(tevRisk), "tevRisk.d"); + printVectorToFile(toArray(tevRtn), "tevRtn.d"); } public static class MONIT extends E04PT.Abstract_E04PT_MONIT { @@ -540,9 +554,17 @@ private static double multiplyMatricesCell(double[][] firstMatrix, double[][] se return cell; } + public static double[] toArray(ArrayList list) { + double[] t = new double[list.size()]; + for (int i = 0; i < t.length; i++) { + t[i] = (double) list.get(i); + } + return t; + } + public static void printVectorToFile(double[] a, String fileName) { try { - FileWriter writer = new FileWriter(new File(fileName)); + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); for (int i = 0; i < a.length; i++) { writer.write(a[i] + "\n"); } @@ -553,4 +575,20 @@ public static void printVectorToFile(double[] a, String fileName) { } } + public static void printMatrixToFile(double[][] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + writer.write(a[i][j] + " "); + } + writer.write("\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + } From 8dead389ad77a684aa1b584865599369fa25c437 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 16:30:44 +0200 Subject: [PATCH 091/196] Added convertion to images --- QCQP/generate_img.py | 102 +++++++++++++++++++++++++++++++++++++++++++ QCQP/img/data.png | Bin 0 -> 146181 bytes QCQP/img/rel_rtn.png | Bin 0 -> 108609 bytes QCQP/img/risk_1.png | Bin 0 -> 23209 bytes QCQP/img/risk_2.png | Bin 0 -> 34478 bytes QCQP/img/risk_3.png | Bin 0 -> 48048 bytes 6 files changed, 102 insertions(+) create mode 100644 QCQP/generate_img.py create mode 100644 QCQP/img/data.png create mode 100644 QCQP/img/rel_rtn.png create mode 100644 QCQP/img/risk_1.png create mode 100644 QCQP/img/risk_2.png create mode 100644 QCQP/img/risk_3.png diff --git a/QCQP/generate_img.py b/QCQP/generate_img.py new file mode 100644 index 0000000..b2c3cc6 --- /dev/null +++ b/QCQP/generate_img.py @@ -0,0 +1,102 @@ +import csv +import numpy as np +import matplotlib.pyplot as plt +from pathlib import Path + +# Set the print precision +np.set_printoptions(precision=4, suppress=True) + +# Set the data folder path +data_folder = Path("data") + +def read_matrix_file(fname): + with open(data_folder / fname) as fdata: + a = np.array([line.split() for line in fdata], dtype = np.float64) + return a + +data_file = "djia_close_price.csv" + +with open(data_folder / data_file) as fdata: + csv_reader = csv.reader(fdata, delimiter=',') + line_count = 0 + close_price = {} + for row in csv_reader: + if line_count == 0: + date_index = row[1:] + line_count += 1 + else: + close_price[row[0]] = np.array(row[1:], dtype=np.float64) + +# Size of data, m: number of observations, n: number of stocks +m = len(date_index) +n = len(close_price) + +# Extract stock closing prices to a numpy array +data = np.zeros(shape=(m, n)) +i = 0 +for stock in close_price: + data[:,i] = close_price[stock] + plt.plot(np.arange(m), data[:,i]) + i += 1 +# Plot closing prices +plt.xlabel('Time (days)') +plt.ylabel('Closing price ($)') +plt.savefig("./img/data.png") +plt.clf() + +# Relative return +rel_rtn = read_matrix_file("relRtn.d") + +# Plot relative return +for i in range(n): + plt.plot(np.arange(m-1),rel_rtn[:,i]) +plt.xlabel('Time (days)') +plt.ylabel('Relative return') +plt.savefig("./img/rel_rtn.png") +plt.clf() + +# Efficient Frontier +ab_risk = read_matrix_file("abRisk.d") +ab_rtn = read_matrix_file("abRtn.d") + +plt.plot(ab_risk*100.0, ab_rtn*100.0) +plt.ylabel('Total Expected Return (%)') +plt.xlabel('Absolute Risk (%)') +plt.savefig("./img/risk_1.png") +plt.clf() + +# Maximizing the Sharpe ratio +sr = read_matrix_file("sr.d") +sr_risk = sr[0][0] +sr_rtn = sr[1][0] + +plt.plot(ab_risk*100.0, ab_rtn*100.0, label='Efficient frontier') +plt.plot([sr_risk*100], [sr_rtn*100], 'rs', label='Portfolio with maximum Sharpe ratio') +plt.plot([sr_risk*100, 0.0], [sr_rtn*100, 0.0], 'r-', label='Capital market line') +plt.axis([min(ab_risk*100), max(ab_risk*100), min(ab_rtn*100), max(ab_rtn*100)]) +plt.ylabel('Total Expected Return (%)') +plt.xlabel('Absolute Risk (%)') +plt.legend() +plt.savefig("./img/risk_2.png") +plt.clf() + +# Portfolio optimization with tracking-error constraint +b = read_matrix_file("b.d") +b_risk = b[0][0] +b_rtn = b[1][0] +tev_risk = read_matrix_file("tevRisk.d") +tev_rtn = read_matrix_file("tevRtn.d") + +plt.figure(figsize=(7.5, 5.5)) +plt.plot(ab_risk*100.0, ab_rtn*100.0, label='Classic efficient frontier') +plt.plot([sr_risk*100], [sr_rtn*100], 'rs', label='Portfolio with maximum Sharpe ratio') +plt.plot([sr_risk*100, 0.0], [sr_rtn*100, 0.0], 'r-', label='Capital market line') +plt.plot(b_risk*100, b_rtn*100, 'r*', label='Benchmark portfolio') +plt.plot(tev_risk*100.0, tev_rtn*100.0, 'seagreen', label='Efficient frontier with tev constraint') + +plt.axis([min(ab_risk*100), max(ab_risk*100), min(tev_rtn*100), max(ab_rtn*100)]) +plt.ylabel('Total Expected Return (%)') +plt.xlabel('Absolute Risk (%)') +plt.legend() +plt.savefig("./img/risk_3.png") +plt.clf() diff --git a/QCQP/img/data.png b/QCQP/img/data.png new file mode 100644 index 0000000000000000000000000000000000000000..54aa4443d90a39eff61c7192e149259684e1b589 GIT binary patch literal 146181 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 WZL0Xdb}@Te3fvsxU$HUf_nD3Ap!!D(v5=B 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 i{@)A8|9HXt&aR8!+QtPM Date: Wed, 13 Jan 2021 16:36:59 +0200 Subject: [PATCH 092/196] Added better message for Pages link --- nearest_correlation_matrices/Readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index dbde38b..e6490a0 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,8 +1,8 @@ -> ## Important Information -> To properly read the documentation click [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). - # Nearest Correlation Matrices +# Correct Rendering of this notebook +This file has a lot of Latex and GitHub currently cannot render it on Markdown files. [Here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices/) you can read it clearly. + This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). From ff16c9f71f8e1a344bce6faa5361ff75259657dd Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 16:55:30 +0200 Subject: [PATCH 093/196] Small correction --- nearest_correlation_matrices/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index e6490a0..34e369b 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,10 +1,10 @@ # Nearest Correlation Matrices +This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. + # Correct Rendering of this notebook This file has a lot of Latex and GitHub currently cannot render it on Markdown files. [Here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices/) you can read it clearly. -This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. - The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). ## Correlation Matrices From 0909f5fdb3e90b9497212e784c2c321c8a19c954 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 17:01:31 +0200 Subject: [PATCH 094/196] Added forgotten e04rz --- QCQP/portfolioOptimizationQCQP.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/QCQP/portfolioOptimizationQCQP.java b/QCQP/portfolioOptimizationQCQP.java index 2db40b6..06b30bf 100644 --- a/QCQP/portfolioOptimizationQCQP.java +++ b/QCQP/portfolioOptimizationQCQP.java @@ -332,6 +332,10 @@ public static void main(String[] args) { srX[i] = x[i] / x[n]; } + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); + printVectorToFile(new double[]{srRisk, srRtn}, "sr.d"); // Portfolio optimization with tracking-error constraint From 4791aa8bbf9a745eefbe25ee4dacd6f9a07d8de0 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 17:07:18 +0200 Subject: [PATCH 095/196] Added doc for QCQP example --- QCQP/Readme.md | 573 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 573 insertions(+) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index e69de29..740dd35 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -0,0 +1,573 @@ +# Quadratically constrained quadratic programming and its applications in portfolio optimization + +# Correct Rendering of this notebook +This file has a lot of Latex and GitHub currently cannot render it on Markdown files. [Here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP/) you can read it clearly. + +The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/QCQP/portfolioOptimizationQCQP.java). + +# Introduction + +Quadratically constrained quadratic programming (QCQP) is a type of optimization problem in which both the objective function and the constraints involve quadratic functions. A general QCQP problem has the following form +$$ +\begin{equation} +\begin{array}{ll} +\underset{x\in\Re^n}{\mbox{minimize}} & \frac{1}{2}x^TP_0x+q_0^Tx+r_0\\[0.6ex] +\mbox{subject to} & \frac{1}{2}x^TP_ix+q_i^Tx+r_i\leq0,\quad i=1,\ldots,p. +\end{array} +\end{equation} +$$ +It appears in applications such as modern portfolio theory, machine learning, engineering and control. Convex QCQP is usually handled through conic optimization, or, more precisely, second-order cone programming (SOCP) due to its computational efficiency and ability to detect infeasibility. However, using SOCP to solve convex QCQP is nontrivial task which requires extra amount of effort to transform problem data and add auxiliary variables. In this notebook, we are going to demonstrate how to use the *NAG Optimization Modelling Suite* in the NAG Library to define and solve QCQP in portfolio optimization. + +# Data Preparation + +We consider daily prices for the 30 stocks in the DJIA from March 2018 to March 2019. In practice, the estimation of the mean return $$r$$ and covariance $$V$$ is often a nontrivial task. In this notebook, we estimate those entities using simple sample estimates. + +```java +// Load stock price data from djia_close_price.csv + String[] dateIndex = new String[0]; + Map closePrice = new LinkedHashMap<>(); + try { + BufferedReader reader = new BufferedReader(new FileReader(dataFile)); + + String line = reader.readLine().substring(1); + dateIndex = line.split(","); + + String[] data; + String key; + double[] values; + + while ((line = reader.readLine()) != null) { + data = line.split(","); + key = data[0]; + values = parseDoubleArr(Arrays.copyOfRange(data, 1, data.length)); + closePrice.put(key, values); + } + reader.close(); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + dataFile); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + dataFile + "\n" + e.getMessage()); + } + + int m = dateIndex.length; + int n = closePrice.size(); + + double[][] data = new double[m][n]; + i = 0; + for (Map.Entry entry : closePrice.entrySet()) { + double[] tempA = entry.getValue(); + for (j = 0; j < m; j++) { + data[j][i] = tempA[j]; + } + i++; + } +``` + +
    + +
    + +
    + +For each stock $$i$$, we first estimate the $$j$$th daily relative return as $$relative~return_{i,j} = \frac{closing~price_{i,j+1}-closing~price_{i,j}}{closing~price_{i,j}}.$$ + +```java + // Relative return + double[][] relRtn = new double[m - 1][n]; + for (j = 0; j < m - 1; j++) { + for (i = 0; i < n; i++) { + relRtn[j][i] = (data[j + 1][i] - data[j][i]) / data[j][i]; + } + } +``` +
    + +
    + +
    + +Simply take arithmetic mean of each column of relative return to get mean return $$r$$ for each stock, followed by estimating covariance $$V$$ using numpy. + +```java + // Mean return + double[] r = new double[n]; + for (j = 0; j < n; j++) { + double sum = 0; + for (i = 0; i < m - 1; i++) { + sum += relRtn[i][j]; + } + r[j] = sum; + r[j] /= m - 1; + } + + // Covariance matrix + G02BX g02bx = new G02BX(); + String weight = "U"; + n = relRtn.length; + m = relRtn[0].length; + int ldx = n; + double[] x1d = convert2DTo1D(relRtn); + double[] wt = new double[0]; + double[] xbar = new double[m]; + double[] std = new double[m]; + int ldv = m; + double[] v1d = new double[ldv * m]; + double[] r1d = new double[ldv * m]; + int ifail = 0; + g02bx.eval(weight, n, m, x1d, ldx, wt, xbar, std, v1d, ldv, r1d, ifail); + + double[][] V = convert1DTo2D(v1d, m); +``` + +# Classic Mean-Variance Model +## Efficient Frontier + +One of the major goals of portfolio management is to achieve a certain level of return under a specific risk measurement. Here we demonstrate how to use NAG Library to build efficient frontier by solving classical Markowitz model with long-only constraint (meaning, buy to hold and short selling is not allowed): +$$ +\begin{equation}\label{MV_model} +\begin{array}{ll} +\underset{x\in\Re^n}{\mbox{minimize}} & -r^Tx+\mu x^TVx\\[0.6ex] +\mbox{subject to} & e^Tx = 1,\\[0.6ex] + & x\geq0, +\end{array} +\end{equation} +$$ +where $$e\in\Re^n$$ is vector of all ones and $$\mu$$ is a scalar controling trade-off between return and risk. Note one could build the efficient frontier by varying $$\mu$$ from $$0$$ to a certain value. + +```java +int itemsDiagLength = V.length; + int itemsAboveDiagLength = (int) (Math.pow(itemsDiagLength, 2) - itemsDiagLength) / 2 + itemsDiagLength; + int[] irowq = new int[itemsAboveDiagLength]; + int[] icolq = new int[itemsAboveDiagLength]; + double[] vVal = new double[itemsAboveDiagLength]; + int c = 0; + // Input for quadratic objective + // Sparsity pattern of upper triangular V + for (i = 0; i < V.length; i++) { + for (j = i; j < V[0].length; j++) { + vVal[c] = V[i][j]; + irowq[c] = i + 1; + icolq[c] = j + 1; + c++; + } + } + + n = closePrice.size(); + // Sparsity pattern of r, which is actually dense in this application + int[] idxr = new int[n]; + for (i = 0; i < n; i++) { + idxr[i] = i + 1; + } + + // Input for linear constraint: e'x = 1 + int[] irowa = new int[n]; + int[] icola = new int[n]; + double[] a = new double[n]; + double[] bl = new double[1]; + double[] bu = new double[1]; + double[] blx = new double[n]; + double[] bux = new double[n]; + + Arrays.fill(irowa, 1); + for (i = 0; i < n; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 1.0); + bl[0] = 1.0; + bu[0] = 1.0; + + // Input for bound constraint: x >= 0 + Arrays.fill(blx, 0.0); + Arrays.fill(bux, 1.0e20); +``` + +The input data is ready, we can easily build the efficient frontier as follows. + +```java +// Set step for mu + int step = 2001; + + // Initialize output data: absolute risk and return + ArrayList abRisk = new ArrayList<>(); + ArrayList abRtn = new ArrayList<>(); + + int mu; + long handle = 0; + double[] q = new double[vVal.length]; + int idqc; + double[] invertSignR = invertSignVector(r); + double[] x = new double[n]; + double[] u = new double[0]; + double[] uc = new double[0]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[2]; + double[] ruser = new double[1]; + long cpuser = 0; + double[][] x2d; + double[][] VX; + double[][] XVX; + double[][] r2d; + double[][] RX; + + for (mu = 0; mu < step; mu++) { + ifail = 0; + + // Create problem handle + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*mu*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * mu * vVal[i]; + } + + idqc = -1; + e04rs.eval(handle, 0.0, nonZeroLength(invertSignR), idxr, invertSignR, nonZeroLength(q), irowq, icolq, q, + idqc, ifail); + + // Set linear constraint e'x = 1 + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, n, blx, bux, ifail); + + // set options + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + // Call socp interior point solver + ifail = 1; + e04pt.eval(handle, n, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + ifail = e04pt.getIFAIL(); + if (ifail == 0) { + // Compute risk and return from the portfolio + x2d = convert1DTo2D(x, x.length); + VX = multiplyMatrices(V, x2d); + XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + + abRisk.add(Math.sqrt(XVX[0][0])); + + r2d = convert1DTo2D(r, r.length); + RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); + + abRtn.add(RX[0][0]); + } + + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); + } +``` + +
    + +
    + +
    + +## Maximizing the Sharpe ratio + +The Sharpe ratio is defined as the ratio of return of portfolio and standard deviation of the portfolio's excess return. It is usually used to measure the efficiency of a portfolio. Find the most efficient portfolio is equivalent to solve the following optimization problem. +$$ +\begin{equation}\label{sr_model} +\begin{array}{ll} +\underset{x\in\Re^n}{\mbox{minimize}} & \frac{\sqrt{x^TVx}}{r^Tx}\\[0.6ex] +\mbox{subject to} & e^Tx = 1,\\[0.6ex] + & x\geq0. +\end{array} +\end{equation} +By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model (\ref{sr_model}) is equivalent to +\begin{equation}\label{sr_model_eq} +\begin{array}{ll} +\underset{y\in\Re^n, \lambda\in\Re}{\mbox{minimize}} & y^TVy\\[0.6ex] +\mbox{subject to} & e^Ty = \lambda,\\[0.6ex] + & r^Ty=1, \\ + & y\geq0, \\ + & \lambda\geq0. +\end{array} +\end{equation} +$$ +Problem (\ref{sr_model_eq}) is similar to problem (\ref{MV_model}) in the sense that they both have a quadratic objective function and linear constraints. + +```java +// Input for linear constraint: e'y = lambda + irowa = new int[(n + 1) + n]; + icola = new int[(n + 1) + n]; + a = new double[(n + 1) + n]; + bl = new double[2]; + bu = new double[2]; + blx = new double[n + 1]; + bux = new double[n + 1]; + + Arrays.fill(irowa, 0, n + 1, 1); + for (i = 0; i <= n; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 0, n, 1.0); + a[n] = -1.0; + bl[0] = 0.0; + bu[0] = 0.0; + + // Input for linear constraint: r'y = 1 + Arrays.fill(irowa, n + 1, irowa.length, 2); + for (i = 0; i < n; i++) { + icola[(n + 1) + i] = i + 1; + } + for (i = 0; i < n; i++) { + a[(n + 1) + i] = r[i]; + } + bl[1] = 1.0; + bu[1] = 1.0; + + // Input for bound constraint: x >= 0 + Arrays.fill(blx, 0.0); + Arrays.fill(bux, 1.0e20); +``` + +Now we can call the NAG SOCP solver as follows. + +```java + ifail = 0; + + // Create problem handle + e04ra.eval(handle, n + 1, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * vVal[i]; + } + idqc = -1; + e04rs.eval(handle, 0.0, 0, idxr, r, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + + // Set linear constraints + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, blx.length, blx, bux, ifail); + + // Set options + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + // Call socp interior point solver + x = new double[n + 1]; + e04pt.eval(handle, n + 1, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + x2d = convert1DTo2D(x, n); + VX = multiplyMatrices(V, x2d); + XVX = multiplyMatrices(invertRowColMatrix(x2d), VX); + + double srRisk = Math.sqrt(XVX[0][0]) / x[n]; + + r2d = convert1DTo2D(r, n); + RX = multiplyMatrices(invertRowColMatrix(r2d), x2d); + + double srRtn = RX[0][0] / x[n]; + + double[] srX = new double[n]; + for (i = 0; i < srX.length; i++) { + srX[i] = x[i] / x[n]; + } + + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); +``` + +
    + +
    + +
    + +# Portfolio optimization with tracking-error constraint + +To avoid taking unnecessary risk when beating a benchmark, the investors commonly impose a limit on the volatility of the deviation of the active portfolio from the benchmark, which is also known as tracking-error volatility (TEV) \cite{J03}. The model to build efficient frontier in excess-return space is +$$ +\begin{equation}\label{er_tev} +\begin{array}{ll} +\underset{x\in\Re^n}{\mbox{maximize}} & r^Tx\\ +\mbox{subject to} & e^Tx = 0,\\ + & x^TVx\leq tev, +\end{array} +\end{equation} +$$ +where $$tev$$ is a limit on the track-error. Roll \cite{R92} noted that problem (\ref{er_tev}) is totally independent of the benchmark and leads to the unpalatable result that the active portfolio has systematically higher risk than the benchmark and is not optimal. Therefore, in this section we solve a more advanced model by taking absolute risk into account as follows. +$$ +\begin{equation}\label{tev_model} +\begin{array}{ll} +\underset{x\in\Re^n}{\mbox{minimize}} & -r^Tx+\mu (x+b)^TV(x+b)\\ +\mbox{subject to} & e^Tx = 0,\\ + & x^TVx\leq tev,\\ + & x+b\geq0, +\end{array} +\end{equation} +$$ +where $$b$$ is a benchmark portfolio. In this demonstration, it is generated synthetically. Note here we use the same covariance matrix $$V$$ for tev and absolute risk measurement for demonstration purpose. In practice one could use different covariance matrices from different markets. + +```java +// Generate a benchmark portfolio from efficient portfolio that maximize the + // Sharpe ratio + // Perturb x + double[] b = new double[n]; + double sumB = 0; + for (i = 0; i < b.length; i++) { + b[i] = srX[i] + 1.0e-1; + sumB += b[i]; + } + + // Normalize b + for (i = 0; i < b.length; i++) { + b[i] /= sumB; + } + + // Set limit on tracking-error + double tev = 0.000002; + + // Compute risk and return at the benchmark + double[][] b2d = convert1DTo2D(b, n); + double[][] VB = multiplyMatrices(V, b2d); + double[][] BVB = multiplyMatrices(invertRowColMatrix(b2d), VB); + + double bRisk = Math.sqrt(BVB[0][0]); + + r2d = convert1DTo2D(r, n); + double[][] RB = multiplyMatrices(invertRowColMatrix(r2d), b2d); + + double bRtn = RB[0][0]; +``` + +
    + +```java + irowa = new int[n]; + icola = new int[n]; + a = new double[n]; + bl = new double[1]; + bu = new double[1]; + + // Input for linear constraint: e'x = 0 + Arrays.fill(irowa, 1); + for (i = 0; i < icola.length; i++) { + icola[i] = i + 1; + } + Arrays.fill(a, 1.0); + bl[0] = 0; + bu[0] = 0; + + // Input for bound constraint: x >= -b + blx = invertSignVector(b); + Arrays.fill(bux, 1.0e20); +``` + +
    + +```java +// Initialize output data: TEV risk and return + ArrayList tevRisk = new ArrayList<>(); + ArrayList tevRtn = new ArrayList<>(); + + double[] rMu = new double[n]; + double[][] Vb; + double[] Vb1d; + x = new double[n]; + double[] xb; + double[][] xb2d; + double[][] xbVxb; + + for (mu = 0; mu < step; mu++) { + ifail = 0; + + // Create problem handle + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + // In qcqp standard form q should be 2*mu*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * mu * vVal[i]; + } + Vb = multiplyMatrices(V, b2d); + Vb1d = convert2DTo1D(Vb); + for (i = 0; i < rMu.length; i++) { + rMu[i] = 2.0 * mu * Vb1d[i] - r[i]; + } + idqc = -1; + e04rs.eval(handle, 0.0, nonZeroLength(rMu), idxr, rMu, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + + // Set quadratic constraint + // In qcqp standard form q should be 2*V + for (i = 0; i < q.length; i++) { + q[i] = 2.0 * vVal[i]; + } + idqc = 0; + e04rs.eval(handle, -tev, 0, idxr, rMu, nonZeroLength(q), irowq, icolq, q, idqc, ifail); + + // Set linear constraint e'x = 1 + e04rj.eval(handle, bl.length, bl, bu, nonZeroLength(a), irowa, icola, a, 0, ifail); + + // Set bound constraint + e04rh.eval(handle, blx.length, blx, bux, ifail); + + // Set options + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print File = -1", ifail); + e04zm.eval(handle, "SOCP Scaling = A", ifail); + + // Call socp interior point solver + // Mute warnings and do not count results from warnings + ifail = -1; + e04pt.eval(handle, n, x, 0, u, 0, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + ifail = e04pt.getIFAIL(); + if (ifail == 0) { + // Compute risk and return from the portfolio + xb = addVectors(x, b); + xb2d = convert1DTo2D(xb, xb.length); + xbVxb = multiplyMatrices(invertRowColMatrix(xb2d), multiplyMatrices(V, xb2d)); + tevRisk.add(Math.sqrt(xbVxb[0][0])); + + tevRtn.add(multiplyMatrices(invertRowColMatrix(r2d), xb2d)[0][0]); + } + + // Destroy the handle: + e04rz.eval(handle, ifail); + handle = e04rz.getHANDLE(); + } +``` + +
    + +
    + +
    + +# Conclusion + +In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. \cite{DGNU09} discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation \cite{NAGDOC} on SOCP solver and \cite{AG03, LVBL98} for more details. + +# References + +[
    1] Jorion Philippe, ``_Portfolio optimization with tracking-error constraints_'', Financial Analysts Journal, vol. 59, number 5, pp. 70--82, 2003. + +[2] Roll Richard, ``_A mean/variance analysis of tracking error_'', The Journal of Portfolio Management, vol. 18, number 4, pp. 13--22, 1992. + +[3] DeMiguel Victor, Garlappi Lorenzo, Nogales Francisco J et al., ``_A generalized approach to portfolio optimization: Improving performance by constraining portfolio norms_'', Management science, vol. 55, number 5, pp. 798--812, 2009. + +[4] Numerical Algorithms Group, ``_NAG documentation_'', 2019. [online](https://www.nag.com/numeric/fl/nagdoc_latest/html/frontmatter/manconts.html) + +[5] Alizadeh Farid and Goldfarb Donald, ``_Second-order cone programming_'', Mathematical programming, vol. 95, number 1, pp. 3--51, 2003. + +[6] Lobo Miguel Sousa, Vandenberghe Lieven, Boyd Stephen et al., ``_Applications of second-order cone programming_'', Linear algebra and its applications, vol. 284, number 1-3, pp. 193--228, 1998. From 250d5d2b77e5e5976a97c098d96ecdf27dcf7c85 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 17:13:32 +0200 Subject: [PATCH 096/196] Fixed latex format --- QCQP/Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 740dd35..ed2ee28 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -8,6 +8,7 @@ The source of this example can be found [here](https://github.com/numericalalgor # Introduction Quadratically constrained quadratic programming (QCQP) is a type of optimization problem in which both the objective function and the constraints involve quadratic functions. A general QCQP problem has the following form + $$ \begin{equation} \begin{array}{ll} @@ -16,6 +17,7 @@ $$ \end{array} \end{equation} $$ + It appears in applications such as modern portfolio theory, machine learning, engineering and control. Convex QCQP is usually handled through conic optimization, or, more precisely, second-order cone programming (SOCP) due to its computational efficiency and ability to detect infeasibility. However, using SOCP to solve convex QCQP is nontrivial task which requires extra amount of effort to transform problem data and add auxiliary variables. In this notebook, we are going to demonstrate how to use the *NAG Optimization Modelling Suite* in the NAG Library to define and solve QCQP in portfolio optimization. # Data Preparation From ccbe4268be8e151d409f1ab59ac8a263d12635c7 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 17:25:31 +0200 Subject: [PATCH 097/196] Fixed latex format --- QCQP/Readme.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index ed2ee28..74a11f7 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -73,7 +73,9 @@ We consider daily prices for the 30 stocks in the DJIA from March 2018 to March
    -For each stock $$i$$, we first estimate the $$j$$th daily relative return as $$relative~return_{i,j} = \frac{closing~price_{i,j+1}-closing~price_{i,j}}{closing~price_{i,j}}.$$ +For each stock $$i$$, we first estimate the $$j$$th daily relative return as + +$$relative~return_{i,j} = \frac{closing~price_{i,j+1}-closing~price_{i,j}}{closing~price_{i,j}}.$$ ```java // Relative return @@ -127,6 +129,7 @@ Simply take arithmetic mean of each column of relative return to get mean return ## Efficient Frontier One of the major goals of portfolio management is to achieve a certain level of return under a specific risk measurement. Here we demonstrate how to use NAG Library to build efficient frontier by solving classical Markowitz model with long-only constraint (meaning, buy to hold and short selling is not allowed): + $$ \begin{equation}\label{MV_model} \begin{array}{ll} @@ -136,6 +139,7 @@ $$ \end{array} \end{equation} $$ + where $$e\in\Re^n$$ is vector of all ones and $$\mu$$ is a scalar controling trade-off between return and risk. Note one could build the efficient frontier by varying $$\mu$$ from $$0$$ to a certain value. ```java @@ -277,6 +281,7 @@ The input data is ready, we can easily build the efficient frontier as follows. ## Maximizing the Sharpe ratio The Sharpe ratio is defined as the ratio of return of portfolio and standard deviation of the portfolio's excess return. It is usually used to measure the efficiency of a portfolio. Find the most efficient portfolio is equivalent to solve the following optimization problem. + $$ \begin{equation}\label{sr_model} \begin{array}{ll} @@ -285,7 +290,11 @@ $$ & x\geq0. \end{array} \end{equation} -By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model (\ref{sr_model}) is equivalent to +$$ + +By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{sr_model})$$ is equivalent to + +$$ \begin{equation}\label{sr_model_eq} \begin{array}{ll} \underset{y\in\Re^n, \lambda\in\Re}{\mbox{minimize}} & y^TVy\\[0.6ex] @@ -296,7 +305,8 @@ By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model (\ref{sr_model \end{array} \end{equation} $$ -Problem (\ref{sr_model_eq}) is similar to problem (\ref{MV_model}) in the sense that they both have a quadratic objective function and linear constraints. + +Problem $$(\ref{sr_model_eq})$$ is similar to problem $$(\ref{MV_model})$$ in the sense that they both have a quadratic objective function and linear constraints. ```java // Input for linear constraint: e'y = lambda @@ -395,7 +405,8 @@ Now we can call the NAG SOCP solver as follows. # Portfolio optimization with tracking-error constraint -To avoid taking unnecessary risk when beating a benchmark, the investors commonly impose a limit on the volatility of the deviation of the active portfolio from the benchmark, which is also known as tracking-error volatility (TEV) \cite{J03}. The model to build efficient frontier in excess-return space is +To avoid taking unnecessary risk when beating a benchmark, the investors commonly impose a limit on the volatility of the deviation of the active portfolio from the benchmark, which is also known as tracking-error volatility (TEV) $$\cite{J03}$$. The model to build efficient frontier in excess-return space is + $$ \begin{equation}\label{er_tev} \begin{array}{ll} @@ -405,7 +416,9 @@ $$ \end{array} \end{equation} $$ -where $$tev$$ is a limit on the track-error. Roll \cite{R92} noted that problem (\ref{er_tev}) is totally independent of the benchmark and leads to the unpalatable result that the active portfolio has systematically higher risk than the benchmark and is not optimal. Therefore, in this section we solve a more advanced model by taking absolute risk into account as follows. + +where $$tev$$ is a limit on the track-error. Roll $$\cite{R92}$$ noted that problem $$(\ref{er_tev})$$ is totally independent of the benchmark and leads to the unpalatable result that the active portfolio has systematically higher risk than the benchmark and is not optimal. Therefore, in this section we solve a more advanced model by taking absolute risk into account as follows. + $$ \begin{equation}\label{tev_model} \begin{array}{ll} @@ -416,6 +429,7 @@ $$ \end{array} \end{equation} $$ + where $$b$$ is a benchmark portfolio. In this demonstration, it is generated synthetically. Note here we use the same covariance matrix $$V$$ for tev and absolute risk measurement for demonstration purpose. In practice one could use different covariance matrices from different markets. ```java @@ -558,7 +572,7 @@ where $$b$$ is a benchmark portfolio. In this demonstration, it is generated syn # Conclusion -In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. \cite{DGNU09} discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation \cite{NAGDOC} on SOCP solver and \cite{AG03, LVBL98} for more details. +In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. $$\cite{DGNU09}$$ discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation $$\cite{NAGDOC}$$ on SOCP solver and $$\cite{AG03, LVBL98}$$ for more details. # References From fe1ed48f9e0a1f1093c8edc2dc0289f22977bcd2 Mon Sep 17 00:00:00 2001 From: Christos Date: Wed, 13 Jan 2021 17:35:59 +0200 Subject: [PATCH 098/196] Small fix --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5721b6a..a175af3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ > ## Important Information > This repository is still under development. +> > To see the documentation and a better view of this repository click [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). # Examples using the NAG Library for Java From 4ddfe6b626c56b4ccb717d8f5f4cae57eb78f7a3 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:19:38 +0200 Subject: [PATCH 099/196] Fixed latex format --- QCQP/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 74a11f7..2763adc 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -283,7 +283,7 @@ The input data is ready, we can easily build the efficient frontier as follows. The Sharpe ratio is defined as the ratio of return of portfolio and standard deviation of the portfolio's excess return. It is usually used to measure the efficiency of a portfolio. Find the most efficient portfolio is equivalent to solve the following optimization problem. $$ -\begin{equation}\label{sr_model} +\begin{equation}\label{eq:sr_model} \begin{array}{ll} \underset{x\in\Re^n}{\mbox{minimize}} & \frac{\sqrt{x^TVx}}{r^Tx}\\[0.6ex] \mbox{subject to} & e^Tx = 1,\\[0.6ex] @@ -292,7 +292,7 @@ $$ \end{equation} $$ -By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{sr_model})$$ is equivalent to +By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{eq:sr_model})$$ is equivalent to $$ \begin{equation}\label{sr_model_eq} From c0d13883996d4bb75904142b70206f3dc88874e0 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:27:23 +0200 Subject: [PATCH 100/196] Fixed latex format --- QCQP/Readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 2763adc..b5fc09d 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -283,6 +283,7 @@ The input data is ready, we can easily build the efficient frontier as follows. The Sharpe ratio is defined as the ratio of return of portfolio and standard deviation of the portfolio's excess return. It is usually used to measure the efficiency of a portfolio. Find the most efficient portfolio is equivalent to solve the following optimization problem. $$ +\newcommand{\dd}[1]{\mathrm{d}#1} \begin{equation}\label{eq:sr_model} \begin{array}{ll} \underset{x\in\Re^n}{\mbox{minimize}} & \frac{\sqrt{x^TVx}}{r^Tx}\\[0.6ex] From 81da797f11769c7b17186b58c7ab4583b407e382 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:31:06 +0200 Subject: [PATCH 101/196] Fixed latex format --- QCQP/Readme.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index b5fc09d..504a80a 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -283,14 +283,15 @@ The input data is ready, we can easily build the efficient frontier as follows. The Sharpe ratio is defined as the ratio of return of portfolio and standard deviation of the portfolio's excess return. It is usually used to measure the efficiency of a portfolio. Find the most efficient portfolio is equivalent to solve the following optimization problem. $$ -\newcommand{\dd}[1]{\mathrm{d}#1} -\begin{equation}\label{eq:sr_model} +\begin{equation} +\label{eq:sr_model} \begin{array}{ll} \underset{x\in\Re^n}{\mbox{minimize}} & \frac{\sqrt{x^TVx}}{r^Tx}\\[0.6ex] \mbox{subject to} & e^Tx = 1,\\[0.6ex] & x\geq0. \end{array} \end{equation} +(\ref{eq:sr_model}) $$ By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{eq:sr_model})$$ is equivalent to From 001f68f12076da9858a7bd6807dfb3d8b76f7187 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:37:57 +0200 Subject: [PATCH 102/196] Fixed latex format --- QCQP/Readme.md | 4 ++-- _layouts/default.html | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 504a80a..1159226 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -291,13 +291,12 @@ $$ & x\geq0. \end{array} \end{equation} -(\ref{eq:sr_model}) $$ By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{eq:sr_model})$$ is equivalent to $$ -\begin{equation}\label{sr_model_eq} +\begin{equation} \begin{array}{ll} \underset{y\in\Re^n, \lambda\in\Re}{\mbox{minimize}} & y^TVy\\[0.6ex] \mbox{subject to} & e^Ty = \lambda,\\[0.6ex] @@ -305,6 +304,7 @@ $$ & y\geq0, \\ & \lambda\geq0. \end{array} +\label{sr_model_eq} \end{equation} $$ diff --git a/_layouts/default.html b/_layouts/default.html index b5e8733..a182685 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -30,7 +30,8 @@

    - {{ site.title | default: site.github.repository_name }} + {{ + site.title | default: site.github.repository_name }}

    {{ site.description | default: site.github.project_tagline }}

    @@ -75,6 +76,14 @@

    {{ site.description | default: site.github.project_tagl ga('send', 'pageview'); {% endif %} + + From 4a2bac41da039a4e1a89bf62c6901c41e1928657 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:44:01 +0200 Subject: [PATCH 103/196] Fixed latex format --- QCQP/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 1159226..fdb3c56 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -297,6 +297,7 @@ By replacing $$x$$ with $$\frac{y}{\lambda}, \lambda\gt0$$, model $$(\ref{eq:sr_ $$ \begin{equation} +\label{sr_model_eq} \begin{array}{ll} \underset{y\in\Re^n, \lambda\in\Re}{\mbox{minimize}} & y^TVy\\[0.6ex] \mbox{subject to} & e^Ty = \lambda,\\[0.6ex] @@ -304,7 +305,6 @@ $$ & y\geq0, \\ & \lambda\geq0. \end{array} -\label{sr_model_eq} \end{equation} $$ @@ -574,7 +574,7 @@ where $$b$$ is a benchmark portfolio. In this demonstration, it is generated syn # Conclusion -In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. $$\cite{DGNU09}$$ discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation $$\cite{NAGDOC}$$ on SOCP solver and $$\cite{AG03, LVBL98}$$ for more details. +In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. [3](#cit-DGNU09) discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation $$\cite{NAGDOC}$$ on SOCP solver and $$\cite{AG03, LVBL98}$$ for more details. # References From 306f32bc45b7207c3cfbe575544ecd0d552514a6 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 11:48:53 +0200 Subject: [PATCH 104/196] Fixed latex format --- QCQP/Readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index fdb3c56..b35c5da 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -407,7 +407,7 @@ Now we can call the NAG SOCP solver as follows. # Portfolio optimization with tracking-error constraint -To avoid taking unnecessary risk when beating a benchmark, the investors commonly impose a limit on the volatility of the deviation of the active portfolio from the benchmark, which is also known as tracking-error volatility (TEV) $$\cite{J03}$$. The model to build efficient frontier in excess-return space is +To avoid taking unnecessary risk when beating a benchmark, the investors commonly impose a limit on the volatility of the deviation of the active portfolio from the benchmark, which is also known as tracking-error volatility (TEV) [[1](#cit-J03)]. The model to build efficient frontier in excess-return space is $$ \begin{equation}\label{er_tev} @@ -419,7 +419,7 @@ $$ \end{equation} $$ -where $$tev$$ is a limit on the track-error. Roll $$\cite{R92}$$ noted that problem $$(\ref{er_tev})$$ is totally independent of the benchmark and leads to the unpalatable result that the active portfolio has systematically higher risk than the benchmark and is not optimal. Therefore, in this section we solve a more advanced model by taking absolute risk into account as follows. +where $$tev$$ is a limit on the track-error. Roll [[2](#cit-R92)] noted that problem $$(\ref{er_tev})$$ is totally independent of the benchmark and leads to the unpalatable result that the active portfolio has systematically higher risk than the benchmark and is not optimal. Therefore, in this section we solve a more advanced model by taking absolute risk into account as follows. $$ \begin{equation}\label{tev_model} @@ -574,7 +574,7 @@ where $$b$$ is a benchmark portfolio. In this demonstration, it is generated syn # Conclusion -In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. [3](#cit-DGNU09) discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation $$\cite{NAGDOC}$$ on SOCP solver and $$\cite{AG03, LVBL98}$$ for more details. +In this notebook, we demonstrated how to use NAG Library to solve various quadratic models in portfolio optimization. Conic optimization is usually a good choice to solve convex QCQP. It is worth pointing out that the versatility of SOCP is not just limited to the QCQP models mentioned here. It covers a lot more problems and constraints. For example, DeMiguel et al. [[3](#cit-DGNU09)] discussed portfolio optimization with norm constraint, which can be easily transformed into an SOCP problem. We refer readers to the NAG Library documentation [[4](#cit-NAGDOC)] on SOCP solver and [[5](#cit-AG03), [6](#cit-LVBL98)] for more details. # References From b0789a4bb7116f1db3781a9f4397e219f1e7ae9c Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 12:09:07 +0200 Subject: [PATCH 105/196] Updated README links --- QCQP/Readme.md | 3 +++ README.md | 2 +- nearest_correlation_matrices/Readme.md | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index b35c5da..88e830b 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -1,3 +1,6 @@ +> ## Important Information +> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/QCQP) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP). + # Quadratically constrained quadratic programming and its applications in portfolio optimization # Correct Rendering of this notebook diff --git a/README.md b/README.md index a175af3..7ff759e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ > ## Important Information > This repository is still under development. > -> To see the documentation and a better view of this repository click [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). +> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). # Examples using the NAG Library for Java diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 34e369b..b35347b 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,3 +1,6 @@ +> ## Important Information +> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices). + # Nearest Correlation Matrices This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. From 06fcded3f82f9d20b63f7caa458972638128f847 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 12:14:54 +0200 Subject: [PATCH 106/196] Updated README links --- QCQP/Readme.md | 2 +- nearest_correlation_matrices/Readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 88e830b..b9ffc0c 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -1,5 +1,5 @@ > ## Important Information -> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/QCQP) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP). +> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/QCQP) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP). # Quadratically constrained quadratic programming and its applications in portfolio optimization diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index b35347b..593a6e6 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,5 +1,5 @@ > ## Important Information -> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices). +> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices). # Nearest Correlation Matrices From de0547c57969c74f836de8c5c1939e8292c76c66 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 12:19:18 +0200 Subject: [PATCH 107/196] Updated README links --- QCQP/Readme.md | 2 ++ nearest_correlation_matrices/Readme.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index b9ffc0c..989f982 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -1,5 +1,7 @@ > ## Important Information > This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/QCQP) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). # Quadratically constrained quadratic programming and its applications in portfolio optimization diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 593a6e6..31d7ac8 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,5 +1,7 @@ > ## Important Information > This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). # Nearest Correlation Matrices From afc82b001348126746409ade0b9de445c0841d93 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 17:19:37 +0200 Subject: [PATCH 108/196] Fixed link to examples --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ff759e..8124f07 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ This repository contains examples and demonstrations using the [NAG Library for ## Examples that ship with the product -The NAG Library for Java ships with a set of usage [examples](./simple_examples). +The NAG Library for Java ships with a set of usage [examples](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/simple_examples). ## Prerequisites From 7511163b80f5364a8b0f80edb71ef863836ad8e8 Mon Sep 17 00:00:00 2001 From: Christos Date: Thu, 14 Jan 2021 17:23:16 +0200 Subject: [PATCH 109/196] Updated Readme file --- nearest_correlation_matrices/Readme.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 31d7ac8..7a1e27d 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -7,9 +7,6 @@ This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. -# Correct Rendering of this notebook -This file has a lot of Latex and GitHub currently cannot render it on Markdown files. [Here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices/) you can read it clearly. - The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). ## Correlation Matrices From 551f45db525337972afeaa3dc5b30578b51fcb65 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:14:44 +0000 Subject: [PATCH 110/196] Simple Examples Synced --- simple_examples/int32/A00AAJE.java | 16 ++ simple_examples/int32/A00ACJE.java | 29 ++ simple_examples/int32/A00ADJE.java | 107 ++++++++ simple_examples/int32/C02AAJE.java | 174 ++++++++++++ simple_examples/int32/C02ABJE.java | 217 +++++++++++++++ simple_examples/int32/C02AFJE.java | 271 +++++++++++++++++++ simple_examples/int32/C02AGJE.java | 262 ++++++++++++++++++ simple_examples/int32/C02AHJE.java | 61 +++++ simple_examples/int32/C02AJJE.java | 65 +++++ simple_examples/int32/C02AKJE.java | 62 +++++ simple_examples/int32/C02ALJE.java | 64 +++++ simple_examples/int32/C02AMJE.java | 75 ++++++ simple_examples/int32/C02ANJE.java | 80 ++++++ simple_examples/int32/C05AUJE.java | 67 +++++ simple_examples/int32/C05AWJE.java | 59 ++++ simple_examples/int32/C05AYJE.java | 44 +++ simple_examples/int32/C05AZJE.java | 65 +++++ simple_examples/int32/C05BBJE.java | 89 ++++++ simple_examples/int32/C05MBJE.java | 95 +++++++ simple_examples/int32/C05QBJE.java | 167 ++++++++++++ simple_examples/int32/C06BAJE.java | 56 ++++ simple_examples/int32/C06FKJE.java | 91 +++++++ simple_examples/int32/C09AAJE.java | 158 +++++++++++ simple_examples/int32/D01BDJE.java | 58 ++++ simple_examples/int32/D01RJJE.java | 184 +++++++++++++ simple_examples/int32/D01RKJE.java | 173 ++++++++++++ simple_examples/int32/D01RLJE.java | 196 ++++++++++++++ simple_examples/int32/D01RMJE.java | 163 +++++++++++ simple_examples/int32/D01TCJE.java | 45 ++++ simple_examples/int32/D02NEJE.java | 388 ++++++++++++++++++++++++++ simple_examples/int32/D02TLJE.java | 290 ++++++++++++++++++++ simple_examples/int32/D03PCJE.java | 217 +++++++++++++++ simple_examples/int32/D03RAJE.java | 307 +++++++++++++++++++++ simple_examples/int32/D03RBJE.java | 388 ++++++++++++++++++++++++++ simple_examples/int32/D05BAJE.java | 111 ++++++++ simple_examples/int32/D05BEJE.java | 185 +++++++++++++ simple_examples/int32/DTFSMJE.java | 54 ++++ simple_examples/int32/E01DAJE.java | 182 +++++++++++++ simple_examples/int32/E02ALJE.java | 101 +++++++ simple_examples/int32/E04ABJE.java | 76 ++++++ simple_examples/int32/E04BBJE.java | 81 ++++++ simple_examples/int32/E04CBJE.java | 90 +++++++ simple_examples/int32/E04FCJE.java | 420 +++++++++++++++++++++++++++++ simple_examples/int32/E04FFJE.java | 140 ++++++++++ simple_examples/int32/E04GBJE.java | 183 +++++++++++++ simple_examples/int32/E04GGJE.java | 219 +++++++++++++++ simple_examples/int32/E04MTJE.java | 132 +++++++++ simple_examples/int32/E04MXJE.java | 292 ++++++++++++++++++++ simple_examples/int32/E04NCJE.java | 246 +++++++++++++++++ simple_examples/int32/E04NFJE.java | 234 ++++++++++++++++ simple_examples/int32/E04NKJE.java | 295 ++++++++++++++++++++ simple_examples/int32/E04NQJE.java | 384 ++++++++++++++++++++++++++ simple_examples/int32/E04PTJE.java | 344 +++++++++++++++++++++++ simple_examples/int32/E04RPJE.java | 199 ++++++++++++++ simple_examples/int32/E04RSJE.java | 229 ++++++++++++++++ simple_examples/int32/E04RTJE.java | 225 ++++++++++++++++ simple_examples/int32/E04SAJE.java | 104 +++++++ simple_examples/int32/E04TAJE.java | 188 +++++++++++++ simple_examples/int32/E04TCJE.java | 263 ++++++++++++++++++ simple_examples/int32/E04UCJE.java | 211 +++++++++++++++ simple_examples/int32/E04YAJE.java | 112 ++++++++ simple_examples/int32/F01ADJE.java | 39 +++ simple_examples/int32/F01CKJE.java | 60 +++++ simple_examples/int32/F01CRJE.java | 47 ++++ simple_examples/int32/F01DGJE.java | 72 +++++ simple_examples/int32/F01ELJE.java | 89 ++++++ simple_examples/int32/F01EMJE.java | 106 ++++++++ simple_examples/int32/F02EKJE.java | 227 ++++++++++++++++ simple_examples/int32/F02FKJE.java | 230 ++++++++++++++++ simple_examples/int32/F02WGJE.java | 132 +++++++++ simple_examples/int32/F03BAJE.java | 108 ++++++++ simple_examples/int32/F04AMJE.java | 114 ++++++++ simple_examples/int32/F04BAJE.java | 144 ++++++++++ simple_examples/int32/F05AAJE.java | 99 +++++++ simple_examples/int32/F06CLJE.java | 40 +++ simple_examples/int32/F07AAJE.java | 90 +++++++ simple_examples/int32/F07ABJE.java | 134 +++++++++ simple_examples/int32/F07ADJE.java | 72 +++++ simple_examples/int32/F07AQJE.java | 99 +++++++ simple_examples/int32/F07FAJE.java | 79 ++++++ simple_examples/int32/F07FBJE.java | 122 +++++++++ simple_examples/int32/F08BTJE.java | 228 ++++++++++++++++ simple_examples/int32/F08FAJE.java | 113 ++++++++ simple_examples/int32/F08XPJE.java | 297 ++++++++++++++++++++ simple_examples/int32/G01ALJE.java | 55 ++++ simple_examples/int32/G02AKJE.java | 68 +++++ simple_examples/int32/G02BJJE.java | 303 +++++++++++++++++++++ simple_examples/int32/G02BRJE.java | 134 +++++++++ simple_examples/int32/G02DAJE.java | 187 +++++++++++++ simple_examples/int32/G02EEJE.java | 184 +++++++++++++ simple_examples/int32/G02MAJE.java | 130 +++++++++ simple_examples/int32/G03GAJE.java | 355 ++++++++++++++++++++++++ simple_examples/int32/G05KFJE.java | 105 ++++++++ simple_examples/int32/G13AWJE.java | 31 +++ simple_examples/int32/G13MEJE.java | 160 +++++++++++ simple_examples/int32/G13NAJE.java | 123 +++++++++ simple_examples/int32/H02BBJE.java | 92 +++++++ simple_examples/int32/H02DAJE.java | 228 ++++++++++++++++ simple_examples/int32/M01CCJE.java | 42 +++ simple_examples/int32/S01BAJE.java | 39 +++ simple_examples/int32/S10AAJE.java | 40 +++ simple_examples/int32/S10ABJE.java | 41 +++ simple_examples/int32/S10ACJE.java | 41 +++ simple_examples/int32/S14ABJE.java | 71 +++++ simple_examples/int32/S14ACJE.java | 68 +++++ simple_examples/int32/S14AFJE.java | 80 ++++++ simple_examples/int32/S17DCJE.java | 69 +++++ simple_examples/int32/S17DGJE.java | 61 +++++ simple_examples/int32/S30AAJE.java | 109 ++++++++ simple_examples/int32/S30ACJE.java | 129 +++++++++ simple_examples/int32/X03AAJE.java | 87 ++++++ simple_examples/int32/X04CBJE.java | 53 ++++ simple_examples/int32/X05ABJE.java | 25 ++ 113 files changed, 15934 insertions(+) create mode 100644 simple_examples/int32/A00AAJE.java create mode 100644 simple_examples/int32/A00ACJE.java create mode 100644 simple_examples/int32/A00ADJE.java create mode 100644 simple_examples/int32/C02AAJE.java create mode 100644 simple_examples/int32/C02ABJE.java create mode 100644 simple_examples/int32/C02AFJE.java create mode 100644 simple_examples/int32/C02AGJE.java create mode 100644 simple_examples/int32/C02AHJE.java create mode 100644 simple_examples/int32/C02AJJE.java create mode 100644 simple_examples/int32/C02AKJE.java create mode 100644 simple_examples/int32/C02ALJE.java create mode 100644 simple_examples/int32/C02AMJE.java create mode 100644 simple_examples/int32/C02ANJE.java create mode 100644 simple_examples/int32/C05AUJE.java create mode 100644 simple_examples/int32/C05AWJE.java create mode 100644 simple_examples/int32/C05AYJE.java create mode 100644 simple_examples/int32/C05AZJE.java create mode 100644 simple_examples/int32/C05BBJE.java create mode 100644 simple_examples/int32/C05MBJE.java create mode 100644 simple_examples/int32/C05QBJE.java create mode 100644 simple_examples/int32/C06BAJE.java create mode 100644 simple_examples/int32/C06FKJE.java create mode 100644 simple_examples/int32/C09AAJE.java create mode 100644 simple_examples/int32/D01BDJE.java create mode 100644 simple_examples/int32/D01RJJE.java create mode 100644 simple_examples/int32/D01RKJE.java create mode 100644 simple_examples/int32/D01RLJE.java create mode 100644 simple_examples/int32/D01RMJE.java create mode 100644 simple_examples/int32/D01TCJE.java create mode 100644 simple_examples/int32/D02NEJE.java create mode 100644 simple_examples/int32/D02TLJE.java create mode 100644 simple_examples/int32/D03PCJE.java create mode 100644 simple_examples/int32/D03RAJE.java create mode 100644 simple_examples/int32/D03RBJE.java create mode 100644 simple_examples/int32/D05BAJE.java create mode 100644 simple_examples/int32/D05BEJE.java create mode 100644 simple_examples/int32/DTFSMJE.java create mode 100644 simple_examples/int32/E01DAJE.java create mode 100644 simple_examples/int32/E02ALJE.java create mode 100644 simple_examples/int32/E04ABJE.java create mode 100644 simple_examples/int32/E04BBJE.java create mode 100644 simple_examples/int32/E04CBJE.java create mode 100644 simple_examples/int32/E04FCJE.java create mode 100644 simple_examples/int32/E04FFJE.java create mode 100644 simple_examples/int32/E04GBJE.java create mode 100644 simple_examples/int32/E04GGJE.java create mode 100644 simple_examples/int32/E04MTJE.java create mode 100644 simple_examples/int32/E04MXJE.java create mode 100644 simple_examples/int32/E04NCJE.java create mode 100644 simple_examples/int32/E04NFJE.java create mode 100644 simple_examples/int32/E04NKJE.java create mode 100644 simple_examples/int32/E04NQJE.java create mode 100644 simple_examples/int32/E04PTJE.java create mode 100644 simple_examples/int32/E04RPJE.java create mode 100644 simple_examples/int32/E04RSJE.java create mode 100644 simple_examples/int32/E04RTJE.java create mode 100644 simple_examples/int32/E04SAJE.java create mode 100644 simple_examples/int32/E04TAJE.java create mode 100644 simple_examples/int32/E04TCJE.java create mode 100644 simple_examples/int32/E04UCJE.java create mode 100644 simple_examples/int32/E04YAJE.java create mode 100644 simple_examples/int32/F01ADJE.java create mode 100644 simple_examples/int32/F01CKJE.java create mode 100644 simple_examples/int32/F01CRJE.java create mode 100644 simple_examples/int32/F01DGJE.java create mode 100644 simple_examples/int32/F01ELJE.java create mode 100644 simple_examples/int32/F01EMJE.java create mode 100644 simple_examples/int32/F02EKJE.java create mode 100644 simple_examples/int32/F02FKJE.java create mode 100644 simple_examples/int32/F02WGJE.java create mode 100644 simple_examples/int32/F03BAJE.java create mode 100644 simple_examples/int32/F04AMJE.java create mode 100644 simple_examples/int32/F04BAJE.java create mode 100644 simple_examples/int32/F05AAJE.java create mode 100644 simple_examples/int32/F06CLJE.java create mode 100644 simple_examples/int32/F07AAJE.java create mode 100644 simple_examples/int32/F07ABJE.java create mode 100644 simple_examples/int32/F07ADJE.java create mode 100644 simple_examples/int32/F07AQJE.java create mode 100644 simple_examples/int32/F07FAJE.java create mode 100644 simple_examples/int32/F07FBJE.java create mode 100644 simple_examples/int32/F08BTJE.java create mode 100644 simple_examples/int32/F08FAJE.java create mode 100644 simple_examples/int32/F08XPJE.java create mode 100644 simple_examples/int32/G01ALJE.java create mode 100644 simple_examples/int32/G02AKJE.java create mode 100644 simple_examples/int32/G02BJJE.java create mode 100644 simple_examples/int32/G02BRJE.java create mode 100644 simple_examples/int32/G02DAJE.java create mode 100644 simple_examples/int32/G02EEJE.java create mode 100644 simple_examples/int32/G02MAJE.java create mode 100644 simple_examples/int32/G03GAJE.java create mode 100644 simple_examples/int32/G05KFJE.java create mode 100644 simple_examples/int32/G13AWJE.java create mode 100644 simple_examples/int32/G13MEJE.java create mode 100644 simple_examples/int32/G13NAJE.java create mode 100644 simple_examples/int32/H02BBJE.java create mode 100644 simple_examples/int32/H02DAJE.java create mode 100644 simple_examples/int32/M01CCJE.java create mode 100644 simple_examples/int32/S01BAJE.java create mode 100644 simple_examples/int32/S10AAJE.java create mode 100644 simple_examples/int32/S10ABJE.java create mode 100644 simple_examples/int32/S10ACJE.java create mode 100644 simple_examples/int32/S14ABJE.java create mode 100644 simple_examples/int32/S14ACJE.java create mode 100644 simple_examples/int32/S14AFJE.java create mode 100644 simple_examples/int32/S17DCJE.java create mode 100644 simple_examples/int32/S17DGJE.java create mode 100644 simple_examples/int32/S30AAJE.java create mode 100644 simple_examples/int32/S30ACJE.java create mode 100644 simple_examples/int32/X03AAJE.java create mode 100644 simple_examples/int32/X04CBJE.java create mode 100644 simple_examples/int32/X05ABJE.java diff --git a/simple_examples/int32/A00AAJE.java b/simple_examples/int32/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/int32/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/int32/A00ACJE.java b/simple_examples/int32/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/int32/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/int32/A00ADJE.java b/simple_examples/int32/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/int32/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/int32/C02AAJE.java b/simple_examples/int32/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/int32/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/int32/C02ABJE.java b/simple_examples/int32/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/int32/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/int32/C02AFJE.java b/simple_examples/int32/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/int32/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/int32/C02AGJE.java b/simple_examples/int32/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/int32/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/int32/C02AHJE.java b/simple_examples/int32/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/int32/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/int32/C02AJJE.java b/simple_examples/int32/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/int32/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/int32/C02AKJE.java b/simple_examples/int32/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/int32/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02ALJE.java b/simple_examples/int32/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/int32/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02AMJE.java b/simple_examples/int32/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/int32/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02ANJE.java b/simple_examples/int32/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/int32/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C05AUJE.java b/simple_examples/int32/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/int32/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/int32/C05AWJE.java b/simple_examples/int32/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/int32/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/int32/C05AYJE.java b/simple_examples/int32/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/int32/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/int32/C05AZJE.java b/simple_examples/int32/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/int32/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/int32/C05BBJE.java b/simple_examples/int32/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/int32/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/C05MBJE.java b/simple_examples/int32/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/int32/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/int32/C05QBJE.java b/simple_examples/int32/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/int32/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/int32/C06BAJE.java b/simple_examples/int32/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/int32/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/int32/C06FKJE.java b/simple_examples/int32/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/int32/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/C09AAJE.java b/simple_examples/int32/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/int32/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/D01BDJE.java b/simple_examples/int32/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/int32/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/int32/D01RJJE.java b/simple_examples/int32/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/int32/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RKJE.java b/simple_examples/int32/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/int32/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RLJE.java b/simple_examples/int32/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/int32/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RMJE.java b/simple_examples/int32/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/int32/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01TCJE.java b/simple_examples/int32/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/int32/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/int32/D03PCJE.java b/simple_examples/int32/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/int32/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/D05BAJE.java b/simple_examples/int32/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/int32/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/int32/D05BEJE.java b/simple_examples/int32/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/int32/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/int32/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/int32/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/int32/E01DAJE.java b/simple_examples/int32/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/int32/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/int32/E02ALJE.java b/simple_examples/int32/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/int32/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/int32/E04ABJE.java b/simple_examples/int32/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/int32/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/int32/E04BBJE.java b/simple_examples/int32/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/int32/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/int32/E04CBJE.java b/simple_examples/int32/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/int32/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/int32/E04FCJE.java b/simple_examples/int32/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/int32/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/int32/E04FFJE.java b/simple_examples/int32/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/int32/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/int32/E04GBJE.java b/simple_examples/int32/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/int32/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/int32/E04GGJE.java b/simple_examples/int32/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/int32/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/int32/E04MTJE.java b/simple_examples/int32/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/int32/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/int32/E04MXJE.java b/simple_examples/int32/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/int32/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/int32/E04NCJE.java b/simple_examples/int32/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/int32/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/int32/E04NFJE.java b/simple_examples/int32/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/int32/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/int32/E04NKJE.java b/simple_examples/int32/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/int32/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/int32/E04NQJE.java b/simple_examples/int32/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/int32/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/int32/E04PTJE.java b/simple_examples/int32/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/int32/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/E04RPJE.java b/simple_examples/int32/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/int32/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/int32/E04RSJE.java b/simple_examples/int32/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/int32/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/int32/E04RTJE.java b/simple_examples/int32/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/int32/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/int32/E04SAJE.java b/simple_examples/int32/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/int32/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/int32/E04TAJE.java b/simple_examples/int32/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/int32/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/int32/E04TCJE.java b/simple_examples/int32/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/int32/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/int32/E04UCJE.java b/simple_examples/int32/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/int32/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/int32/E04YAJE.java b/simple_examples/int32/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/int32/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/int32/F01ADJE.java b/simple_examples/int32/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/int32/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/int32/F01CKJE.java b/simple_examples/int32/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/int32/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/int32/F01CRJE.java b/simple_examples/int32/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/int32/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/int32/F01DGJE.java b/simple_examples/int32/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/int32/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/int32/F01EMJE.java b/simple_examples/int32/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/int32/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/int32/F03BAJE.java b/simple_examples/int32/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/int32/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/int32/F04AMJE.java b/simple_examples/int32/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/int32/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/int32/F04BAJE.java b/simple_examples/int32/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/int32/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/F05AAJE.java b/simple_examples/int32/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/int32/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/int32/F06CLJE.java b/simple_examples/int32/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/int32/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/int32/F07AAJE.java b/simple_examples/int32/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/int32/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/int32/F07ABJE.java b/simple_examples/int32/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/int32/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/int32/F07ADJE.java b/simple_examples/int32/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/int32/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/int32/F07AQJE.java b/simple_examples/int32/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/int32/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/int32/F07FAJE.java b/simple_examples/int32/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/int32/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/int32/F07FBJE.java b/simple_examples/int32/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/int32/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/int32/F08BTJE.java b/simple_examples/int32/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/int32/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/int32/F08FAJE.java b/simple_examples/int32/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/int32/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/int32/F08XPJE.java b/simple_examples/int32/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/int32/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/int32/G01ALJE.java b/simple_examples/int32/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/int32/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/int32/G02AKJE.java b/simple_examples/int32/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/int32/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/int32/G02BJJE.java b/simple_examples/int32/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/int32/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/int32/G02BRJE.java b/simple_examples/int32/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/int32/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/int32/G02DAJE.java b/simple_examples/int32/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/int32/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/int32/G02EEJE.java b/simple_examples/int32/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/int32/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/int32/G02MAJE.java b/simple_examples/int32/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/int32/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/int32/G03GAJE.java b/simple_examples/int32/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/int32/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/int32/G05KFJE.java b/simple_examples/int32/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/int32/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/G13AWJE.java b/simple_examples/int32/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/int32/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/int32/G13MEJE.java b/simple_examples/int32/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/int32/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/int32/G13NAJE.java b/simple_examples/int32/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/int32/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/int32/H02BBJE.java b/simple_examples/int32/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/int32/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/int32/H02DAJE.java b/simple_examples/int32/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/int32/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/int32/M01CCJE.java b/simple_examples/int32/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/int32/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/int32/S01BAJE.java b/simple_examples/int32/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/int32/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10AAJE.java b/simple_examples/int32/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/int32/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10ABJE.java b/simple_examples/int32/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/int32/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10ACJE.java b/simple_examples/int32/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/int32/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S14ABJE.java b/simple_examples/int32/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/int32/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/int32/S14ACJE.java b/simple_examples/int32/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/int32/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/S14AFJE.java b/simple_examples/int32/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/int32/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/S17DCJE.java b/simple_examples/int32/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/int32/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/int32/S17DGJE.java b/simple_examples/int32/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/int32/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/int32/S30AAJE.java b/simple_examples/int32/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/int32/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/int32/S30ACJE.java b/simple_examples/int32/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/int32/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/int32/X03AAJE.java b/simple_examples/int32/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/int32/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/int32/X04CBJE.java b/simple_examples/int32/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/int32/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/int32/X05ABJE.java b/simple_examples/int32/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/int32/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} From 32c0c4676e46cb3dab76efeff27d3be6eca04e9b Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:17:28 +0000 Subject: [PATCH 111/196] Removed wrong files --- simple_examples/int32/A00AAJE.java | 16 -- simple_examples/int32/A00ACJE.java | 29 -- simple_examples/int32/A00ADJE.java | 107 -------- simple_examples/int32/C02AAJE.java | 174 ------------ simple_examples/int32/C02ABJE.java | 217 --------------- simple_examples/int32/C02AFJE.java | 271 ------------------- simple_examples/int32/C02AGJE.java | 262 ------------------ simple_examples/int32/C02AHJE.java | 61 ----- simple_examples/int32/C02AJJE.java | 65 ----- simple_examples/int32/C02AKJE.java | 62 ----- simple_examples/int32/C02ALJE.java | 64 ----- simple_examples/int32/C02AMJE.java | 75 ------ simple_examples/int32/C02ANJE.java | 80 ------ simple_examples/int32/C05AUJE.java | 67 ----- simple_examples/int32/C05AWJE.java | 59 ---- simple_examples/int32/C05AYJE.java | 44 --- simple_examples/int32/C05AZJE.java | 65 ----- simple_examples/int32/C05BBJE.java | 89 ------ simple_examples/int32/C05MBJE.java | 95 ------- simple_examples/int32/C05QBJE.java | 167 ------------ simple_examples/int32/C06BAJE.java | 56 ---- simple_examples/int32/C06FKJE.java | 91 ------- simple_examples/int32/C09AAJE.java | 158 ----------- simple_examples/int32/D01BDJE.java | 58 ---- simple_examples/int32/D01RJJE.java | 184 ------------- simple_examples/int32/D01RKJE.java | 173 ------------ simple_examples/int32/D01RLJE.java | 196 -------------- simple_examples/int32/D01RMJE.java | 163 ----------- simple_examples/int32/D01TCJE.java | 45 ---- simple_examples/int32/D02NEJE.java | 388 -------------------------- simple_examples/int32/D02TLJE.java | 290 -------------------- simple_examples/int32/D03PCJE.java | 217 --------------- simple_examples/int32/D03RAJE.java | 307 --------------------- simple_examples/int32/D03RBJE.java | 388 -------------------------- simple_examples/int32/D05BAJE.java | 111 -------- simple_examples/int32/D05BEJE.java | 185 ------------- simple_examples/int32/DTFSMJE.java | 54 ---- simple_examples/int32/E01DAJE.java | 182 ------------- simple_examples/int32/E02ALJE.java | 101 ------- simple_examples/int32/E04ABJE.java | 76 ------ simple_examples/int32/E04BBJE.java | 81 ------ simple_examples/int32/E04CBJE.java | 90 ------- simple_examples/int32/E04FCJE.java | 420 ----------------------------- simple_examples/int32/E04FFJE.java | 140 ---------- simple_examples/int32/E04GBJE.java | 183 ------------- simple_examples/int32/E04GGJE.java | 219 --------------- simple_examples/int32/E04MTJE.java | 132 --------- simple_examples/int32/E04MXJE.java | 292 -------------------- simple_examples/int32/E04NCJE.java | 246 ----------------- simple_examples/int32/E04NFJE.java | 234 ---------------- simple_examples/int32/E04NKJE.java | 295 -------------------- simple_examples/int32/E04NQJE.java | 384 -------------------------- simple_examples/int32/E04PTJE.java | 344 ----------------------- simple_examples/int32/E04RPJE.java | 199 -------------- simple_examples/int32/E04RSJE.java | 229 ---------------- simple_examples/int32/E04RTJE.java | 225 ---------------- simple_examples/int32/E04SAJE.java | 104 ------- simple_examples/int32/E04TAJE.java | 188 ------------- simple_examples/int32/E04TCJE.java | 263 ------------------ simple_examples/int32/E04UCJE.java | 211 --------------- simple_examples/int32/E04YAJE.java | 112 -------- simple_examples/int32/F01ADJE.java | 39 --- simple_examples/int32/F01CKJE.java | 60 ----- simple_examples/int32/F01CRJE.java | 47 ---- simple_examples/int32/F01DGJE.java | 72 ----- simple_examples/int32/F01ELJE.java | 89 ------ simple_examples/int32/F01EMJE.java | 106 -------- simple_examples/int32/F02EKJE.java | 227 ---------------- simple_examples/int32/F02FKJE.java | 230 ---------------- simple_examples/int32/F02WGJE.java | 132 --------- simple_examples/int32/F03BAJE.java | 108 -------- simple_examples/int32/F04AMJE.java | 114 -------- simple_examples/int32/F04BAJE.java | 144 ---------- simple_examples/int32/F05AAJE.java | 99 ------- simple_examples/int32/F06CLJE.java | 40 --- simple_examples/int32/F07AAJE.java | 90 ------- simple_examples/int32/F07ABJE.java | 134 --------- simple_examples/int32/F07ADJE.java | 72 ----- simple_examples/int32/F07AQJE.java | 99 ------- simple_examples/int32/F07FAJE.java | 79 ------ simple_examples/int32/F07FBJE.java | 122 --------- simple_examples/int32/F08BTJE.java | 228 ---------------- simple_examples/int32/F08FAJE.java | 113 -------- simple_examples/int32/F08XPJE.java | 297 -------------------- simple_examples/int32/G01ALJE.java | 55 ---- simple_examples/int32/G02AKJE.java | 68 ----- simple_examples/int32/G02BJJE.java | 303 --------------------- simple_examples/int32/G02BRJE.java | 134 --------- simple_examples/int32/G02DAJE.java | 187 ------------- simple_examples/int32/G02EEJE.java | 184 ------------- simple_examples/int32/G02MAJE.java | 130 --------- simple_examples/int32/G03GAJE.java | 355 ------------------------ simple_examples/int32/G05KFJE.java | 105 -------- simple_examples/int32/G13AWJE.java | 31 --- simple_examples/int32/G13MEJE.java | 160 ----------- simple_examples/int32/G13NAJE.java | 123 --------- simple_examples/int32/H02BBJE.java | 92 ------- simple_examples/int32/H02DAJE.java | 228 ---------------- simple_examples/int32/M01CCJE.java | 42 --- simple_examples/int32/S01BAJE.java | 39 --- simple_examples/int32/S10AAJE.java | 40 --- simple_examples/int32/S10ABJE.java | 41 --- simple_examples/int32/S10ACJE.java | 41 --- simple_examples/int32/S14ABJE.java | 71 ----- simple_examples/int32/S14ACJE.java | 68 ----- simple_examples/int32/S14AFJE.java | 80 ------ simple_examples/int32/S17DCJE.java | 69 ----- simple_examples/int32/S17DGJE.java | 61 ----- simple_examples/int32/S30AAJE.java | 109 -------- simple_examples/int32/S30ACJE.java | 129 --------- simple_examples/int32/X03AAJE.java | 87 ------ simple_examples/int32/X04CBJE.java | 53 ---- simple_examples/int32/X05ABJE.java | 25 -- 113 files changed, 15934 deletions(-) delete mode 100644 simple_examples/int32/A00AAJE.java delete mode 100644 simple_examples/int32/A00ACJE.java delete mode 100644 simple_examples/int32/A00ADJE.java delete mode 100644 simple_examples/int32/C02AAJE.java delete mode 100644 simple_examples/int32/C02ABJE.java delete mode 100644 simple_examples/int32/C02AFJE.java delete mode 100644 simple_examples/int32/C02AGJE.java delete mode 100644 simple_examples/int32/C02AHJE.java delete mode 100644 simple_examples/int32/C02AJJE.java delete mode 100644 simple_examples/int32/C02AKJE.java delete mode 100644 simple_examples/int32/C02ALJE.java delete mode 100644 simple_examples/int32/C02AMJE.java delete mode 100644 simple_examples/int32/C02ANJE.java delete mode 100644 simple_examples/int32/C05AUJE.java delete mode 100644 simple_examples/int32/C05AWJE.java delete mode 100644 simple_examples/int32/C05AYJE.java delete mode 100644 simple_examples/int32/C05AZJE.java delete mode 100644 simple_examples/int32/C05BBJE.java delete mode 100644 simple_examples/int32/C05MBJE.java delete mode 100644 simple_examples/int32/C05QBJE.java delete mode 100644 simple_examples/int32/C06BAJE.java delete mode 100644 simple_examples/int32/C06FKJE.java delete mode 100644 simple_examples/int32/C09AAJE.java delete mode 100644 simple_examples/int32/D01BDJE.java delete mode 100644 simple_examples/int32/D01RJJE.java delete mode 100644 simple_examples/int32/D01RKJE.java delete mode 100644 simple_examples/int32/D01RLJE.java delete mode 100644 simple_examples/int32/D01RMJE.java delete mode 100644 simple_examples/int32/D01TCJE.java delete mode 100644 simple_examples/int32/D02NEJE.java delete mode 100644 simple_examples/int32/D02TLJE.java delete mode 100644 simple_examples/int32/D03PCJE.java delete mode 100644 simple_examples/int32/D03RAJE.java delete mode 100644 simple_examples/int32/D03RBJE.java delete mode 100644 simple_examples/int32/D05BAJE.java delete mode 100644 simple_examples/int32/D05BEJE.java delete mode 100644 simple_examples/int32/DTFSMJE.java delete mode 100644 simple_examples/int32/E01DAJE.java delete mode 100644 simple_examples/int32/E02ALJE.java delete mode 100644 simple_examples/int32/E04ABJE.java delete mode 100644 simple_examples/int32/E04BBJE.java delete mode 100644 simple_examples/int32/E04CBJE.java delete mode 100644 simple_examples/int32/E04FCJE.java delete mode 100644 simple_examples/int32/E04FFJE.java delete mode 100644 simple_examples/int32/E04GBJE.java delete mode 100644 simple_examples/int32/E04GGJE.java delete mode 100644 simple_examples/int32/E04MTJE.java delete mode 100644 simple_examples/int32/E04MXJE.java delete mode 100644 simple_examples/int32/E04NCJE.java delete mode 100644 simple_examples/int32/E04NFJE.java delete mode 100644 simple_examples/int32/E04NKJE.java delete mode 100644 simple_examples/int32/E04NQJE.java delete mode 100644 simple_examples/int32/E04PTJE.java delete mode 100644 simple_examples/int32/E04RPJE.java delete mode 100644 simple_examples/int32/E04RSJE.java delete mode 100644 simple_examples/int32/E04RTJE.java delete mode 100644 simple_examples/int32/E04SAJE.java delete mode 100644 simple_examples/int32/E04TAJE.java delete mode 100644 simple_examples/int32/E04TCJE.java delete mode 100644 simple_examples/int32/E04UCJE.java delete mode 100644 simple_examples/int32/E04YAJE.java delete mode 100644 simple_examples/int32/F01ADJE.java delete mode 100644 simple_examples/int32/F01CKJE.java delete mode 100644 simple_examples/int32/F01CRJE.java delete mode 100644 simple_examples/int32/F01DGJE.java delete mode 100644 simple_examples/int32/F01ELJE.java delete mode 100644 simple_examples/int32/F01EMJE.java delete mode 100644 simple_examples/int32/F02EKJE.java delete mode 100644 simple_examples/int32/F02FKJE.java delete mode 100644 simple_examples/int32/F02WGJE.java delete mode 100644 simple_examples/int32/F03BAJE.java delete mode 100644 simple_examples/int32/F04AMJE.java delete mode 100644 simple_examples/int32/F04BAJE.java delete mode 100644 simple_examples/int32/F05AAJE.java delete mode 100644 simple_examples/int32/F06CLJE.java delete mode 100644 simple_examples/int32/F07AAJE.java delete mode 100644 simple_examples/int32/F07ABJE.java delete mode 100644 simple_examples/int32/F07ADJE.java delete mode 100644 simple_examples/int32/F07AQJE.java delete mode 100644 simple_examples/int32/F07FAJE.java delete mode 100644 simple_examples/int32/F07FBJE.java delete mode 100644 simple_examples/int32/F08BTJE.java delete mode 100644 simple_examples/int32/F08FAJE.java delete mode 100644 simple_examples/int32/F08XPJE.java delete mode 100644 simple_examples/int32/G01ALJE.java delete mode 100644 simple_examples/int32/G02AKJE.java delete mode 100644 simple_examples/int32/G02BJJE.java delete mode 100644 simple_examples/int32/G02BRJE.java delete mode 100644 simple_examples/int32/G02DAJE.java delete mode 100644 simple_examples/int32/G02EEJE.java delete mode 100644 simple_examples/int32/G02MAJE.java delete mode 100644 simple_examples/int32/G03GAJE.java delete mode 100644 simple_examples/int32/G05KFJE.java delete mode 100644 simple_examples/int32/G13AWJE.java delete mode 100644 simple_examples/int32/G13MEJE.java delete mode 100644 simple_examples/int32/G13NAJE.java delete mode 100644 simple_examples/int32/H02BBJE.java delete mode 100644 simple_examples/int32/H02DAJE.java delete mode 100644 simple_examples/int32/M01CCJE.java delete mode 100644 simple_examples/int32/S01BAJE.java delete mode 100644 simple_examples/int32/S10AAJE.java delete mode 100644 simple_examples/int32/S10ABJE.java delete mode 100644 simple_examples/int32/S10ACJE.java delete mode 100644 simple_examples/int32/S14ABJE.java delete mode 100644 simple_examples/int32/S14ACJE.java delete mode 100644 simple_examples/int32/S14AFJE.java delete mode 100644 simple_examples/int32/S17DCJE.java delete mode 100644 simple_examples/int32/S17DGJE.java delete mode 100644 simple_examples/int32/S30AAJE.java delete mode 100644 simple_examples/int32/S30ACJE.java delete mode 100644 simple_examples/int32/X03AAJE.java delete mode 100644 simple_examples/int32/X04CBJE.java delete mode 100644 simple_examples/int32/X05ABJE.java diff --git a/simple_examples/int32/A00AAJE.java b/simple_examples/int32/A00AAJE.java deleted file mode 100644 index 65b6c18..0000000 --- a/simple_examples/int32/A00AAJE.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.nag.routines.A00.A00AA; - -/** - * A00AA example program text. - */ -public class A00AAJE { - - public static void main(String[] args) { - A00AA a00aa = new A00AA(); - - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - - } - -} diff --git a/simple_examples/int32/A00ACJE.java b/simple_examples/int32/A00ACJE.java deleted file mode 100644 index 7f44ba3..0000000 --- a/simple_examples/int32/A00ACJE.java +++ /dev/null @@ -1,29 +0,0 @@ -import com.nag.routines.A00.A00AC; - -/** - * A00AC example program text. - * @author Mo - */ -public class A00ACJE { - - public static void main(String[] args) { - A00AC a00ac = new A00AC(); - boolean lmok; - - System.out.println(" A00ACJ Example Program Results\n"); - System.out.println(); - - a00ac.eval(); - - lmok = a00ac.eval(); - - if (lmok) { - System.out.println("A valid licence key is available"); - } - else { - System.out.println("No valid licence key was found"); - } - - } - -} diff --git a/simple_examples/int32/A00ADJE.java b/simple_examples/int32/A00ADJE.java deleted file mode 100644 index 139c8b9..0000000 --- a/simple_examples/int32/A00ADJE.java +++ /dev/null @@ -1,107 +0,0 @@ -import com.nag.routines.A00.A00AD; -import com.nag.routines.X05.X05AA; -import java.util.Arrays; - -/** - * A00AD example program text. - */ -public class A00ADJE { - - public static void main(String[] args) { - - A00AD a00ad = new A00AD(); - X05AA x05aa = new X05AA(); - int i, mkmaj, mkmin; - boolean licval; - String fcomp, hdware, impl, opsys, pcode, prec, vend; - int[] itime = new int[7]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - - System.out.println(" A00ADJ Example Program Results\n"); - - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - - // Output scalars must be retrieved manually - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - // Print implementation details - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/int32/C02AAJE.java b/simple_examples/int32/C02AAJE.java deleted file mode 100644 index 1abc528..0000000 --- a/simple_examples/int32/C02AAJE.java +++ /dev/null @@ -1,174 +0,0 @@ -import com.nag.routines.C02.C02AA; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.types.NAGComplex; -import java.util.Arrays; - -/** - * C02AA example program text. - * @author joed - * @since 27.1.0.0 - */ -public class C02AAJE { - - public static void main(String[] args) { - - System.out.println(" C02AAJ Example Program Results"); - - Routine.setComplex(new NAGComplex()); - exampleBasic(); - examplePolishing(); - - System.out.println(); - - } - - /** Demonstrate a basic problem. */ - public static void exampleBasic() { - - C02AA c02aa = new C02AA(); - int ifail, itmax, n, polish; - NAGComplex[] a, z; - double[] berr, cond; - int[] conv; - - System.out.println(); - System.out.println("Example 1: Basic Problem"); - System.out.println(); - - // Set polynomial degree and instantiate arrays - n = 5; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Set polynomial coefficients - a[0] = new NAGComplex(5.0, 6.0); - a[1] = new NAGComplex(30.0, 20.0); - a[2] = new NAGComplex(-0.2, -6.0); - a[3] = new NAGComplex(50.0, 100000.0); - a[4] = new NAGComplex(-2.0, 40.0); - a[5] = new NAGComplex(10.0, 1.0); - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond "); - System.out.println(" ---------------------------------------------------"); - for (int i = 0; i < n; i++) { - System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, - z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - - } - - /** Compare polishing processes on a Wilkinson-style polynomial. */ - public static void examplePolishing() { - - C02AA c02aa = new C02AA(); - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - NAGComplex pz; - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int ifail, itmax, k, n, polish; - NAGComplex[] a, z, zact; - double[] berr, cond; - int[] conv; - boolean[] matched; - - System.out.println(); - System.out.println("Example 2: Polishing Processes"); - System.out.println(); - - // Set polynomial degree and instantiate - n = 10; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = new NAGComplex[n]; - zact = new NAGComplex[n]; - - // Set known roots and (instantiate z) - for (int i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) i+1, 0.0); - z[i] = new NAGComplex(); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (int i = 0; i < n; i++) { - a[i] = new NAGComplex(); - } - a[n] = new NAGComplex(1.0, 0.0); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - a[j] = a[j+1].subtract(a[j].multiply(zact[i])); - } - a[n] = a[n].negate().multiply(zact[i]); - } - - System.out.println(" polish relerr fwderr "); - System.out.println(" ----------------------------"); - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - for (polish = 0; polish <= 2; polish++) { - - // Find roots - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - /* Calculate the maximum relative errors of the roots, and the maximum - * forward error evaluating the polynomial at those roots. Errors are - * capped at machine precision. */ - maxrelerr = maxfwderr = eps; - Arrays.fill(matched, false); - - for (int i = 0; i < n; i++) { - - // Evaluate polynomial at this root - pz = a[0].clone(); - for (int j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(a[j]); - } - - // Match to an expected root - k = 0; - err = rmax; - for (int j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - - } - -} diff --git a/simple_examples/int32/C02ABJE.java b/simple_examples/int32/C02ABJE.java deleted file mode 100644 index fad5ebb..0000000 --- a/simple_examples/int32/C02ABJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.C02.C02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AB - */ -public class C02ABJE { - - public static void main(String[] args) { - - final boolean polish_example = false; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" C02ABJ Example Program Results"); - - ex1_basic(args); - if (polish_example) { - ex2_polishing(args); - } - } - - public static void ex1_basic(String[] args) { - - int i, ifail, itmax, n = 0, polish; - - NAGComplex[] z = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - - System.out.println("\n Basic Problem\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - String line = reader.readLine(); - line = reader.readLine(); - line = reader.readLine(); - - // Read polynomial degree and allocate - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Read polynomial coefficients - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[i] = Double.parseDouble(sVal[0]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond"); - System.out.println(" -----------------------------------------------------"); - for (i = 0; i < n; i++) { - System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - } - - public static void ex2_polishing(String[] args) { - NAGComplex pz = new NAGComplex(); - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int i, ifail, itmax, j, k, n = 0, polish; - - NAGComplex[] z = null, zact = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - boolean[] matched = null; - - System.out.println("\n Polishing Processes\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i <= 12; i++) { - reader.readLine(); - } - - // Read polynomial degree and allocate - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = NAGComplex.createArray(n); - zact = NAGComplex.createArray(n); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Set known roots - for (i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) (i + 1), 0.0); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (i = 0; i < n; i++) { - a[i] = 0.0; - } - a[n] = 1.0; - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - a[j] = a[j + 1] - a[j] * zact[i].getRe(); - } - a[n] = -a[n] * zact[i].getRe(); - } - - System.out.println(" polish relerr fwderr"); - System.out.println(" ----------------------------"); - - // Use different polish modes - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - for (polish = 0; polish <= 2; polish++) { - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - // Find roots - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); - - // Calculate the maximum relative errors of the roots, and the maximum - // forward error evaluating the polynomial at those roots. Errors are - // capped at machine precision. - maxrelerr = eps; - maxfwderr = eps; - Arrays.fill(matched, false); - - for (i = 0; i < n; i++) { - // Evaluate polynomial at this root - pz = new NAGComplex(a[0], 0.0); - for (j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); - } - - // Match to an expected root - k = 0; - err = rmax; - for (j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - } -} diff --git a/simple_examples/int32/C02AFJE.java b/simple_examples/int32/C02AFJE.java deleted file mode 100644 index 6043be7..0000000 --- a/simple_examples/int32/C02AFJE.java +++ /dev/null @@ -1,271 +0,0 @@ -import com.nag.routines.C02.C02AF; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AF - */ -public class C02AFJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AFJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - - int i, ifail, n = 0; - - double[][] a = null, z = null; - double[] w = null; - - System.out.println("\n\n Example 1"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[2][n + 1]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); - } - - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[][] a = null, abar = null, z = null, zbar = null; - double[] r = null, w = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 12; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[2][n + 1]; - abar = new double[2][n + 1]; - r = new double[n]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar = 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[0][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[0][i] = f * a[0][i]; - - if (a[1][i] != 0.0E0) { - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - - } else { - - if (a[1][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] abar1d = convert2DTo1D(abar); - double[] zbar1d = convert2DTo1D(zbar); - c02af.eval(abar1d, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][j], zbar[1][j]); - deltac = Math.abs(r1 - r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0E0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j*n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AGJE.java b/simple_examples/int32/C02AGJE.java deleted file mode 100644 index c58e524..0000000 --- a/simple_examples/int32/C02AGJE.java +++ /dev/null @@ -1,262 +0,0 @@ -import com.nag.routines.C02.C02AG; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AG - */ -public class C02AGJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AGJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - double zi, zr; - int i, ifail, n = 0, nroot; - - double[] a = null, w = null; - double[][] z = null; - - System.out.println("\n\n Example 1\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - w = new double[2 * (n + 1)]; - z = new double[2][n]; - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - nroot = 0; - - while (nroot < n) { - zr = z[0][nroot]; - zi = z[1][nroot]; - if (zi == 0.0E0) { - System.out.printf(" z = %12.4E\n", zr); - nroot += 1; - } else { - System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); - nroot += 2; - } - } - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[] a = null, abar = null, r = null, w = null; - double[][] z = null, zbar = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 7; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n+1]; - abar = new double[n+1]; - r = new double[n]; - w = new double[2 * (n+1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d ,w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar= 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[i] != 0.0) { - f = 1.0 + epsbar; - epsbar = -epsbar; - abar[i] = f * a[i]; - } else { - abar[i] = 0.0E0; - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] zbar1d = convert2DTo1D(zbar); - c02ag.eval(abar, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][i], zbar[1][i]); - deltac = Math.abs(r1-r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j * n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j * n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AHJE.java b/simple_examples/int32/C02AHJE.java deleted file mode 100644 index b1e12cd..0000000 --- a/simple_examples/int32/C02AHJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.C02.C02AH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AH - */ -public class C02AHJE { - - public static void main(String[] args) { - - double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AHJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - ar = Double.parseDouble(sVal[0]); - ai = Double.parseDouble(sVal[1]); - br = Double.parseDouble(sVal[2]); - bi = Double.parseDouble(sVal[3]); - cr = Double.parseDouble(sVal[4]); - ci = Double.parseDouble(sVal[5]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AH c02ah = new C02AH(); - c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); - ifail = c02ah.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); - System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); - } - } -} diff --git a/simple_examples/int32/C02AJJE.java b/simple_examples/int32/C02AJJE.java deleted file mode 100644 index 64e3a5e..0000000 --- a/simple_examples/int32/C02AJJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C02.C02AJ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AJ - */ -public class C02AJJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AJJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - a = Double.parseDouble(sVal[0]); - b = Double.parseDouble(sVal[1]); - c = Double.parseDouble(sVal[2]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AJ c02aj = new C02AJ(); - c02aj.eval(a, b, c, zsm, zlg, ifail); - ifail = c02aj.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - - if (zsm[1] == 0.0E0) { - // 2 real roots. - System.out.printf(" z = %12.4E\n", zsm[0]); - System.out.printf(" z = %12.4E\n", zlg[0]); - } else { - // 2 complex roots. - System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); - } - } - } -} diff --git a/simple_examples/int32/C02AKJE.java b/simple_examples/int32/C02AKJE.java deleted file mode 100644 index 4a0579f..0000000 --- a/simple_examples/int32/C02AKJE.java +++ /dev/null @@ -1,62 +0,0 @@ -import com.nag.routines.C02.C02AK; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AK - */ -public class C02AKJE { - - public static void main(String[] args) { - - double r = 0, s = 0, t = 0, u = 0; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AKJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - u = Double.parseDouble(sVal[0]); - r = Double.parseDouble(sVal[1]); - s = Double.parseDouble(sVal[2]); - t = Double.parseDouble(sVal[3]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AK c02ak = new C02AK(); - c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ALJE.java b/simple_examples/int32/C02ALJE.java deleted file mode 100644 index 4f9eac9..0000000 --- a/simple_examples/int32/C02ALJE.java +++ /dev/null @@ -1,64 +0,0 @@ -import com.nag.routines.C02.C02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AL - */ -public class C02ALJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0, d = 0, e = 0; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ALJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - e = Double.parseDouble(sVal[0]); - a = Double.parseDouble(sVal[1]); - b = Double.parseDouble(sVal[2]); - c = Double.parseDouble(sVal[3]); - d = Double.parseDouble(sVal[4]); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AL c02al = new C02AL(); - c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02al.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02AMJE.java b/simple_examples/int32/C02AMJE.java deleted file mode 100644 index f1fffa4..0000000 --- a/simple_examples/int32/C02AMJE.java +++ /dev/null @@ -1,75 +0,0 @@ -import com.nag.routines.C02.C02AM; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AM - */ -public class C02AMJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex r = null, s = null, t = null, u = null; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AMJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AM c02am = new C02AM(); - c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ANJE.java b/simple_examples/int32/C02ANJE.java deleted file mode 100644 index dc865e2..0000000 --- a/simple_examples/int32/C02ANJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.C02.C02AN; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AN - */ -public class C02ANJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex a = null, b = null, c = null, d = null, e = null; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ANJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AN c02an = new C02AN(); - c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02an.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C05AUJE.java b/simple_examples/int32/C05AUJE.java deleted file mode 100644 index d2b09b1..0000000 --- a/simple_examples/int32/C05AUJE.java +++ /dev/null @@ -1,67 +0,0 @@ -import com.nag.routines.C05.C05AU; - -/** - * C05AUJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05AUJE{ - - /** - * C05AUJ main program - */ - public static void main(String[] args){ - double a = 0, b = 0, eps, eta, h, x; //placeholders - int ifail; - double[] ruser; - int[] iuser; - - ruser = new double[1]; //need to initialise before passing to wrapper - iuser = new int[1]; - - System.out.println("C05AUJ Example Program Results"); - - x = 1; - h = 0.1; - eps = 0.00001; - eta = 0; - - //Instance of class f to pass to wrapper - f f1 = new f(); - - ifail = -1; - C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); - c05au.eval(); - - //update values - x = c05au.getX(); - a = c05au.getA(); - b = c05au.getB(); - ifail = c05au.getIFAIL(); - - System.out.println(); - - switch(ifail){ - case 0: - System.out.printf("Root is : \t%.5f\n", x); - System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); - break; - case 3: - case 4: - System.out.printf("Final value = %.5f\n", x); - break; - } - } - - /** - * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. - * eval() must be implemented by the user. - * @return x - e^x - */ - public static class f extends C05AU.Abstract_C05AU_F{ - public double eval(){ - return(this.X - Math.exp(-this.X)); - } - } -} - diff --git a/simple_examples/int32/C05AWJE.java b/simple_examples/int32/C05AWJE.java deleted file mode 100644 index 6ea3c9f..0000000 --- a/simple_examples/int32/C05AWJE.java +++ /dev/null @@ -1,59 +0,0 @@ -import com.nag.routines.C05.C05AW; - -public class C05AWJE{ - - public static void main(String[] args){ - double eps, eta, x; - int ifail, nfmax; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("C05AWJ Example Program Results"); - System.out.println(); - - boolean finished = false; - for(int i = 3; i <= 4; i++){ - eps = Math.pow(10, -i); - x = 1; - eta = 0; - nfmax = 200; - - ifail = -1; - f f1 = new f(); - C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); - c05aw.eval(); - - ifail = c05aw.getIFAIL(); - x = c05aw.getX(); - eps = c05aw.getEPS(); - - switch(ifail){ - case(0): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - case(-1): - //exit loop - finished = true; - break; - case(3): - case(4): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - } - if(finished){ - break; - } - } - } - - public static class f extends C05AW.Abstract_C05AW_F{ - public double eval(){ - return(Math.exp(-X) - X); - } - } -} - - diff --git a/simple_examples/int32/C05AYJE.java b/simple_examples/int32/C05AYJE.java deleted file mode 100644 index c9ee43b..0000000 --- a/simple_examples/int32/C05AYJE.java +++ /dev/null @@ -1,44 +0,0 @@ -import com.nag.routines.C05.C05AY; - -/** - * C05AY example program text. - */ -public class C05AYJE { - - public static void main(String[] args) { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - int ifail = 0; - int[] iuser = new int[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch (ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/int32/C05AZJE.java b/simple_examples/int32/C05AZJE.java deleted file mode 100644 index 7c3e27e..0000000 --- a/simple_examples/int32/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C05.C05AZ; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * C05AZ example program text. - */ -public class C05AZJE { - - public static void main(String[] args) { - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - int ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - if (ind == 0) { - keepOn = false; - } - else { - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - - } - - switch (ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/int32/C05BBJE.java b/simple_examples/int32/C05BBJE.java deleted file mode 100644 index 4723773..0000000 --- a/simple_examples/int32/C05BBJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.C05.C05BB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C05BBJ Example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05BBJE{ - - /** - * C05BBJE main program text - */ - public static void main(String[] args){ - NAGComplex w, z; - double resid = 0; - int branch = 0, ifail = 0; //placeholder - boolean offset = false; //placeholder - - //need to initialise first - z = new NAGComplex(); - w = new NAGComplex(); - - System.out.println("C05BBJ Example Program Results"); - - if(args.length != 1){ - System.out.println("Please specify path to data file as input"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - branch = Integer.parseInt(sVal[0]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - offset = Boolean.parseBoolean(sVal[0]); - - System.out.printf("Branch = %d\n", branch); - System.out.printf("Offset = %b\n", offset); - - System.out.println(); - System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - sVal = line.split("\\s+"); - - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - - ifail = -1; - C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); - c05bb.eval(); - - z = (NAGComplex) c05bb.getZ(); - w = (NAGComplex) c05bb.getW(); - resid = c05bb.getRESID(); - ifail = c05bb.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C05MBJE.java b/simple_examples/int32/C05MBJE.java deleted file mode 100644 index 9b46ff5..0000000 --- a/simple_examples/int32/C05MBJE.java +++ /dev/null @@ -1,95 +0,0 @@ -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ example program text. - * - * @author joed - * @since 27.0.0.0 - * - */ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ example main program. - */ - public static void main(String[] args) { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - int astart, i, ifail, m; - double[] fvec, x; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail == 0 || ifail == 8 || ifail == 9) { - if (ifail == 0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/int32/C05QBJE.java b/simple_examples/int32/C05QBJE.java deleted file mode 100644 index 4b93405..0000000 --- a/simple_examples/int32/C05QBJE.java +++ /dev/null @@ -1,167 +0,0 @@ -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05QB example program text. - * @author ludovic - */ -public class C05QBJE { - - public static void main(String[] args) { - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - int[] IUSER = new int[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - } - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private int N, IFLAG; - private double[] X, FVEC, RUSER; - private int[] IUSER; - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { - - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for (int i = 1; i < N; ++i) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - for (int i = 0; i < N-1; ++i) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - } - - } - - } - -} diff --git a/simple_examples/int32/C06BAJE.java b/simple_examples/int32/C06BAJE.java deleted file mode 100644 index 541d4d3..0000000 --- a/simple_examples/int32/C06BAJE.java +++ /dev/null @@ -1,56 +0,0 @@ -import com.nag.routines.C06.C06BA; -import com.nag.routines.X01.X01AA; - -/** - * C06BAJ example program text. - * @author willa - */ -public class C06BAJE{ - - public static void main(String[] args){ - int lwork = 16, nout = 6; - int ifail, ncall; - double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; - double[] work; - - C06BA c06ba = new C06BA(); - work = new double[lwork]; - - System.out.println("C06BAJ Example Program Results"); - System.out.println(); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - - ans = Math.pow(pi, 2)/12.0; - ncall = 0; - sig = 1.0; - seqn = 0.0; - System.out.println("\t\t\t Estimated\t Actual"); - System.out.println("I\t SEQN \t RESULT\t abs error\t error"); - System.out.println(); - - for(int i = 0; i < 10; i++){ - r = (double) i + 1; - seqn = seqn + sig/Math.pow(r, 2); - - ifail = 0; - c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); - - //update variables - ncall = c06ba.getNCALL(); - result = c06ba.getRESULT(); - abserr = c06ba.getABSERR(); - - error = result - ans; - sig = -sig; - - if(i <= 2){ - System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); - } - else{ - System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); - } - } - } -} diff --git a/simple_examples/int32/C06FKJE.java b/simple_examples/int32/C06FKJE.java deleted file mode 100644 index 58db62f..0000000 --- a/simple_examples/int32/C06FKJE.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.nag.routines.C06.C06FK; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C06FKJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class C06FKJE{ - - /** - * C06FKJE main program - */ - public static void main(String[] args){ - int ifail = 0, n = 0; //placeholder - double[] work, xa, xb, ya, yb; - - work = new double[0]; - xa = new double[0]; - xb = new double[0]; - ya = new double[0]; - yb = new double[0]; //placeholders - - System.out.println("C06FKJ Example Program Results"); - System.out.println(); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - //Break when the end of the file is reached - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - work = new double[n]; - xa = new double[n]; - xb = new double[n]; - ya = new double[n]; - yb = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - xa[i] = Double.parseDouble(sVal[0]); - xb[i] = xa[i]; - ya[i] = Double.parseDouble(sVal[1]); - yb[i] = ya[i]; - } - - ifail = 0; - - C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); - c06fk1.eval(); - xa = c06fk1.getX(); - C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); - c06fk2.eval(); - xb = c06fk2.getX(); - - System.out.printf("\tCovolution \tCorrelation\n"); - System.out.println(); - - for(int i = 0; i < n; i++){ - System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C09AAJE.java b/simple_examples/int32/C09AAJE.java deleted file mode 100644 index 48c38b6..0000000 --- a/simple_examples/int32/C09AAJE.java +++ /dev/null @@ -1,158 +0,0 @@ -import com.nag.routines.C09.C09AA; -import com.nag.routines.C09.C09CC; -import com.nag.routines.C09.C09CD; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C09AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C09AAJE{ - - /** - * C09AAJ example main program - */ - public static void main(String[] args){ - int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders - String mode = "", wavnam = "", wtrans; //placeholders - int[] dwtlev, icomm; - double[] c, x, y; - - x = new double[0]; y = new double[0]; //placeholders - - //print error message if no data file given - if(args.length != 1){ - C09AAJE.usage(); - } - - icomm = new int[100]; - - System.out.println("C09AAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - wavnam = sVal[1]; - mode = sVal[2]; - - x = new double[n]; - y = new double[n]; - - System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); - - System.out.println("Input data \tX : "); - for(int i = 0; i < n; i++){ - line = reader.readLine(); - //Avoid errors with data file format and negative numbers - line = " " + line; - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - System.out.printf("%.3f\t", x[i]); - } - System.out.printf("\n"); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //Query wavelet filter dimensions - //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' - wtrans = "Multilevel"; - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); - c09aa.eval(); - - nwc = c09aa.getNWC(); - nwlmax = c09aa.getNWLMAX(); - lenc = nwc; - c = new double[lenc]; - dwtlev = new int[nwlmax + 1]; - - icomm = c09aa.getICOMM(); - ifail = 0; - //Perform discrete wavelet transform - C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); - c09cc.eval(); - - nf = c09aa.getNF(); - nwlmax = c09cc.getNWL(); - dwtlev = c09cc.getDWTLEV(); - c = c09cc.getC(); - - System.out.println(); - System.out.printf("Length of wavelet filter : \t%d\n", nf); - System.out.printf("Number of Levels : \t%d\n", nwlmax); - System.out.printf("Number of coefficients in each level: \n\t\t"); - for(int i = 0; i <= nwlmax; i++){ - System.out.printf("%d\t ", dwtlev[i]); - } - System.out.printf("\n"); - System.out.printf("Total number of wavelength coefficients : %d\n", nwc); - nnz = arraySum(dwtlev); - System.out.println(); - System.out.println("Wavelet coefficients C:"); - for(int i = 0; i < nnz; i++){ - System.out.printf("%.3f ", c[i]); - } - System.out.printf("\n"); - - //Reconstruct original data - ny = n; - - ifail = 0; - lenc = c09cc.getLENC(); - icomm = c09cc.getICOMM(); - C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); - c09cd.eval(); - - y = c09cd.getY(); - System.out.println(); - System.out.printf("Reconstruction \tY : \n"); - for(int i = 0; i < ny; i++){ - System.out.printf("%.3f ", y[i]); - } - System.out.printf("\n"); - } - - /** - * Finds the sum of all integers in an array - * @param a - * Array to sum - * @return total - */ - private static int arraySum(int[] a){ - int tot = 0; - for(int i = 0; i < a.length; i++){ - tot += a[i]; - } - return tot; - } - - /** - * No arguments supplied when exmaple runs - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/D01BDJE.java b/simple_examples/int32/D01BDJE.java deleted file mode 100644 index 8659cc4..0000000 --- a/simple_examples/int32/D01BDJE.java +++ /dev/null @@ -1,58 +0,0 @@ -import com.nag.routines.D01.D01BD; - -/** - * D01BD example program text. - */ -public class D01BDJE { - - public static void main(String[] args) { - - double a = 0.0, b = 1.0; - double epsabs = 0.0, epsrel = 0.0001; - double result = Double.NaN; - double abserr = Double.NaN; - FUN fun = new FUN(); - D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); - - d01bd.eval(); - result = d01bd.getRESULT(); - abserr = d01bd.getABSERR(); - - System.out.println(" D01BDJ Example Program Results"); - - System.out.println(); - System.out.printf(" A - lower limit of integration = %10.4f\n",a); - System.out.printf(" B - upper limit of integration = %10.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.println(); - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.println(); - - if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - } - -} diff --git a/simple_examples/int32/D01RJJE.java b/simple_examples/int32/D01RJJE.java deleted file mode 100644 index 9eee98a..0000000 --- a/simple_examples/int32/D01RJJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.D01.D01RJ; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RJ example program text. - * @author Mo - */ -public class D01RJJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RJJ Example Program Results"); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - /* pass constant to f through ruser */ - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RJ d01rj = new D01RJ(); - ifail = -1; - d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rj.getRESULT(); - abserr = d01rj.getABSERR(); - ifail = d01rj.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); - System.out.println(); - } - - } - - } - - public static class F implements D01RJ.D01RJ_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int i = 0; i < NX; i++) { - if (X[i] == 1.0) { - /* An undefined result will be generated. */ - /* Set iflag to force an immediate exit */ - IFLAG = -1; - /* Store chosen value of iflag in iuser */ - IUSER[0] = IFLAG; - } - } - if (IFLAG != -1) { - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j])/ - Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RKJE.java b/simple_examples/int32/D01RKJE.java deleted file mode 100644 index 20c0501..0000000 --- a/simple_examples/int32/D01RKJE.java +++ /dev/null @@ -1,173 +0,0 @@ -import com.nag.routines.D01.D01RK; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RK example program text. - * @author Mo - */ -public class D01RKJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, key, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RKJ Example Program Results"); - - key = 6; - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RK d01rk = new D01RK(); - ifail = -1; - d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rk.getRESULT(); - abserr = d01rk.getABSERR(); - ifail = d01rk.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RK.D01RK_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RLJE.java b/simple_examples/int32/D01RLJE.java deleted file mode 100644 index c8a6d0e..0000000 --- a/simple_examples/int32/D01RLJE.java +++ /dev/null @@ -1,196 +0,0 @@ -import com.nag.routines.D01.D01RL; -import java.util.Arrays; - -/** - * D01RL example program text. - * @author Mo - */ -public class D01RLJE { - - public static void main(String[] args) { - - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] points, rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub, npts; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RLJ Example Program Results"); - - epsabs = 0.0; - epsrel = 0.0001; - a = 0.0; - b = 1.0; - npts = 1; - maxsub = 20; - liinfo = 2*Math.max(maxsub,npts) + npts + 4; - lrinfo = 4*Math.max(maxsub,npts) + npts + 6; - - points = new double[npts]; - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[21]; - - points[0] = 1.0/7.0; - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RL d01rl = new D01RL(); - ifail = -1; - d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - points = d01rl.getPOINTS(); - result = d01rl.getRESULT(); - abserr = d01rl.getABSERR(); - ifail = d01rl.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F"); - System.out.println(); - } - - } - - } - - public static class F implements D01RL.D01RL_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - /*for (int i = 0; i < NX; i++) {*/ - /*FV[i] = 0.0;*/ - /*}*/ - - for (int i = 0; i < NX; i++) { - FV[i] = Math.abs(X[i] - 1.0/7.0); - } - - for (int i = 0; i < NX; i++) { - if (FV[i] == 0.0) { - /* A singular point will be hit. */ - /* Record offending abscissae and abort computation. */ - IFLAG = 0; - for (int k = 0; k < NX; k++) { - if (FV[k] == 0.0) { - IFLAG = IFLAG + 1; - RUSER[IFLAG-1] = X[k]; - } - } - /* Store value of iflag in iuser */ - IUSER[0] = IFLAG; - /* signal abort by setting iflag<0 */ - IFLAG = -IFLAG; - } - } - if (IFLAG == 0) { - /* Safe to evaluate. */ - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/Math.sqrt(FV[j]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RMJE.java b/simple_examples/int32/D01RMJE.java deleted file mode 100644 index 6e80b2b..0000000 --- a/simple_examples/int32/D01RMJE.java +++ /dev/null @@ -1,163 +0,0 @@ -import com.nag.routines.D01.D01RM; -import java.util.Arrays; - -/** - * D01RM example program text. - * @author Mo - */ -public class D01RMJE { - - public static void main(String[] args) { - - double bound, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, inf, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RMJ Example Program Results"); - - bound = 0.0; - inf = 1; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RM d01rm = new D01RM(); - ifail = -1; - d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rm.getRESULT(); - abserr = d01rm.getABSERR(); - ifail = d01rm.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",bound); - System.out.println(" B - upper limit of integration = infinity\n"); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RM.D01RM_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01TCJE.java b/simple_examples/int32/D01TCJE.java deleted file mode 100644 index cde8428..0000000 --- a/simple_examples/int32/D01TCJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.routines.D01.D01TC; -import java.util.Arrays; - -/** - * D01TC example program text. - * @author Mo - */ -public class D01TCJE { - - public static void main(String[] args) { - - double a, b, c, d; - double[] abscis, weight; - int n, ifail, itype; - - /* Header */ - System.out.println(" D01TCJ Example Program Results"); - - n = 7; - a = 0.0; - b = 1.0; - c = 0.0; - d = 0.0; - itype = -3; - - abscis = new double[n]; - weight = new double[n]; - - D01TC d01tc = new D01TC(); - ifail = 0; - d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); - abscis= d01tc.getABSCIS(); - weight = d01tc.getWEIGHT(); - - System.out.println(); - System.out.printf(" Laguerre formula, %2d points\n",n); - System.out.println(); - System.out.println(" Abscissae Weights\n"); - for (int j = 0; j < n; j++) { - System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); - } - - } - -} diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java deleted file mode 100644 index 34a5b25..0000000 --- a/simple_examples/int32/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java deleted file mode 100644 index 601b3ce..0000000 --- a/simple_examples/int32/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/int32/D03PCJE.java b/simple_examples/int32/D03PCJE.java deleted file mode 100644 index 4901e2e..0000000 --- a/simple_examples/int32/D03PCJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.D03.D03PC; -import com.nag.routines.D03.D03PZ; -import com.nag.routines.X01.X01AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.StringBuilder; - -/** - * D03PCJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D03PCJE{ - - /** - * D03PCJE main program - */ - public static void main(String[] args){ - int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; - double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; - int[] isave, iuser, iwsav; - double[] rsave, u, uout, x, xout, ruser, rwsav; - boolean[] lwsav; - String[] cwsav; - - xout = new double[0]; // placeholders - ruser = new double[1]; - rwsav = new double[1100]; - iuser = new int[1]; - iwsav = new int[505]; - lwsav = new boolean[100]; - cwsav = new String[10]; - - System.out.println("D03PCJ Example Program Results"); - - //Specify path to data file - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - intpts = Integer.parseInt(sVal[0]); - npts = Integer.parseInt(sVal[1]); - itype = Integer.parseInt(sVal[2]); - - xout = new double[intpts]; - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < intpts; i++){ - xout[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.split("\\s+"); - acc = Double.parseDouble(sVal[0]); - alpha = Double.parseDouble(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - itrace = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - ts = Double.parseDouble(sVal[0]); - tout = Double.parseDouble(sVal[1]); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - neqn = npde * npts; - lisave = neqn + 24; - nwk = (10 + (6 * npde)) * neqn; - lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; - - rsave = new double[lrsave]; - u = new double[npde * npts]; - uout = new double[npde * intpts * itype]; - x = new double[npts]; - isave = new int[lisave]; - ruser[0] = alpha; - ind = 0; - itask = 1; - - X01AA x01aa = new X01AA(); - pi = x01aa.eval(); - piby2 = 0.5 * pi; - hx = piby2/(double)(npts - 1); - x[0] = 0.0; - x[npts - 1] = 1.0; - for(int i = 1; i < (npts - 1); i++){ - x[i] = Math.sin(hx * (double)(i)); - } - - u = uinit(x, npts, iuser, ruser); - - //Character (80) :: cwsav(10) - //Surely a better way of doing this? - for(int i = 0; i < 10; i++){ - StringBuilder builder = new StringBuilder(""); - for(int j = 0; j < 80; j++){ - builder.append(" "); - } - cwsav[i] = builder.toString(); - } - - for(int i = 0; i <5; i++){ - tout = 10 * tout; - - ifail = 0; - pdedef pdedef1 = new pdedef(); - bndary bndary1 = new bndary(); - D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, - isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, - rwsav, ifail); - d03pc.eval(); - - //update ind - ind = d03pc.getIND(); - - if(i == 0){ - System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); - System.out.printf("T / X "); - for(int j = 0; j < xout.length; j++){ - System.out.printf("\t%.4f", xout[j]); - } - System.out.printf("\n"); - } - System.out.println(); - - //Interpolate at required spatial points - ifail = 0; - - D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); - d03pz.eval(); - - System.out.printf("%.4f \tU(1)", tout); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2]); - } - System.out.printf("\n"); - System.out.printf("\tU(2)"); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2 + 1]); - } - System.out.printf("\n"); - System.out.println(); - } - - System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); - System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); - System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); - System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); - } - - /** - * PDE initial condition - */ - public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ - double alpha = ruser[0]; - double[] u = new double[2 * npts]; - for(int i = 0; i < npts; i++){ - u[2 * i] = 2 * alpha * x[i]; - u[(2 * i) + 1] = 1; - } - return u; - } - - public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ - public void eval(){ - double alpha = this.RUSER[0]; - this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); - this.Q[1] = 0; - this.R[0] = this.X * this.UX[0]; - this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); - this.P[0] = 0; - this.P[1] = 0; - this.P[2] = 0; - this.P[3] = 1 - (this.X * this.X); - } - } - - public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ - public void eval(){ - if(this.IBND == 0){ - this.BETA[0] = 0; - this.BETA[1] = 1; - this.GAMMA[0] = this.U[0]; - this.GAMMA[1] = -this.U[0] * this.U[1]; - } - else{ - this.BETA[0] = 1; - this.BETA[1] = 0; - this.GAMMA[0] = -this.U[0]; - this.GAMMA[1] = this.U[1]; - } - } - } - -} - - - diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java deleted file mode 100644 index 88d49aa..0000000 --- a/simple_examples/int32/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java deleted file mode 100644 index 9b1b482..0000000 --- a/simple_examples/int32/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/D05BAJE.java b/simple_examples/int32/D05BAJE.java deleted file mode 100644 index 7a8caf7..0000000 --- a/simple_examples/int32/D05BAJE.java +++ /dev/null @@ -1,111 +0,0 @@ -import com.nag.routines.D05.D05BA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BAJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D05BAJE{ - - /** - * D05BAJE main program - */ - public static void main(String[] args){ - double alim, h, hi, si, thresh, tlim, tol; - int ifail, iorder, lwk, nmesh = 6; - String method; - double[] errest, yn, work; - - errest = new double[nmesh]; - yn = new double[nmesh]; - - System.out.println("D05BAJ Example Program Results"); - - method = "A"; - iorder = 6; - alim = 0; - tlim = 20; - h = (tlim - alim) / (double) nmesh; - tol = 0.001; - X02AJ x02aj = new X02AJ(); - thresh = x02aj.eval(); - lwk = 10 * nmesh + 6; - work = new double[lwk]; - - //Loop until the supplied workspace is big enough - //breakflag used to exit loop - boolean breakflag = false; - while(true){ - ifail = 1; - - ck ck1 = new ck(); - cf cf1 = new cf(); - cg cg1 = new cg(); - - D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, - tol, thresh, work, lwk, ifail); - d05ba.eval(); - - //update - ifail = d05ba.getIFAIL(); - lwk = d05ba.getLWK(); - work = d05ba.getWORK(); - - switch(ifail){ - case 5: - lwk = (int) work[0]; - work = new double[lwk]; - break; - case 6: - lwk = (int) work[0]; - work = new double[lwk]; - break; - default: - breakflag = true; - } - - if(breakflag == true){ - break; - } - } - - if(ifail != 0){ - System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); - } - - System.out.println(); - System.out.printf("Size of workplace = %d\n", lwk); - System.out.printf("Tolerance = %.4e\n", tol); - System.out.println(); - System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); - for(int i = 0; i < nmesh; i++){ - hi = (double) (i + 1) * h; - si = sol(hi); - System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); - } - } - - private static double sol(double t){ - return Math.log(t + Math.exp(1)); - } - - public static class ck extends D05BA.Abstract_D05BA_CK{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cf extends D05BA.Abstract_D05BA_CF{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cg extends D05BA.Abstract_D05BA_CG{ - public double eval(){ - return (this.Y + Math.exp(-this.Y)); - } - } -} - diff --git a/simple_examples/int32/D05BEJE.java b/simple_examples/int32/D05BEJE.java deleted file mode 100644 index f98bea3..0000000 --- a/simple_examples/int32/D05BEJE.java +++ /dev/null @@ -1,185 +0,0 @@ -import com.nag.routines.D05.D05BE; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BEJ example program text. - * @author willa - */ -public class D05BEJE{ - - private static final int iorder = 4; - private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); - private static final int nout = 6; - private static final int lct = nmesh / 32 + 1; - private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; - - public static void main(String[] args){ - double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; - int ifail; - double[] work, yn; - int[] nct; - - work = new double[lwk]; - yn = new double[nmesh]; - nct = new int[lct]; - - System.out.println("D05BEJ Example Program Results"); - - X02AJ x02aj = new X02AJ(); - tlim = 7; - tolnl = Math.sqrt(x02aj.eval()); - h = tlim /(double) (nmesh - 1); - yn[0] = 0; - - ifail = 0; - - D05BE d05be = new D05BE(); - ck1 k1 = new ck1(); - cf1 f1 = new cf1(); - cg1 g1 = new cg1(); - d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 1"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 1; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol1(hi1)); - - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 4) && (i % 5 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - System.out.println(); - - tlim = 5; - h = tlim /(double) (nmesh - 1); - yn[0] = 1; - - ifail = 0; - - ck2 k2 = new ck2(); - cf2 f2 = new cf2(); - cg2 g2 = new cg2(); - d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 2"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 0; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol2(hi1)); - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 6) && (i % 7 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - } - - private static double sol1(double t){ - double c, pi, t1, x = 0; - - //x is dummy variable - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + t; - c = 1 / Math.sqrt(2 * pi); - - return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); - } - - private static double sol2(double t){ - return (1 / (1 + t)); - } - - private static class ck1 extends D05BE.Abstract_D05BE_CK{ - public double eval(){ - return (Math.exp(-0.5 * this.T)); - } - } - - private static class ck2 extends D05BE.Abstract_D05BE_CK{ - double pi, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - return Math.sqrt(pi); - } - } - - private static class cf1 extends D05BE.Abstract_D05BE_CF{ - double a, pi, t1, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + this.T; - a = 1 / Math.sqrt(pi * this.T); - return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); - } - } - - private static class cf2 extends D05BE.Abstract_D05BE_CF{ - double st1; - - public double eval(){ - st1 = Math.sqrt(1 + this.T); - return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); - } - } - - private static class cg1 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } - - private static class cg2 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } -} diff --git a/simple_examples/int32/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java deleted file mode 100644 index a88b114..0000000 --- a/simple_examples/int32/DTFSMJE.java +++ /dev/null @@ -1,54 +0,0 @@ -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; - -/** - * DTFSM example program text. Adapted from f06wbfe.f90 - * @author joed - */ -public class DTFSMJE { - - public static void main(String[] args) { - - double alpha = 4.21; - int ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[m*m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - a[i*m+j] = (j >= i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[(m*(m+1))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/int32/E01DAJE.java b/simple_examples/int32/E01DAJE.java deleted file mode 100644 index 10c008f..0000000 --- a/simple_examples/int32/E01DAJE.java +++ /dev/null @@ -1,182 +0,0 @@ -import com.nag.routines.E01.E01DA; -import com.nag.routines.E02.E02DF; - -/** - * E01DA example program text. - */ -public class E01DAJE { - - public static void main(String[] args) { - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = e01da.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) { - if (i <= mx) { - System.out.printf("%4d %9.4f", i+1, lamda[i]); - } - else { - System.out.printf(" "); - } - if (i <= my) { - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - } - else { - System.out.printf("\n"); - } - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = e01da.getPX(); - py = e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px, 4*ny+py); - if (4*nx+px > 4*ny+py) { - liwrk = ny + py - 4; - } - else { - liwrk = nx + px - 4; - } - double[] tx = new double[nx]; - double[] ty = new double[ny]; - double[] ff = new double[nx*ny]; - wrk = new double[lwrk]; - int[] iwrk = new int[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i < nx-1; i++) { - tx[i] = tx[i-1] + step; - } - tx[nx-1] = xhi; - - step = (yhi-ylo)/(ny-1); - ty[0] = ylo; - for (int i = 1; i < ny-1; i++) { - ty[i] = ty[i-1] + step; - } - ty[ny-1] = yhi; - - /* Evaluate the spline. */ - E02DF e02df = new E02DF(); - ifail = 0; - e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); - - ifail = e02df.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); - System.out.printf(" "); - for (int i = 0; i < nx; ++i) { - System.out.printf(" %5.2f ", tx[i]); - } - System.out.printf("\n"); - for (int i = 0; i < ny; ++i) { - System.out.printf(" %5.2f ", ty[i]); - for (int j = 0; j < nx; ++j) { - System.out.printf(" %8.3f", ff[ny*j+i]); - } - System.out.printf("\n"); - } - break; - default: - System.out.printf("\n Error detected by E02DF: %d\n", ifail); - } - - } - -} diff --git a/simple_examples/int32/E02ALJE.java b/simple_examples/int32/E02ALJE.java deleted file mode 100644 index 372f125..0000000 --- a/simple_examples/int32/E02ALJE.java +++ /dev/null @@ -1,101 +0,0 @@ -import com.nag.routines.E02.E02AL; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E02ALJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E02ALJE{ - - /** - * E02ALJ Example main program - */ - public static void main(String[] args){ - double dxx, ref = 0, s, t, xx; - int ifail, n = 0, m = 0, neval = 0; //placeholders - double[] a, x, y; - - a = new double[0]; - x = new double[0]; - y = new double[0]; //placeholders - - System.out.println("E02ALJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - m = Integer.parseInt(sVal[2]); - neval = Integer.parseInt(sVal[3]); - - a = new double[m + 1]; - x = new double[n]; - y = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - y[i] = Double.parseDouble(sVal[2]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - ifail = 0; - E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); - e02al.eval(); - - //update - ref = e02al.getREF(); - x = e02al.getX(); - y = e02al.getY(); - - - System.out.println(); - System.out.printf(" Polynomial coefficients\n"); - for(int i = 0; i <= m; i++){ - System.out.printf("\t%.4e\n", a[i]); - } - System.out.println(); - System.out.printf(" Reference deviation = %.2e\n", ref); - System.out.println(); - System.out.printf("\tX\tFit\texp(x)\tResidual\n"); - - dxx = 1/(double)(neval - 1); - - for(int j = 0; j < neval; j++){ - xx = (double) j * dxx; - - s = a[m]; - - for(int i = m - 1; i >=0; i--){ - s = s * xx + a[i]; - } - - t = Math.exp(xx); - System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); - } - } -} - diff --git a/simple_examples/int32/E04ABJE.java b/simple_examples/int32/E04ABJE.java deleted file mode 100644 index 773f1ff..0000000 --- a/simple_examples/int32/E04ABJE.java +++ /dev/null @@ -1,76 +0,0 @@ -import com.nag.routines.E04.E04AB; - -/** - * E04ABJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04ABJE{ - - /** - * E04ABJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04ABJ Example Program Results"); - - //e1 and e2 are set to zero so that E04ABA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); - e04ab.eval(); - - //update - ifail = e04ab.getIFAIL(); - a = e04ab.getA(); - b = e04ab.getB(); - x = e04ab.getX(); - f = e04ab.getF(); - maxcal = e04ab.getMAXCAL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04AB.Abstract_E04AB_FUNCT{ - public void eval(){ - FC = Math.sin(this.XC) / this.XC; - } - } -} diff --git a/simple_examples/int32/E04BBJE.java b/simple_examples/int32/E04BBJE.java deleted file mode 100644 index d7032f5..0000000 --- a/simple_examples/int32/E04BBJE.java +++ /dev/null @@ -1,81 +0,0 @@ -import com.nag.routines.E04.E04BB; - -/** - * E04BBJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04BBJE{ - - /** - * E04BBJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04BBJ Example Program Results"); - - //e1 and e2 are set to zero so that E04BBA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); - e04bb.eval(); - - //update - a = e04bb.getA(); - b = e04bb.getB(); - maxcal = e04bb.getMAXCAL(); - x = e04bb.getX(); - f = e04bb.getF(); - g = e04bb.getG(); - ifail = e04bb.getIFAIL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04BB.Abstract_E04BB_FUNCT{ - public void eval(){ - this.FC = Math.sin(this.XC) / this.XC; - this.GC = (Math.cos(this.XC) - this.FC)/this.XC; - } - } -} - diff --git a/simple_examples/int32/E04CBJE.java b/simple_examples/int32/E04CBJE.java deleted file mode 100644 index fbde674..0000000 --- a/simple_examples/int32/E04CBJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.E04.E04CB; -import com.nag.routines.E04.E04CBK; -import com.nag.routines.X02.X02AJ; - -/** - * E04CBJ Example Program text - * @author willa - * @since 27.1.0.0 - */ -public class E04CBJE{ - - /** - * E04CBJE main program - */ - public static void main(String[] args){ - int n = 2, ifail, maxcal; - double f = 0, tolf, tolx; //placeholders - boolean monitoring; - int[] iuser; - double[] ruser, x; - - iuser = new int[1]; - ruser = new double[1]; - x = new double[n]; - - System.out.println("E04CBJ Example Program Results"); - - //Set monitoring to true to obtain monitoring information - monitoring = false; - - x[0] = -1.0; - x[1] = 1.0; - X02AJ x02aj = new X02AJ(); - tolf = Math.sqrt(x02aj.eval()); - tolx = Math.sqrt(tolf); - maxcal = 100; - - ifail = 0; - - funct funct1 = new funct(); - if(!monitoring){ - defMonit monit = new defMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - else{ - myMonit monit = new myMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - - System.out.println(); - System.out.printf("The final function value is \t%.4f\n", f); - System.out.printf("at the point\t"); - for(int i = 0; i < n; i++){ - System.out.printf("%.4f\t", x[i]); - } - System.out.printf("\n"); - } - - public static class funct extends E04CB.Abstract_E04CB_FUNCT{ - public void eval(){ - this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); - } - } - - public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ - public void eval(){ - System.out.println(); - System.out.printf("There have been %d function calls\n", this.NCALL); - System.out.printf("The smallest function value is %.4f\n", this.FMIN); - System.out.printf("The simplex is\n"); - for(int i = 0; i <= this.N; i++){ - for(int j = 0; j < this.N; j++){ - System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); - } - System.out.printf("\n"); - } - System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); - System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); - } - } - - //This is how to use NAG supplied function as argument - public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ - public void eval(){ - super.eval(); - } - } -} diff --git a/simple_examples/int32/E04FCJE.java b/simple_examples/int32/E04FCJE.java deleted file mode 100644 index 939f68d..0000000 --- a/simple_examples/int32/E04FCJE.java +++ /dev/null @@ -1,420 +0,0 @@ -import com.nag.routines.E04.E04FC; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04FC example program text. - * @author ludovic - */ -public class E04FCJE { - - public static void main(String[] args) { - - BufferedReader dataIn = null; - - try { - E04FC e04fc = new E04FC(); - System.out.println(" E04FCJ Example Program Results"); - dataIn = new BufferedReader(new FileReader(args[0])); - //skip header - dataIn.readLine(); - - int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, - lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; - String trans = "T"; - - double eta, fsumsq, stepmx, xtol; - eta = fsumsq = stepmx = xtol = Double.NaN; - int ifail, iprint, maxcal, nf, niter; - ifail = iprint = maxcal = nf = niter = 0; - double[] fjac = new double[m * n], - fvec = new double[m], - g = new double[n], - s = new double[n], - v = new double[ldv * n], - w = new double[lw], - x = new double[n], - y = new double[m], - t = new double[m * nt]; - - - int[] iw = new int[liw]; - - for (int i = 0; i < m; ++i) { - String[] line = dataIn.readLine().trim().split("\\s+"); - if (line.length != nt + 1) { - System.err.println("Error in data file - only " + line.length - + " records at line " + (i + 2) + " while expecting " + (nt + 1) - + " elements"); - System.exit(1); - } - y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format - for (int j = 1; j <= nt; ++j) { - t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); - } - } - - // Set IPRINT to 1 to obtain output from LSQMON at each iteration - iprint = -1; - - maxcal = 400 * n; - eta = 0.5; - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - - // We estimate that the minimum will be within 10 units of the starting point - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - - LSQFUN lsqfun = new LSQFUN(); - lsqfun.t = t; - lsqfun.y = y; - LSQMON lsqmon = new LSQMON(); - - e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, - fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); - - ifail = e04fc.getIFAIL(); - - - switch (ifail) { - case (1): - System.err.println("Unexpected ifail = " + ifail); - break; - default: - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); - System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); - lsqgrd(m, n, fvec, fjac, ldfjac, g); - System.out.print(" The estimated gradient is "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.3e\t", g[i]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int i = 0; i < m; ++i) { - System.out.printf(" %9.1e\n", fvec[i]); - } - } - - - - } - catch (Exception ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - finally { - try { - dataIn.close(); - } - catch (IOException ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - } - - - } - - public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); - dgemv.eval(); - for (int i = 0; i < g.length; ++i) { - g[i] = 2.0 * g[i]; - } - } - - public static class LSQFUN implements E04FC.E04FC_LSQFUN { - - public double[] t, y; - int IFLAG, M, N, LW, LIW; - double[] XC, FVEC, W; - int[] IW; - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, - int[] IW, int LIW, double[] W, int LW) { - for (int i = 0; i < M; ++i) { - FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; - } - } - - } - - public static class LSQMON implements E04FC.E04FC_LSQMON { - - int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; - int[] IW; - double[] XC, FVEC, FJAC, S, W; - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setFJAC(double[] FJAC) { - this.FJAC = FJAC; - } - - @Override - public double[] getFJAC() { - return FJAC; - } - - @Override - public void setLDFJAC(int LDFJAC) { - this.LDFJAC = LDFJAC; - } - - @Override - public int getLDFJAC() { - return LDFJAC; - } - - @Override - public void setS(double[] S) { - this.S = S; - } - - @Override - public double[] getS() { - return S; - } - - @Override - public void setIGRADE(int IGRADE) { - this.IGRADE = IGRADE; - } - - @Override - public int getIGRADE() { - return IGRADE; - } - - @Override - public void setNITER(int NITER) { - this.NITER = NITER; - } - - @Override - public int getNITER() { - return NITER; - } - - @Override - public void setNF(int NF) { - this.NF = NF; - } - - @Override - public int getNF() { - return NF; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, - int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, - int LIW, double[] W, int LW) { - - int ndec = 3; - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); - fsumsq = ddot.eval(); - - lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); - - gtg = ddot.eval(N, g, 1, g, 1); - // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", - NITER, NF, fsumsq, gtg, IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < N; ++j) { - System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); - } - - } - - } - -} diff --git a/simple_examples/int32/E04FFJE.java b/simple_examples/int32/E04FFJE.java deleted file mode 100644 index ad81e32..0000000 --- a/simple_examples/int32/E04FFJE.java +++ /dev/null @@ -1,140 +0,0 @@ -import com.nag.routines.E04.E04FF; -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.util.Arrays; - -/** - * E04FF example program text. - * @author joed - */ -public class E04FFJE { - - public static void main(String[] args) { - double infbnd = 1.0e20; - double[] lx, rx, ux, x, ruser, pdy, pdz; - double[] rinfo = new double[100], stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; - int[] iuser; - int[] icolrd = new int[1], irowrd = new int[1]; - long cpuser, handle; // c_ptr - MONIT monit = new MONIT(); - OBJFUN objfun = new OBJFUN(); - - /* Header */ - System.out.printf(" E04FFJ Example Program Results\n\n"); - - /* Fill problem data structure */ - pdny = 11; - pdnz = 11; - pdy = new double[] { - 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, - 8.33e-2, 7.14e-2, 6.25e-2 - }; - pdz = new double[] { - 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, - 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 - }; - nvar = 4; - nres = 11; - - /* Initialize handle */ - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define residuals structure */ - E04RM e04rm = new E04RM(); - isparse = 0; // Dense => irowrd and icolrd are not accessed - nnzrd = 1; - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set options */ - E04ZM e04zm = new E04ZM(); - ifail = 0; - e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - - /* Define starting point */ - x = new double[] {0.25, 0.39, 0.415, 0.39}; - rx = new double[nres]; - - /* Define bounds for the second and the fourth variable */ - E04RH e04rh = new E04RH(); - lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; - ux = new double[] {infbnd, 1.0, infbnd, infbnd}; - ifail = 0; - e04rh.eval(handle, nvar, lx, ux, ifail); - - /* Call the solver */ - E04FF e04ff = new E04FF(); - ifail = -1; - iuser = new int[] {pdny, pdnz}; - ruser = new double[2 * nres]; - cpuser = 0L; - for (int i = 0; i < nres; i++) { - ruser[i] = pdy[i]; - ruser[nres + i] = pdz[i]; - } - e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, - iuser, ruser, cpuser, ifail); - - /* Free handle memory */ - E04RZ e04rz = new E04RZ(); - ifail = 0; - e04rz.eval(handle, ifail); - - } - - public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { - - public void eval() { - int pdny, pdnz; - double r1, r2; - double[] pdy, pdz; - - /* Interrupt solver if the dimensions are incorrect */ - if (this.NRES != 11 || this.NVAR != 4) { - this.INFORM = -1; - return; - } - - /* Extract the problem data structure from the workspaces */ - pdny = this.IUSER[0]; - pdnz = this.IUSER[1]; - if (pdny != this.NRES || pdnz != this.NRES) { - this.INFORM = -1; - return; - } - pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); - pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); - - for (int i = 0; i < this.NRES; i++) { - r1 = pdy[i] * (pdy[i] + this.X[1]); - r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; - this.RX[i] = pdz[i] - (this.X[0] * r1/r2); - } - - } - - } - - public static class MONIT extends E04FF.Abstract_E04FF_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04GBJE.java b/simple_examples/int32/E04GBJE.java deleted file mode 100644 index 7becf21..0000000 --- a/simple_examples/int32/E04GBJE.java +++ /dev/null @@ -1,183 +0,0 @@ -import com.nag.routines.A00.A00AA; -import com.nag.routines.E04.E04GB; -import com.nag.routines.E04.E04HEV; -import com.nag.routines.E04.E04YA; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.F06PA; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04GB example program text. - */ -public class E04GBJE { - - public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; - public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; - public static final String trans = "T"; - public static double[] y; - public static double[] t; - - public static void main(String[] args) { - - double eta, fsumq = 0.0, stepmx, xtol; - int ifail, iprint, maxcal, nf = 0, niter = 0; - double[] fjac = new double[ldfjac * n]; - double[] fvec = new double[m]; - double[] g = new double[n]; - double[] s = new double[n]; - double[] v = new double[ldv * n]; - double[] w = new double[lw * n]; - double[] x = new double[n]; - int[] iw = new int[liw]; - - System.out.println(" E04GBJ Example Program Results"); - - // Data - y = new double[] { - 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, - 0.96, 1.34, 2.10, 4.39 - }; - - t = new double[m * nt]; - for (int i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - // Check LSQFUN by calling E04YA at an arbitrary point - E04YA e04ya = new E04YA(); - LSQFUN lsqfun = new LSQFUN(); - x[0] = 0.19; - x[1] = -.34; - x[2] = 0.88; - ifail = 0; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); - - // Continue setting parameters for E04GB - E04GB e04gb = new E04GB(); - LSQMON lsqmon = new LSQMON(); - LSQLIN lsqlin = new LSQLIN(); - iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration - maxcal = 50 * n; - eta = 0.09; // Since E04HEV is being used as LSQLIN - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, - stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, - liw, w, lw, ifail); - fsumq = e04gb.getFSUMSQ(); - x = e04gb.getX(); - ifail = e04gb.getIFAIL(); - - if (ifail == 0 || ifail >= 2) { - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); - System.out.printf(" at the point "); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.4f", x[ii]); - } - System.out.println(); - - lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); - - System.out.print(" The corresponding gradient is"); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.3E", g[ii]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int ii = 0; ii < m; ++ii) { - System.out.printf(" %9.1E\n", fvec[ii]); - } - System.out.println(); - } - - } - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - - for (int i = 0; i < m; i++) { - denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; - this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; - - if (this.IFLAG != 0) { - this.FJAC[i] = 1.0; - dummy = -1.0 / (denom * denom); - this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; - this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; - } - } - - } - - } - - public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { - - public static final int ndec = 3; - - /** Monitoring routine. */ - public void eval() { - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(); - - fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); - this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); - gtg = ddot.eval(this.N, g, inc1, g, inc1); - - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", - this.NITER, this.NF, fsumsq, gtg, this.IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < n; j++) { - System.out.printf(" %13.5E %9.1E %9.1E\n", - this.XC[j], g[j], this.S[j]); - } - - } - - /** Routine to evaluate gradient of the sum of squares. */ - public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); - f06pa.eval(); - - for (int i = 0; i < n; ++i) { - g[i] = 2.0 * g[i]; - } - - } - - } - - /** Using E04HEV as LSQLIN. */ - private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { - - public void eval() { - super.eval(); - } - - } - -} diff --git a/simple_examples/int32/E04GGJE.java b/simple_examples/int32/E04GGJE.java deleted file mode 100644 index 8a18c6a..0000000 --- a/simple_examples/int32/E04GGJE.java +++ /dev/null @@ -1,219 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RX; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; - -/** - * E04GG example program text. - */ -public class E04GGJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser = 0, handle = 0; - int ifail, isparse, nnzrd, nres, nvar; - - double[] blx, bux, ruser, rx, x, z; - double[] rinfo = new double[100], stats = new double[100]; - int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; - - /* Header */ - System.out.println(" E04GGJ Example Program Results\n"); - - nvar = 6; - nres = 24; - // ruser = new double[2*nres]; - // Data from Lanczos 3 Problem - ruser = new double[] { - // t(:) = - 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, - 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, - 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, - // y(:) = - 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, - 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, - 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 - }; - - iuser[0] = 0; - - // Initialize handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define residuals structure, isparse=0 means the residual structure is - // dense => irowrd and icolrd are not accessed - isparse = 0; - nnzrd = 0; - E04RM e04rm = new E04RM(); - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); - e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); - e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); - // Change printed output verbosity - e04zm.eval(handle, "Print Level = 1",ifail); - - // Define starting point - rx = new double[nres]; - z = new double[nvar]; - // x = new double[nvar]; - x = new double[] { - 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 - }; - - // Define bounds - blx = new double[nvar]; - bux = new double[nvar]; - blx[0] = 0.0; - bux[0] = 1.0; - blx[1] = -1.0; - bux[1] = infbnd; - blx[2] = -1.0; - bux[2] = infbnd; - blx[3] = -1.0; - bux[3] = infbnd; - blx[4] = -1.0; - bux[4] = 1.0; - blx[5] = -1.0; - bux[5] = 10.0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, blx, bux, ifail); - - // Call the solver - ifail = -1; - E04GG e04gg = new E04GG(); - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); - ifail = e04gg.getIFAIL(); - - // Recover latest iterate from handle if available - if (ifail == 0) { - ifail = -1; - E04RX e04rx = new E04RX(); - e04rx.eval(handle,"X",1,nvar,z,ifail); - ifail = e04rx.getIFAIL(); - if (ifail == 0) { - System.out.println("\nSolver stored solution iterate in the handle"); - System.out.print("X: "); - for (int i = 0; i < nvar; i++){ - System.out.printf("%8.2E ", z[i]); - } - System.out.println(); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - - this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int i; - - for (i = 0; i < this.RDX.length; i++) { - this.RDX[i] = 0; - } - - for (i = 0; i < this.NRES; i++) { - this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); - this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - for (int i = 0; i < this.NVAR * this.NVAR; i++) { - this.HX[i] = 0.0; - } - - double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; - - for (int i = 0; i < this.NRES; i++){ - sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); - sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); - sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); - sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); - sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); - sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); - } - - this.HX[(2-1) + (1-1) * this.NVAR] = sum21; - this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; - this.HX[(2-1) + (2-1) * this.NVAR] = sum22; - this.HX[(4-1) + (3-1) * this.NVAR] = sum43; - this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; - this.HX[(4-1) + (4-1) * this.NVAR] = sum44; - this.HX[(6-1) + (5-1) * this.NVAR] = sum65; - this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; - this.HX[(6-1) + (6-1) * this.NVAR] = sum66; - - this.INFORM = 0; - } - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - } - -} diff --git a/simple_examples/int32/E04MTJE.java b/simple_examples/int32/E04MTJE.java deleted file mode 100644 index 6272e91..0000000 --- a/simple_examples/int32/E04MTJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RF; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04MT example program text. - */ -public class E04MTJE { - - public static void main(String[] args) throws IOException { - - System.out.println(" E04MTJ Example Program Results"); - int m = 7; - int n = 7; - int nnza = 41; - int nnzc = 7; - int nnzu = 2*n + 2*m; - - int[] cindex = {1,2,3,4,5,6,7}; - double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; - int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, - 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; - int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, - 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; - double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, - 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, - 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, - 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, - 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, - 0.12, 0.02, 0.01, 0.97}; - double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, - -0.0992,-0.003}; - double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, - 1.0e20, 0.002}; - double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; - double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; - double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; - - long handle = 0; - int ifail = 0; - E04RA e04ra = new E04RA(handle,n,ifail); - e04ra.eval(); - - handle = e04ra.getHANDLE(); - - int[] icolh = new int[1]; - int[] irowh = new int[1]; - double[] h = new double[1]; - E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); - e04rf.eval(); - handle = e04ra.getHANDLE(); - - E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); - e04rh.eval(); - handle = e04rh.getHANDLE(); - - int idlc = 0; - E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); - e04rj.eval(); - handle = e04rj.getHANDLE(); - - E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); - e04zm.eval(); - e04zm.setOPTSTR("Print Solution = YES"); - e04zm.eval(); - e04zm.setOPTSTR("Print Options = NO"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); - e04zm.eval(); - handle = e04zm.getHANDLE(); - - long cpuser = 2; - int[] iuser = {1}; - double[] ruser = new double[1]; - ifail = -1; - MONIT monit = new MONIT(); - double[] x = new double[n], u = new double[nnzu]; - double[] rinfo = new double[100], stats = new double[100]; - System.out.println(); - System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); - E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, - monit,iuser,ruser,cpuser,ifail); - e04mt.eval(); - System.out.println(); - System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); - e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); - e04zm.eval(); - iuser[0] = 2; - e04mt.setIFAIL(-1); - e04mt.setHANDLE(e04zm.getHANDLE()); - e04mt.setIUSER(iuser); - e04mt.eval(); - - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - - double tol = 1.2e-8; - - if (IUSER[0] == 1) { - if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - else { - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - - } - - } - -} diff --git a/simple_examples/int32/E04MXJE.java b/simple_examples/int32/E04MXJE.java deleted file mode 100644 index 642a933..0000000 --- a/simple_examples/int32/E04MXJE.java +++ /dev/null @@ -1,292 +0,0 @@ -import com.nag.routines.E04.E04MX; -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NS; -import com.nag.routines.E04.E04NT; -import com.nag.routines.X04.X04AC; -import com.nag.routines.X04.X04AD; -import java.util.Arrays; - -/** - * E04MX example program text. - */ -public class E04MXJE { - - public static void main(String[] args) { - - /* Parameters */ - int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; - boolean readints = false; - String fname = args[0]; - /* Local Scalars */ - double obj, objadd, sinf; - int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, - maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; - boolean verboseOutput; - String start; - /* Local Arrays */ - double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; - int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; - String[] crname, cw; - String[] cuser = new String[1], pnames = new String[5]; - cuser[0] = " "; - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - - System.out.println(" E04MXJ Example Program Results"); - - // Initialize - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - maxm = 0; - maxn = 0; - maxnnz = 0; - maxnnzh = 0; - maxncolh = 0; - maxlintvar = 0; - - // Open the data file for reading - X04AC x04ac = new X04AC(); - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Prep call to E04MX in query mode - E04MX e04mx = new E04MX(); - a = new double[1]; - irowa = new int[1]; - iccola = new int[1]; - bl = new double[1]; - bu = new double[1]; - crname = new String[]{" "}; - h = new double[1]; - irowh = new int[1]; - iccolh = new int[1]; - intvar = new int[1]; - ifail = 0; - - // Placeholders for output only scalars - n = 0; - m = 0; - nnz = 0; - ncolh = 0; - nnzh = 0; - lintvar = 0; - iobj = 0; - nname = 0; - minmax = 0; - - // Make call to E04MX - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - - // Get output scalar values - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close file - X04AD x04ad = new X04AD(); - ifail = 0; - x04ad.eval(nin, ifail); - - // Set maxm, maxn and maxnnz - maxm = m; - maxn = n; - maxnnz = nnz; - maxnnzh = nnzh; - maxncolh = ncolh; - maxlintvar = (readints) ? lintvar : 1; - - // Allocate memory - irowa = new int[maxnnz]; - iccola = new int[maxn + 1]; - a = new double[maxnnz]; - bl = new double[maxn + maxm]; - bu = new double[maxn + maxm]; - crname = new String[maxn + maxm]; - for (int j = 0; j < (maxn + maxm); j++) { - crname[j] = " "; - } - irowh = new int[maxnnzh]; - iccolh = new int[maxncolh + 1]; - h = new double[maxnnzh]; - intvar = new int[maxlintvar]; - - // Open the data file for reading - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Call E04MX to read the problem - ifail = 0; - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close the data file - ifail = 0; - x04ad.eval(nin, ifail); - - /* Data has been read. Set up and run the solver */ - - iw = new int[leniw]; - rw = new double[lenrw]; - cw = new String[lencw]; - for (int j = 0; j < lencw; j++) { - cw[j] = " "; - } - - // Call E04NP to initialize workspace - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); - - // Call option setter E04NS to change the direction of optimization. - // Minimization is assumed by default. - E04NS e04ns = new E04NS(); - if (minmax == 1) { - ifail = 0; - e04ns.eval("Maximize", cw, iw, rw, ifail); - } - else if (minmax == 0) { - ifail = 0; - e04ns.eval("Feasible Point", cw, iw, rw, ifail); - } - - // Set this to TRUE to cause E04NQ to produce intermediate progress output - verboseOutput = false; - - if (verboseOutput) { - // By default E04NQ does not print monitoring information. Set the print - // file unit or the summary file unit to get information. - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", nout, cw, iw, rw, ifail); - } - else { - System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); - } - - // We have no explicit objective vector so set LENC = 0; the objective vector - // is stored in row IOBJ of ACOL. - lenc = 0; - objadd = 0.0; - start = "C"; - - c = new double[Math.max(1, lenc)]; - helast = new int[n + m]; - x = new double[n + m]; - pi = new double[m]; - rc = new double[n + m]; - hs = new int[n + m]; - iuser = new int[ncolh + 1 + nnzh]; - ruser = new double[nnzh]; - - if (ncolh > 0) { - // Store the non zeros of H in ruser for use by qphx - for (int j = 0; j < nnzh; j++) { - ruser[j] = h[j]; - } - // Store iccolh and irowh in iuser for use by qphx - for (int j = 0; j < ncolh + 1; j++) { - iuser[j] = iccolh[j]; - } - for (int j = 0; j < nnzh; j++) { - iuser[j + ncolh + 1] = irowh[j]; - } - - } - - // Call E04NQ to solve the problem - E04NQ e04nq = new E04NQ(); - QPHX qphx = new QPHX(); - ns = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - ifail = 0; - e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, - pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, - x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, - lenrw,cuser,iuser,ruser,ifail); - ns = e04nq.getNS(); - ninf = e04nq.getNINF(); - sinf = e04nq.getSINF(); - obj = e04nq.getOBJ(); - ifail = e04nq.getIFAIL(); - - if (!verboseOutput) { - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n", obj); - System.out.printf(" Optimal X = \n"); - System.out.printf(" "); - for (int j = 0; j < n; j++) { - System.out.printf("%9.2f", x[j]); - } - System.out.printf("\n"); - } - - } - - public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { - - /** - * Subroutine to compute H*x. - * Note: IUSER and RUSER contain the following data: - * RUSER(1:NNZH) = H(1:NNZH) - * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) - * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) - */ - public void eval() { - /* Local Scalars */ - int end, icol, idx, irow, start; - - Arrays.fill(HX, 0.0); - - for (icol = 0; icol < this.NCOLH + 1; ++icol) { - - start = this.IUSER[icol] - 1; - end = IUSER[icol+1] - 2; - - for (idx = start; idx < end + 1; ++idx) { - - irow = this.IUSER[this.NCOLH + 1 + idx] - 1; - this.HX[irow] += this.X[icol] * this.RUSER[idx]; - - if (irow != icol) { - this.HX[icol] += this.X[irow] * this.RUSER[idx]; - } - - } - - } - - } - - } - - -} diff --git a/simple_examples/int32/E04NCJE.java b/simple_examples/int32/E04NCJE.java deleted file mode 100644 index d6c3010..0000000 --- a/simple_examples/int32/E04NCJE.java +++ /dev/null @@ -1,246 +0,0 @@ -import static java.lang.Math.max; - -import com.nag.routines.E04.E04NC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NC example program text. - * @author ludovic - */ -public class E04NCJE { - - public static void main(String[] args) { - - double one = 1.0; - double zero = 0.0; - int inc1 = 1, lcwsav = 1, liwsav = 610, - llwsav = 120, lrwsav = 475, nin = 5, - nout = 6; - double obj; - int i, ifail, iter, lda, ldc, liwork, - lwork, m, n, nclin, sdc; - double[] a, b, bl, bu, c, - clamda, cvec, work, x; - double[] rwsav = new double[lrwsav]; - int[] istate, iwork, kx; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - String[] cwsav = new String[lcwsav]; - - System.out.println(" E04NCJ Example Program Results"); - try { - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - m = Integer.parseInt(data[0]); - n = Integer.parseInt(data[1]); - nclin = Integer.parseInt(data[2]); - - liwork = n; - ldc = max(1,nclin); - lda = max(1,m); - - if (nclin > 0) { - sdc = n; - } - else { - sdc = 1; - } - - /* This particular example problem is of type LS1, so we allocate - * A(LDA,N), CVEC(1), B(M) and define LWORK as below - */ - if (nclin > 0) { - lwork = 2*n*n + 9*n + 6*nclin; - } - else { - lwork = 9*n; - } - - /* - * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column - * ie: - * 1 1 1 - * 2 2 2 - * 3 3 3 - * - * is stored [1,2,3,1,2,3,1,2,3] - */ - istate = new int[n+nclin]; - kx = new int[n]; - iwork = new int[liwork]; - c = new double[ldc*sdc]; - bl = new double[n+nclin]; - bu = new double[n+nclin]; - cvec = new double[1]; - x = new double[n]; - a = new double[lda * n]; - b = new double[m]; - clamda = new double[n+nclin]; - work = new double[lwork]; - - /* - * Extra arrays to initialize: - */ - for (int ii = 0; ii < cwsav.length; ++ii) { - // 80 characters long... - cwsav[ii] - = " "; - } - - for (int ii = 0; ii < lda; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < n; ++jj) { - a[lda*jj+ii] = Double.parseDouble(data[jj]); - } - } - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - - for (int ii = 0; ii < m; ++ii) { - b[ii] = Double.parseDouble(data[ii]); - } - - for (int ii = 0; ii < ldc; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < sdc; ++jj) { - c[ldc*jj+ii] = Double.parseDouble(data[jj]); - } - } - - //bl and bu to complicated to read properly -> hardcoded - line = br.readLine(); - line = br.readLine(); - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = -1.0E+25; - bl[3] = 0.0; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 0.0; - bl[8] = 0.0; - bl[9] = 2.0; - bl[10] = -1.0E+25; - bl[11] = 1.0; - - line = br.readLine(); - line = br.readLine(); - bu[0] = 2.0; - bu[1] = 2.0; - bu[2] = 2.0; - bu[3] = 2.0; - bu[4] = 2.0; - bu[5] = 2.0; - bu[6] = 2.0; - bu[7] = 2.0; - bu[8] = 2.0; - bu[9] = 1.0E+25; - bu[10] = 2.0; - bu[11] = 4.0; - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int ii = 0; ii < n; ++ii) { - x[ii] = Double.parseDouble(data[ii]); - } - - // CALL TO E04WBF - ifail = 0; - String routname = "E04NCA"; - E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, - lrwsav, ifail); - e04wb.eval(); - cwsav = e04wb.getCWSAV(); - iwsav = e04wb.getIWSAV(); - lwsav = e04wb.getLWSAV(); - rwsav = e04wb.getRWSAV(); - - // CALL TO E04NCF - ifail = -1; - - /* Java needs these to be initialized, so set it to an impossible value - * to trap possible error later */ - iter = Integer.MIN_VALUE; - obj = Double.NaN; - - E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, - clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); - e04nc.eval(); - - // Getting ifail's value back - ifail = e04nc.getIFAIL(); - - switch (ifail) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 7: - System.out.println("\n Varbl Istate Value Lagr Mult\n"); - - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println("\n\n L Con Istate Value Lagr Mult\n"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); - break; - default: - if (ifail > 7) { - System.out.println(" Varbl Istate Value Lagr Mult"); - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println(" L Con Istate Value Lagr Mult"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); - } - else { - System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); - } - } - } - catch (Exception ex) { - Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - -} diff --git a/simple_examples/int32/E04NFJE.java b/simple_examples/int32/E04NFJE.java deleted file mode 100644 index e341f9f..0000000 --- a/simple_examples/int32/E04NFJE.java +++ /dev/null @@ -1,234 +0,0 @@ -import com.nag.routines.E04.E04NF; -import com.nag.routines.E04.E04NH; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E54NFU; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NF example program text. - */ -public class E04NFJE { - - public static void main(String[] args) { - - /* Local Scalars */ - double obj; - int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; - /* Local Arrays */ - double[] a, ax, bl, bu, clamda, cvec, h, work, x; - int[] istate, iwork; - - try { - - System.out.println(" E04NFJ Example Program Results"); - - if (args.length == 0) { - System.err.println("You need to provide the path to the data file e04nfae.d"); - System.exit(-1); - } - - // Read data from file - DataFile datafile = new DataFile(args[0]); - datafile.read(); - - liwork = 2 * datafile.n + 3; - lda = Math.max(1, datafile.nclin); - - sda = (datafile.nclin > 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new int[datafile.n + datafile.nclin]; - ax = new double[Math.max(1, datafile.nclin)]; - iwork = new int[liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[datafile.n + datafile.nclin]; - work = new double[lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[lcwsav]; - cwsav[0] - = " "; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - double[] rwsav = new double[lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - int[] iuser = new int[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } - catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default. */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - super.eval(); - } - - } - - public static class DataFile { - - public String filename; - public int n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file" - + " - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } - else { - sda = 1; - } - ldh = n; - - cvec = new double[n]; - a = new double[lda * sda]; - bl = new double[n + nclin]; - bu = new double[n + nclin]; - x = new double[n]; - h = new double[ldh * n]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/int32/E04NKJE.java b/simple_examples/int32/E04NKJE.java deleted file mode 100644 index 604ee66..0000000 --- a/simple_examples/int32/E04NKJE.java +++ /dev/null @@ -1,295 +0,0 @@ -import com.nag.routines.E04.E04NK; -import com.nag.routines.E04.E04WB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NKJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class E04NKJE{ - private static int lcwsav = 1; - private static int liwsav = 380; - private static int llwsav = 20; - private static int lrwsav = 285; - - /** - * E04NKJ Example main program. - */ - public static void main(String[] args){ - double obj, sinf; - int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; - String start; - double[] a, bl, bu, clamda, xs, z, ruser, rwsav; - int[] ha, istate, iz, ka, iuser, iwsav; - boolean[] lwsav; - String[] crname, cwsav, names; - - System.out.println("E04NKJ Example Program Results"); - - ruser = new double[1]; - rwsav = new double[lrwsav]; - iuser = new int[1]; - iwsav = new int[liwsav]; - - cwsav = new String[lcwsav]; - //equivalent to ```Character (80) :: cwsav(lcwsav)``` - for(i = 0; i < lcwsav; i++){ - char[] chars = new char[80]; - Arrays.fill(chars, ' '); - cwsav[i] = new String(chars); - } - names = new String[5]; - //names all blank anyway this time - for(i = 0; i < 5; i++){ - char[] chars = new char[8]; - Arrays.fill(chars, ' '); - names[i] = new String(chars); - } - - //dummy arrays - crname = new String[0]; - - n = 7; - m = 8; - nnz = 48; - iobj = 8; - ncolh = 7; - start = "C"; - nname = 15; - - ha = new int[nnz]; - ka = new int[n + 1]; - istate = new int[n + m]; - a = new double[nnz]; - bl = new double[n + m]; - bu = new double[n + m]; - xs = new double[n + m]; - clamda = new double[n + m]; - crname = new String[nname]; - lwsav = new boolean[llwsav]; - - names[0] = " "; - names[1] = " "; - names[2] = " "; - names[3] = " "; - names[4] = " "; - - crname[0] = "...X1..."; - crname[1] = "...X2..."; - crname[2] = "...X3..."; - crname[3] = "...X4..."; - crname[4] = "...X5..."; - crname[5] = "...X6..."; - crname[6] = "...X7..."; - crname[7] = "..ROW1.."; - crname[8] = "..ROW2.."; - crname[9] = "..ROW3.."; - crname[10] = "..ROW4.."; - crname[11] = "..ROW5.."; - crname[12] = "..ROW6.."; - crname[13] = "..ROW7.."; - crname[14] = "..COST.."; - - //Matrix A. Set up KA - jcol = 1; - ka[0] = 1; - - a[0] = 0.02; ha[0] = 7; - a[1] = 0.02; ha[1] = 5; - a[2] = 0.03; ha[2] = 3; - a[3] = 1.00; ha[3] = 1; - a[4] = 0.70; ha[4] = 6; - a[5] = 0.02; ha[5] = 4; - a[6] = 0.15; ha[6] = 2; - a[7] = -200.00; ha[7] = 8; - a[8] = 0.06; ha[8] = 7; - a[9] = 0.75; ha[9] = 6; - a[10] = 0.03; ha[10] = 5; - a[11] = 0.04; ha[11] = 4; - a[12] = 0.05; ha[12] = 3; - a[13] = 0.04; ha[13] = 2; - a[14] = 1.00; ha[14] = 1; - a[15] = -2000.00; ha[15] = 8; - a[16] = 0.02; ha[16] = 2; - a[17] = 1.00; ha[17] = 1; - a[18] = 0.01; ha[18] = 4; - a[19] = 0.08; ha[19] = 3; - a[20] = 0.08; ha[20] = 7; - a[21] = 0.80; ha[21] = 6; - a[22] = -2000.00; ha[22] = 8; - a[23] = 1.00; ha[23] = 1; - a[24] = 0.12; ha[24] = 7; - a[25] = 0.02; ha[25] = 3; - a[26] = 0.02; ha[26] = 4; - a[27] = 0.75; ha[27] = 6; - a[28] = 0.04; ha[28] = 2; - a[29] = -2000.00; ha[29] = 8; - a[30] = 0.01; ha[30] = 5; - a[31] = 0.80; ha[31] = 6; - a[32] = 0.02; ha[32] = 7; - a[33] = 1.00; ha[33] = 1; - a[34] = 0.02; ha[34] = 2; - a[35] = 0.06; ha[35] = 3; - a[36] = 0.02; ha[36] = 4; - a[37] = -2000.00; ha[37] = 8; - a[38] = 1.00; ha[38] = 1; - a[39] = 0.01; ha[39] = 2; - a[40] = 0.01; ha[40] = 3; - a[41] = 0.97; ha[41] = 6; - a[42] = 0.01; ha[42] = 7; - a[43] = 400.00; ha[43] = 8; - a[44] = 0.97; ha[44] = 7; - a[45] = 0.03; ha[45] = 2; - a[46] = 1.00; ha[46] = 1; - a[47] = 400.00; ha[47] = 8; - - ka[1] = 9; - ka[2] = 17; - ka[3] = 24; - ka[4] = 31; - ka[5] = 39; - ka[6] = 45; - ka[7] = 49; - - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = 4.0e2; - bl[3] = 1.0e2; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 2.0e3; - bl[8] = -1.0e25; - bl[9] = -1.0e25; - bl[10] = -1.0e25; - bl[11] = -1.0e25; - bl[12] = 1.5e3; - bl[13] = 2.5e2; - bl[14] = -1.0e25; - - bu[0] = 2.0e2; - bu[1] = 2.5e3; - bu[2] = 8.0e2; - bu[3] = 7.0e2; - bu[4] = 1.5e3; - bu[5] = 1.0e25; - bu[6] = 1.0e25; - bu[7] = 2.0e3; - bu[8] = 6.0e1; - bu[9] = 1.0e2; - bu[10] = 4.0e1; - bu[11] = 3.0e1; - bu[12] = 1.0e25; - bu[13] = 3.0e2; - bu[14] = 1.0e25; - - istate[0] = 0; - istate[1] = 0; - istate[2] = 0; - istate[3] = 0; - istate[4] = 0; - istate[5] = 0; - istate[6] = 0; - istate[7] = 0; - - xs[0] = 0.0; - xs[1] = 0.0; - xs[2] = 0.0; - xs[3] = 0.0; - xs[4] = 0.0; - xs[5] = 0.0; - xs[6] = 0.0; - xs[7] = 0.0; - - ifail = 0; - E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, - lrwsav,ifail); - e04wb.eval(); - - leniz = 1; - lenz = 1; - iz = new int[leniz]; - z = new double[lenz]; - - QPHX qphx = new QPHX(); - - ifail = 1; - - //placeholders - ns = 0; - miniz = 0; - minz = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - - E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, - crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, - leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); - e04nk.eval(); - ifail = e04nk.getIFAIL(); - - minz = e04nk.getMINZ(); - miniz = e04nk.getMINIZ(); - - lenz = minz; - leniz = miniz; - - iz = new int[leniz]; - z = new double[lenz]; - - ifail = -1; - - e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, - istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, - lwsav,iwsav,rwsav,ifail); - - //update - ifail = e04nk.getIFAIL(); - obj = e04nk.getOBJ(); - - if(ifail == 0){ - System.out.println(); - System.out.println("\tVariable Istate Value Lagr Mult"); - System.out.println(); - - for(i = 0; i < n; i++){ - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - if(m > 0){ - System.out.println(); - System.out.println(); - System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); - System.out.println(); - - for(i = n; i < n + m - 1; i++){ - System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - System.out.println(); - System.out.println(); - System.out.printf("Final objetive value = %15.7g\n", obj); - } - - } - - public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ - public void eval(){ - this.HX[0] = 2 * this.X[0]; - this.HX[1] = 2 * this.X[1]; - this.HX[2] = 2 * (this.X[2] + this.X[3]); - this.HX[3] = this.HX[2]; - this.HX[4] = 2 * this.X[4]; - this.HX[5] = 2 * (this.X[5] + this.X[6]); - this.HX[6] = this.HX[5]; - } - } -} diff --git a/simple_examples/int32/E04NQJE.java b/simple_examples/int32/E04NQJE.java deleted file mode 100644 index 6cf84fe..0000000 --- a/simple_examples/int32/E04NQJE.java +++ /dev/null @@ -1,384 +0,0 @@ -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NT; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NQ example program text. - */ -public class E04NQJE { - - public static final int LENCW = 600; - public static final int LENIW = 600; - public static final int LENRW = 600; - public static final int NIN = 5; - public static final int NOUT = 6; - - public static void main(String[] args) throws IOException { - - /* Local Scalars */ - double obj, objadd, sinf; - int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; - boolean verboseOutput; - String prob; // Length = 8 - String start; // Length = 1 - /* Local Arrays */ - double[] acol, bl, bu, c, pi, rc, x; - double[] ruser = new double[1], rw = new double[LENRW]; - int[] helast, hs, inda, loca; - int[] iuser = new int[1], iw = new int[LENIW]; - String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 - String[] names; // Length = 8 - /* Init String arrays with same length*/ - Arrays.fill(cuser, " "); - Arrays.fill(cw, " "); - - System.out.println(" E04NQJ Example Program Results"); - - /* Read data file */ - - if (args.length != 1) { - usage(); - } - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - String line; - - // Skip heading in data file - line = dataIn.readLine(); - - // Read n, m - line = dataIn.readLine(); - String[] data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 2) { - System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" - + line + "\n"+Arrays.toString(data)); - System.exit(1); - } - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - - // Read ne, iobj, ncolh, start, nname - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 5) { - System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); - System.exit(1); - } - ne = Integer.parseInt(data[0]); - iobj = Integer.parseInt(data[1]); - ncolh = Integer.parseInt(data[2]); - start = data[3].replaceAll("'",""); - nname = Integer.parseInt(data[4]); - - // Allocate - inda = new int[ne]; - loca = new int[n+1]; - helast = new int[n+m]; - hs = new int[n+m]; - acol = new double[ne]; - bl = new double[n+m]; - bu = new double[n+m]; - x = new double[n+m]; - pi = new double[m]; - rc = new double[n+m]; - names = new String[nname]; - - // Read names - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - int nameIndex = 0; - int dataIndex = 0; - while (nameIndex < nname) { - names[nameIndex] = data[dataIndex].replaceAll("'", ""); - ++nameIndex; - ++dataIndex; - if (nameIndex < nname && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read matrix - line = dataIn.readLine(); // skipping blank line - int locaIndex = 0; - int currentCol = 0; - for (i = 0; i < ne; ++i) { - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 3) { - System.out.println("The line is not well formatted for input of A:\n\t"+line); - System.exit(1); - } - acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); - inda[i] = Integer.parseInt(data[1]); - if (i == 0) { - loca[locaIndex] = 1;//storing for Fortran use: 1-based - ++locaIndex; - ++currentCol; - } - else { - int tmp = Integer.parseInt(data[2]); - if (tmp != currentCol) { - loca[locaIndex] = i+1; - ++currentCol; - ++locaIndex; - } - } - } - loca[n] = ne + 1; - - // Read bl - line = dataIn.readLine(); // skipping blank line - int blindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (blindex < bl.length) { - bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++blindex; - ++dataIndex; - if (blindex < bl.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read bu - line = dataIn.readLine(); // skipping blank line - int buindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (buindex < bu.length) { - bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++buindex; - ++dataIndex; - if (buindex < bu.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read hs - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (start.equalsIgnoreCase("C")) { - if (data.length != n) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - else { - if (data.length != n+m) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - for (i = 0; i < data.length; ++i) { - hs[i] = Integer.parseInt(data[i]); - } - - // Read x - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != n) { - System.out.println("Wrong format for X data."); - System.exit(1); - } - for (i = 0; i < data.length; ++i) { - x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); - } - - /* Done reading data file */ - - System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); - - /* Call E04NP to initialize E04NQ. */ - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); - - /* Set this to .True. to cause e04nqf to produce intermediate - * progress output. */ - verboseOutput = true; - - if (verboseOutput) { - /* By default e04nqf does not print monitoring - * information. Set the print file unit or the summary - * file unit to get information. */ - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); - } - - /* We have no explicit objective vector so set LENC = 0; the - * objective vector is stored in row IOBJ of ACOL. */ - lenc = 0; - c = new double[Math.max(1,lenc)]; - objadd = 0.0; - sinf = 0.0; - obj = Double.NaN; - prob = " "; - - /* Do not allow any elastic variables (i.e. they cannot be - * infeasible). If we'd set optional argument "Elastic mode" to 0, - * we wouldn't need to set the individual elements of array HELAST. */ - - for (int j = 0; j < (n+m); j++) { - helast[j] = 0; - } - - /* Solve the QP problem. */ - - E04NQ e04nq = new E04NQ(); - ifail = 0; - ns = 0; - ninf = 0; - e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, - inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, - iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); - - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); - System.out.print(" Optimal X = "); - for (i = 0; i < n; ++i) { - System.out.printf("%9.2f ", x[i]); - } - System.out.println(); - - } - - private static void usage() { - System.out.println("Usage:\n" - + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator - + ". E04NQJE " + File.separator + "e04nqfe.d"); - System.exit(1); - } - - public static class QPHX implements E04NQ.E04NQ_QPHX { - - private int NCOLHREF; - - public QPHX(int NCOLHREF) { - this.NCOLHREF = NCOLHREF; - } - - // @Override - public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, - String[] CUSER, int[] IUSER, double[] RUSER) { - - if (NCOLH != NCOLHREF) { - System.out.println("NCOLH value is wrong!"); - System.out.println("TEST FAILED"); - System.exit(1); - } - HX[0] = 2.0*X[0]; - HX[1] = 2.0*X[1]; - HX[2] = 2.0*(X[2]+X[3]); - HX[3] = HX[2]; - HX[4] = 2.0*X[4]; - HX[5] = 2.0*(X[5]+X[6]); - HX[6] = HX[5]; - - } - - private String[] CUSER; - private double[] HX,RUSER,X; - private int[] IUSER; - private int NCOLH, NSTATE; - - // @Override - public String[] getCUSER() { - return CUSER; - } - - // @Override - public double[] getHX() { - return HX; - } - - // @Override - public int[] getIUSER() { - return IUSER; - } - - // @Override - public int getNCOLH() { - return NCOLH; - } - - // @Override - public int getNSTATE() { - return NSTATE; - } - - // @Override - public double[] getRUSER() { - return RUSER; - } - - // @Override - public double[] getX() { - return X; - } - - // @Override - public void setCUSER(String[] arg0) { - CUSER = arg0; - - } - - // @Override - public void setHX(double[] arg0) { - HX = arg0; - - } - - // @Override - public void setIUSER(int[] arg0) { - IUSER = arg0; - - } - - // @Override - public void setNCOLH(int arg0) { - NCOLH = arg0; - - } - - // @Override - public void setNSTATE(int arg0) { - NSTATE = arg0; - - } - - // @Override - public void setRUSER(double[] arg0) { - RUSER = arg0; - - } - - // @Override - public void setX(double[] arg0) { - X = arg0; - - } - - } - - - - -} diff --git a/simple_examples/int32/E04PTJE.java b/simple_examples/int32/E04PTJE.java deleted file mode 100644 index 75303ac..0000000 --- a/simple_examples/int32/E04PTJE.java +++ /dev/null @@ -1,344 +0,0 @@ -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RB; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.F08.DSYEVD; -import java.util.Arrays; - -/** - * E04PTJ example program text. - * @author joed - * @since 27.0.0.0 - */ -public class E04PTJE { - - - /** - * Monitoring function can be used to monitor the progress - * or, for example, to implement bespoke stopping criteria. - */ - private static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - - double tol = RUSER[0]; - int tolReached = IUSER[1]; - - // If x is close to the solution, print a message - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - if (tolReached == 0) { - System.out.println(); - System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); - IUSER[1] = 1; - } - } - - } - - } - - - /** - * E04PTJ example main program. - */ - public static void main(String[] args) { - - DSYEVD dsyevd = new DSYEVD(); - E04PT e04pt = new E04PT(); - E04RA e04ra = new E04RA(); - E04RB e04rb = new E04RB(); - E04RE e04re = new E04RE(); - E04RH e04rh = new E04RH(); - E04RJ e04rj = new E04RJ(); - E04RZ e04rz = new E04RZ(); - E04ZM e04zm = new E04ZM(); - MONIT monit = new MONIT(); - - final int nqc = 1; - long cpuser, handle; - double r1; - int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, - nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; - boolean verboseOutput; - String ctype1, ctype2; // Length must be 8 - double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, - work, x, xl, xu; - double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; - int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; - int[] iuser = new int[2]; - - System.out.println("E04PTJ Example Program Results\n"); - - // Dimensions of the problem - n = 3; - nnzp0 = 6; - nnzp1 = 6; - - // Initialize size of linear constraints in SOCP - m = nqc; - na = n + nqc + 1; - nnza = nqc + n; - - // Initialize size of cone constraints - nvarc1 = 2; - nvarc2 = 2; - - // Set problem data - lwork = Math.max(2*n*n+6*n+1, 120+9*n); - liwork = 5*n + 3; - irowp0 = new int[]{1, 2, 3, 2, 3, 3}; - icolp0 = new int[]{1, 1, 1, 2, 2, 3}; - p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; - irowp1 = new int[]{1, 2, 3, 2, 3, 3}; - icolp1 = new int[]{1, 1, 1, 2, 2, 3}; - p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; - q0 = new double[]{0.847, 0.08, 0.505}; - q1 = new double[]{0.065, 0.428, 0.097}; - r1 = 1.276; - f0 = new double[n*n]; - f1 = new double[n*n]; - lambda0 = new double[n]; - lambda1 = new double[n]; - work = new double[lwork]; - iwork = new int[liwork]; - - // Store full P0 and P1 in F0 and F1 - Arrays.fill(f0, 0.0); - for (i = 0; i < nnzp0; i++) { - f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; - } - Arrays.fill(f1, 0.0); - for (i = 0; i < nnzp1; i++) { - f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; - } - - // Factorize P0 and P1 via eigenvalue decomposition - ifail = 0; - dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); - dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); - - // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 - nu = 0; - nv = 0; - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - for (j = 1; j <= n; j++) { - f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); - } - m++; - nu++; - nnza += n; - } - if (lambda1[i-1] > 0) { - for (j = 1; j <= n; j++) { - f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); - } - m++; - nv++; - nnza += n; - } - } - nnza += nu + nv; - na += nu+ nv; - nvarc1 += nu; - nvarc2 += nv; - - // Add two fixed variable for two rotated quadratic cones - na += 2; - m += 2; - nnza += 2; - - // Compute size of multipliers - nnzu = 2*na + 2*m; - nnzuc = nvarc1 + nvarc2; - - // Initialize arrays to build SOCP - icola = new int[nnza]; - irowa = new int[nnza]; - a = new double[nnza]; - bla = new double[m]; - bua = new double[m]; - xl = new double[na]; - xu = new double[na]; - c = new double[na]; - x = new double[na]; - u = new double[nnzu]; - uc = new double[nnzuc]; - idxc1 = new int[nvarc1]; - idxc2 = new int[nvarc2]; - - // Build objective function parameter c - // [x, t1, u, v, y1, y2, t0] - Arrays.fill(c, 0.0); - for (j = 0; j < n; j++) { - c[j] = q0[j]; - } - c[na-1] = 1.0; - - // Build linear constraints parameter A - idxa = 0; - rptr = 0; - // q1 in First row - rptr++; - Arrays.fill(irowa, 0, n, rptr); - for (j = 0; j < n; j++) { - icola[j] = j+1; - a[j] = q1[j]; - } - idxa += n; - - // F0 in F0*x-u=0 row - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f0[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // F1 in F1*x-v=0 row - for (i = 1; i <= n; i++) { - if (lambda1[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f1[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // Rest of A, a diagonal matrix - for (j = 0; j < m; j++) { - irowa[idxa+j] = j+1; - icola[idxa+j] = n+j+1; - a[idxa+j] = 1.0; - } - for (j = 1; j < (nu+nv+1); j++) { - a[idxa+j] = -1.0; - } - // RHS in linear constraints - Arrays.fill(bla, 0.0); - Arrays.fill(bua, 0.0); - bla[0] = -r1; - bua[0] = -r1; - for (j = (m-nqc); j <= m; j++) { - bla[j-1] = 1.0; - bua[j-1] = 1.0; - } - - // Box constraints, all variables are free - Arrays.fill(xl, -1E+20); - Arrays.fill(xu, 1E+20); - - // Cone constraints - // First cone - idxc1[0] = na; - idxc1[1] = n + 1 + nu + nv + 1; - for (j = 2; j < nvarc1; j++) { - idxc1[j] = n + j; - } - ctype1 = "RQUAD "; - // Second cone - idxc2[0] = n + 1; - idxc2[1] = n + 1 + nu + nv + 2; - for (j = 2; j < nvarc2; j++) { - idxc2[j] = n + nu + j; - } - ctype2 = "RQUAD "; - - // Create the problem handle - handle = 0; - ifail = 0; - e04ra.eval(handle, na, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - ifail = 0; - e04re.eval(handle, na, c, ifail); - - // Set box constraints - ifail = 0; - e04rh.eval(handle, na, xl, xu, ifail); - - // Set linear constraints - ifail = 0; - idlc = 0; - e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); - idlc = e04rj.getIDLC(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Turn on monitoring - ifail = 0; - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - /* Set this to true to cause e04pt to produce intermediate - * progress output */ - verboseOutput = false; - - if (verboseOutput) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } - else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = 0; // unused in this example - iuser[1] = 0; - ruser[0] = 1.0E-7; - ifail = -1; - e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, - ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if (ifail == 0 || ifail == 50) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (xIdx = 1; xIdx <= n; xIdx++) { - System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); - } - } - - // Free the handle memory - ifail = 0; - e04rz.eval(handle, ifail); - - } - - - /** - * Convert from 2D Fortran index to 1D-column major Java index. - * @param x 1-based row index for a 2D array - * @param y 1-based column index for a 2D array - * @return the corresponding 0-based index for a 1D column-major array - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/E04RPJE.java b/simple_examples/int32/E04RPJE.java deleted file mode 100644 index d22d3d1..0000000 --- a/simple_examples/int32/E04RPJE.java +++ /dev/null @@ -1,199 +0,0 @@ -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RN; -import com.nag.routines.E04.E04RP; -import com.nag.routines.E04.E04RY; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04SV; - -/** - * E04RPJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ - -public class E04RPJE{ - - /** - * E04RPJ Example main program - */ - public static void main(String[] args){ - int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, - nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; - double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; - int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, - nnzq, qi, qj, idummy; - long cpuser, handle; - - rdummy = new double[1]; - rinfo = new double[32]; - stats = new double[32]; - idummy = new int[1]; - - System.out.println("E04RPJ Example Program Results"); - System.out.println(); - - //Problem size - nvar = 5; - nnzh = 0; - nclin = 0; - nnzb = 0; - nblk = 2; - - //Initialize handle to an empty problem - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - //Linear part of the objective function - cvec = new double[nvar]; - cvec[0] = 1; - cvec[1] = 0; - cvec[2] = 1; - cvec[3] = 0; - cvec[4] = 0; - - //Add the linear objetive function to the problem formulation - ifail = 0; - E04RE e04re = new E04RE(handle, nvar, cvec, ifail); - e04re.eval(); - - //Matrix inequalities - //block 1 - dimaq = 2; - nnzasum = 9; nnzqsum = 8; - idblk = 0; - - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 2; - nnza[2] = 3; - nnza[3] = 2; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 2.0; irowa[2] = 1; icola[2] = 1; - a[3] = -2.0; irowa[3] = 1; icola[3] = 2; - a[4] = 6.0; irowa[4] = 1; icola[4] = 1; - a[5] = 5.0; irowa[5] = 1; icola[5] = 2; - a[6] = -4.0; irowa[6] = 2; icola[6] = 2; - a[7] = 3.0; irowa[7] = 1; icola[7] = 2; - a[8] = 8.0; irowa[8] = 2; icola[8] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - //update - idblk = e04rn.getIDBLK(); - - nq = 6; - - qi = new int[nq]; - qj = new int[nq]; - nnzq = new int[nq]; - irowq = new int[nnzqsum]; - icolq = new int[nnzqsum]; - q = new double[nnzqsum]; - - qi[0] = 1; qj[0] = 4; - qi[1] = 2; qj[1] = 4; - qi[2] = 3; qj[2] = 4; - qi[3] = 1; qj[3] = 5; - qi[4] = 2; qj[4] = 5; - qi[5] = 3; qj[5] = 5; - - nnzq[0] = 1; - nnzq[1] = 2; - nnzq[2] = 1; - nnzq[3] = 1; - nnzq[4] = 2; - nnzq[5] = 1; - - q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; - q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; - q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; - q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; - q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; - q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; - q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; - q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; - - ifail = 0; - //Expand the existing linear matrix inequality with bilnear term - E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, - q,idblk,ifail); - e04rp.eval(); - - //block 2 - dimaq = 2; - nnzasum = 5; - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 1; - nnza[2] = 1; - nnza[3] = 1; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 1.0; irowa[2] = 1; icola[2] = 1; - a[3] = 1.0; irowa[3] = 1; icola[3] = 2; - a[4] = 1.0; irowa[4] = 2; icola[4] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - - System.out.println("Passing SDP problem to solver"); - System.out.println(); - - ifail = 0; - //Print overview of handle - //nout = 6 is default output for fortran - E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); - e04ry.eval(); - - //Allocate memory for the solver - x = new double[nvar]; - nnzu = 0; - nnzuc = 0; - nnzua = 0; - inform = 0; - for(int i = 0; i < nvar; i++){ - x[i] = 0.0; - } - - ifail = 0; - E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, - rinfo,stats,inform,ifail); - e04sv.eval(); - - //Destroy handle - ifail = 0; - E04RZ e04rz = new E04RZ(handle,ifail); - e04rz.eval(); - } - -} - - - diff --git a/simple_examples/int32/E04RSJE.java b/simple_examples/int32/E04RSJE.java deleted file mode 100644 index d614fbb..0000000 --- a/simple_examples/int32/E04RSJE.java +++ /dev/null @@ -1,229 +0,0 @@ -import com.nag.routines.E04.E04RS; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RS - */ -public class E04RSJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - double s = 0.0; - int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; - int[] iuser = new int[2]; - - System.out.println(" E04RSJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - nnzq0 = Integer.parseInt(sVal[1]); - nnzq1 = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - irowq0 = new int[nnzq0]; - icolq0 = new int[nnzq0]; - q0 = new double[nnzq0]; - irowq1 = new int[nnzq1]; - icolq1 = new int[nnzq1]; - q1 = new double[nnzq1]; - idxr0 = new int[n]; - r0 = new double[n]; - idxr1 = new int[n]; - r1 = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - irowq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - icolq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - q0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - irowq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - icolq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - q1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - s = Double.parseDouble(sVal[0]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute size of multipliers - // One quadratic constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - idqc = -1; - ifail = 0; - E04RS e04rs = new E04RS(); - e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); - - // Set quadratic constraint - idqc = 0; - ifail = 0; - e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } -} diff --git a/simple_examples/int32/E04RTJE.java b/simple_examples/int32/E04RTJE.java deleted file mode 100644 index dd4bce8..0000000 --- a/simple_examples/int32/E04RTJE.java +++ /dev/null @@ -1,225 +0,0 @@ -import com.nag.routines.E04.E04RT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RT example program text. - */ -public class E04RTJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; - double[] lc = new double[3]; - double[] lc_rhs = new double[1]; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icola = null, idxr0 = null, irowa = null; - int[] icollc = new int[3]; - int[] irowlc = new int[3]; - int[] iuser = new int[2]; - - System.out.println(" E04RTJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - m = Integer.parseInt(sVal[1]); - nnza = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - a = new double[nnza]; - icola = new int[nnza]; - irowa = new int[nnza]; - idxr0 = new int[n]; - r0 = new double[n]; - b = new double[m]; - xl = new double[n]; - xu = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - irowa[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - icola[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < m; i++) { - b[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xl[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xu[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute -2*b'A as linear term in quadratic function - for (j = 0; j < n; j++) { - r0[j] = 0.0; - idxr0[j] = j + 1; - } - for (i = 0; i < nnza; i++) { - r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; - } - - // Compute size of multipliers - // One linear constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2 * n + 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set quadratic objective function - idqc = -1; - ifail = 0; - E04RT e04rt = new E04RT(); - e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); - - // Set box constraints - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, n, xl, xu, ifail); - - // Set linear constraint: x1 + x2 + x3 = 1 - for (j = 0; j < n; j++) { - irowlc[j] = 1; - icollc[j] = j + 1; - lc[j] = 1.0; - } - lc_rhs[0] = 1.0; - ifail = 0; - idlc = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } - } diff --git a/simple_examples/int32/E04SAJE.java b/simple_examples/int32/E04SAJE.java deleted file mode 100644 index 325267b..0000000 --- a/simple_examples/int32/E04SAJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.routines.E04.E04RC; -import com.nag.routines.E04.E04SA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04PTU; - -/** - * E04SA example program text. - */ -public class E04SAJE { - - public static final String fname = "e04saje.opt"; - public static void main(String[] args) { - - long cpuser, handle = 0; - int ifail, n, nnzu, nnzuc, x_idx; - boolean verbose_output; - String ftype; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u, uc, x; - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04SAJ Example Program Results"); - - // Read mps file to a handle - ifail = 0; - ftype = "mps"; - E04SA e04sa = new E04SA(); - e04sa.eval(handle, fname, ftype, pinfo, ifail); - handle = e04sa.getHANDLE(); - - // Get problem size from pinfo - pinfo = e04sa.getPINFO(); - n = pinfo[0]; - nnzu = pinfo[10]; - nnzuc = pinfo[11]; - - // Set all variables as continuous - ifail = 0; - E04RC e04rc = new E04RC(); - - int[] x_idx_Arr = new int[n]; - for (x_idx = 1; x_idx <= n; x_idx++) { - x_idx_Arr[x_idx - 1] = x_idx; - } - - e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); - - // Allocate memory - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Set this to .True. to cause e04ptf to produce intermediate progress output - verbose_output = false; - - E04ZM e04zm = new E04ZM(); - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx " + " Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - E04PTU e04ptu = new E04PTU(); - e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); - this.INFORM = e04ptu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TAJE.java b/simple_examples/int32/E04TAJE.java deleted file mode 100644 index 97cebe2..0000000 --- a/simple_examples/int32/E04TAJE.java +++ /dev/null @@ -1,188 +0,0 @@ -import com.nag.routines.E04.E04TA; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04MTU; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04TE; -import com.nag.routines.E04.E04TJ; -import com.nag.routines.E04.E04RW; -import com.nag.routines.E04.E04RZ; - -import java.util.Arrays; - -/** - * E04TA - */ -public class E04TAJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser, handle; - int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; - - double[] a, bla, bua, cvec, ulag, x, xl, xu; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u = new double[1]; - - int[] icola, irowa; - - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04TAJ Example Program Results\n"); - System.out.println(" Solve the first LP\n"); - - handle = 0; - cpuser = 0; - - // Initialize the handle - nvar = 2; - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define the objective function - cvec = new double[nvar]; - cvec[0] = 2.0; - cvec[1] = 4.5; - ifail = 0; - E04RE e04re = new E04RE(); - e04re.eval(handle, nvar, cvec, ifail); - - // Box constraints - xl = new double[nvar]; - xu = new double[nvar]; - Arrays.fill(xl, 0.0); - xu[0] = infbnd; - xu[1] = 100.0; - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, xl, xu, ifail); - - // Set the linear constraints - idlc = 0; - nclin = 3; - nnza = 6; - bla = new double[nclin]; - bua = new double[nclin]; - irowa = new int[nnza]; - icola = new int[nnza]; - a = new double[nnza]; - Arrays.fill(bla, -infbnd); - bua = new double[] { - 1500.0, 6000.0, 16000.0 - }; - irowa = new int[] { - 1, 1, 2, 2, 3, 3 - }; - icola = new int[] { - 1, 2, 1, 2, 1, 2 - }; - a = new double[] { - 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 - }; - ifail = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); - - // Optional parameters - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Task = Max", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - - // Call the LP solver - x = new double[nvar + 1]; - nnzu = 0; - ifail = -1; - E04MT e04mt = new E04MT(); - MONIT monit = new MONIT(); - e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a variable - ifail = 0; - E04TA e04ta = new E04TA(); - e04ta.eval(handle, 1, nvar, ifail); - nvar = e04ta.getNVAR(); - - // Box constraint on the new variable - ifail = 0; - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); - - // Add the linear objective component - ifail = 0; - E04TE e04te = new E04TE(); - e04te.eval(handle, 3, 7.0, ifail); - - // Add linear constraints coefficients - E04TJ e04tj = new E04TJ(); - ifail = 0; - e04tj.eval(handle, 1, 3, 5.0, ifail); - ifail = 0; - e04tj.eval(handle, 2, 3, 12.0, ifail); - ifail = 0; - e04tj.eval(handle, 3, 3, 120.0, ifail); - - System.out.println("\n The new variable has been added, solve the handle again\n"); - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a linear constraint - nclin = 1; - bla[0] = -infbnd; - bua[0] = 100.0; - nnza = 2; - irowa[0] = 1; - irowa[1] = 1; - icola[0] = 2; - icola[1] = 3; - a[0] = 1.0; - a[1] = 1.0; - idlc = 0; - e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); - - System.out.println("\n The new constraint has been added, solve the handle again\n"); - - // Query the problem sizes to request the Lagrangian multipliers for the - // last solve - ioflag = 1; - liarr = 100; - E04RW e04rw = new E04RW(); - e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); - nnzu = pinfo[10]; - ulag = new double[nnzu]; - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Free the memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - E04MTU e04mtu = new E04MTU(); - e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, - this.CPUSER, this.INFORM); - this.INFORM = e04mtu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TCJE.java b/simple_examples/int32/E04TCJE.java deleted file mode 100644 index d28d78b..0000000 --- a/simple_examples/int32/E04TCJE.java +++ /dev/null @@ -1,263 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGU; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04TB; -import com.nag.routines.E04.E04TC; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Arrays; - -/** - * E04TC example program text. - * @author Mo - */ -public class E04TCJE { - - public static void main(String[] args) { - double[] rx, x, udt, udy; - double[] rinfo = new double[100], ruser = new double[0], - stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, udnres; - int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; - int[] idx; - long cpuser, handle; // c_ptr - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - /* Header */ - System.out.printf(" E04TCJ Example Program Results\n\n"); - try { - - handle = 0L; - cpuser = 0L; - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - - /* Read number of residuals */ - nres = Integer.parseInt(data[0]); - - udnres = nres; - - /* Allocate memory */ - udt = new double[nres]; - udy = new double[nres]; - - /* Read observations */ - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udt[ii+jj] = Double.parseDouble(data[jj]); - } - } - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udy[ii+jj] = Double.parseDouble(data[jj]); - } - } - - /* try to fit the model */ - /* f(t) = at^2 + bt + c + d sin(omega t) */ - /* To the data {(t_i, y_i)} */ - nvar = 5; - - /* Initialize the NAG optimization handle */ - E04RA e04ra = new E04RA(); - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define a dense nonlinear least-squares objective function */ - /* (isparse = 0 => the sparsity pattern of the Jacobian */ - /* doesn't need to be defined) */ - E04RM e04rm = new E04RM(); - isparse = 0; - nnzrd = 1; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set some optional parameters to control the output of the solver */ - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - - System.out.println("First solve the problem with the outliers"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Call the solver */ - E04GG e04gg = new E04GG(); - x = new double[nvar]; - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - rx = new double[nres]; - iuser = new int[] {udnres}; - ruser = new double[2 * udnres];; - for (int ii = 0; ii < udnres; ii++) { - ruser[ii] = udt[ii]; - ruser[udnres + ii] = udy[ii]; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Now remove the outlier residuals from the problem handle"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Disable the two outlier residuals */ - E04TC e04tc = new E04TC(); - idx = new int[] {10, 20}; - e04tc.eval(handle, "NLS", 2, idx, ifail); - - /* Solve the problem again */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Assuming the outliers points are measured again"); - System.out.println("we can enable the residuals and adjust the values"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Fix the first variable to its known value of 0.3 */ - /* enable the residuals and adjust the values in the data */ - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); - E04TB e04tb = new E04TB(); - e04tb.eval(handle, "NLS", 2, idx, ifail); - udy[9] = -0.515629; - udy[19] = 0.54920; - - /* Solve the problem */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - } - catch (Exception ex) { - Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + - this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - - udy[i]; - } - - this.INFORM = 0; - - } - - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 1; i <= this.NRES; i++) { - this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); - this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; - this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; - this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); - this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * - Math.cos(this.X[4] * udt[i-1]); - - } - - this.INFORM = 0; - - } - - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - E04GGU e04ggu = new E04GGU(); - e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggu.getINFORM(); - } - - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04UCJE.java b/simple_examples/int32/E04UCJE.java deleted file mode 100644 index e43d457..0000000 --- a/simple_examples/int32/E04UCJE.java +++ /dev/null @@ -1,211 +0,0 @@ -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E04UE; -import com.nag.routines.F06.DGEMV; -import java.util.Arrays; - -/** - * E04UC example program text. - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) { - - /* Local Scalars */ - double objf; - int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[LRWSAV]; - int[] istate, iwork; - int[] iuser = new int[1], iwsav = new int[LIWSAV]; - boolean[] lwsav = new boolean[LLWSAV]; - String[] cwsav = new String[LCWSAV]; - Arrays.fill(cwsav, - " "); - - System.out.println(" E04UCJ Example Program Results"); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new int[n + nclin + ncnln]; - iwork = new int[liwork]; - c = new double[Math.max(1, ncnln)]; - cjac = new double[ldcj * sdcjac]; - clamda = new double[n + nclin + ncnln]; - objgrd = new double[n]; - r = new double[ldr * n]; - work = new double[lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - E04UE e04ue = new E04UE(); - inform = 0; - e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives. */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[LDCJ] = X[1] + X[1]; - CJAC[2*LDCJ] = X[2] + X[2]; - CJAC[3*LDCJ] = X[3] + X[3]; - } - - } - - if (NEEDC[1] > 0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[1+LDCJ] = X[0]*X[2]*X[3]; - CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; - CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/int32/E04YAJE.java b/simple_examples/int32/E04YAJE.java deleted file mode 100644 index 72d80da..0000000 --- a/simple_examples/int32/E04YAJE.java +++ /dev/null @@ -1,112 +0,0 @@ -import com.nag.routines.E04.E04YA; - - -/** - * E04YA example program text. - * @author joed - */ -public class E04YAJE { - - public static LSQFUN lsqfun = new LSQFUN(); - public static final int LIW = 1, MDEC = 15, NDEC = 3; - public static final int LDFJAC = MDEC; - public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; - public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - int i; - - for (i = 0; i < M; i++) { - denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); - - if (IFLAG != 1) { - FVEC[i] = XC[0] + (t[i]/denom) - y[i]; - } - - if (IFLAG != 0) { - FJAC[i] = 1.0; - dummy = -1.0/(denom*denom); - FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; - FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; - } - - } - } - - } - - public static void main(String[] args) { - int i, ifail, m, n; - double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], - w = new double[LW], x = new double[NDEC]; - int[] iw = new int[LIW]; - - System.out.println(" E04YAJ Example Program Results"); - - n = NDEC; - m = MDEC; - - /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) - * (I = 1, 2, ..., m) */ - - y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, - 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; - for (i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - /* Set up an arbitrary point at which to check the 1st derivatives */ - - x[0] = 0.19; - x[1] = -1.34; - x[2] = 0.88; - - System.out.println(); - System.out.println("The test point is"); - System.out.printf(" "); - for (i = 0; i < n; i++) { - System.out.printf("%10.5f", x[i]); - } - System.out.printf("\n"); - - E04YA e04ya = new E04YA(); - ifail = -1; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); - ifail = e04ya.getIFAIL(); - - if (ifail >= 0 && ifail != 1) { - - switch (ifail) { - case 0: - System.out.println(); - System.out.println("1st derivatives are consistent with residual values"); - break; - case 2: - System.out.println(); - System.out.println("Probable error in calculation of 1st derivatives"); - break; - default: - } - - System.out.println(); - System.out.println("At the test point, LSQFUN gives"); - System.out.println(); - System.out.println(" Residuals 1st derivatives"); - for (i = 0; i < m; i++) { - System.out.printf(" %15.3E", fvec[i]); - System.out.printf("%15.3E", fjac[i]); - System.out.printf("%15.3E", fjac[LDFJAC + i]); - System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); - } - - } - - } - -} diff --git a/simple_examples/int32/F01ADJE.java b/simple_examples/int32/F01ADJE.java deleted file mode 100644 index 4167f71..0000000 --- a/simple_examples/int32/F01ADJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.F01.F01AD; -import com.nag.routines.X04.X04CA; - - -/** - * F01AD example program text. - * @author joed - */ -public class F01ADJE { - - public static void main(String[] args) { - - int i, ifail, lda, n; - double[] a; - - System.out.println(" F01ADJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n + 1; - a = new double[] { - 5.0, 7.0, 6.0, 5.0, 0.0, - 7.0, 10.0, 8.0, 7.0, 0.0, - 6.0, 8.0, 10.0, 9.0, 0.0, - 5.0, 7.0, 9.0, 10.0, 0.0 - }; - - F01AD f01ad = new F01AD(); - ifail = -1; - f01ad.eval(n, a, lda, ifail); - ifail = f01ad.getIFAIL(); - - /* Print the result matrix A */ - X04CA x04ca = new X04CA(); - x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); - - } - -} diff --git a/simple_examples/int32/F01CKJE.java b/simple_examples/int32/F01CKJE.java deleted file mode 100644 index ed3ffa2..0000000 --- a/simple_examples/int32/F01CKJE.java +++ /dev/null @@ -1,60 +0,0 @@ -import com.nag.routines.F01.F01CK; -import com.nag.routines.X04.X04CB; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CK example program text. - * @author ludovic - */ -public class F01CKJE { - - public static void main(String[] args) { - - double[] a, b, c, z; - int n, p, m, iz, opt; - int ifail; - - m = 3; - n = p = 2; - iz = 1; - opt = 1; - a = new double[n * p]; - b = new double[n * m]; - c = new double[m * p]; - z = new double[iz]; - ifail = 0; - - System.out.println(" F01CKJ Example Program Results"); - - // Initialising b and c - - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - b[j+i*n] = (double) (i+j); - } - for (int j = 0; j < p; ++j) { - c[i+j*m] = (double) (i+j); - } - } - - F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); - f01ck.eval(); - ifail = f01ck.getIFAIL(); - String title = "Matrix A"; - System.out.println(); - System.out.flush(); - ifail = 0; - - String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; - String[] dummy = {" "}; - int ncols = 80; - int indent = 0; - - (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, - dummy,ncols,indent, ifail); - - } - -} diff --git a/simple_examples/int32/F01CRJE.java b/simple_examples/int32/F01CRJE.java deleted file mode 100644 index c10b284..0000000 --- a/simple_examples/int32/F01CRJE.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.nag.routines.F01.F01CR; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CR example program text. - * @author ludovic - */ -public class F01CRJE { - - public static void main(String[] args) { - System.out.println(" F01CRJ Example Program Results"); - double[] a; - int m,n,mn,lmove; - int[] move; - int ifail; - n = 7; - m = 3; - mn = m*n; - lmove = (m + n)/2; - a = new double[mn]; - move = new int[lmove]; - ifail = 1; - - for (int i = 0; i < mn; i++) { - a[i] = i+1.0; - } - - F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); - f01cr.eval(); - - System.out.println(); - int index = 0; - for (int i = 0; i < mn; ++i) { - System.out.printf(" %7.1f",a[i]); - ++index; - if (index == 7) { - System.out.println(); - index = 0; - } - } - System.out.println(); - - } - -} diff --git a/simple_examples/int32/F01DGJE.java b/simple_examples/int32/F01DGJE.java deleted file mode 100644 index 107137f..0000000 --- a/simple_examples/int32/F01DGJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F01.F01DG; -import com.nag.routines.X04.X04CA; - -/** - * F01DG example program text. - * @author joed - * @since 27.0.0.0 - */ -public class F01DGJE { - - /** - * F01DG example main program. - */ - public static void main(String[] args) { - - F01DG f01dg = new F01DG(); - X04CA x04ca = new X04CA(); - double alpha; - int i, ifail, lda, ldb, n; - String side, transa, uplo; // Length 1 - double[] a, b; - - System.out.println("F01DGJ Example Program Results\n"); - - // Values for side, uplo and transa - side = "L"; - uplo = "U"; - transa = "T"; - - // Order of square matrices - n = 4; - lda = n; - ldb = n; - - // Scaling constant alpha - alpha = 0.4; - - // Set input matrices (column-major order) - a = new double[]{ - 1.5, 0.0, 0.0, 0.0, - 2.3, 3.4, 0.0, 0.0, - 6.7, 5.4, 8.1, 0.0, - 1.9, 8.6, 2.0, 5.9 - }; - b = new double[]{ - 3.5, 0.0, 0.0, 0.0, - 2.1, 5.6, 0.0, 0.0, - 4.0, 2.1, 1.7, 0.0, - 2.1, 2.5, 1.1, 7.4 - }; - - /* ifail: behaviour on error exit - * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ - ifail = 0; - - // Find B=alpha*A*B - f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); - ifail = f01dg.getIFAIL(); - - // Print the solution - if (ifail == 0) { - if (transa.equals("N")) { - x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); - } - else { - x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); - } - } - - } - -} diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java deleted file mode 100644 index 9986c6c..0000000 --- a/simple_examples/int32/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/int32/F01EMJE.java b/simple_examples/int32/F01EMJE.java deleted file mode 100644 index 716a7b5..0000000 --- a/simple_examples/int32/F01EMJE.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.nag.routines.F01.F01EM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F01EMJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F01EMJE{ - - /** - * F01EMJ Example main program - */ - public static void main(String[] args){ - double imnorm = 0; - int ifail, iflag = 0, lda, n; //placeholders - double[] a, ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("F01EMJ Example Program Results"); - System.out.println(); - - //Tell wrapper what type of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //Problem size - n = 4; - lda = n; - - //Allocate - a = new double[lda * n]; - - //Data - //A = ( 1, 0,-2, 1) - // (-1, 2, 0, 1) - // ( 2, 0, 1, 0) - // ( 1, 0,-2, 2) - a[0] = 1; - a[1] = -1; - a[2] = 2; - a[3] = 1; - a[4] = 0; - a[5] = 2; - a[6] = 0; - a[7] = 0; - a[8] = -2; - a[9] = 0; - a[10] = 1; - a[11] = -1; - a[12] = 1; - a[13] = 1; - a[14] = 0; - a[15] = 2; - - //Find f(A) - ifail = 0; - //Create fexp2 object to pass to wrapper - fexp2 f = new fexp2(); - F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); - f01em.eval(); - - //Print solution - ifail = 0; - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); - x04ca.eval(); - - //Print the norm oof the imaginary part to check if it small - System.out.println(); - System.out.printf("Imnorm = %.2f\n", imnorm); - } - - /** - * fexp2 class representing f routine argument - */ - public static class fexp2 extends F01EM.Abstract_F01EM_F{ - public void eval(){ - NAGComplex two = new NAGComplex(2, 0); - NAGComplex twoPowM = new NAGComplex(2, 0); - - twoPowM.setRe(Math.pow(2, this.M)); - - for(int i = 0; i < this.NZ; i++){ - this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); - } - - //Set iflag nonzero to terminate exectuion for any reason - this.IFLAG = 0; - } - - //Raises e ^ z where z is a complex number - //Uses eulers formula; - //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) - public NAGComplex complexExp(NAGComplex x){ - NAGComplex tmp = new NAGComplex(); - tmp.setRe(Math.cos(x.getIm())); - tmp.setIm(Math.sin(x.getIm())); - NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); - return ans; - } - } -} diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java deleted file mode 100644 index 3737022..0000000 --- a/simple_examples/int32/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java deleted file mode 100644 index 0dd7ab9..0000000 --- a/simple_examples/int32/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java deleted file mode 100644 index 36c26c6..0000000 --- a/simple_examples/int32/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/int32/F03BAJE.java b/simple_examples/int32/F03BAJE.java deleted file mode 100644 index 673ddec..0000000 --- a/simple_examples/int32/F03BAJE.java +++ /dev/null @@ -1,108 +0,0 @@ -import com.nag.routines.F03.F03BA; -import com.nag.routines.F07.F07AD; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F03BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F03BAJE{ - - /** - * F03BAJ example main program. - */ - public static void main(String[] args){ - double d = 0; - int id = 0, ifail, info = 0, lda = 0, n = 0; - double[] a; - int[] ipiv; - - //Should initialise values so java doesn't give any errors because of try/catch - a = new double[n]; - ipiv = new int[n]; - - System.out.println("F03BAJ Example Program Results"); - - //If file name not given print usage info - if(args.length != 1){ - F03BAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - lda = n; - - //reallocate with values from data file - a = new double[n * lda]; - ipiv = new int[n]; - - //read in matrix - for(int i = 0; i < n; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); - f07ad.eval(); - - ifail = 0; - - //Print out matrix - System.out.println(); - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivots"); - for(int i = 0; i < n; i++){ - System.out.printf("\t%d ", ipiv[i]); - } - System.out.printf("\n"); - System.out.println(); - - ifail = 0; - - F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); - f03ba.eval(); - d = f03ba.getD(); - id = f03ba.getID(); - - System.out.printf("D = \t%.5f ID = \t%d\n", d, id); - System.out.println(); - System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); - - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - -} - diff --git a/simple_examples/int32/F04AMJE.java b/simple_examples/int32/F04AMJE.java deleted file mode 100644 index a498b2b..0000000 --- a/simple_examples/int32/F04AMJE.java +++ /dev/null @@ -1,114 +0,0 @@ -import com.nag.routines.F04.F04AM; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04AMJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04AMJE{ - - /** - * F04AMJ example main program. - */ - public static void main(String[] args){ - int m = 0, n = 0; - int ifail, ir, lda, ldb, ldqr, ldx; - double eps; - double[] a, b, alpha, e, qr, r, x, y, z; - int[] ipiv; - - System.out.println("F04AMJ Example Program Results"); - - if(args.length != 1){ - F04AMJE.usage(); - } - - //declare so try/catch works - a = new double[0]; - b = new double[0]; - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[1]); - n = Integer.parseInt(sVal[2]); - - a = new double[m * n]; - b = new double[m * 1]; - - for(int i = 0; i < m; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * m) ] = Double.parseDouble(sVal[j]); - } - for(int j = n; j < m; j++){ - b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - //Setting these in try block is more robust but less neat - //May be needed for array sizes~ - ir = 1; - lda = m; - ldb = m; - ldqr = m; - ldx = n; - - alpha = new double[n]; - e = new double[n]; - qr = new double[ldqr * n]; - r = new double[m]; - x = new double[ldx * ir]; - y = new double[n]; - z = new double[n]; - ipiv = new int[n]; - - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - - ifail = 0; - - F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); - f04am.eval(); - //update any values you want here - x = f04am.getX(); - - System.out.println("Solution"); - for(int i = 0; i < n; i++){ - for(int j = 0; j < ir; j++){ - System.out.printf("%.4f ", x[j + (i * ir)]); - } - System.out.printf("\n"); - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - - - - - - diff --git a/simple_examples/int32/F04BAJE.java b/simple_examples/int32/F04BAJE.java deleted file mode 100644 index 79c2b01..0000000 --- a/simple_examples/int32/F04BAJE.java +++ /dev/null @@ -1,144 +0,0 @@ -import com.nag.routines.F04.F04BA; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04BAJE{ - - /** - * F04BAJ example main program. - */ - public static void main(String[] args){ - int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder - int ierr, ifail; - double errbnd, rcond; - double a[], b[]; - int ipiv[]; - - a = new double[0]; b = new double[0]; //placeholder - - if(args.length != 1){ - F04BAJE.usage(); - } - - System.out.println("F04BAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - nrhs = Integer.parseInt(sVal[2]); - - lda = n; - ldb = n; - - a = new double[lda * n]; - b = new double[ldb * nrhs]; - - line = reader.readLine(); - for(int i = 0; i < lda; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < ldb; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < nrhs; j++){ - b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 1; - ipiv = new int[n]; - rcond = 0; - errbnd = 0; - F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); - f04ba.eval(); - - ifail = f04ba.getIFAIL(); - rcond = f04ba.getRCOND(); - errbnd = f04ba.getERRBND(); - ipiv = f04ba.getIPIV(); - a = f04ba.getA(); - b = f04ba.getB(); - - if(ifail == 0){ - //Print solution, estimate of condition number and approximate error bound. - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Estimate of condition number"); - System.out.printf("%.1e\n", 1/rcond); - System.out.println(); - System.out.println("Esttimate of error bound for computed solutions"); - System.out.printf("%.1e\n", errbnd); - } - else if(ifail == (n + 1)){ - //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. - System.out.println(); - System.out.println("Estimate of reciprocal of condition number"); - System.out.printf("%.1e\n", rcond); - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - } - else if(ifail > 0 && ifail <= n){ - //The upper triangular matrix U is exactly singular. Print details of factorization. - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivot indices"); - for(int i = 0; i < n; i++){ - System.out.printf("%d ", ipiv[i]); - } - System.out.printf("\n"); - } - else{ - System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); - } - - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/F05AAJE.java b/simple_examples/int32/F05AAJE.java deleted file mode 100644 index 317c269..0000000 --- a/simple_examples/int32/F05AAJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F05.F05AA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F05AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F05AAJE{ - - /** - * F05AAJ example main program. - */ - public static void main(String[] args) { - //Should initialise values to avoid issues with try/catch - int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; - double cc = 0; - double[] a, s; - - //same as ints - a = new double[1]; - s = new double[1]; - System.out.println("F05AAJ Example Program Results"); - System.out.println(); - - //supply data - if(args.length != 1){ - F05AAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+");; - m = Integer.parseInt(sVal[1]); - n1 = Integer.parseInt(sVal[2]); - n2 = Integer.parseInt(sVal[3]); - lda = m; - - a = new double[lda*n2]; - s = new double[n2]; - - //read in a from data - for(int i = 0; i < n2; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - a[i + (j * n2)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //create object then eval - F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); - f05aa.eval(); - - //update values - n1 = f05aa.getN1(); - n2 = f05aa.getN2(); - cc = f05aa.getCC(); - icol = f05aa.getICOL(); - a = f05aa.getA(); - - System.out.printf("N1 = %d N2 = %d\n", n1, n2); - System.out.println(); - System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); - System.out.println(); - System.out.println("Final Vectors"); - - for(int i = 0; i < n2; i++){ - for(int j = 1; j < m; j++){ - System.out.printf("%.4f ", a[i +(j * n2)]); - } - System.out.printf("\n"); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/F06CLJE.java b/simple_examples/int32/F06CLJE.java deleted file mode 100644 index ca2ac5e..0000000 --- a/simple_examples/int32/F06CLJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.F06.F06CL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F06CL example program text. - * @author ludovic - */ -public class F06CLJE { - - public static void main(String[] args) { - boolean fail = false; - NAGComplex z1 = new NAGComplex(); - NAGComplex z2 = new NAGComplex(); - NAGComplex z3 = new NAGComplex(); - - System.out.println(" F06CLJ Example Program Results"); - System.out.println(); - - Routine.complex = z1; - - z1.setRe(1.0); - z1.setIm(1.0); - z2.setRe(2.0); - z2.setIm(2.0); - - F06CL f06cl = new F06CL(z1,z2,fail); - z3 = (NAGComplex)f06cl.eval(); - fail = f06cl.getFAIL(); - - if (fail) { - System.err.println(" Something went wrong..."); - } - else { - System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); - } - - } - -} diff --git a/simple_examples/int32/F07AAJE.java b/simple_examples/int32/F07AAJE.java deleted file mode 100644 index 26eb5dc..0000000 --- a/simple_examples/int32/F07AAJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.F07.F07AA; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F07AA example program text. - * @author joed - */ -public class F07AAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, ldb, n; - double[] a, b; - int[] ipiv; - - System.out.println(" F07AAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - ldb = n; - - a = new double[n*n]; - b = new double[n]; - ipiv = new int[n]; - - a[0+0*n] = 1.80; - a[0+1*n] = 2.88; - a[0+2*n] = 2.05; - a[0+3*n] = -0.89; - a[1+0*n] = 5.25; - a[1+1*n] = -2.95; - a[1+2*n] = -0.95; - a[1+3*n] = -3.80; - a[2+0*n] = 1.58; - a[2+1*n] = -2.69; - a[2+2*n] = -2.90; - a[2+3*n] = -1.04; - a[3+0*n] = -1.11; - a[3+1*n] = -0.66; - a[3+2*n] = -0.59; - a[3+3*n] = 0.80; - - b[0] = 9.52; - b[1] = 24.35; - b[2] = 0.77; - b[3] = -6.22; - - /* Solve the equations Ax = b for x */ - - F07AA f07aa = new F07AA(); - info = 0; - f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); - info = f07aa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); - - /* Print pivot indices */ - - System.out.println(); - System.out.println(" Pivot indices"); - for (i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.printf("\n"); - - } - else { - System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); - } - - } - -} diff --git a/simple_examples/int32/F07ABJE.java b/simple_examples/int32/F07ABJE.java deleted file mode 100644 index 6362739..0000000 --- a/simple_examples/int32/F07ABJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.F07.DGESVX; -import com.nag.routines.X04.X04CA; - -/** - * F07ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ABJE{ - - /** - * F07ABJ example main program - */ - public static void main(String[] args){ - double rcond = 0; - int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders - String equed; - double[] a, af, b, berr, c, ferr, r, work, x; - int[] ipiv, iwork; - - System.out.println("F07ABJ Example Program Results"); - System.out.println(); - - //Problem size - n = 4; - nrhs = 2; - lda = n; - ldaf = n; - ldb = n; - ldx = n; - - //Allocate - a = new double[lda * n]; - af = new double[ldaf * n]; - b = new double[ldb * nrhs]; - berr = new double[nrhs]; - c = new double[n]; - ferr = new double[nrhs]; - r = new double[n]; - work = new double[4 * n]; - x = new double[ldx * nrhs]; - ipiv = new int[n]; - iwork = new int[n]; - equed = " "; - - //Matrices A and B - a[0] = 1.8; - a[1] = 525; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -295; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -380; - a[14] = -1.04; - a[15] = 0.8; - b[0] = 9.52; - b[1] = 2435; - b[2] = 0.77; - b[3] = -6.22; - b[4] = 18.47; - b[5] = 225; - b[6] = -13.28; - b[7] = -6.21; - - //Solve the equations AX = B for X - //The NAG name equivalent of dgesvx is f07abf - DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, - c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - dgesvx.eval(); - - //Update - info = dgesvx.getINFO(); - equed = dgesvx.getEQUED(); - rcond = dgesvx.getRCOND(); - - if(info == 0 || info == n + 1){ - //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Backward errors (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", berr[i]); - } - System.out.println(); - System.out.println(); - System.out.println("Estimated forward error bounds (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", ferr[i]); - } - System.out.println(); - System.out.println(); - if(equed.equals("N")){ - System.out.println("A has not been equilibrated"); - } - else if(equed.equals("R")){ - System.out.println("A has been row scaled as diag(R)*A"); - } - else if(equed.equals("C")){ - System.out.println("A has been column scaled as A*diag(C)"); - } - else if(equed.equals("B")){ - System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); - } - System.out.println(); - System.out.println("Reciprocal condition number estimate of scaled matrix"); - System.out.printf(" %.1e\n", rcond); - System.out.println(); - System.out.println("Estimate of reciprocal pivot growth factor"); - System.out.printf(" %.1e\n", work[0]); - System.out.println(); - - if(info == n + 1){ - System.out.println(); - System.out.println("The matrix A is singular to working precision"); - } - } - else{ - System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); - } - } -} diff --git a/simple_examples/int32/F07ADJE.java b/simple_examples/int32/F07ADJE.java deleted file mode 100644 index 4450683..0000000 --- a/simple_examples/int32/F07ADJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F07.DGETRF; -import com.nag.routines.X04.X04CA; - -/** - * F07ADJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ADJE{ - - /** - * F07ADJ Example main program - */ - public static void main(String[] args){ - int ifail, info = 0, lda, m, n; - double[] a; - int[] ipiv; - - System.out.println("F07ADJ Example Program Results"); - System.out.println(); - - //Problem size (can be read from data file) - m = 4; - n = 4; - lda = m; - - //Data - ipiv = new int[n]; - a = new double[m * n]; - a[0] = 1.8; - a[1] = 5.25; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -2.95; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -0.95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -3.8; - a[14] = -1.04; - a[15] = 0.8; - - //Factorize A - //The NAG name equivalent of dgetrf is F07ADF - DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); - dgetrf.eval(); - - //Update - info = dgetrf.getINFO(); - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); - x04ca.eval(); - - //Print pivot indices - System.out.println("IPIV"); - for(int i = 0; i < Math.min(m, n); i++){ - System.out.printf("\t%d", ipiv[i]); - } - System.out.println(); - - if(info != 0){ - System.out.println("The factor U is singular"); - } - } -} diff --git a/simple_examples/int32/F07AQJE.java b/simple_examples/int32/F07AQJE.java deleted file mode 100644 index 5ee47e5..0000000 --- a/simple_examples/int32/F07AQJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F07.F07AQ; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexF; - -/** - * F07AQ example program text. - * @author joed - * @since 27.1.0.0 - */ -public class F07AQJE { - - public static void main(String[] args) { - - F07AQ f07aq = new F07AQ(); - int info, iter, lda, ldb, ldx, n, r; - NAGComplex[] a, b, work, x; - NAGComplexF[] swork; - double[] rwork; - int[] ipiv; - - System.out.println(" F07AQJ Example Program Results"); - System.out.println(); - - // Set dimensions and instantiate arrays - n = 4; - r = 1; - lda = ldb = ldx = n; - a = new NAGComplex[lda*n]; - b = new NAGComplex[ldb*r]; - work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); - x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); - swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); - ipiv = new int[n]; - rwork = new double[n]; - - // Set A - a[0] = new NAGComplex(-1.34, 2.55); // Column 1 - a[1] = new NAGComplex(-0.17, -1.41); - a[2] = new NAGComplex(-3.29, -2.39); - a[3] = new NAGComplex(2.41, 0.39); - a[4] = new NAGComplex(0.28, 3.17); // Column 2 - a[5] = new NAGComplex(3.31, -0.15); - a[6] = new NAGComplex(-1.91, 4.42); - a[7] = new NAGComplex(-0.56, 1.47); - a[8] = new NAGComplex(-6.39, -2.20); // Column 3 - a[9] = new NAGComplex(-0.15, 1.34); - a[10] = new NAGComplex(-0.14, -1.35); - a[11] = new NAGComplex(-0.83, -0.69); - a[12] = new NAGComplex(0.72, -0.92); // Column 4 - a[13] = new NAGComplex(1.29, 1.38); - a[14] = new NAGComplex(1.72, 1.35); - a[15] = new NAGComplex(-1.96, 0.67); - - // Set B - b[0] = new NAGComplex(26.26,51.78); - b[1] = new NAGComplex( 6.43,-8.68); - b[2] = new NAGComplex(-5.75,25.31); - b[3] = new NAGComplex( 1.16, 2.57); - - // Notify wrappers of complex types - Routine.setComplex(new NAGComplex()); - Routine.setComplexF(new NAGComplexF()); - - // Solve the equations Ax = b for x - iter = info = 0; - f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); - iter = f07aq.getITER(); - info = f07aq.getINFO(); - - if (info == 0) { - - // Print solution - - System.out.println(" Solution"); - for (int i = 0; i < n; i++) { - for (int j = 0; j < r; j++) { - System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); - } - } - System.out.println(); - - // Print pivot indices - - System.out.println(); - System.out.println(" Pivot indices"); - for (int i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.println(); - - } - else { - System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); - } - - } - -} diff --git a/simple_examples/int32/F07FAJE.java b/simple_examples/int32/F07FAJE.java deleted file mode 100644 index e516051..0000000 --- a/simple_examples/int32/F07FAJE.java +++ /dev/null @@ -1,79 +0,0 @@ -import com.nag.routines.F07.F07FA; -import com.nag.routines.X04.X04CA; - -/** - * F07FA example program text. - * @author saraht - */ -public class F07FAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, n; - double[] a, b; - - System.out.println(" F07FAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - - a = new double[n*n]; - b = new double[n]; - - /* A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18 */ - - a[0+0*n] = 4.16; - a[0+1*n] = -3.12; - a[0+2*n] = 0.56; - a[0+3*n] = -0.10; - - a[1+1*n] = 5.03; - a[1+2*n] = -0.83; - a[1+3*n] = 1.18; - - a[2+2*n] = 0.76; - a[2+3*n] = 0.34; - - a[3+3*n] = 1.18; - - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - /* Solve the equations Ax = b for x */ - - F07FA f07fa = new F07FA(); - info = 0; - f07fa.eval("Upper", n, 1, a, lda, b, n, info); - info = f07fa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); - - } - else { - System.err.printf(" The leading minor of order %d is not positive definite \n", info); - } - - } - -} diff --git a/simple_examples/int32/F07FBJE.java b/simple_examples/int32/F07FBJE.java deleted file mode 100644 index 09bbd37..0000000 --- a/simple_examples/int32/F07FBJE.java +++ /dev/null @@ -1,122 +0,0 @@ -import com.nag.routines.F07.F07FB; -import com.nag.routines.X04.X04CA; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * F07FB example program text. - * @author ludovic - */ -public class F07FBJE { - - public static void main(String[] args) { - String fact,uplo,equed; - int n, nrhs,lda,ldaf,ldb,ldx; - int[] iwork; - double rcond; - double[] a,af,s,b,x,ferr,berr,work; - int info,ifail; - lda = 4; - ldaf = lda; - ldb = lda; - ldx = lda; - nrhs = 2; - n = 4; - a = new double[lda*lda]; - af = new double[ldaf*ldaf]; - b = new double[ldb*nrhs]; - berr = new double[nrhs]; - ferr = new double[nrhs]; - s = new double[lda]; - work = new double[3*lda]; - x = new double[ldx*nrhs]; - iwork = new int[lda]; - info = 1; - rcond = Double.NaN; - fact = "E"; - uplo = "U"; - equed = "Z";//dummy value - /*A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18*/ - a[0] = 4.16; - - a[4] = -3.12; - a[5] = 5.03; - - a[8] = 0.56; - a[9] = -0.83; - a[10] = 0.76; - - a[12] = -0.10; - a[13] = 1.18; - a[14] = 0.34; - a[15] = 1.18; - - /*B= 8.70 8.30 - -13.35 2.13 - 1.89 1.61 - - 4.14 5.00*/ - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - b[4] = 8.30; - b[5] = 2.13; - b[6] = 1.61; - b[7] = 5.00; - - System.out.println(" F07FBJ Example Program Results"); - System.out.println(); - - F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, - ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - f07fb.eval(); - fact = f07fb.getFACT(); - uplo = f07fb.getUPLO(); - equed = f07fb.getEQUED(); - rcond = f07fb.getRCOND(); - info = f07fb.getINFO(); - - - if ((info == 0) || (info == n+1)) { - ifail = 0; - (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); - System.out.println(); - System.out.println(" Backward errors (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",berr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimated forward error bounds (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",ferr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimate of reciprocal condition number"); - System.out.printf(" %11.1e\n",rcond); - System.out.println(); - if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has not been equilibrated"); - } - else if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); - } - - if (info == n+1) { - System.out.println(); - System.out.println(" The matrix A is singular to working precision"); - } - - } - else { - System.out.printf(" The leading minor of order %3d is not positive definite\n"); - } - - } - -} diff --git a/simple_examples/int32/F08BTJE.java b/simple_examples/int32/F08BTJE.java deleted file mode 100644 index 43c219b..0000000 --- a/simple_examples/int32/F08BTJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import static java.lang.Math.*; - -import com.nag.routines.F06.F06JJ; -import com.nag.routines.F06.F06ZJ; -import com.nag.routines.F08.F08AU; -import com.nag.routines.F08.F08BT; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04DB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * F08BT example program text. - * @author ludovic - */ -public class F08BTJE { - - public static void main(String[] args) throws FileNotFoundException, IOException { - int incl = 1, nb = 64; - double tol; - int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; - NAGComplex[] a, b, tau, work; - double[] rnorm, rwork; - int[] jpvt; - String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; - - // Setup complex constants - NAGComplex one = new NAGComplex(); - NAGComplex zero = new NAGComplex(); - one.setRe(1.0); - one.setIm(0.0); - zero.setRe(0.0); - zero.setIm(0.0); - - // Inform the Routine class of the type of complex in use - can use any complex object - Routine.complex = one; - - System.out.println(" F08BTJ Example Program Results"); - System.out.println(); - - // Read values from data file - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); - line = br.readLine().trim(); - line = br.readLine().trim(); - String[] vals = line.split("\\s+"); - m = Integer.parseInt(vals[0].trim()); - n = Integer.parseInt(vals[1].trim()); - nrhs = Integer.parseInt(vals[2].trim()); - lda = ldb = m; - lwork = (n + 1) * nb; - a = new NAGComplex[lda * n]; - b = new NAGComplex[ldb * nrhs]; - tau = new NAGComplex[n]; - work = new NAGComplex[lwork]; - rnorm = new double[nrhs]; - rwork = new double[2 * n]; - jpvt = new int[n]; - - // Actually initialize the complex arrays - for (int i = 0; i < a.length; ++i) { - a[i] = new NAGComplex(); - } - for (int i = 0; i < b.length; ++i) { - b[i] = new NAGComplex(); - } - for (int i = 0; i < tau.length; ++i) { - tau[i] = new NAGComplex(); - } - for (int i = 0; i < work.length; ++i) { - work[i] = new NAGComplex(); - } - - /* Read A and B from data file */ - - readCompMatrix(br, a, lda, n); - readCompMatrix(br, b, ldb, nrhs); - br.close(); - - /* Initialize JPVT to be zero so that all columns are free */ - - for (int i = 0; i < n; ++i) { - jpvt[i] = 0; - } - - /* Compute the QR factorization of A */ - - F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); - f08bt.eval(); - - /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ - - String side = "Left"; - String conjTrans = "Conjugate Transpose"; - F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); - f08au.eval(); - a = (NAGComplex[])f08au.getA(); - - /* Choose TOL to reflect the relative accuracy of the input data */ - - tol = 0.01; - - /* Determine and print the rank, K, or R relative to TOL */ - - for (k = 1; k < n + 1; ++k) { - if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { - break; - } - } - k = k - 1; - - System.out.println(" Tolerance used to estimate the rank of A"); - System.out.printf(" %11.2E\n", tol); - System.out.println(" Estimated rank of A"); - System.out.printf(" %8d\n", k); - - /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 - * storing the result in B */ - - String upDown = "Upper"; - String trans = "No transpose"; - String unit = "Non-Unit"; - F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); - f06zj.eval(); - - /* Compute estimates of the square roots of the residual sums of squares - * (2-norm of each of the columns of C2) */ - - int mMinusK = m - k; - NAGComplex[] btmp = new NAGComplex[b.length]; - for (int i = 0; i < btmp.length; ++i) { - btmp[i] = new NAGComplex(); - } - System.arraycopy(b, k, btmp, 0, b.length - k); - - F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); - rnorm[0] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp, 0, b, k, b.length - k); - for (int j = 1; j < nrhs; ++j) { - System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); - rnorm[j] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); - } - - /* Set the remaining elements of the solutions to zero (to give the - * basic solutions) */ - - for (int i = k; i < n; ++i) { - for (int j = 0; j < nrhs; ++j) { - NAGComplex tmp = new NAGComplex(); - tmp.setRe(0.0); - tmp.setIm(0.0); - b[i + j * ldb] = tmp; - } - } - - /* Permute the least squares solution stored in B to give X = P*Y */ - - for (int j = 0; j < nrhs; j++) { - for (int i = 0; i < n; i++) { - work[jpvt[i] - 1] = b[j*ldb + i]; - } - for (int i = 0; i < n; i++) { - b[j*ldb + i] = work[i]; - } - } - - /* Print least squares solutions */ - - X04DB x04db = new X04DB(); - ifail = 0; - x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", - "Integer",rlabs,"Integer",clabs,80,0,ifail); - - /* Print the square roots of the residual sums of squares */ - - System.out.println(); - System.out.println(" Square root(s) of the residual sum(s) of squares"); - System.out.printf(" "); - for (int i = 0; i < nrhs; ++i) { - System.out.printf("%11.2E", rnorm[i]); - } - System.out.println(); - - } - - private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, - int col) throws IOException { - - // matches one complex number (without the brackets...) - String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; - String fullPattern = complexPat; - for (int i = 0; i < col -1; ++i) { - fullPattern = fullPattern + "\\s*" + complexPat; - } - fullPattern = fullPattern + ".*"; - Pattern comppat = Pattern.compile(fullPattern); - - for (int i = 0; i < row; ++i) { - String line = br.readLine().trim(); - if (line.equalsIgnoreCase("")) { - line = br.readLine().trim(); - } - Matcher m = comppat.matcher(line.trim()); - if (m.matches()) { - for (int j = 0; j < col; ++j) { - String[] numbers = m.group(j + 1).trim().split(","); - mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); - mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); - // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); - } - // System.out.println(); - } - - - } - } - - private static double abs(NAGComplex z) { - return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); - } - -} diff --git a/simple_examples/int32/F08FAJE.java b/simple_examples/int32/F08FAJE.java deleted file mode 100644 index 028f854..0000000 --- a/simple_examples/int32/F08FAJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.routines.F08.DDISNA; -import com.nag.routines.F08.F08FA; -import com.nag.routines.F16.F16JQ; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F08FA example program text. - * @author ludovic - */ -public class F08FAJE { - - public static void main(String[] args) { - int n = 4, LWork = n*64, lda = n; - double[] a, w, work,zerrbd,rcondz, colVector; - int info = 0, ifail = 0, k = 0; - a = new double[n * n]; - w = new double[n]; - work = new double[LWork]; - zerrbd = new double[n]; - rcondz = new double[n]; - colVector = new double[n]; - - System.out.println(" F08FAJ Example Program Results\n"); - - //array a : Stored in column major way - - a[0] = 1.0; - a[1] = 2.0; - a[2] = 3.0; - a[3] = 4.0; - - a[4] = 2.0; - a[5] = 2.0; - a[6] = 3.0; - a[7] = 4.0; - - a[8] = 3.0; - a[9] = 3.0; - a[10] = 3.0; - a[11] = 4.0; - - a[12] = 4.0; - a[13] = 4.0; - a[14] = 4.0; - a[15] = 4.0; - - //initializing the info parameter - info = 0; - w[0] = Double.NaN; - w[1] = Double.NaN; - w[2] = Double.NaN; - w[3] = Double.NaN; - F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); - f08fa.eval(); - info = f08fa.getINFO(); - - if (info == 0) { - System.out.println(" Eigenvalues"); - System.out.print(" "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %8.4f",w[i]); - } - System.out.println(); - - // Normalize the eigenvectors: largest element positive - F16JQ f16jq = new F16JQ(); // aka blas_damax_val - for (int i = 0; i < n; i++) { - System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate - f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value - k = f16jq.getK() - 1; // Make index zero based - - // Invert sign of column if largest element is negative - if (a[(4*i)+k] < 0) { - for (int j = 0; j < n; j++) { - a[(4*i)+j] = (-1) * a[(4*i)+j]; - } - } - - } - - (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); - - double eps = (new X02AJ()).eval(); - double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); - - (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); - for (int i = 0; i < n; ++i) { - zerrbd[i] = eerrbd/rcondz[i]; - } - - System.out.println(); - System.out.println(" Error estimate for the eigenvalues"); - System.out.printf(" %11.1e\n",eerrbd); - System.out.println(); - System.out.println(" Error estimates for the eigenvectors"); - for (int i = 0; i < n; ++i) { - System.out.printf(" %11.1e",zerrbd[i]); - } - System.out.println(); - - } - else { - System.out.printf(" Failure in DSYEV. INFO =%4d",info); - } - - } - -} diff --git a/simple_examples/int32/F08XPJE.java b/simple_examples/int32/F08XPJE.java deleted file mode 100644 index cc894d3..0000000 --- a/simple_examples/int32/F08XPJE.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.nag.routines.F06.F06UA; -import com.nag.routines.F06.F06BN; -import com.nag.routines.F06.ZGEMM; -import com.nag.routines.F08.ZGGESX; -import com.nag.routines.M01.M01DA; -import com.nag.routines.M01.M01ED; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04DB; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * F08XPJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F08XPJE{ - - public static boolean chkfac = false; - public static boolean prcond = false; - public static boolean prmat = false; - public static int nb = 64; - - /* - * F08XPJ Example main program - */ - public static void main(String[] args){ - NAGComplex alph, bet; - double abnorm, anorm, bnorm, eps, normd, norme, tol; - int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; - boolean factor; - NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; - double[] rconde, rcondv, rwork; - int[] idum, iwork; - boolean[] bwork; - String[] clabs, rlabs; - - //Placeholders - idum = new int[1]; - rconde = new double[2]; - rcondv = new double[2]; - dummy = NAGComplex.createArray(1); - - System.out.println("F08XPJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - //Tell wrappers what time of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //n declared here for neater code but can be read in from data file - n = 4; - lda = n; - ldb = n; - ldc = n; - ldd = n; - lde = n; - ldvsl = n; - ldvsr = n; - - //Allocate - a = NAGComplex.createArray(lda * n); - alpha = NAGComplex.createArray(n); - b = NAGComplex.createArray(ldb * n); - beta = NAGComplex.createArray(n); - c = NAGComplex.createArray(ldc * n); - d = NAGComplex.createArray(ldd * n); - e = NAGComplex.createArray(lde * n); - vsl = NAGComplex.createArray(ldvsl * n); - vsr = NAGComplex.createArray(ldvsr * n); - rwork = new double[8 * n]; - bwork = new boolean[n]; - clabs = new String[1]; - clabs[0] = " "; - rlabs = new String[1]; - rlabs[0] = " "; - - //Use routine workspace query to get optimal workspace - lwork = -1; - liwork = -1; - //The NAG name equivalent of zggesx is f08xpf - selctg selctg1 = new selctg(); - ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, - rwork, idum, liwork, bwork, info); - zggesx.eval(); - - //Make sure that there is a enough workspace for block size nb - lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); - liwork = Math.max(n + 2, idum[0]); - work = NAGComplex.createArray(lwork); - iwork = new int[liwork]; - - //Read in matrices A and B - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - line = reader.readLine(); //skip n (set manually for neater code) - String[] sVal; - - for(int i = 0; i < 2; i++){ - for(int j = 0; j < n; j++){ - line = reader.readLine(); - sVal = line.split("\\)"); - for(int k = 0; k < n; k++){ - if(i == 0){ - a[(k * n) + j] = parseComplex(sVal[k]); - } - else{ - b[(k * n) + j] = parseComplex(sVal[k]); - } - } - } - } - - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - - if(chkfac){ - for(int i = 0; i < a.length; i++){ - //Copy A and B into D and E respectively - d[i] = a[i]; - e[i] = b[i]; - } - } - - //Find the Forbenius norms of A and B - //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf - F06UA f06ua = new F06UA(); - anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); - bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); - - if(prmat){ - //Print matrices A and B - //ifail : behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - - ifail = 0; - x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - } - - factor = true; - //Find the generalized Schur form - //The NAG name equivalent of zggesx is f08xpf - zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, - rwork, iwork, liwork, bwork, info); - zggesx.eval(); - - //update - sdim = zggesx.getSDIM(); - - if(info != 0 && info != (n + 2)){ - System.out.printf("Failure in ZGGESX. INFO = %d\n", info); - factor = false; - } - else if(chkfac){ - //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D - //The NAG name equivalent of zgemm is f06zaf - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); - zgemm.eval(); - - //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); - zgemm.eval(); - - //Find norms of matrices D and E and warn if either is too large - f06ua = new F06UA("0", ldd, n, d, ldd, rwork); - normd = f06ua.eval(); - X02AJ x02aj = new X02AJ(); - if(normd > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); - factor = false; - System.out.println("Schur factorization has failed"); - } - f06ua = new F06UA("0", lde, n, e, lde, rwork); - norme = f06ua.eval(); - if(norme > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); - factor = false; - } - } - - if(factor){ - //Print eigenvalue details - System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); - System.out.println("(dimension of deflating subspaces)"); - - System.out.println(); - //Print selected (finite) generalized eigenvalues - System.out.println("Selected generalized eigenvalues"); - - //Store absolute values of eigenvalues for ranking - for(int i = 0; i < n; i++){ - work[i] = alpha[i].divide(beta[i]); - rwork[i] = NAGComplex.abs(work[i]); - } - - //Rank eigenvalues - ifail = 0; - M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); - m01da.eval(); - - //Sort eigevalues in work - M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); - m01ed.eval(); - for(int i = 0; i < sdim; i++){ - System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); - } - - if(info == n + 2){ - System.out.println("*** note that rounding errors mean that leading eigenvalues in"); - System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); - System.out.println(); - } - - if(prcond){ - //Compute the machine precision and sqrt(anorm^2 + bnorm^2) - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - F06BN f06bn = new F06BN(anorm, bnorm); - abnorm = f06bn.eval(); - tol = eps * abnorm; - - //Print out the reciprocal condition numbers and error bound for selected eigenvalues - System.out.println("Reciprocal condition numbers for the average of the selected"); - System.out.println("eigenvalues and their asymptotic error bound"); - System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); - } - } - else{ - System.out.println("Schur factorization has failed"); - } - - } - - /** - * Converts String read in from data file to NAGComplex value. - * @param s - * Complex number string - * @return new NAGComplex representing s - */ - public static NAGComplex parseComplex(String s){ - s = s.trim(); - double re = Double.parseDouble(s.substring(1, 7)); - double im = Double.parseDouble(s.substring(8)); - return new NAGComplex(re, im); - } - - /** - * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. - */ - public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ - public boolean eval(){ - return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); - } - } - -} diff --git a/simple_examples/int32/G01ALJE.java b/simple_examples/int32/G01ALJE.java deleted file mode 100644 index 672a151..0000000 --- a/simple_examples/int32/G01ALJE.java +++ /dev/null @@ -1,55 +0,0 @@ -import com.nag.routines.G01.G01AL; - -/** - * G01ALJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G01ALJE{ - - /** - * G01ALJ Example main program - */ - public static void main(String[] args){ - int ifail, n; - double[] x, res; - int[] iwrk; - - res = new double[5]; - - System.out.println("G01ALJ Example Program Results"); - System.out.println(); - - //Problem size - n = 12; - - //Allocate - x = new double[n]; - iwrk = new int[n]; - - //Data - x[0] = 12; - x[1] = 9; - x[2] = 2; - x[3] = 5; - x[4] = 6; - x[5] = 8; - x[6] = 2; - x[7] = 7; - x[8] = 3; - x[9] = 1; - x[10] = 11; - x[11] = 10; - - //Calculate summary statistics - ifail = 0; - G01AL g01al = new G01AL(n, x, iwrk, res, ifail); - g01al.eval(); - - System.out.printf("Maximum %.4f\n", res[4]); - System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); - System.out.printf("Median (50%% quantile) %.4f\n", res[2]); - System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); - System.out.printf("Minimum %.4f\n", res[0]); - } -} diff --git a/simple_examples/int32/G02AKJE.java b/simple_examples/int32/G02AKJE.java deleted file mode 100644 index 8ddaff2..0000000 --- a/simple_examples/int32/G02AKJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.G02.G02AK; -import com.nag.routines.X04.X04CA; - -/** - * G02AK example program text. - * @author joed - * @since 27.0.0.0 - */ -public class G02AKJE { - - /** - * G02AKJ example main program. - */ - public static void main(String[] args) { - - G02AK g02ak = new G02AK(); - X04CA x04ca = new X04CA(); - double errtol, f, rankerr, ranktol; - int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; - double[] g, x; - - System.out.println("G02AKJ Example Program Results\n"); - - // Problem size - n = 4; - ldg = n; - ldx = n; - - // Rank constraint - rank = 2; - - // Matrix G (column-major) - g = new double[]{ - 2.0, -1.0, 0.0, 0.0, - -1.0, 2.0, -1.0, 0.0, - 0.0, -1.0, 2.0, -1.0, - 0.0, 0.0, -1.0, 2.0 - }; - - // Use the defaults for errtol, ranktol, maxits, maxit - errtol = 0.0; - ranktol = 0.0; - maxits = 0; - maxit = 0; - - // Calculate rank constrained nearest correlation matrix - ifail = 0; - x = new double[ldx*n]; - f = 0.0; - rankerr = 0.0; - nsub = 0; - g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, - rankerr, nsub, ifail); - nsub = g02ak.getNSUB(); - f = g02ak.getF(); - rankerr = g02ak.getRANKERR(); - - // Display results - ifail = 0; - x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); - System.out.println(); - System.out.printf("Number of subproblems solved: %12d\n\n", nsub); - System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); - System.out.printf("Rank error: %35.4f\n", rankerr); - - } - -} diff --git a/simple_examples/int32/G02BJJE.java b/simple_examples/int32/G02BJJE.java deleted file mode 100644 index 3de843e..0000000 --- a/simple_examples/int32/G02BJJE.java +++ /dev/null @@ -1,303 +0,0 @@ -import com.nag.routines.G02.G02BJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G02BJ example program text. - * @author ludovic - */ -public class G02BJJE { - - public static void main(String[] args) { - int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; - double[] cnt, r, ssp, std, xbar;//, xmiss; - - if (args.length != 1) { - G02BJJE.usage(); - } - - String dataFile = args[0]; - DataHolder data = new DataHolder(); - readDataFile(dataFile, data); - System.out.println(" G02BJJ Example Program Results"); - System.out.println(); - - ldcnt = ldr = ldssp = data.nvars; - ldx = data.n; - cnt = new double[ldcnt * data.nvars]; - r = new double[ldr * data.nvars]; - ssp = new double[ldssp * data.nvars]; - std = new double[data.nvars]; - xbar = new double[data.nvars]; - - - //Display the data - - System.out.printf(" Number of variables (columns) = %5d\n", data.m); - System.out.printf(" Number of cases (rows) = %5d\n", data.n); - System.out.println(); - System.out.println(" Data matrix is:-"); - for (int ii = 0; ii < data.m; ++ii) { - System.out.printf(" %12d",ii+1); - } - System.out.println(); - for (int ii = 0; ii < data.n; ++ii) { - System.out.printf(" %3d ",ii+1); - for (int jj = 0; jj < data.m; ++jj) { - System.out.printf("%12.4f ",data.x[ii + jj * data.n]); - } - System.out.println(); - } - - ifail = 0; - G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, - data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, - ldcnt, ifail); - g02bj.eval(); - - data.n = g02bj.getN(); - data.m = g02bj.getM(); - data.x = g02bj.getX(); - ldx = g02bj.getLDX(); - data.miss = g02bj.getMISS(); - data.xmiss = g02bj.getXMISS(); - data.nvars = g02bj.getNVARS(); - data.kvar = g02bj.getKVAR(); - xbar = g02bj.getXBAR(); - std = g02bj.getSTD(); - ssp = g02bj.getSSP(); - ldssp = g02bj.getLDSSP(); - r = g02bj.getR(); - ldr = g02bj.getLDR(); - ncases = g02bj.getNCASES(); - cnt = g02bj.getCNT(); - ldcnt = g02bj.getLDCNT(); - ifail = g02bj.getIFAIL(); - - //Display results - System.out.println(); - System.out.println(" Variable\tMean\tSt.dev."); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); - } - System.out.println(); - System.out.println(" Sums of squares and cross-products of deviations"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.println(" Correlation coefficients"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",r[ii + ldr * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); - System.out.println(); - System.out.println(" Numbers used for each pair are:"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); - } - System.out.println(); - } - System.out.println(); - } - - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - /** - G02BJF Example Program Data - 5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 - 12.0 2.0 0.0 0.0 - -1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS - -1.0 0.0 0.0 0.0 :: XMISS - 4 1 2 :: KVAR - */ - private static void readDataFile(String filename, DataHolder data) { - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String line = br.readLine(); // skip header - line = br.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvars(Integer.parseInt(sVal[2])); - - data.x = new double[data.n * data.m]; - data.miss = new int[data.m]; - data.xmiss = new double[data.m]; - data.kvar = new int[data.nvars]; - - for (int i = 0; i < data.n; ++i) { - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.x[i + j * data.n] = Double.parseDouble(sVal[j]); - } - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.miss[j] = Integer.parseInt(sVal[j]); - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.xmiss[j] = Double.parseDouble(sVal[j]); - } - - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.nvars; ++j) { - data.kvar[j] = Integer.parseInt(sVal[j]); - } - } - catch (FileNotFoundException ex) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch (IOException ex) { - System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); - System.exit(-3); - } - - } - - private static class DataHolder { - private int n; - private int m; - private int nvars; - private double[] x; - private int[] miss; - private double[] xmiss; - private int[] kvar; - - /** - * @return the n - */ - public int getN() { - return n; - } - - /** - * @param n the n to set - */ - public void setN(int n) { - this.n = n; - } - - /** - * @return the m - */ - public int getM() { - return m; - } - - /** - * @param m the m to set - */ - public void setM(int m) { - this.m = m; - } - - /** - * @return the nvars - */ - public int getNvars() { - return nvars; - } - - /** - * @param nvars the nvars to set - */ - public void setNvars(int nvars) { - this.nvars = nvars; - } - - /** - * @return the x - */ - public double[] getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(double[] x) { - this.x = x; - } - - /** - * @return the miss - */ - public int[] getMiss() { - return miss; - } - - /** - * @param miss the miss to set - */ - public void setMiss(int[] miss) { - this.miss = miss; - } - - /** - * @return the xmiss - */ - public double[] getXmiss() { - return xmiss; - } - - /** - * @param xmiss the xmiss to set - */ - public void setXmiss(double[] xmiss) { - this.xmiss = xmiss; - } - - /** - * @return the kvar - */ - public int[] getKvar() { - return kvar; - } - - /** - * @param kvar the kvar to set - */ - public void setKvar(int[] kvar) { - this.kvar = kvar; - } - } -} diff --git a/simple_examples/int32/G02BRJE.java b/simple_examples/int32/G02BRJE.java deleted file mode 100644 index 084f478..0000000 --- a/simple_examples/int32/G02BRJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.G02.G02BR; - -/** - * G02BRJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G02BRJE{ - - /** - * G02BRJ Example main program - */ - public static void main(String[] args){ - int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder - double[] rr, work1, work2, x, xmiss; - int[] incase, kworka, kworkb, kworkc, miss; - - System.out.println("G02BRJ Example Program Results"); - System.out.println(); - - //Problem size - n = 9; - m = 3; - itype = 0; - - ldrr = m; - ldx = n; - - //Allocate - rr = new double[ldrr * m]; - work1 = new double[n]; - work2 = new double[n]; - x = new double[ldx * m]; - xmiss = new double[m]; - incase = new int[n]; - kworka = new int[n]; - kworkb = new int[n]; - kworkc = new int[n]; - miss = new int[m]; - - //Data - //X = (1.70, 1.00, 0.50) - // (2.80, 4.00, 3.00) - // (0.60, 6.00, 2.50) - // (1.80, 9.00, 6.00) - // (0.99, 4.00, 2.50) - // (1.40, 2.00, 5.50) - // (1.80, 9.00, 7.50) - // (2.50, 7.00, 0.00) - // (0.99, 5.00, 3.00) - x[0] = 1.7; - x[1] = 2.8; - x[2] = 0.6; - x[3] = 1.8; - x[4] = 0.99; - x[5] = 1.4; - x[6] = 1.8; - x[7] = 2.5; - x[8] = 0.99; - x[9] = 1; - x[10] = 4; - x[11] = 6; - x[12] = 9; - x[13] = 4; - x[14] = 2; - x[15] = 9; - x[16] = 7; - x[17] = 5; - x[18] = 0.5; - x[19] = 3; - x[20] = 2.5; - x[21] = 6; - x[22] = 2.5; - x[23] = 5.5; - x[24] = 7.5; - x[25] = 0; - x[26] = 3; - - //Missing value flags - miss[0] = 1; - miss[1] = 0; - miss[2] = 1; - xmiss[0] = 0.99; - xmiss[1] = 0; - xmiss[2] = 0; - - //Display data - System.out.printf("Number of variables (columns) = %d\n", m); - System.out.printf("Number of case (rows) = %d\n", n); - System.out.println(); - System.out.println("Data matrix is:-\n"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", x[(j * n) + i]); - } - System.out.println(); - } - System.out.println(); - - //Calculate correlation coefficients - ifail = 0; - G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, - work1, work2, ifail); - g02br.eval(); - - //Update - ncases = g02br.getNCASES(); - - //Display results - System.out.println("Matrix of rank correlation coefficients:"); - System.out.println("Upper triangle -- Spearman's"); - System.out.println("Lower triangle -- Kendall's tau"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", rr[(j * m) + i]); - } - System.out.println(); - } - System.out.println(); - System.out.printf("Number of cases actually used: %d\n", ncases); - } -} diff --git a/simple_examples/int32/G02DAJE.java b/simple_examples/int32/G02DAJE.java deleted file mode 100644 index c390197..0000000 --- a/simple_examples/int32/G02DAJE.java +++ /dev/null @@ -1,187 +0,0 @@ -import com.nag.routines.G02.G02BU; -import com.nag.routines.G02.G02DA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G02DAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02DAJE{ - - /** - * G02DAJ Example main program - */ - public static void main(String[] args){ - double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; - int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; - boolean svd = false; - String mean, weight; - double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; - int[] isx; - - System.out.println("G02DAJ Example Program Results"); - System.out.println(); - - c = new double[1]; - wmean = new double[1]; - - //Problem size (can be read in from data file - n = 12; - m = 4; - weight = "U"; - mean = "M"; - - if(weight.toLowerCase().equals("w")){ - lwt = n; - } - else{ - lwt = 0; - } - ldx = n; - - x = new double[ldx * m]; - y = new double[n]; - wt = new double[n]; - isx = new int[m]; - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip n, m, weight, mean - - //Read in data - String[] sVal; - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - x[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - if(lwt > 0){ - wt[i] = Double.parseDouble(sVal[m + 1]); - } - } - - //Read in variable inclusion flags - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < m; i++){ - isx[i] = Integer.parseInt(sVal[i]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Calcluate IP - ip = 0; - for(int i = 0; i < m; i++){ - if(isx[i] == 1){ - ip++; - } - } - if(mean.toLowerCase().equals("m")){ - ip = ip + 1; - } - - //Allocate - ldq = n; - b = new double[ip]; - cov = new double[((ip * ip) + ip)/2]; - h = new double[n]; - p = new double[ip * ip * (ip + 2)]; - q = new double[ldq * (ip + 1)]; - res = new double[n]; - se = new double[ip]; - wk = new double[ip * ip + (5 * (ip - 1))]; - - //Use suggested value for tolerance - tol = 0.000001; - - //fit general linear regression model - ifail = -1; - G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, - ldq, svd, irank, p, tol, wk, ifail); - g02da.eval(); - ifail = g02da.getIFAIL(); - if(ifail != 0){ - if(ifail != 5){ - System.exit(-3); - } - } - - //Calculate (weighted) total sums of squares, adjusted for mean if required - //If in G02DAF, an intercept is added to the regression by including a comlumn of - //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used - //in this call to G02BUF - ifail = 0; - G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); - g02bu.eval(); - - idf = g02da.getIDF(); - irank = g02da.getIRANK(); - //Get effective number of observations (=N if there are no zero weights) - en = (double) idf + irank; - - rss = g02da.getRSS(); - //Calculate R-squared, corrected R-Squared and AIC - rsq = 1 - rss/c[0]; - if(mean.toLowerCase().equals("m")){ - mult = (en - 1) / (en - irank); - } - else{ - mult = en / (en - irank); - } - arsq = 1 - mult * (1 - rsq); - aic = en * Math.log(rss/en) + (2 * irank); - - svd = g02da.getSVD(); - //Disply results - if(svd){ - System.out.printf("Model not of full rank, rank = %d", irank); - System.out.println(); - } - System.out.printf("Residual sum of squares = %.4e\n", rss); - System.out.printf("Degrees of freedom = %d\n", idf); - System.out.printf("R-squared = %.4e\n", rsq); - System.out.printf("Adjusted R-squared = %.4e\n", arsq); - System.out.printf("AIC = %.4e\n", aic); - System.out.println(); - System.out.printf("Variable\tParameter estimate\tStandard error\n"); - System.out.println(); - if(ifail == 0){ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); - } - } - else{ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); - } - } - System.out.println(); - System.out.printf(" Obs\t\t Residuals\t\t H\n"); - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); - } - - } -} diff --git a/simple_examples/int32/G02EEJE.java b/simple_examples/int32/G02EEJE.java deleted file mode 100644 index 5856fde..0000000 --- a/simple_examples/int32/G02EEJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.G02.G02EE; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G02EE example program text. - */ -public class G02EEJE { - - public static void main(String[] args) throws Exception { - int vnlen = 3; - double chrss, f, fin, rss; - rss = chrss = f = Double.NaN; - int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; - boolean addvar = false; - String mean, weight, newvar; - newvar = " "; - double[] exss, p, q, wk, wt, x, y; - int[] isx; - String[] free, model, vname; - - System.out.println(" G02EEJ Example Program Results\n"); - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - String line = dataIn.readLine(); - - String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - mean = data[2].substring(1,2); - weight = data[3].substring(1,2); - fin = Double.parseDouble(data[4]); - - if (weight.equalsIgnoreCase("W")) { - lwt = n; - } - else { - lwt = 0; - } - ldx = n; - - x = new double[ldx*m]; - y = new double[n]; - wt = new double[lwt]; - isx = new int[m]; - vname = new String[m]; - - for (int i = 0; i < vname.length;++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - vname[i] = tmp.toString(); - } - - if (lwt > 0) { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - wt[i] = Double.parseDouble(data[m+1]); - } - } - else { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - } - } - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int i = 0; i < m; ++i) { - isx[i] = Integer.parseInt(data[i]); - } - - data = dataIn.readLine().trim().split("::")[0].trim() - .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); - for (int i = 0; i < m; ++i) { - vname[i] = data[i].substring(0,3); - } - - dataIn.close(); - - maxip = 0; - for (int i = 0; i < m; ++i) { - if (isx[i] > 0) { - ++maxip; - } - } - - if (mean.equalsIgnoreCase("M")) { - maxip += 1; - } - - ldq = n; - model = new String[maxip]; - free = new String[maxip]; - exss = new double[maxip]; - q = new double[ldq*(maxip+2)]; - p = new double[maxip+1]; - wk = new double[2*maxip]; - - for (int i = 0; i < model.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - model[i] = tmp.toString(); - } - for (int i = 0; i < free.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - free[i] = tmp.toString(); - } - istep = 0; - ifail = -1; - - - G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, - addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, - wk,ifail); - for (int i = 0; i < m; ++i) { - g02ee.setIFAIL(0); - g02ee.eval(); - - System.out.printf(" Step %2d\n",g02ee.getISTEP()); - if (!g02ee.getADDVAR()) { - System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - break; - } - else { - System.out.println(" Added variable is "+g02ee.getNEWVAR()); - System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); - System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); - System.out.println(); - System.out.print(" Variables in model:"); - for (int j = 0; j < g02ee.getNTERM(); ++j) { - System.out.print(" "+g02ee.getMODEL()[j]); - } - System.out.println("\n"); - System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); - System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); - System.out.println(); - if (g02ee.getIFR() == 0) { - System.out.println(" No free variables remaining"); - break; - } - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - - } - - } - - } - -} diff --git a/simple_examples/int32/G02MAJE.java b/simple_examples/int32/G02MAJE.java deleted file mode 100644 index 4a8bfcb..0000000 --- a/simple_examples/int32/G02MAJE.java +++ /dev/null @@ -1,130 +0,0 @@ -import com.nag.routines.G02.G02MA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * G02MAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02MAJE{ - - /** - * G02MAJ example main program - */ - public static void main(String[] args){ - int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; - double[] b, d, fitsum, ropt, y; - int[] isx; - - isx = new int[0]; //placeholder - - System.out.println("G02MAJ Example Program Results"); - System.out.println(); - - //data (Could also read in from data file) - //Problem size - n = 20; - m = 6; - - //Model Specification - mtype = 1; - pred = 3; - prey = 1; - mnstep = 6; - lisx = 0; - - //Variable inclusion flags aren't needed in this example - ip = m; - - //Optional arguments (using defaults) - lropt = 0; - ropt = new double[lropt]; - - //D and Y - ldd = n; - y = new double[n]; - d = new double[ldd * m]; - - //Read in D and Y from data file (too large to write out) - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip N, M - line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx - - String sVal[]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - d[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Allocate output arrays - ldb = ip; - b = new double[ldb * (mnstep + 2)]; - fitsum = new double[6 * (mnstep + 1)]; - - //Call the model fitting routine - ifail = -1; - G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, - fitsum, ropt, lropt, ifail); - g02ma.eval(); - ifail = g02ma.getIFAIL(); - if(ifail != 0){ - if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ - //ifail = 112, 161, 162, 163 are warnings, so no need to terminate - System.exit(-2); - } - } - - //update - nstep = g02ma.getNSTEP(); - - //Display the parameter estimates - System.out.printf(" Step\t\t\tParameter Estimate\n"); - System.out.println("------------------------------------------------------"); - for(int i = 0; i < nstep; i++){ - System.out.printf(" %d", (i + 1)); - for(int j = 0; j < ip; j++){ - System.out.printf("\t%.3f", b[j + (i * nstep)]); - } - System.out.printf("\n"); - } - System.out.println(); - System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); - System.out.println(); - System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); - System.out.println("---------------------------------------------------------"); - for(int k = 0; k < nstep; k++){ - System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], - (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], - fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); - } - System.out.println(); - System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); - } -} diff --git a/simple_examples/int32/G03GAJE.java b/simple_examples/int32/G03GAJE.java deleted file mode 100644 index ba20592..0000000 --- a/simple_examples/int32/G03GAJE.java +++ /dev/null @@ -1,355 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import com.nag.routines.G03.G03GA; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * G03GAJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G03GAJE{ - - /** - * G03GAJ example main program. - */ - public static void main(String[] args){ - int i, ldx, lprob, riter, lds, sds, ifail = 0; - double[] w, g, s, f; - double tol, loglik = 0; - - if(args.length != 1){ - G03GAJE.usage(); - } - - // Data file name as argument - String filename = args[0]; - // DataHolder object to hold data read in from data file - DataHolder data = new DataHolder(); - - readDataFile(filename, data); - - System.out.println(" G03GAJ Example Program Results"); - System.out.println(); - - // Leading dimensions - ldx = data.n; - lprob = data.n; - - - switch(data.sopt){ - case 1: - s = new double[data.nvar * data.nvar * data.ng]; - lds = data.nvar; - sds = data.nvar; - break; - case 2: - s = new double[data.nvar * data.nvar * 1]; - lds = data.nvar; - sds = data.nvar; - break; - case 3: - s = new double[data.nvar * data.ng * 1]; - lds = data.nvar; - sds = data.ng; - break; - case 4: - s = new double[data.nvar * 1 * 1]; - lds = data.nvar; - sds = 1; - break; - default: - s = new double[1 * 1 * 1]; - lds = 1; - sds = 1; - break; - } - - // Allocate array size - g = new double[data.nvar * data.ng]; - w = new double[data.ng]; - f = new double[data.n * data.ng]; - tol = 0.0; - riter = 5; - - ifail = 0; - - // Create g03ga object with variables from data file - G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, - lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); - - // Run routine - g03ga.eval(); - - // Update variables - data.n = g03ga.getN(); - data.m = g03ga.getM(); - data.x = g03ga.getX(); - ldx = g03ga.getLDX(); - data.isx = g03ga.getISX(); - data.nvar = g03ga.getNVAR(); - data.ng = g03ga.getNG(); - data.popt = g03ga.getPOPT(); - data.prob = g03ga.getPROB(); - lprob = g03ga.getLPROB(); - data.niter = g03ga.getNITER(); - riter = g03ga.getRITER(); - w = g03ga.getW(); - g = g03ga.getG(); - data.sopt = g03ga.getSOPT(); - s = g03ga.getS(); - lds = g03ga.getLDS(); - sds = g03ga.getSDS(); - f = g03ga.getF(); - tol = g03ga.getTOL(); - loglik = g03ga.getLOGLIK(); - ifail = g03ga.getIFAIL(); - - // Results - X04CA x04ca = new X04CA(); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); - - System.out.println(); - switch(data.sopt){ - case 1: - for(i = 0; i < data.ng; i++){ - ifail = 0; - // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic - // calling X04CA along the 3rd dimension - x04ca.eval("g", "n", data.nvar, data.nvar, - Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), - lds, "Variance-cavariance matrix", ifail); - } - break; - case 2: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); - break; - case 3: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); - break; - case 4: - ifail = 0; - x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); - break; - case 5: - ifail = 0; - x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); - break; - } - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); - - System.out.println(); - System.out.println("No. iterations: " + data.niter); - System.out.printf("Log-likelihood: %.04f\n", loglik); - } - - /** - * Read data from given filename and puts into DataHolder object - * @param filename - * Name of data file (absolute or relative path) - * @param data - * DataHolder object to store data from data file - */ - public static void readDataFile(String filename, DataHolder data){ - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - // Problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvar(Integer.parseInt(sVal[2])); - - // Number of groups - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNg(Integer.parseInt(sVal[0])); - - // Scaling option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setSopt(Integer.parseInt(sVal[0])); - - // Initial probabilities option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setPopt(Integer.parseInt(sVal[0])); - - // Maximum number of iterations - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNiter(Integer.parseInt(sVal[0])); - - // - data.x = new double[data.m * data.n]; - data.prob = new double[data.ng * data.n]; - data.isx = new int[data.m]; - - //Data matrix X - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.m; ++j){ - data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - - //Included variables - if(data.nvar != data.m){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int i = 0; i < data.m; ++i){ - data.isx[i] = Integer.parseInt(sVal[i]); - } - } - - - //Optionally read initial probabilities of group memebership (included in example data) - if(data.popt == 2){ - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.ng; ++j){ - data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - } - - /** - * Stores data from data file for later reference - */ - private static class DataHolder{ - private int n; - private int m; - private int nvar; - private int ng; - private int sopt; - private int popt; - private int niter; - private int isx[]; - private double x[]; - private double prob[]; - - public void setN(int n){ - this.n = n; - } - - public int getN(){ - return n; - } - - public void setM(int m){ - this.m = m; - } - - public int getM(){ - return m; - } - - public void setNvar(int nvar){ - this.nvar = nvar; - } - - public int getNvar(){ - return nvar; - } - - public void setNg(int ng){ - this.ng = ng; - } - - public int getNg(){ - return ng; - } - - public void setSopt(int sopt){ - this.sopt = sopt; - } - - public int getSopt(){ - return sopt; - } - - public void setPopt(int popt){ - this.popt = popt; - } - - public int getPopt(){ - return popt; - } - - public void setNiter(int niter){ - this.niter = niter; - } - - public int getNiter(){ - return niter; - } - - public void setIsx(int[] isx){ - this.isx = isx; - } - - public int[] getIsx(){ - return isx; - } - - public void setX(double[] x){ - this.x = x; - } - - public double[] getX(){ - return x; - } - - public void setProb(double[] prob){ - this.prob = prob; - } - - public double[] getProb(){ - return prob; - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/G05KFJE.java b/simple_examples/int32/G05KFJE.java deleted file mode 100644 index 18ce755..0000000 --- a/simple_examples/int32/G05KFJE.java +++ /dev/null @@ -1,105 +0,0 @@ -import com.nag.routines.G05.G05KF; -import com.nag.routines.G05.G05SA; -import com.nag.routines.Routine; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G05KFJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G05KFJE{ - - /** - * G05KFJ example main program. - */ - public static void main(String[] args){ - //genid, subid only initilised so they can be set in try{} without java throwing error - int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; - int ifail, lstate; - int[] seed, state; - double x[]; - - System.out.println("G05KFJ Example Program Results"); - System.out.println(); - - //No file input given - if(args.length != 1){ - G05KFJE.usage(); - } - - seed = new int[lseed]; - - //Read in data from data fiel - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the base generator information and seed - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - genid = Integer.parseInt(sVal[0]); - subid = Integer.parseInt(sVal[1]); - seed[0] = Integer.parseInt(sVal[2]); - - //Read in sample size - line = reader.readLine(); - sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - lstate = 0; - ifail = 0; - state = new int[lstate]; - - //Initial call to get size of STATE array - G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); - g05kf.eval(); - - //Update local variables - lstate = g05kf.getLSTATE(); - state = g05kf.getSTATE(); - - //Reallocate STATE - state = new int[lstate]; - - //Update object variables - g05kf.setSTATE(state); - g05kf.eval(); - - //Update local variables - state = g05kf.getSTATE(); - - x = new double[n]; - - //Generate the variates - ifail = 0; - G05SA g05sa = new G05SA(n, state, x, ifail); - g05sa.eval(); - - //Display the variates - for(int i = 0; i < x.length; i++){ - System.out.printf("%.4f\n", x[i]); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/G13AWJE.java b/simple_examples/int32/G13AWJE.java deleted file mode 100644 index 9e829bd..0000000 --- a/simple_examples/int32/G13AWJE.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.nag.routines.G01.G01EW; -import com.nag.routines.G13.G13AW; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G13AW example program text. - */ -public class G13AWJE { - - public static void main(String[] args) { - - int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; - double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., - -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., - 88.,122.,126.,114.,85.,64}; - int[] state = new int[1]; - G13AW g13aw = new G13AW(type, p, n, y, ifail); - System.out.println(" G13AWJ Example Program Results\n"); - double ts = g13aw.eval(); - G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); - double pvalue = g01ew.eval(); - ifail = g01ew.getIFAIL(); - if (ifail == 0 || ifail == 201) { - System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); - System.out.printf("associated p-value = %6.3f\n", pvalue); - } - - } - -} diff --git a/simple_examples/int32/G13MEJE.java b/simple_examples/int32/G13MEJE.java deleted file mode 100644 index a768a46..0000000 --- a/simple_examples/int32/G13MEJE.java +++ /dev/null @@ -1,160 +0,0 @@ -import com.nag.routines.G13.G13ME; - -/** - * G13MEJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13MEJE{ - - /** - * G13MEJ main program - */ - public static void main(String[] args){ - double tau; - int ifail, lrcomm, m, nb, pn; - double[] iema, rcomm, sinit, t; - int[] inter, nbVal; - - inter = new int[2]; - - System.out.println("G13MEJ Example Program Results"); - System.out.println(); - - //data (can read in from data file) - //Number of iteration required - m = 2; - - //Decay parameter and interpolation method - tau = 2; - inter[0] = 3; - inter[1] = 2; - - //Initial values - sinit = new double[m + 2]; - sinit[0] = 5; - sinit[1] = 0.5; - sinit[2] = 0.5; - sinit[3] = 0.5; - - //Array of NB values in order - nbVal = new int[3]; - nbVal[0] = 5; - nbVal[1] = 10; - nbVal[2] = 15; - - //First block - double[] t1 = new double[nbVal[0]]; - double[] iema1 = new double[nbVal[0]]; - t1[0] = 7.5; - t1[1] = 8.2; - t1[2] = 18.1; - t1[3] = 22.8; - t1[4] = 25.8; - iema1[0] = 0.6; - iema1[1] = 0.6; - iema1[2] = 0.8; - iema1[3] = 0.1; - iema1[4] = 0.2; - - //Second block - double[] t2 = new double[nbVal[1]]; - double[] iema2 = new double[nbVal[1]]; - t2[0] = 26.8; - t2[1] = 31.1; - t2[2] = 38.4; - t2[3] = 45.9; - t2[4] = 48.2; - t2[5] = 48.9; - t2[6] = 57.9; - t2[7] = 58.5; - t2[8] = 63.9; - t2[9] = 65.2; - iema2[0] = 0.2; - iema2[1] = 0.5; - iema2[2] = 0.7; - iema2[3] = 0.1; - iema2[4] = 0.4; - iema2[5] = 0.7; - iema2[6] = 0.8; - iema2[7] = 0.3; - iema2[8] = 0.2; - iema2[9] = 0.5; - - //Third block - double[] t3 = new double[nbVal[2]]; - double[] iema3 = new double[nbVal[2]]; - t3[0] = 66.6; - t3[1] = 67.4; - t3[2] = 69.3; - t3[3] = 69.9; - t3[4] = 73.0; - t3[5] = 75.6; - t3[6] = 77.0; - t3[7] = 84.7; - t3[8] = 86.8; - t3[9] = 88.0; - t3[10] = 88.5; - t3[11] = 91.0; - t3[12] = 93.0; - t3[13] = 93.7; - t3[14] = 94.0; - iema3[0] = 0.2; - iema3[1] = 0.3; - iema3[2] = 0.8; - iema3[3] = 0.6; - iema3[4] = 0.1; - iema3[5] = 0.7; - iema3[6] = 0.9; - iema3[7] = 0.6; - iema3[8] = 0.3; - iema3[9] = 0.1; - iema3[10] = 0.1; - iema3[11] = 0.4; - iema3[12] = 1.0; - iema3[13] = 1.0; - iema3[14] = 0.1; - - //Print some titles - System.out.printf("\t\t\tIterated\n"); - System.out.println("\t\tTime\t EMA\n"); - System.out.println("--------------------------------"); - - lrcomm = 20 + m; - rcomm = new double[lrcomm]; - - pn = 0; - - //Loop through 3 blocks - for(int i = 0; i < nbVal.length; i++){ - //nb for given block - nb = nbVal[i]; - - //Use data for current block - if(i == 0){ - t = t1; - iema = iema1; - } - else if(i == 1){ - t = t2; - iema = iema2; - } - else{ - t = t3; - iema = iema3; - } - - ifail = 0; - G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); - g13me.eval(); - pn = g13me.getPN(); - - //Display results for this block of data - for(int j = 0; j < nb; j++){ - System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); - } - System.out.println(); - } - } -} - diff --git a/simple_examples/int32/G13NAJE.java b/simple_examples/int32/G13NAJE.java deleted file mode 100644 index 2032eb1..0000000 --- a/simple_examples/int32/G13NAJE.java +++ /dev/null @@ -1,123 +0,0 @@ -import com.nag.routines.G13.G13NA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G13NAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13NAJE{ - - /** - * G13NAJ example main program - */ - public static void main(String[] args){ - double beta = 0; - int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder - double[] param, sparam, y; - int[] tau; - - param = new double[1]; - //Placeholder y to be read in from data file - y = new double[0]; - - System.out.println("G13NAJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - //Allocate enough size to hold the input series - y = new double[n]; - - //Read in the input series - for(int i = 0; i < 10; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < 10; j++){ - y[(i * 10) + j] = Double.parseDouble(sVal[j]); - } - } - - //Read in the type of change point, penalty and minimum segment size - line = reader.readLine(); - sVal = line.split("\\s+"); - ctype = Integer.parseInt(sVal[0]); - iparam = Integer.parseInt(sVal[1]); - beta = Double.parseDouble(sVal[2]); - minss = Integer.parseInt(sVal[3]); - - //Read in the distribution parameter (if required) - if(iparam == 1){ - line = reader.readLine(); - sVal = line.split("\\s+"); - param[0] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Output arrays - tau = new int[n]; - sparam = new double[(2 * n) + 2]; - - ifail = -1; - - //Call routine to detece change points - G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); - g13na.eval(); - - //update - ifail = g13na.getIFAIL(); - ctype = g13na.getCTYPE(); - ntau = g13na.getNTAU(); - - if(ifail == 0 || ifail == 200 || ifail == 201){ - //Display the results - if(ctype == 5 || ctype == 6){ - //Exponential or Poisson distribtion - System.out.printf(" -- Charge Points -- Distribution\n"); - System.out.printf(" Number Position Parameter \n"); - System.out.println("====================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); - } - - } - else{ - //Normal of Gamma distribution - System.out.printf(" -- Charge Points -- --- Distribution ---\n"); - System.out.printf(" Number Position Parameters\n"); - System.out.println("================================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); - } - } - } - if(ifail == 200 || ifail == 201){ - System.out.println("Some truncation occured internally to avoid overflow"); - } - } -} diff --git a/simple_examples/int32/H02BBJE.java b/simple_examples/int32/H02BBJE.java deleted file mode 100644 index 04f4207..0000000 --- a/simple_examples/int32/H02BBJE.java +++ /dev/null @@ -1,92 +0,0 @@ -import com.nag.routines.H.H02BB; - -/** - * H02BBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class H02BBJE{ - - /** - * H02BBJ example main program - */ - public static void main(String[] args){ - double bigbnd, objmip = 0, tolfes, toliv; - int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; - double[] a, bl, bu, cvec, rwork, x; - int[] intvar, iwork; - - System.out.println("H02BBJ Example Program Results"); - System.out.println(); - - //Data (can be read in from data file) - n = 2; - m = 3; - lda = m; - - a = new double[lda * n]; - bl = new double[m + n]; - bu = new double[m + n]; - cvec = new double[n]; - x = new double[n]; - intvar = new int[n]; - - itmax = 0; - msglvl = 10; - maxnod = 0; - intfst = 0; - maxdpt = 4; - tolfes = 0; - toliv = 0; - - cvec[0] = -3; - cvec[1] = -4; - - //A = ( 2, 5) - // ( 2, -2) - // ( 3, 2) - a[0] = 2; - a[1] = 2; - a[2] = 3; - a[3] = 5; - a[4] = -2; - a[5] = 2; - - bigbnd = 1E+20; - - bl[0] = 0; - bl[1] = 0; - bl[2] = -1E+20; - bl[3] = -1E+20; - bl[4] = 5; - - bu[0] = 1E+20; - bu[1] = 1E+20; - bu[2] = 15; - bu[3] = 5; - bu[4] = 1E+20; - - intvar[0] = 1; - intvar[1] = 1; - - x[0] = 1; - x[1] = 1; - - liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; - //Math.pow() needs to be casted to int in java - lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); - iwork = new int[liwork]; - rwork = new double[lrwork]; - - ifail = 0; - - H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, - tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); - h02bb.eval(); - } -} - - - - - diff --git a/simple_examples/int32/H02DAJE.java b/simple_examples/int32/H02DAJE.java deleted file mode 100644 index 6e90401..0000000 --- a/simple_examples/int32/H02DAJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import com.nag.routines.H.H02DA; -import com.nag.routines.H.H02ZK; -import com.nag.routines.H.H02ZL; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * H02DAJ exmaple program text - * @author willa - * @since 27.1.0.0 - */ -public class H02DAJE{ - - /** - * H02DAJ example main program - */ - public static void main(String[] args){ - double acc, accqp = 0, objmip = 0; - int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; - String cvalue; - double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; - int[] iopts, iuser, varcon; - - System.out.println("H02DAJ Example Program Results"); - System.out.println(); - - opts = new double[100]; - ruser = new double[1]; - iopts = new int[200]; - iuser = new int[1]; - - //Blank 40 character string to represent ```Character (40) :: cvalue``` - char[] ch = new char[40]; - Arrays.fill(ch, ' '); - cvalue = new String(ch); - - n = 8; - nclin = 5; - ncnln = 2; - lda = nclin; - - a = new double[lda * n]; - d = new double[nclin]; - ax = new double[nclin]; - bl = new double[n]; - bu = new double[n]; - varcon = new int[n + nclin + ncnln]; - x = new double[n]; - c = new double[ncnln]; - cjac = new double[ncnln * n]; - objgrd = new double[n]; - - //Set variable types: continuous then binary - varcon[0] = 0; - varcon[1] = 0; - varcon[2] = 0; - varcon[3] = 0; - varcon[4] = 1; - varcon[5] = 1; - varcon[6] = 1; - varcon[7] = 1; - - //Set continuous variable bounds - bl[0] = 0; - bl[1] = 0; - bl[2] = 0; - bl[3] = 0; - bu[0] = 1000; - bu[1] = 1000; - bu[2] = 1000; - bu[3] = 1000; - - //Bounds for binary variables need not be provided - bl[4] = 0; - bl[5] = 0; - bl[6] = 0; - bl[7] = 0; - bu[4] = 1; - bu[5] = 1; - bu[6] = 1; - bu[7] = 1; - - //Set linear constraint, equality first - varcon[n] = 3; - varcon[n + 1] = 4; - varcon[n + 2] = 4; - varcon[n + 3] = 4; - varcon[n + 4] = 4; - - //Set Ax=d then Ax>=d - //( 1, 1, 1, 1, 0, 0, 0, 0) - //(-1, 0, 0, 0, 1, 0, 0, 0) - //( 0,-1, 0, 0, 0, 1, 0, 0) - //( 0, 0,-1, 0, 0, 0, 1, 0) - //( 0, 0, 0,-1, 0, 0, 0, 1) - a[0] = 1; - a[1] = -1; - a[5] = 1; - a[7] = -1; - a[10] = 1; - a[13] = -1; - a[15] = 1; - a[19] = -1; - a[21] = 1; - a[27] = 1; - a[33] = 1; - a[39] = 1; - d[0] = 1; - d[1] = 0; - d[2] = 0; - d[3] = 0; - d[4] = 0; - - //Set constraints supplied by CONFUN, equality first - varcon[n + nclin] = 3; - varcon[n + nclin + 1] = 4; - - liopts = iopts.length; - lopts = opts.length; - - //Initialize communication arrays - ifail = 0; - H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); - h02zk.eval(); - - - //Optimization parameters - maxit = 500; - acc = 0.000001; - - //Initial estimate (binary variables need not be given) - x[0] = 1; - x[1] = 1; - x[2] = 1; - x[3] = 1; - x[4] = 0; - x[5] = 0; - x[6] = 0; - x[7] = 0; - - //Portfolio parameters p and rho - iuser[0] = 3; - ruser[0] = 10; - - ifail = 0; - //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines - objfun objfun1 = new objfun(); - confun confun1 = new confun(); - H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, - objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); - h02da.eval(); - - //Results - ifail = h02da.getIFAIL(); - if(ifail == 0){ - X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); - x04ca.eval(); - - //Query the accuracy of the mixed integer QP Solver - ifail = -1; - H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); - h02zl.eval(); - - //Update values to print - accqp = h02zl.getRVALUE(); - objmip = h02da.getOBJMIP(); - ifail = h02zl.getIFAIL(); - if(ifail == 0){ - System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); - } - System.out.printf("Optimised value:\t%.3f\n", objmip); - } - else{ - System.out.printf("h02daf returns ifail = %d\n", ifail); - } - } - - /** - * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA - */ - public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ - public void eval(){ - if(this.MODE == 0){ - //Objective value - this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) - + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) - + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); - } - else{ - //Objective gradients for continous varaiables - this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); - this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); - this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); - this.OBJGRD[3] = 0; - } - } - } - - /** - * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA - */ - public static class confun extends H02DA.Abstract_H02DA_CONFUN{ - public void eval(){ - if(this.MODE == 0){ - //Constraints - int p = this.IUSER[0]; - double rho = this.RUSER[0]; - - //Mean return rho: - this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; - //Maximum of p assets in portfolio - this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; - } - else{ - //Jacobian - this.CJAC[0] = 8; - this.CJAC[2] = 9; - this.CJAC[4] = 12; - this.CJAC[6] = 7; - //c[2] does not include continuours varaibles which requries that their derivatives are zero - this.CJAC[1] = 0; - this.CJAC[3] = 0; - this.CJAC[5] = 0; - this.CJAC[7] = 0; - } - } - } -} diff --git a/simple_examples/int32/M01CCJE.java b/simple_examples/int32/M01CCJE.java deleted file mode 100644 index fda5e2f..0000000 --- a/simple_examples/int32/M01CCJE.java +++ /dev/null @@ -1,42 +0,0 @@ -import com.nag.routines.M01.M01CC; -import java.io.*; - -/** - * M01CC example program text. - */ -public class M01CCJE { - - public static void main(String[] args) throws Exception { - - String[] ch; - String order = "Reverse ASCII"; - int m1,m2,l1,l2; - int ifail = 0; - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); - ch = new String[m2]; - m1 = 1; - for (int i = m1-1; i < m2; ++i) { - ch[i] = dataIn.readLine(); - } - dataIn.close(); - l1 = 7; - l2 = 12; - - System.out.println(" M01CCJ Example Program Results"); - M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); - m01cc.eval(); - ifail = m01cc.getIFAIL(); - System.out.println(); - System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); - System.out.println(); - for (int i = m1-1; i < m2; ++i) { - System.out.println(" "+ch[i]); - } - - } - -} diff --git a/simple_examples/int32/S01BAJE.java b/simple_examples/int32/S01BAJE.java deleted file mode 100644 index 4bf2823..0000000 --- a/simple_examples/int32/S01BAJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.S.S01BA; - -/** - * S01BAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S01BAJE{ - - /** - * S01BAJE main program - */ - public static void main(String[] args){ - double y; - int ifail; - double[] xVal; //data - - //store data - xVal = new double[6]; - xVal[0] = 2.5; - xVal[1] = 0.125; - xVal[2] = -0.906; - xVal[3] = 0.00129; - xVal[4] = -0.00000783; - xVal[5] = 0.000000001; - - System.out.println("S01BAJ Example Program Results"); - System.out.println(); - System.out.printf("\tX\t\tY\n"); - - for(double x : xVal){ - ifail = -1; - S01BA s01ba = new S01BA(x, ifail); - y = s01ba.eval(); - - System.out.printf("\t%.4e\t%.4e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10AAJE.java b/simple_examples/int32/S10AAJE.java deleted file mode 100644 index 2a0878a..0000000 --- a/simple_examples/int32/S10AAJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.S.S10AA; - -/** - * S10AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10AAJE{ - - /** - * S10AAJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[4]; - xVal[0] = -20; - xVal[1] = -5.0; - xVal[2] = 0.5; - xVal[3] = 5.0; - - System.out.println("S10AAJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AA s10aa = new S10AA(x, ifail); - y = s10aa.eval(); - ifail = s10aa.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ABJE.java b/simple_examples/int32/S10ABJE.java deleted file mode 100644 index dd84ab7..0000000 --- a/simple_examples/int32/S10ABJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AB; - -/** - * S10ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ABJE{ - - /** - * S10ABJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ABJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AB s10ab = new S10AB(x, ifail); - y = s10ab.eval(); - ifail = s10ab.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ACJE.java b/simple_examples/int32/S10ACJE.java deleted file mode 100644 index cc0c04c..0000000 --- a/simple_examples/int32/S10ACJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AC; - -/** - * S10ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ACJE{ - - /** - * S10ACJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ACJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AC s10ac = new S10AC(x, ifail); - y = s10ac.eval(); - ifail = s10ac.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S14ABJE.java b/simple_examples/int32/S14ABJE.java deleted file mode 100644 index 673a4b3..0000000 --- a/simple_examples/int32/S14ABJE.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.nag.routines.S.S14AB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ABJE{ - - /** - * S14ABJ example main program - */ - public static void main(String[] args){ - double x, y; - int ifail; - - System.out.println("S14ABJ Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //loop until break - while(true){ - line = reader.readLine(); - - //if finished looping through file break - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[1]); - - ifail = -1; - S14AB s14ab = new S14AB(x, ifail); - y = s14ab.eval(); - //update ifail - ifail = s14ab.getIFAIL(); - - if(ifail < 0){ - break; - } - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S14ACJE.java b/simple_examples/int32/S14ACJE.java deleted file mode 100644 index e2fff05..0000000 --- a/simple_examples/int32/S14ACJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.S.S14AC; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ACJE{ - - /** - * S14ACJ example main program - */ - public static void main(String[] args){ - double f, x; - int ifail; - - System.out.println("S14ACJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\tpsi(X)-log(X)\n"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[0]); - - ifail = -1; - S14AC s14ac = new S14AC(x, ifail); - f = s14ac.eval(); - ifail = s14ac.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("\t%.4f\t%.4f\n", x, f); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S14AFJE.java b/simple_examples/int32/S14AFJE.java deleted file mode 100644 index 9005cc1..0000000 --- a/simple_examples/int32/S14AFJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.S.S14AF; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14AFJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14AFJE{ - - /** - * S14AFJ Example main program - */ - public static void main(String[] args){ - NAGComplex y, z; - int ifail, k; - - //Tell the wrapper the type of complex being used before calling a routine - Routine.setComplex(new NAGComplex()); - - y = new NAGComplex(); - z = new NAGComplex(); - - System.out.println("S14AFJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); - - System.out.println(); - System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); - System.out.println(); - - //loop until break... - while(true){ - line = reader.readLine(); - - //end of file reached - if(line == null){ - break; - } - - String[] sVal = line.split("\\s+"); - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - k = Integer.parseInt(sVal[2]); - - ifail = -1; - S14AF s14af = new S14AF(z, k, ifail); - y = (NAGComplex) s14af.eval(); - ifail = s14af.getIFAIL(); - - //ifail < 0 => error - if(ifail < 0){ - break; - } - System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S17DCJE.java b/simple_examples/int32/S17DCJE.java deleted file mode 100644 index ba01290..0000000 --- a/simple_examples/int32/S17DCJE.java +++ /dev/null @@ -1,69 +0,0 @@ -import com.nag.routines.S.S17DC; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class S17DCJE{ - private static int n = 2; - - public static void main(String[] args){ - double fnu; - int ifail, nz = 0; - String scal; - NAGComplex z; - NAGComplex[] cwrk, cy; - - z = new NAGComplex(); - //initiate complex arrays like this to save looping through and doing it manually by looping through - cwrk = NAGComplex.createArray(n); - cy = NAGComplex.createArray(n); - - System.out.println("S17DCF Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - System.out.println(); - System.out.printf("Calling with N = %d\n", n); - System.out.println(); - System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - fnu = Double.parseDouble(sVal[0]); - z.setRe(Double.parseDouble(sVal[1])); - z.setIm(Double.parseDouble(sVal[2])); - scal = sVal[3].substring(1,2); - - ifail = 0; - S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); - s17dc.eval(); - - System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S17DGJE.java b/simple_examples/int32/S17DGJE.java deleted file mode 100644 index b93c9e0..0000000 --- a/simple_examples/int32/S17DGJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.S.S17DG; -import com.nag.types.NAGComplex; -import java.io.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * S17DG example program text. - */ -public class S17DGJE { - - public static void main(String[] args) throws Exception { - String deriv,scal; - int ifail = 1; - NAGComplex z,ai; - int nz = -1; - z = new NAGComplex(); - ai = new NAGComplex(); - ai.setRe(Double.NaN); - ai.setIm(Double.NaN); - - System.out.println(" S17DGJ Example Program Results"); - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - System.out.println(); - System.out.println(" DERIV Z SCAL AI NZ"); - System.out.println(); - String line = dataIn.readLine(); - Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," - + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); - Matcher m; - S17DG s17dg = new S17DG(); - while (line != null) { - m = linePatt.matcher(line); - if (m.matches()) { - deriv = m.group(1); - z.setRe(Double.parseDouble(m.group(2))); - z.setIm(Double.parseDouble(m.group(3))); - scal = m.group(4); - ifail = 1;// SOFT AND SILENT FAILURE - s17dg.eval(deriv,z,scal,ai,nz,ifail); - if (s17dg.getIFAIL() == 0) { - System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", - s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), - s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); - } - else { - System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); - System.exit(-1); - } - } - else { - System.out.println("Can't match:\n"+line); - } - line = dataIn.readLine(); - } - - } - -} diff --git a/simple_examples/int32/S30AAJE.java b/simple_examples/int32/S30AAJE.java deleted file mode 100644 index 7e01ffe..0000000 --- a/simple_examples/int32/S30AAJE.java +++ /dev/null @@ -1,109 +0,0 @@ -import com.nag.routines.S.S30AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S30AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S30AAJE{ - - /** - * S30AAJ main program - */ - public static void main(String[] args){ - double q = 0, r = 0, s = 0, sigma = 0; - int ifail, ldp, m = 0, n = 0; - String calput = ""; //placeholders - double[] p, t, x; - - //placeholders - t = new double[0]; - x = new double[0]; - - System.out.println("S30AAJ Example Program Results"); - - //Supply file path as arugment - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - calput = sVal[0].substring(1,2); - - line = reader.readLine(); - sVal = line.split("\\s+"); - s = Double.parseDouble(sVal[0]); - sigma = Double.parseDouble(sVal[1]); - r = Double.parseDouble(sVal[2]); - q = Double.parseDouble(sVal[3]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - n = Integer.parseInt(sVal[1]); - - t = new double[n]; - x = new double[m]; - - for(int i = 0; i < m; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[0]); - } - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - t[i] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ldp = m; - p = new double[ldp * n]; - - ifail = 0; - S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); - s30aa.eval(); - - System.out.println(); - System.out.println("Black-Scholes-Merton formula"); - - if(calput.toLowerCase().equals("c")){ - System.out.println("European Call : "); - } - else if(calput.toLowerCase().equals("p")){ - System.out.println("European Put : "); - } - - System.out.printf(" Spot =\t%.4f\n", s); - System.out.printf(" Volatility =\t%.4f\n", sigma); - System.out.printf(" Rate =\t%.4f\n", r); - System.out.printf(" Dividend =\t%.4f\n", q); - - System.out.println(); - System.out.printf(" Strike\tExpiry\tOption Price\n"); - for(int i = 0; i < m; i++){ - for(int j = 0; j < n; j++){ - System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); - } - } - } -} - diff --git a/simple_examples/int32/S30ACJE.java b/simple_examples/int32/S30ACJE.java deleted file mode 100644 index 8d994dc..0000000 --- a/simple_examples/int32/S30ACJE.java +++ /dev/null @@ -1,129 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -import com.nag.routines.S.S30AC; - -/** - * S30AC example program text. - */ -public class S30ACJE { - - public static void main(String[] args) { - - int i, ifail, mode = 0, n = 0; - String calput; - - double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; - int[] ivalid = null; - - // Strings must be length expected by Fortran - calput = getBlankString(1); - - /* Header */ - System.out.println(" S30ACJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - System.out.println(); - System.out.println(" SIGMA IVALID"); - System.out.println(); - - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - calput = sVal[0].replaceAll("\'", ""); - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - mode = Integer.parseInt(sVal[1]); - - line = reader.readLine(); // skip empty line - - p = new double[n]; - k = new double[n]; - s0 = new double[n]; - t = new double[n]; - r = new double[n]; - sigma = new double[n]; - ivalid = new int[n]; - - // Read p, k, s0, t and r from data file - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - p[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - k[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - s0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - t[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - r[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find the implied volatilities, sigma - ifail = 0; - S30AC s30ac = new S30AC(); - s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); - - // Print solution - for (i = 0; i < n; i++) { - System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); - } - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } -} diff --git a/simple_examples/int32/X03AAJE.java b/simple_examples/int32/X03AAJE.java deleted file mode 100644 index b03f1ab..0000000 --- a/simple_examples/int32/X03AAJE.java +++ /dev/null @@ -1,87 +0,0 @@ -import com.nag.routines.X03.X03AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * X03AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class X03AAJE{ - - /** - * X03AAJ example main program. - */ - public static void main(String[] args){ - int n = 3; - double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder - int ifail, isizea, isizeb, istepa, istepb; - boolean sw; - double[] a, b; - - a = new double[n * n]; - b = new double[n]; - - System.out.println("X03AAF Example Program Results"); - System.out.println(); - - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //stored column wise - //a = (-2, -3, 7) - // ( 2, -5, 3) - // (-9, 1, 0) - for(int i = 0; i < n; i++){ - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < n; i++){ - String[] sVal = line.split("\\s+"); - b[i] = Double.parseDouble(sVal[i + 1]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - c1 = 1; - c2 = 0; - isizea = n; - isizeb = n; - istepa = 1; - istepb = 1; - sw = true; - - ifail = 0; - X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); - x03aa.eval(); - - //update - c1 = x03aa.getC1(); - c2 = x03aa.getC2(); - d1 = x03aa.getD1(); - d2 = x03aa.getD2(); - - System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); - } -} diff --git a/simple_examples/int32/X04CBJE.java b/simple_examples/int32/X04CBJE.java deleted file mode 100644 index fa77c3a..0000000 --- a/simple_examples/int32/X04CBJE.java +++ /dev/null @@ -1,53 +0,0 @@ -import com.nag.routines.X04.X04CB; - -/** - * X04CBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class X04CBJE{ - - /** - * X04CBJ example main program - */ - public static void main(String[] args){ - int nmax = 5, lda = nmax, ifail, indent, ncols; - double[] a; - - a = new double[lda * nmax]; - - String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; - String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; - - System.out.println("X04CBJ Example Program Results"); - System.out.println(); - - //generate an array of data - for(int i = 0; i < nmax; i++){ - for(int j = 0; j < lda; j++){ - a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); - } - } - - ncols = 80; - indent = 0; - - //Print 3 by nmax rectangular matrix with default format and integer row and column labels - ifail = 0; - X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", - clabs, ncols, indent, ifail); - x04cb.eval(); - System.out.println(); - - //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels - ifail = 0; - x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", - clabs, ncols, indent, ifail); - System.out.println(); - - //Print 3 by nmax lower triangular matrix in MATLAB format - //Row and column labelling is ignored - ifail = 0; - x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); - } -} diff --git a/simple_examples/int32/X05ABJE.java b/simple_examples/int32/X05ABJE.java deleted file mode 100644 index acb3804..0000000 --- a/simple_examples/int32/X05ABJE.java +++ /dev/null @@ -1,25 +0,0 @@ -import com.nag.routines.X05.X05AB; - -/** - * X05AB example program text. - */ -public class X05ABJE { - - public static void main(String[] args) { - - int[] itime = new int[7]; - - itime[0] = 1789; - itime[1] = 7; - itime[2] = 14; - itime[3] = 13; - itime[4] = 11; - itime[5] = 48; - itime[6] = 320; - - System.out.println(" X05ABJ Example Program Results"); - System.out.println((new X05AB(itime)).eval()); - - } - -} From 8baad2aea088d0b62a131b584c04033a775f6184 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:17:55 +0000 Subject: [PATCH 112/196] Simple Examples Synced --- simple_examples/int32/A00AAJE.java | 16 ++ simple_examples/int32/A00ACJE.java | 29 ++ simple_examples/int32/A00ADJE.java | 107 ++++++++ simple_examples/int32/C02AAJE.java | 174 ++++++++++++ simple_examples/int32/C02ABJE.java | 217 +++++++++++++++ simple_examples/int32/C02AFJE.java | 271 +++++++++++++++++++ simple_examples/int32/C02AGJE.java | 262 ++++++++++++++++++ simple_examples/int32/C02AHJE.java | 61 +++++ simple_examples/int32/C02AJJE.java | 65 +++++ simple_examples/int32/C02AKJE.java | 62 +++++ simple_examples/int32/C02ALJE.java | 64 +++++ simple_examples/int32/C02AMJE.java | 75 ++++++ simple_examples/int32/C02ANJE.java | 80 ++++++ simple_examples/int32/C05AUJE.java | 67 +++++ simple_examples/int32/C05AWJE.java | 59 ++++ simple_examples/int32/C05AYJE.java | 44 +++ simple_examples/int32/C05AZJE.java | 65 +++++ simple_examples/int32/C05BBJE.java | 89 ++++++ simple_examples/int32/C05MBJE.java | 95 +++++++ simple_examples/int32/C05QBJE.java | 167 ++++++++++++ simple_examples/int32/C06BAJE.java | 56 ++++ simple_examples/int32/C06FKJE.java | 91 +++++++ simple_examples/int32/C09AAJE.java | 158 +++++++++++ simple_examples/int32/D01BDJE.java | 58 ++++ simple_examples/int32/D01RJJE.java | 184 +++++++++++++ simple_examples/int32/D01RKJE.java | 173 ++++++++++++ simple_examples/int32/D01RLJE.java | 196 ++++++++++++++ simple_examples/int32/D01RMJE.java | 163 +++++++++++ simple_examples/int32/D01TCJE.java | 45 ++++ simple_examples/int32/D02NEJE.java | 388 ++++++++++++++++++++++++++ simple_examples/int32/D02TLJE.java | 290 ++++++++++++++++++++ simple_examples/int32/D03PCJE.java | 217 +++++++++++++++ simple_examples/int32/D03RAJE.java | 307 +++++++++++++++++++++ simple_examples/int32/D03RBJE.java | 388 ++++++++++++++++++++++++++ simple_examples/int32/D05BAJE.java | 111 ++++++++ simple_examples/int32/D05BEJE.java | 185 +++++++++++++ simple_examples/int32/DTFSMJE.java | 54 ++++ simple_examples/int32/E01DAJE.java | 182 +++++++++++++ simple_examples/int32/E02ALJE.java | 101 +++++++ simple_examples/int32/E04ABJE.java | 76 ++++++ simple_examples/int32/E04BBJE.java | 81 ++++++ simple_examples/int32/E04CBJE.java | 90 +++++++ simple_examples/int32/E04FCJE.java | 420 +++++++++++++++++++++++++++++ simple_examples/int32/E04FFJE.java | 140 ++++++++++ simple_examples/int32/E04GBJE.java | 183 +++++++++++++ simple_examples/int32/E04GGJE.java | 219 +++++++++++++++ simple_examples/int32/E04MTJE.java | 132 +++++++++ simple_examples/int32/E04MXJE.java | 292 ++++++++++++++++++++ simple_examples/int32/E04NCJE.java | 246 +++++++++++++++++ simple_examples/int32/E04NFJE.java | 234 ++++++++++++++++ simple_examples/int32/E04NKJE.java | 295 ++++++++++++++++++++ simple_examples/int32/E04NQJE.java | 384 ++++++++++++++++++++++++++ simple_examples/int32/E04PTJE.java | 344 +++++++++++++++++++++++ simple_examples/int32/E04RPJE.java | 199 ++++++++++++++ simple_examples/int32/E04RSJE.java | 229 ++++++++++++++++ simple_examples/int32/E04RTJE.java | 225 ++++++++++++++++ simple_examples/int32/E04SAJE.java | 104 +++++++ simple_examples/int32/E04TAJE.java | 188 +++++++++++++ simple_examples/int32/E04TCJE.java | 263 ++++++++++++++++++ simple_examples/int32/E04UCJE.java | 211 +++++++++++++++ simple_examples/int32/E04YAJE.java | 112 ++++++++ simple_examples/int32/F01ADJE.java | 39 +++ simple_examples/int32/F01CKJE.java | 60 +++++ simple_examples/int32/F01CRJE.java | 47 ++++ simple_examples/int32/F01DGJE.java | 72 +++++ simple_examples/int32/F01ELJE.java | 89 ++++++ simple_examples/int32/F01EMJE.java | 106 ++++++++ simple_examples/int32/F02EKJE.java | 227 ++++++++++++++++ simple_examples/int32/F02FKJE.java | 230 ++++++++++++++++ simple_examples/int32/F02WGJE.java | 132 +++++++++ simple_examples/int32/F03BAJE.java | 108 ++++++++ simple_examples/int32/F04AMJE.java | 114 ++++++++ simple_examples/int32/F04BAJE.java | 144 ++++++++++ simple_examples/int32/F05AAJE.java | 99 +++++++ simple_examples/int32/F06CLJE.java | 40 +++ simple_examples/int32/F07AAJE.java | 90 +++++++ simple_examples/int32/F07ABJE.java | 134 +++++++++ simple_examples/int32/F07ADJE.java | 72 +++++ simple_examples/int32/F07AQJE.java | 99 +++++++ simple_examples/int32/F07FAJE.java | 79 ++++++ simple_examples/int32/F07FBJE.java | 122 +++++++++ simple_examples/int32/F08BTJE.java | 228 ++++++++++++++++ simple_examples/int32/F08FAJE.java | 113 ++++++++ simple_examples/int32/F08XPJE.java | 297 ++++++++++++++++++++ simple_examples/int32/G01ALJE.java | 55 ++++ simple_examples/int32/G02AKJE.java | 68 +++++ simple_examples/int32/G02BJJE.java | 303 +++++++++++++++++++++ simple_examples/int32/G02BRJE.java | 134 +++++++++ simple_examples/int32/G02DAJE.java | 187 +++++++++++++ simple_examples/int32/G02EEJE.java | 184 +++++++++++++ simple_examples/int32/G02MAJE.java | 130 +++++++++ simple_examples/int32/G03GAJE.java | 355 ++++++++++++++++++++++++ simple_examples/int32/G05KFJE.java | 105 ++++++++ simple_examples/int32/G13AWJE.java | 31 +++ simple_examples/int32/G13MEJE.java | 160 +++++++++++ simple_examples/int32/G13NAJE.java | 123 +++++++++ simple_examples/int32/H02BBJE.java | 92 +++++++ simple_examples/int32/H02DAJE.java | 228 ++++++++++++++++ simple_examples/int32/M01CCJE.java | 42 +++ simple_examples/int32/S01BAJE.java | 39 +++ simple_examples/int32/S10AAJE.java | 40 +++ simple_examples/int32/S10ABJE.java | 41 +++ simple_examples/int32/S10ACJE.java | 41 +++ simple_examples/int32/S14ABJE.java | 71 +++++ simple_examples/int32/S14ACJE.java | 68 +++++ simple_examples/int32/S14AFJE.java | 80 ++++++ simple_examples/int32/S17DCJE.java | 69 +++++ simple_examples/int32/S17DGJE.java | 61 +++++ simple_examples/int32/S30AAJE.java | 109 ++++++++ simple_examples/int32/S30ACJE.java | 129 +++++++++ simple_examples/int32/X03AAJE.java | 87 ++++++ simple_examples/int32/X04CBJE.java | 53 ++++ simple_examples/int32/X05ABJE.java | 25 ++ 113 files changed, 15934 insertions(+) create mode 100644 simple_examples/int32/A00AAJE.java create mode 100644 simple_examples/int32/A00ACJE.java create mode 100644 simple_examples/int32/A00ADJE.java create mode 100644 simple_examples/int32/C02AAJE.java create mode 100644 simple_examples/int32/C02ABJE.java create mode 100644 simple_examples/int32/C02AFJE.java create mode 100644 simple_examples/int32/C02AGJE.java create mode 100644 simple_examples/int32/C02AHJE.java create mode 100644 simple_examples/int32/C02AJJE.java create mode 100644 simple_examples/int32/C02AKJE.java create mode 100644 simple_examples/int32/C02ALJE.java create mode 100644 simple_examples/int32/C02AMJE.java create mode 100644 simple_examples/int32/C02ANJE.java create mode 100644 simple_examples/int32/C05AUJE.java create mode 100644 simple_examples/int32/C05AWJE.java create mode 100644 simple_examples/int32/C05AYJE.java create mode 100644 simple_examples/int32/C05AZJE.java create mode 100644 simple_examples/int32/C05BBJE.java create mode 100644 simple_examples/int32/C05MBJE.java create mode 100644 simple_examples/int32/C05QBJE.java create mode 100644 simple_examples/int32/C06BAJE.java create mode 100644 simple_examples/int32/C06FKJE.java create mode 100644 simple_examples/int32/C09AAJE.java create mode 100644 simple_examples/int32/D01BDJE.java create mode 100644 simple_examples/int32/D01RJJE.java create mode 100644 simple_examples/int32/D01RKJE.java create mode 100644 simple_examples/int32/D01RLJE.java create mode 100644 simple_examples/int32/D01RMJE.java create mode 100644 simple_examples/int32/D01TCJE.java create mode 100644 simple_examples/int32/D02NEJE.java create mode 100644 simple_examples/int32/D02TLJE.java create mode 100644 simple_examples/int32/D03PCJE.java create mode 100644 simple_examples/int32/D03RAJE.java create mode 100644 simple_examples/int32/D03RBJE.java create mode 100644 simple_examples/int32/D05BAJE.java create mode 100644 simple_examples/int32/D05BEJE.java create mode 100644 simple_examples/int32/DTFSMJE.java create mode 100644 simple_examples/int32/E01DAJE.java create mode 100644 simple_examples/int32/E02ALJE.java create mode 100644 simple_examples/int32/E04ABJE.java create mode 100644 simple_examples/int32/E04BBJE.java create mode 100644 simple_examples/int32/E04CBJE.java create mode 100644 simple_examples/int32/E04FCJE.java create mode 100644 simple_examples/int32/E04FFJE.java create mode 100644 simple_examples/int32/E04GBJE.java create mode 100644 simple_examples/int32/E04GGJE.java create mode 100644 simple_examples/int32/E04MTJE.java create mode 100644 simple_examples/int32/E04MXJE.java create mode 100644 simple_examples/int32/E04NCJE.java create mode 100644 simple_examples/int32/E04NFJE.java create mode 100644 simple_examples/int32/E04NKJE.java create mode 100644 simple_examples/int32/E04NQJE.java create mode 100644 simple_examples/int32/E04PTJE.java create mode 100644 simple_examples/int32/E04RPJE.java create mode 100644 simple_examples/int32/E04RSJE.java create mode 100644 simple_examples/int32/E04RTJE.java create mode 100644 simple_examples/int32/E04SAJE.java create mode 100644 simple_examples/int32/E04TAJE.java create mode 100644 simple_examples/int32/E04TCJE.java create mode 100644 simple_examples/int32/E04UCJE.java create mode 100644 simple_examples/int32/E04YAJE.java create mode 100644 simple_examples/int32/F01ADJE.java create mode 100644 simple_examples/int32/F01CKJE.java create mode 100644 simple_examples/int32/F01CRJE.java create mode 100644 simple_examples/int32/F01DGJE.java create mode 100644 simple_examples/int32/F01ELJE.java create mode 100644 simple_examples/int32/F01EMJE.java create mode 100644 simple_examples/int32/F02EKJE.java create mode 100644 simple_examples/int32/F02FKJE.java create mode 100644 simple_examples/int32/F02WGJE.java create mode 100644 simple_examples/int32/F03BAJE.java create mode 100644 simple_examples/int32/F04AMJE.java create mode 100644 simple_examples/int32/F04BAJE.java create mode 100644 simple_examples/int32/F05AAJE.java create mode 100644 simple_examples/int32/F06CLJE.java create mode 100644 simple_examples/int32/F07AAJE.java create mode 100644 simple_examples/int32/F07ABJE.java create mode 100644 simple_examples/int32/F07ADJE.java create mode 100644 simple_examples/int32/F07AQJE.java create mode 100644 simple_examples/int32/F07FAJE.java create mode 100644 simple_examples/int32/F07FBJE.java create mode 100644 simple_examples/int32/F08BTJE.java create mode 100644 simple_examples/int32/F08FAJE.java create mode 100644 simple_examples/int32/F08XPJE.java create mode 100644 simple_examples/int32/G01ALJE.java create mode 100644 simple_examples/int32/G02AKJE.java create mode 100644 simple_examples/int32/G02BJJE.java create mode 100644 simple_examples/int32/G02BRJE.java create mode 100644 simple_examples/int32/G02DAJE.java create mode 100644 simple_examples/int32/G02EEJE.java create mode 100644 simple_examples/int32/G02MAJE.java create mode 100644 simple_examples/int32/G03GAJE.java create mode 100644 simple_examples/int32/G05KFJE.java create mode 100644 simple_examples/int32/G13AWJE.java create mode 100644 simple_examples/int32/G13MEJE.java create mode 100644 simple_examples/int32/G13NAJE.java create mode 100644 simple_examples/int32/H02BBJE.java create mode 100644 simple_examples/int32/H02DAJE.java create mode 100644 simple_examples/int32/M01CCJE.java create mode 100644 simple_examples/int32/S01BAJE.java create mode 100644 simple_examples/int32/S10AAJE.java create mode 100644 simple_examples/int32/S10ABJE.java create mode 100644 simple_examples/int32/S10ACJE.java create mode 100644 simple_examples/int32/S14ABJE.java create mode 100644 simple_examples/int32/S14ACJE.java create mode 100644 simple_examples/int32/S14AFJE.java create mode 100644 simple_examples/int32/S17DCJE.java create mode 100644 simple_examples/int32/S17DGJE.java create mode 100644 simple_examples/int32/S30AAJE.java create mode 100644 simple_examples/int32/S30ACJE.java create mode 100644 simple_examples/int32/X03AAJE.java create mode 100644 simple_examples/int32/X04CBJE.java create mode 100644 simple_examples/int32/X05ABJE.java diff --git a/simple_examples/int32/A00AAJE.java b/simple_examples/int32/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/int32/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/int32/A00ACJE.java b/simple_examples/int32/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/int32/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/int32/A00ADJE.java b/simple_examples/int32/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/int32/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/int32/C02AAJE.java b/simple_examples/int32/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/int32/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/int32/C02ABJE.java b/simple_examples/int32/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/int32/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/int32/C02AFJE.java b/simple_examples/int32/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/int32/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/int32/C02AGJE.java b/simple_examples/int32/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/int32/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/int32/C02AHJE.java b/simple_examples/int32/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/int32/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/int32/C02AJJE.java b/simple_examples/int32/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/int32/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/int32/C02AKJE.java b/simple_examples/int32/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/int32/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02ALJE.java b/simple_examples/int32/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/int32/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02AMJE.java b/simple_examples/int32/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/int32/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C02ANJE.java b/simple_examples/int32/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/int32/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/int32/C05AUJE.java b/simple_examples/int32/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/int32/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/int32/C05AWJE.java b/simple_examples/int32/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/int32/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/int32/C05AYJE.java b/simple_examples/int32/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/int32/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/int32/C05AZJE.java b/simple_examples/int32/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/int32/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/int32/C05BBJE.java b/simple_examples/int32/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/int32/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/C05MBJE.java b/simple_examples/int32/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/int32/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/int32/C05QBJE.java b/simple_examples/int32/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/int32/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/int32/C06BAJE.java b/simple_examples/int32/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/int32/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/int32/C06FKJE.java b/simple_examples/int32/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/int32/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/C09AAJE.java b/simple_examples/int32/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/int32/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/D01BDJE.java b/simple_examples/int32/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/int32/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/int32/D01RJJE.java b/simple_examples/int32/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/int32/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RKJE.java b/simple_examples/int32/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/int32/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RLJE.java b/simple_examples/int32/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/int32/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01RMJE.java b/simple_examples/int32/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/int32/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/int32/D01TCJE.java b/simple_examples/int32/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/int32/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/int32/D03PCJE.java b/simple_examples/int32/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/int32/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/D05BAJE.java b/simple_examples/int32/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/int32/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/int32/D05BEJE.java b/simple_examples/int32/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/int32/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/int32/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/int32/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/int32/E01DAJE.java b/simple_examples/int32/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/int32/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/int32/E02ALJE.java b/simple_examples/int32/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/int32/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/int32/E04ABJE.java b/simple_examples/int32/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/int32/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/int32/E04BBJE.java b/simple_examples/int32/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/int32/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/int32/E04CBJE.java b/simple_examples/int32/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/int32/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/int32/E04FCJE.java b/simple_examples/int32/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/int32/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/int32/E04FFJE.java b/simple_examples/int32/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/int32/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/int32/E04GBJE.java b/simple_examples/int32/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/int32/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/int32/E04GGJE.java b/simple_examples/int32/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/int32/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/int32/E04MTJE.java b/simple_examples/int32/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/int32/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/int32/E04MXJE.java b/simple_examples/int32/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/int32/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/int32/E04NCJE.java b/simple_examples/int32/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/int32/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/int32/E04NFJE.java b/simple_examples/int32/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/int32/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/int32/E04NKJE.java b/simple_examples/int32/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/int32/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/int32/E04NQJE.java b/simple_examples/int32/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/int32/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/int32/E04PTJE.java b/simple_examples/int32/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/int32/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/E04RPJE.java b/simple_examples/int32/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/int32/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/int32/E04RSJE.java b/simple_examples/int32/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/int32/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/int32/E04RTJE.java b/simple_examples/int32/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/int32/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/int32/E04SAJE.java b/simple_examples/int32/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/int32/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/int32/E04TAJE.java b/simple_examples/int32/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/int32/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/int32/E04TCJE.java b/simple_examples/int32/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/int32/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/int32/E04UCJE.java b/simple_examples/int32/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/int32/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/int32/E04YAJE.java b/simple_examples/int32/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/int32/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/int32/F01ADJE.java b/simple_examples/int32/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/int32/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/int32/F01CKJE.java b/simple_examples/int32/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/int32/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/int32/F01CRJE.java b/simple_examples/int32/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/int32/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/int32/F01DGJE.java b/simple_examples/int32/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/int32/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/int32/F01EMJE.java b/simple_examples/int32/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/int32/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/int32/F03BAJE.java b/simple_examples/int32/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/int32/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/int32/F04AMJE.java b/simple_examples/int32/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/int32/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/int32/F04BAJE.java b/simple_examples/int32/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/int32/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/F05AAJE.java b/simple_examples/int32/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/int32/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/int32/F06CLJE.java b/simple_examples/int32/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/int32/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/int32/F07AAJE.java b/simple_examples/int32/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/int32/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/int32/F07ABJE.java b/simple_examples/int32/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/int32/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/int32/F07ADJE.java b/simple_examples/int32/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/int32/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/int32/F07AQJE.java b/simple_examples/int32/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/int32/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/int32/F07FAJE.java b/simple_examples/int32/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/int32/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/int32/F07FBJE.java b/simple_examples/int32/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/int32/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/int32/F08BTJE.java b/simple_examples/int32/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/int32/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/int32/F08FAJE.java b/simple_examples/int32/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/int32/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/int32/F08XPJE.java b/simple_examples/int32/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/int32/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/int32/G01ALJE.java b/simple_examples/int32/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/int32/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/int32/G02AKJE.java b/simple_examples/int32/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/int32/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/int32/G02BJJE.java b/simple_examples/int32/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/int32/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/int32/G02BRJE.java b/simple_examples/int32/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/int32/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/int32/G02DAJE.java b/simple_examples/int32/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/int32/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/int32/G02EEJE.java b/simple_examples/int32/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/int32/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/int32/G02MAJE.java b/simple_examples/int32/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/int32/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/int32/G03GAJE.java b/simple_examples/int32/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/int32/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/int32/G05KFJE.java b/simple_examples/int32/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/int32/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/int32/G13AWJE.java b/simple_examples/int32/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/int32/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/int32/G13MEJE.java b/simple_examples/int32/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/int32/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/int32/G13NAJE.java b/simple_examples/int32/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/int32/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/int32/H02BBJE.java b/simple_examples/int32/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/int32/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/int32/H02DAJE.java b/simple_examples/int32/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/int32/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/int32/M01CCJE.java b/simple_examples/int32/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/int32/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/int32/S01BAJE.java b/simple_examples/int32/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/int32/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10AAJE.java b/simple_examples/int32/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/int32/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10ABJE.java b/simple_examples/int32/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/int32/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S10ACJE.java b/simple_examples/int32/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/int32/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/int32/S14ABJE.java b/simple_examples/int32/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/int32/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/int32/S14ACJE.java b/simple_examples/int32/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/int32/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/S14AFJE.java b/simple_examples/int32/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/int32/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/int32/S17DCJE.java b/simple_examples/int32/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/int32/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/int32/S17DGJE.java b/simple_examples/int32/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/int32/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/int32/S30AAJE.java b/simple_examples/int32/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/int32/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/int32/S30ACJE.java b/simple_examples/int32/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/int32/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/int32/X03AAJE.java b/simple_examples/int32/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/int32/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/int32/X04CBJE.java b/simple_examples/int32/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/int32/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/int32/X05ABJE.java b/simple_examples/int32/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/int32/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} From 60f521a21a7e62774f57f3630c1216052c0045bd Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:21:21 +0000 Subject: [PATCH 113/196] Removed wrong files --- simple_examples/int32/A00AAJE.java | 16 -- simple_examples/int32/A00ACJE.java | 29 -- simple_examples/int32/A00ADJE.java | 107 -------- simple_examples/int32/C02AAJE.java | 174 ------------ simple_examples/int32/C02ABJE.java | 217 --------------- simple_examples/int32/C02AFJE.java | 271 ------------------- simple_examples/int32/C02AGJE.java | 262 ------------------ simple_examples/int32/C02AHJE.java | 61 ----- simple_examples/int32/C02AJJE.java | 65 ----- simple_examples/int32/C02AKJE.java | 62 ----- simple_examples/int32/C02ALJE.java | 64 ----- simple_examples/int32/C02AMJE.java | 75 ------ simple_examples/int32/C02ANJE.java | 80 ------ simple_examples/int32/C05AUJE.java | 67 ----- simple_examples/int32/C05AWJE.java | 59 ---- simple_examples/int32/C05AYJE.java | 44 --- simple_examples/int32/C05AZJE.java | 65 ----- simple_examples/int32/C05BBJE.java | 89 ------ simple_examples/int32/C05MBJE.java | 95 ------- simple_examples/int32/C05QBJE.java | 167 ------------ simple_examples/int32/C06BAJE.java | 56 ---- simple_examples/int32/C06FKJE.java | 91 ------- simple_examples/int32/C09AAJE.java | 158 ----------- simple_examples/int32/D01BDJE.java | 58 ---- simple_examples/int32/D01RJJE.java | 184 ------------- simple_examples/int32/D01RKJE.java | 173 ------------ simple_examples/int32/D01RLJE.java | 196 -------------- simple_examples/int32/D01RMJE.java | 163 ----------- simple_examples/int32/D01TCJE.java | 45 ---- simple_examples/int32/D02NEJE.java | 388 -------------------------- simple_examples/int32/D02TLJE.java | 290 -------------------- simple_examples/int32/D03PCJE.java | 217 --------------- simple_examples/int32/D03RAJE.java | 307 --------------------- simple_examples/int32/D03RBJE.java | 388 -------------------------- simple_examples/int32/D05BAJE.java | 111 -------- simple_examples/int32/D05BEJE.java | 185 ------------- simple_examples/int32/DTFSMJE.java | 54 ---- simple_examples/int32/E01DAJE.java | 182 ------------- simple_examples/int32/E02ALJE.java | 101 ------- simple_examples/int32/E04ABJE.java | 76 ------ simple_examples/int32/E04BBJE.java | 81 ------ simple_examples/int32/E04CBJE.java | 90 ------- simple_examples/int32/E04FCJE.java | 420 ----------------------------- simple_examples/int32/E04FFJE.java | 140 ---------- simple_examples/int32/E04GBJE.java | 183 ------------- simple_examples/int32/E04GGJE.java | 219 --------------- simple_examples/int32/E04MTJE.java | 132 --------- simple_examples/int32/E04MXJE.java | 292 -------------------- simple_examples/int32/E04NCJE.java | 246 ----------------- simple_examples/int32/E04NFJE.java | 234 ---------------- simple_examples/int32/E04NKJE.java | 295 -------------------- simple_examples/int32/E04NQJE.java | 384 -------------------------- simple_examples/int32/E04PTJE.java | 344 ----------------------- simple_examples/int32/E04RPJE.java | 199 -------------- simple_examples/int32/E04RSJE.java | 229 ---------------- simple_examples/int32/E04RTJE.java | 225 ---------------- simple_examples/int32/E04SAJE.java | 104 ------- simple_examples/int32/E04TAJE.java | 188 ------------- simple_examples/int32/E04TCJE.java | 263 ------------------ simple_examples/int32/E04UCJE.java | 211 --------------- simple_examples/int32/E04YAJE.java | 112 -------- simple_examples/int32/F01ADJE.java | 39 --- simple_examples/int32/F01CKJE.java | 60 ----- simple_examples/int32/F01CRJE.java | 47 ---- simple_examples/int32/F01DGJE.java | 72 ----- simple_examples/int32/F01ELJE.java | 89 ------ simple_examples/int32/F01EMJE.java | 106 -------- simple_examples/int32/F02EKJE.java | 227 ---------------- simple_examples/int32/F02FKJE.java | 230 ---------------- simple_examples/int32/F02WGJE.java | 132 --------- simple_examples/int32/F03BAJE.java | 108 -------- simple_examples/int32/F04AMJE.java | 114 -------- simple_examples/int32/F04BAJE.java | 144 ---------- simple_examples/int32/F05AAJE.java | 99 ------- simple_examples/int32/F06CLJE.java | 40 --- simple_examples/int32/F07AAJE.java | 90 ------- simple_examples/int32/F07ABJE.java | 134 --------- simple_examples/int32/F07ADJE.java | 72 ----- simple_examples/int32/F07AQJE.java | 99 ------- simple_examples/int32/F07FAJE.java | 79 ------ simple_examples/int32/F07FBJE.java | 122 --------- simple_examples/int32/F08BTJE.java | 228 ---------------- simple_examples/int32/F08FAJE.java | 113 -------- simple_examples/int32/F08XPJE.java | 297 -------------------- simple_examples/int32/G01ALJE.java | 55 ---- simple_examples/int32/G02AKJE.java | 68 ----- simple_examples/int32/G02BJJE.java | 303 --------------------- simple_examples/int32/G02BRJE.java | 134 --------- simple_examples/int32/G02DAJE.java | 187 ------------- simple_examples/int32/G02EEJE.java | 184 ------------- simple_examples/int32/G02MAJE.java | 130 --------- simple_examples/int32/G03GAJE.java | 355 ------------------------ simple_examples/int32/G05KFJE.java | 105 -------- simple_examples/int32/G13AWJE.java | 31 --- simple_examples/int32/G13MEJE.java | 160 ----------- simple_examples/int32/G13NAJE.java | 123 --------- simple_examples/int32/H02BBJE.java | 92 ------- simple_examples/int32/H02DAJE.java | 228 ---------------- simple_examples/int32/M01CCJE.java | 42 --- simple_examples/int32/S01BAJE.java | 39 --- simple_examples/int32/S10AAJE.java | 40 --- simple_examples/int32/S10ABJE.java | 41 --- simple_examples/int32/S10ACJE.java | 41 --- simple_examples/int32/S14ABJE.java | 71 ----- simple_examples/int32/S14ACJE.java | 68 ----- simple_examples/int32/S14AFJE.java | 80 ------ simple_examples/int32/S17DCJE.java | 69 ----- simple_examples/int32/S17DGJE.java | 61 ----- simple_examples/int32/S30AAJE.java | 109 -------- simple_examples/int32/S30ACJE.java | 129 --------- simple_examples/int32/X03AAJE.java | 87 ------ simple_examples/int32/X04CBJE.java | 53 ---- simple_examples/int32/X05ABJE.java | 25 -- 113 files changed, 15934 deletions(-) delete mode 100644 simple_examples/int32/A00AAJE.java delete mode 100644 simple_examples/int32/A00ACJE.java delete mode 100644 simple_examples/int32/A00ADJE.java delete mode 100644 simple_examples/int32/C02AAJE.java delete mode 100644 simple_examples/int32/C02ABJE.java delete mode 100644 simple_examples/int32/C02AFJE.java delete mode 100644 simple_examples/int32/C02AGJE.java delete mode 100644 simple_examples/int32/C02AHJE.java delete mode 100644 simple_examples/int32/C02AJJE.java delete mode 100644 simple_examples/int32/C02AKJE.java delete mode 100644 simple_examples/int32/C02ALJE.java delete mode 100644 simple_examples/int32/C02AMJE.java delete mode 100644 simple_examples/int32/C02ANJE.java delete mode 100644 simple_examples/int32/C05AUJE.java delete mode 100644 simple_examples/int32/C05AWJE.java delete mode 100644 simple_examples/int32/C05AYJE.java delete mode 100644 simple_examples/int32/C05AZJE.java delete mode 100644 simple_examples/int32/C05BBJE.java delete mode 100644 simple_examples/int32/C05MBJE.java delete mode 100644 simple_examples/int32/C05QBJE.java delete mode 100644 simple_examples/int32/C06BAJE.java delete mode 100644 simple_examples/int32/C06FKJE.java delete mode 100644 simple_examples/int32/C09AAJE.java delete mode 100644 simple_examples/int32/D01BDJE.java delete mode 100644 simple_examples/int32/D01RJJE.java delete mode 100644 simple_examples/int32/D01RKJE.java delete mode 100644 simple_examples/int32/D01RLJE.java delete mode 100644 simple_examples/int32/D01RMJE.java delete mode 100644 simple_examples/int32/D01TCJE.java delete mode 100644 simple_examples/int32/D02NEJE.java delete mode 100644 simple_examples/int32/D02TLJE.java delete mode 100644 simple_examples/int32/D03PCJE.java delete mode 100644 simple_examples/int32/D03RAJE.java delete mode 100644 simple_examples/int32/D03RBJE.java delete mode 100644 simple_examples/int32/D05BAJE.java delete mode 100644 simple_examples/int32/D05BEJE.java delete mode 100644 simple_examples/int32/DTFSMJE.java delete mode 100644 simple_examples/int32/E01DAJE.java delete mode 100644 simple_examples/int32/E02ALJE.java delete mode 100644 simple_examples/int32/E04ABJE.java delete mode 100644 simple_examples/int32/E04BBJE.java delete mode 100644 simple_examples/int32/E04CBJE.java delete mode 100644 simple_examples/int32/E04FCJE.java delete mode 100644 simple_examples/int32/E04FFJE.java delete mode 100644 simple_examples/int32/E04GBJE.java delete mode 100644 simple_examples/int32/E04GGJE.java delete mode 100644 simple_examples/int32/E04MTJE.java delete mode 100644 simple_examples/int32/E04MXJE.java delete mode 100644 simple_examples/int32/E04NCJE.java delete mode 100644 simple_examples/int32/E04NFJE.java delete mode 100644 simple_examples/int32/E04NKJE.java delete mode 100644 simple_examples/int32/E04NQJE.java delete mode 100644 simple_examples/int32/E04PTJE.java delete mode 100644 simple_examples/int32/E04RPJE.java delete mode 100644 simple_examples/int32/E04RSJE.java delete mode 100644 simple_examples/int32/E04RTJE.java delete mode 100644 simple_examples/int32/E04SAJE.java delete mode 100644 simple_examples/int32/E04TAJE.java delete mode 100644 simple_examples/int32/E04TCJE.java delete mode 100644 simple_examples/int32/E04UCJE.java delete mode 100644 simple_examples/int32/E04YAJE.java delete mode 100644 simple_examples/int32/F01ADJE.java delete mode 100644 simple_examples/int32/F01CKJE.java delete mode 100644 simple_examples/int32/F01CRJE.java delete mode 100644 simple_examples/int32/F01DGJE.java delete mode 100644 simple_examples/int32/F01ELJE.java delete mode 100644 simple_examples/int32/F01EMJE.java delete mode 100644 simple_examples/int32/F02EKJE.java delete mode 100644 simple_examples/int32/F02FKJE.java delete mode 100644 simple_examples/int32/F02WGJE.java delete mode 100644 simple_examples/int32/F03BAJE.java delete mode 100644 simple_examples/int32/F04AMJE.java delete mode 100644 simple_examples/int32/F04BAJE.java delete mode 100644 simple_examples/int32/F05AAJE.java delete mode 100644 simple_examples/int32/F06CLJE.java delete mode 100644 simple_examples/int32/F07AAJE.java delete mode 100644 simple_examples/int32/F07ABJE.java delete mode 100644 simple_examples/int32/F07ADJE.java delete mode 100644 simple_examples/int32/F07AQJE.java delete mode 100644 simple_examples/int32/F07FAJE.java delete mode 100644 simple_examples/int32/F07FBJE.java delete mode 100644 simple_examples/int32/F08BTJE.java delete mode 100644 simple_examples/int32/F08FAJE.java delete mode 100644 simple_examples/int32/F08XPJE.java delete mode 100644 simple_examples/int32/G01ALJE.java delete mode 100644 simple_examples/int32/G02AKJE.java delete mode 100644 simple_examples/int32/G02BJJE.java delete mode 100644 simple_examples/int32/G02BRJE.java delete mode 100644 simple_examples/int32/G02DAJE.java delete mode 100644 simple_examples/int32/G02EEJE.java delete mode 100644 simple_examples/int32/G02MAJE.java delete mode 100644 simple_examples/int32/G03GAJE.java delete mode 100644 simple_examples/int32/G05KFJE.java delete mode 100644 simple_examples/int32/G13AWJE.java delete mode 100644 simple_examples/int32/G13MEJE.java delete mode 100644 simple_examples/int32/G13NAJE.java delete mode 100644 simple_examples/int32/H02BBJE.java delete mode 100644 simple_examples/int32/H02DAJE.java delete mode 100644 simple_examples/int32/M01CCJE.java delete mode 100644 simple_examples/int32/S01BAJE.java delete mode 100644 simple_examples/int32/S10AAJE.java delete mode 100644 simple_examples/int32/S10ABJE.java delete mode 100644 simple_examples/int32/S10ACJE.java delete mode 100644 simple_examples/int32/S14ABJE.java delete mode 100644 simple_examples/int32/S14ACJE.java delete mode 100644 simple_examples/int32/S14AFJE.java delete mode 100644 simple_examples/int32/S17DCJE.java delete mode 100644 simple_examples/int32/S17DGJE.java delete mode 100644 simple_examples/int32/S30AAJE.java delete mode 100644 simple_examples/int32/S30ACJE.java delete mode 100644 simple_examples/int32/X03AAJE.java delete mode 100644 simple_examples/int32/X04CBJE.java delete mode 100644 simple_examples/int32/X05ABJE.java diff --git a/simple_examples/int32/A00AAJE.java b/simple_examples/int32/A00AAJE.java deleted file mode 100644 index 65b6c18..0000000 --- a/simple_examples/int32/A00AAJE.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.nag.routines.A00.A00AA; - -/** - * A00AA example program text. - */ -public class A00AAJE { - - public static void main(String[] args) { - A00AA a00aa = new A00AA(); - - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - - } - -} diff --git a/simple_examples/int32/A00ACJE.java b/simple_examples/int32/A00ACJE.java deleted file mode 100644 index 7f44ba3..0000000 --- a/simple_examples/int32/A00ACJE.java +++ /dev/null @@ -1,29 +0,0 @@ -import com.nag.routines.A00.A00AC; - -/** - * A00AC example program text. - * @author Mo - */ -public class A00ACJE { - - public static void main(String[] args) { - A00AC a00ac = new A00AC(); - boolean lmok; - - System.out.println(" A00ACJ Example Program Results\n"); - System.out.println(); - - a00ac.eval(); - - lmok = a00ac.eval(); - - if (lmok) { - System.out.println("A valid licence key is available"); - } - else { - System.out.println("No valid licence key was found"); - } - - } - -} diff --git a/simple_examples/int32/A00ADJE.java b/simple_examples/int32/A00ADJE.java deleted file mode 100644 index 139c8b9..0000000 --- a/simple_examples/int32/A00ADJE.java +++ /dev/null @@ -1,107 +0,0 @@ -import com.nag.routines.A00.A00AD; -import com.nag.routines.X05.X05AA; -import java.util.Arrays; - -/** - * A00AD example program text. - */ -public class A00ADJE { - - public static void main(String[] args) { - - A00AD a00ad = new A00AD(); - X05AA x05aa = new X05AA(); - int i, mkmaj, mkmin; - boolean licval; - String fcomp, hdware, impl, opsys, pcode, prec, vend; - int[] itime = new int[7]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - - System.out.println(" A00ADJ Example Program Results\n"); - - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - - // Output scalars must be retrieved manually - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - // Print implementation details - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/int32/C02AAJE.java b/simple_examples/int32/C02AAJE.java deleted file mode 100644 index 1abc528..0000000 --- a/simple_examples/int32/C02AAJE.java +++ /dev/null @@ -1,174 +0,0 @@ -import com.nag.routines.C02.C02AA; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.types.NAGComplex; -import java.util.Arrays; - -/** - * C02AA example program text. - * @author joed - * @since 27.1.0.0 - */ -public class C02AAJE { - - public static void main(String[] args) { - - System.out.println(" C02AAJ Example Program Results"); - - Routine.setComplex(new NAGComplex()); - exampleBasic(); - examplePolishing(); - - System.out.println(); - - } - - /** Demonstrate a basic problem. */ - public static void exampleBasic() { - - C02AA c02aa = new C02AA(); - int ifail, itmax, n, polish; - NAGComplex[] a, z; - double[] berr, cond; - int[] conv; - - System.out.println(); - System.out.println("Example 1: Basic Problem"); - System.out.println(); - - // Set polynomial degree and instantiate arrays - n = 5; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Set polynomial coefficients - a[0] = new NAGComplex(5.0, 6.0); - a[1] = new NAGComplex(30.0, 20.0); - a[2] = new NAGComplex(-0.2, -6.0); - a[3] = new NAGComplex(50.0, 100000.0); - a[4] = new NAGComplex(-2.0, 40.0); - a[5] = new NAGComplex(10.0, 1.0); - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond "); - System.out.println(" ---------------------------------------------------"); - for (int i = 0; i < n; i++) { - System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, - z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - - } - - /** Compare polishing processes on a Wilkinson-style polynomial. */ - public static void examplePolishing() { - - C02AA c02aa = new C02AA(); - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - NAGComplex pz; - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int ifail, itmax, k, n, polish; - NAGComplex[] a, z, zact; - double[] berr, cond; - int[] conv; - boolean[] matched; - - System.out.println(); - System.out.println("Example 2: Polishing Processes"); - System.out.println(); - - // Set polynomial degree and instantiate - n = 10; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = new NAGComplex[n]; - zact = new NAGComplex[n]; - - // Set known roots and (instantiate z) - for (int i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) i+1, 0.0); - z[i] = new NAGComplex(); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (int i = 0; i < n; i++) { - a[i] = new NAGComplex(); - } - a[n] = new NAGComplex(1.0, 0.0); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - a[j] = a[j+1].subtract(a[j].multiply(zact[i])); - } - a[n] = a[n].negate().multiply(zact[i]); - } - - System.out.println(" polish relerr fwderr "); - System.out.println(" ----------------------------"); - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - for (polish = 0; polish <= 2; polish++) { - - // Find roots - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - /* Calculate the maximum relative errors of the roots, and the maximum - * forward error evaluating the polynomial at those roots. Errors are - * capped at machine precision. */ - maxrelerr = maxfwderr = eps; - Arrays.fill(matched, false); - - for (int i = 0; i < n; i++) { - - // Evaluate polynomial at this root - pz = a[0].clone(); - for (int j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(a[j]); - } - - // Match to an expected root - k = 0; - err = rmax; - for (int j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - - } - -} diff --git a/simple_examples/int32/C02ABJE.java b/simple_examples/int32/C02ABJE.java deleted file mode 100644 index fad5ebb..0000000 --- a/simple_examples/int32/C02ABJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.C02.C02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AB - */ -public class C02ABJE { - - public static void main(String[] args) { - - final boolean polish_example = false; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" C02ABJ Example Program Results"); - - ex1_basic(args); - if (polish_example) { - ex2_polishing(args); - } - } - - public static void ex1_basic(String[] args) { - - int i, ifail, itmax, n = 0, polish; - - NAGComplex[] z = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - - System.out.println("\n Basic Problem\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - String line = reader.readLine(); - line = reader.readLine(); - line = reader.readLine(); - - // Read polynomial degree and allocate - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Read polynomial coefficients - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[i] = Double.parseDouble(sVal[0]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond"); - System.out.println(" -----------------------------------------------------"); - for (i = 0; i < n; i++) { - System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - } - - public static void ex2_polishing(String[] args) { - NAGComplex pz = new NAGComplex(); - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int i, ifail, itmax, j, k, n = 0, polish; - - NAGComplex[] z = null, zact = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - boolean[] matched = null; - - System.out.println("\n Polishing Processes\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i <= 12; i++) { - reader.readLine(); - } - - // Read polynomial degree and allocate - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = NAGComplex.createArray(n); - zact = NAGComplex.createArray(n); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Set known roots - for (i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) (i + 1), 0.0); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (i = 0; i < n; i++) { - a[i] = 0.0; - } - a[n] = 1.0; - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - a[j] = a[j + 1] - a[j] * zact[i].getRe(); - } - a[n] = -a[n] * zact[i].getRe(); - } - - System.out.println(" polish relerr fwderr"); - System.out.println(" ----------------------------"); - - // Use different polish modes - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - for (polish = 0; polish <= 2; polish++) { - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - // Find roots - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); - - // Calculate the maximum relative errors of the roots, and the maximum - // forward error evaluating the polynomial at those roots. Errors are - // capped at machine precision. - maxrelerr = eps; - maxfwderr = eps; - Arrays.fill(matched, false); - - for (i = 0; i < n; i++) { - // Evaluate polynomial at this root - pz = new NAGComplex(a[0], 0.0); - for (j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); - } - - // Match to an expected root - k = 0; - err = rmax; - for (j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - } -} diff --git a/simple_examples/int32/C02AFJE.java b/simple_examples/int32/C02AFJE.java deleted file mode 100644 index 6043be7..0000000 --- a/simple_examples/int32/C02AFJE.java +++ /dev/null @@ -1,271 +0,0 @@ -import com.nag.routines.C02.C02AF; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AF - */ -public class C02AFJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AFJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - - int i, ifail, n = 0; - - double[][] a = null, z = null; - double[] w = null; - - System.out.println("\n\n Example 1"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[2][n + 1]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); - } - - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[][] a = null, abar = null, z = null, zbar = null; - double[] r = null, w = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 12; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[2][n + 1]; - abar = new double[2][n + 1]; - r = new double[n]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar = 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[0][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[0][i] = f * a[0][i]; - - if (a[1][i] != 0.0E0) { - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - - } else { - - if (a[1][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] abar1d = convert2DTo1D(abar); - double[] zbar1d = convert2DTo1D(zbar); - c02af.eval(abar1d, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][j], zbar[1][j]); - deltac = Math.abs(r1 - r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0E0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j*n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AGJE.java b/simple_examples/int32/C02AGJE.java deleted file mode 100644 index c58e524..0000000 --- a/simple_examples/int32/C02AGJE.java +++ /dev/null @@ -1,262 +0,0 @@ -import com.nag.routines.C02.C02AG; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AG - */ -public class C02AGJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AGJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - double zi, zr; - int i, ifail, n = 0, nroot; - - double[] a = null, w = null; - double[][] z = null; - - System.out.println("\n\n Example 1\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - w = new double[2 * (n + 1)]; - z = new double[2][n]; - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - nroot = 0; - - while (nroot < n) { - zr = z[0][nroot]; - zi = z[1][nroot]; - if (zi == 0.0E0) { - System.out.printf(" z = %12.4E\n", zr); - nroot += 1; - } else { - System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); - nroot += 2; - } - } - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[] a = null, abar = null, r = null, w = null; - double[][] z = null, zbar = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 7; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n+1]; - abar = new double[n+1]; - r = new double[n]; - w = new double[2 * (n+1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d ,w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar= 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[i] != 0.0) { - f = 1.0 + epsbar; - epsbar = -epsbar; - abar[i] = f * a[i]; - } else { - abar[i] = 0.0E0; - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] zbar1d = convert2DTo1D(zbar); - c02ag.eval(abar, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][i], zbar[1][i]); - deltac = Math.abs(r1-r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j * n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j * n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AHJE.java b/simple_examples/int32/C02AHJE.java deleted file mode 100644 index b1e12cd..0000000 --- a/simple_examples/int32/C02AHJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.C02.C02AH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AH - */ -public class C02AHJE { - - public static void main(String[] args) { - - double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AHJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - ar = Double.parseDouble(sVal[0]); - ai = Double.parseDouble(sVal[1]); - br = Double.parseDouble(sVal[2]); - bi = Double.parseDouble(sVal[3]); - cr = Double.parseDouble(sVal[4]); - ci = Double.parseDouble(sVal[5]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AH c02ah = new C02AH(); - c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); - ifail = c02ah.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); - System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); - } - } -} diff --git a/simple_examples/int32/C02AJJE.java b/simple_examples/int32/C02AJJE.java deleted file mode 100644 index 64e3a5e..0000000 --- a/simple_examples/int32/C02AJJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C02.C02AJ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AJ - */ -public class C02AJJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AJJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - a = Double.parseDouble(sVal[0]); - b = Double.parseDouble(sVal[1]); - c = Double.parseDouble(sVal[2]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AJ c02aj = new C02AJ(); - c02aj.eval(a, b, c, zsm, zlg, ifail); - ifail = c02aj.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - - if (zsm[1] == 0.0E0) { - // 2 real roots. - System.out.printf(" z = %12.4E\n", zsm[0]); - System.out.printf(" z = %12.4E\n", zlg[0]); - } else { - // 2 complex roots. - System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); - } - } - } -} diff --git a/simple_examples/int32/C02AKJE.java b/simple_examples/int32/C02AKJE.java deleted file mode 100644 index 4a0579f..0000000 --- a/simple_examples/int32/C02AKJE.java +++ /dev/null @@ -1,62 +0,0 @@ -import com.nag.routines.C02.C02AK; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AK - */ -public class C02AKJE { - - public static void main(String[] args) { - - double r = 0, s = 0, t = 0, u = 0; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AKJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - u = Double.parseDouble(sVal[0]); - r = Double.parseDouble(sVal[1]); - s = Double.parseDouble(sVal[2]); - t = Double.parseDouble(sVal[3]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AK c02ak = new C02AK(); - c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ALJE.java b/simple_examples/int32/C02ALJE.java deleted file mode 100644 index 4f9eac9..0000000 --- a/simple_examples/int32/C02ALJE.java +++ /dev/null @@ -1,64 +0,0 @@ -import com.nag.routines.C02.C02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AL - */ -public class C02ALJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0, d = 0, e = 0; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ALJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - e = Double.parseDouble(sVal[0]); - a = Double.parseDouble(sVal[1]); - b = Double.parseDouble(sVal[2]); - c = Double.parseDouble(sVal[3]); - d = Double.parseDouble(sVal[4]); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AL c02al = new C02AL(); - c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02al.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02AMJE.java b/simple_examples/int32/C02AMJE.java deleted file mode 100644 index f1fffa4..0000000 --- a/simple_examples/int32/C02AMJE.java +++ /dev/null @@ -1,75 +0,0 @@ -import com.nag.routines.C02.C02AM; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AM - */ -public class C02AMJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex r = null, s = null, t = null, u = null; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AMJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AM c02am = new C02AM(); - c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ANJE.java b/simple_examples/int32/C02ANJE.java deleted file mode 100644 index dc865e2..0000000 --- a/simple_examples/int32/C02ANJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.C02.C02AN; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AN - */ -public class C02ANJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex a = null, b = null, c = null, d = null, e = null; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ANJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AN c02an = new C02AN(); - c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02an.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C05AUJE.java b/simple_examples/int32/C05AUJE.java deleted file mode 100644 index d2b09b1..0000000 --- a/simple_examples/int32/C05AUJE.java +++ /dev/null @@ -1,67 +0,0 @@ -import com.nag.routines.C05.C05AU; - -/** - * C05AUJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05AUJE{ - - /** - * C05AUJ main program - */ - public static void main(String[] args){ - double a = 0, b = 0, eps, eta, h, x; //placeholders - int ifail; - double[] ruser; - int[] iuser; - - ruser = new double[1]; //need to initialise before passing to wrapper - iuser = new int[1]; - - System.out.println("C05AUJ Example Program Results"); - - x = 1; - h = 0.1; - eps = 0.00001; - eta = 0; - - //Instance of class f to pass to wrapper - f f1 = new f(); - - ifail = -1; - C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); - c05au.eval(); - - //update values - x = c05au.getX(); - a = c05au.getA(); - b = c05au.getB(); - ifail = c05au.getIFAIL(); - - System.out.println(); - - switch(ifail){ - case 0: - System.out.printf("Root is : \t%.5f\n", x); - System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); - break; - case 3: - case 4: - System.out.printf("Final value = %.5f\n", x); - break; - } - } - - /** - * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. - * eval() must be implemented by the user. - * @return x - e^x - */ - public static class f extends C05AU.Abstract_C05AU_F{ - public double eval(){ - return(this.X - Math.exp(-this.X)); - } - } -} - diff --git a/simple_examples/int32/C05AWJE.java b/simple_examples/int32/C05AWJE.java deleted file mode 100644 index 6ea3c9f..0000000 --- a/simple_examples/int32/C05AWJE.java +++ /dev/null @@ -1,59 +0,0 @@ -import com.nag.routines.C05.C05AW; - -public class C05AWJE{ - - public static void main(String[] args){ - double eps, eta, x; - int ifail, nfmax; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("C05AWJ Example Program Results"); - System.out.println(); - - boolean finished = false; - for(int i = 3; i <= 4; i++){ - eps = Math.pow(10, -i); - x = 1; - eta = 0; - nfmax = 200; - - ifail = -1; - f f1 = new f(); - C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); - c05aw.eval(); - - ifail = c05aw.getIFAIL(); - x = c05aw.getX(); - eps = c05aw.getEPS(); - - switch(ifail){ - case(0): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - case(-1): - //exit loop - finished = true; - break; - case(3): - case(4): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - } - if(finished){ - break; - } - } - } - - public static class f extends C05AW.Abstract_C05AW_F{ - public double eval(){ - return(Math.exp(-X) - X); - } - } -} - - diff --git a/simple_examples/int32/C05AYJE.java b/simple_examples/int32/C05AYJE.java deleted file mode 100644 index c9ee43b..0000000 --- a/simple_examples/int32/C05AYJE.java +++ /dev/null @@ -1,44 +0,0 @@ -import com.nag.routines.C05.C05AY; - -/** - * C05AY example program text. - */ -public class C05AYJE { - - public static void main(String[] args) { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - int ifail = 0; - int[] iuser = new int[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch (ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/int32/C05AZJE.java b/simple_examples/int32/C05AZJE.java deleted file mode 100644 index 7c3e27e..0000000 --- a/simple_examples/int32/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C05.C05AZ; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * C05AZ example program text. - */ -public class C05AZJE { - - public static void main(String[] args) { - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - int ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - if (ind == 0) { - keepOn = false; - } - else { - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - - } - - switch (ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/int32/C05BBJE.java b/simple_examples/int32/C05BBJE.java deleted file mode 100644 index 4723773..0000000 --- a/simple_examples/int32/C05BBJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.C05.C05BB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C05BBJ Example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05BBJE{ - - /** - * C05BBJE main program text - */ - public static void main(String[] args){ - NAGComplex w, z; - double resid = 0; - int branch = 0, ifail = 0; //placeholder - boolean offset = false; //placeholder - - //need to initialise first - z = new NAGComplex(); - w = new NAGComplex(); - - System.out.println("C05BBJ Example Program Results"); - - if(args.length != 1){ - System.out.println("Please specify path to data file as input"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - branch = Integer.parseInt(sVal[0]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - offset = Boolean.parseBoolean(sVal[0]); - - System.out.printf("Branch = %d\n", branch); - System.out.printf("Offset = %b\n", offset); - - System.out.println(); - System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - sVal = line.split("\\s+"); - - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - - ifail = -1; - C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); - c05bb.eval(); - - z = (NAGComplex) c05bb.getZ(); - w = (NAGComplex) c05bb.getW(); - resid = c05bb.getRESID(); - ifail = c05bb.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C05MBJE.java b/simple_examples/int32/C05MBJE.java deleted file mode 100644 index 9b46ff5..0000000 --- a/simple_examples/int32/C05MBJE.java +++ /dev/null @@ -1,95 +0,0 @@ -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ example program text. - * - * @author joed - * @since 27.0.0.0 - * - */ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ example main program. - */ - public static void main(String[] args) { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - int astart, i, ifail, m; - double[] fvec, x; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail == 0 || ifail == 8 || ifail == 9) { - if (ifail == 0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/int32/C05QBJE.java b/simple_examples/int32/C05QBJE.java deleted file mode 100644 index 4b93405..0000000 --- a/simple_examples/int32/C05QBJE.java +++ /dev/null @@ -1,167 +0,0 @@ -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05QB example program text. - * @author ludovic - */ -public class C05QBJE { - - public static void main(String[] args) { - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - int[] IUSER = new int[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - } - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private int N, IFLAG; - private double[] X, FVEC, RUSER; - private int[] IUSER; - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { - - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for (int i = 1; i < N; ++i) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - for (int i = 0; i < N-1; ++i) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - } - - } - - } - -} diff --git a/simple_examples/int32/C06BAJE.java b/simple_examples/int32/C06BAJE.java deleted file mode 100644 index 541d4d3..0000000 --- a/simple_examples/int32/C06BAJE.java +++ /dev/null @@ -1,56 +0,0 @@ -import com.nag.routines.C06.C06BA; -import com.nag.routines.X01.X01AA; - -/** - * C06BAJ example program text. - * @author willa - */ -public class C06BAJE{ - - public static void main(String[] args){ - int lwork = 16, nout = 6; - int ifail, ncall; - double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; - double[] work; - - C06BA c06ba = new C06BA(); - work = new double[lwork]; - - System.out.println("C06BAJ Example Program Results"); - System.out.println(); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - - ans = Math.pow(pi, 2)/12.0; - ncall = 0; - sig = 1.0; - seqn = 0.0; - System.out.println("\t\t\t Estimated\t Actual"); - System.out.println("I\t SEQN \t RESULT\t abs error\t error"); - System.out.println(); - - for(int i = 0; i < 10; i++){ - r = (double) i + 1; - seqn = seqn + sig/Math.pow(r, 2); - - ifail = 0; - c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); - - //update variables - ncall = c06ba.getNCALL(); - result = c06ba.getRESULT(); - abserr = c06ba.getABSERR(); - - error = result - ans; - sig = -sig; - - if(i <= 2){ - System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); - } - else{ - System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); - } - } - } -} diff --git a/simple_examples/int32/C06FKJE.java b/simple_examples/int32/C06FKJE.java deleted file mode 100644 index 58db62f..0000000 --- a/simple_examples/int32/C06FKJE.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.nag.routines.C06.C06FK; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C06FKJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class C06FKJE{ - - /** - * C06FKJE main program - */ - public static void main(String[] args){ - int ifail = 0, n = 0; //placeholder - double[] work, xa, xb, ya, yb; - - work = new double[0]; - xa = new double[0]; - xb = new double[0]; - ya = new double[0]; - yb = new double[0]; //placeholders - - System.out.println("C06FKJ Example Program Results"); - System.out.println(); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - //Break when the end of the file is reached - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - work = new double[n]; - xa = new double[n]; - xb = new double[n]; - ya = new double[n]; - yb = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - xa[i] = Double.parseDouble(sVal[0]); - xb[i] = xa[i]; - ya[i] = Double.parseDouble(sVal[1]); - yb[i] = ya[i]; - } - - ifail = 0; - - C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); - c06fk1.eval(); - xa = c06fk1.getX(); - C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); - c06fk2.eval(); - xb = c06fk2.getX(); - - System.out.printf("\tCovolution \tCorrelation\n"); - System.out.println(); - - for(int i = 0; i < n; i++){ - System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C09AAJE.java b/simple_examples/int32/C09AAJE.java deleted file mode 100644 index 48c38b6..0000000 --- a/simple_examples/int32/C09AAJE.java +++ /dev/null @@ -1,158 +0,0 @@ -import com.nag.routines.C09.C09AA; -import com.nag.routines.C09.C09CC; -import com.nag.routines.C09.C09CD; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C09AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C09AAJE{ - - /** - * C09AAJ example main program - */ - public static void main(String[] args){ - int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders - String mode = "", wavnam = "", wtrans; //placeholders - int[] dwtlev, icomm; - double[] c, x, y; - - x = new double[0]; y = new double[0]; //placeholders - - //print error message if no data file given - if(args.length != 1){ - C09AAJE.usage(); - } - - icomm = new int[100]; - - System.out.println("C09AAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - wavnam = sVal[1]; - mode = sVal[2]; - - x = new double[n]; - y = new double[n]; - - System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); - - System.out.println("Input data \tX : "); - for(int i = 0; i < n; i++){ - line = reader.readLine(); - //Avoid errors with data file format and negative numbers - line = " " + line; - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - System.out.printf("%.3f\t", x[i]); - } - System.out.printf("\n"); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //Query wavelet filter dimensions - //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' - wtrans = "Multilevel"; - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); - c09aa.eval(); - - nwc = c09aa.getNWC(); - nwlmax = c09aa.getNWLMAX(); - lenc = nwc; - c = new double[lenc]; - dwtlev = new int[nwlmax + 1]; - - icomm = c09aa.getICOMM(); - ifail = 0; - //Perform discrete wavelet transform - C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); - c09cc.eval(); - - nf = c09aa.getNF(); - nwlmax = c09cc.getNWL(); - dwtlev = c09cc.getDWTLEV(); - c = c09cc.getC(); - - System.out.println(); - System.out.printf("Length of wavelet filter : \t%d\n", nf); - System.out.printf("Number of Levels : \t%d\n", nwlmax); - System.out.printf("Number of coefficients in each level: \n\t\t"); - for(int i = 0; i <= nwlmax; i++){ - System.out.printf("%d\t ", dwtlev[i]); - } - System.out.printf("\n"); - System.out.printf("Total number of wavelength coefficients : %d\n", nwc); - nnz = arraySum(dwtlev); - System.out.println(); - System.out.println("Wavelet coefficients C:"); - for(int i = 0; i < nnz; i++){ - System.out.printf("%.3f ", c[i]); - } - System.out.printf("\n"); - - //Reconstruct original data - ny = n; - - ifail = 0; - lenc = c09cc.getLENC(); - icomm = c09cc.getICOMM(); - C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); - c09cd.eval(); - - y = c09cd.getY(); - System.out.println(); - System.out.printf("Reconstruction \tY : \n"); - for(int i = 0; i < ny; i++){ - System.out.printf("%.3f ", y[i]); - } - System.out.printf("\n"); - } - - /** - * Finds the sum of all integers in an array - * @param a - * Array to sum - * @return total - */ - private static int arraySum(int[] a){ - int tot = 0; - for(int i = 0; i < a.length; i++){ - tot += a[i]; - } - return tot; - } - - /** - * No arguments supplied when exmaple runs - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/D01BDJE.java b/simple_examples/int32/D01BDJE.java deleted file mode 100644 index 8659cc4..0000000 --- a/simple_examples/int32/D01BDJE.java +++ /dev/null @@ -1,58 +0,0 @@ -import com.nag.routines.D01.D01BD; - -/** - * D01BD example program text. - */ -public class D01BDJE { - - public static void main(String[] args) { - - double a = 0.0, b = 1.0; - double epsabs = 0.0, epsrel = 0.0001; - double result = Double.NaN; - double abserr = Double.NaN; - FUN fun = new FUN(); - D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); - - d01bd.eval(); - result = d01bd.getRESULT(); - abserr = d01bd.getABSERR(); - - System.out.println(" D01BDJ Example Program Results"); - - System.out.println(); - System.out.printf(" A - lower limit of integration = %10.4f\n",a); - System.out.printf(" B - upper limit of integration = %10.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.println(); - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.println(); - - if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - } - -} diff --git a/simple_examples/int32/D01RJJE.java b/simple_examples/int32/D01RJJE.java deleted file mode 100644 index 9eee98a..0000000 --- a/simple_examples/int32/D01RJJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.D01.D01RJ; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RJ example program text. - * @author Mo - */ -public class D01RJJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RJJ Example Program Results"); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - /* pass constant to f through ruser */ - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RJ d01rj = new D01RJ(); - ifail = -1; - d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rj.getRESULT(); - abserr = d01rj.getABSERR(); - ifail = d01rj.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); - System.out.println(); - } - - } - - } - - public static class F implements D01RJ.D01RJ_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int i = 0; i < NX; i++) { - if (X[i] == 1.0) { - /* An undefined result will be generated. */ - /* Set iflag to force an immediate exit */ - IFLAG = -1; - /* Store chosen value of iflag in iuser */ - IUSER[0] = IFLAG; - } - } - if (IFLAG != -1) { - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j])/ - Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RKJE.java b/simple_examples/int32/D01RKJE.java deleted file mode 100644 index 20c0501..0000000 --- a/simple_examples/int32/D01RKJE.java +++ /dev/null @@ -1,173 +0,0 @@ -import com.nag.routines.D01.D01RK; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RK example program text. - * @author Mo - */ -public class D01RKJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, key, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RKJ Example Program Results"); - - key = 6; - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RK d01rk = new D01RK(); - ifail = -1; - d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rk.getRESULT(); - abserr = d01rk.getABSERR(); - ifail = d01rk.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RK.D01RK_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RLJE.java b/simple_examples/int32/D01RLJE.java deleted file mode 100644 index c8a6d0e..0000000 --- a/simple_examples/int32/D01RLJE.java +++ /dev/null @@ -1,196 +0,0 @@ -import com.nag.routines.D01.D01RL; -import java.util.Arrays; - -/** - * D01RL example program text. - * @author Mo - */ -public class D01RLJE { - - public static void main(String[] args) { - - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] points, rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub, npts; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RLJ Example Program Results"); - - epsabs = 0.0; - epsrel = 0.0001; - a = 0.0; - b = 1.0; - npts = 1; - maxsub = 20; - liinfo = 2*Math.max(maxsub,npts) + npts + 4; - lrinfo = 4*Math.max(maxsub,npts) + npts + 6; - - points = new double[npts]; - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[21]; - - points[0] = 1.0/7.0; - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RL d01rl = new D01RL(); - ifail = -1; - d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - points = d01rl.getPOINTS(); - result = d01rl.getRESULT(); - abserr = d01rl.getABSERR(); - ifail = d01rl.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F"); - System.out.println(); - } - - } - - } - - public static class F implements D01RL.D01RL_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - /*for (int i = 0; i < NX; i++) {*/ - /*FV[i] = 0.0;*/ - /*}*/ - - for (int i = 0; i < NX; i++) { - FV[i] = Math.abs(X[i] - 1.0/7.0); - } - - for (int i = 0; i < NX; i++) { - if (FV[i] == 0.0) { - /* A singular point will be hit. */ - /* Record offending abscissae and abort computation. */ - IFLAG = 0; - for (int k = 0; k < NX; k++) { - if (FV[k] == 0.0) { - IFLAG = IFLAG + 1; - RUSER[IFLAG-1] = X[k]; - } - } - /* Store value of iflag in iuser */ - IUSER[0] = IFLAG; - /* signal abort by setting iflag<0 */ - IFLAG = -IFLAG; - } - } - if (IFLAG == 0) { - /* Safe to evaluate. */ - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/Math.sqrt(FV[j]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RMJE.java b/simple_examples/int32/D01RMJE.java deleted file mode 100644 index 6e80b2b..0000000 --- a/simple_examples/int32/D01RMJE.java +++ /dev/null @@ -1,163 +0,0 @@ -import com.nag.routines.D01.D01RM; -import java.util.Arrays; - -/** - * D01RM example program text. - * @author Mo - */ -public class D01RMJE { - - public static void main(String[] args) { - - double bound, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, inf, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RMJ Example Program Results"); - - bound = 0.0; - inf = 1; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RM d01rm = new D01RM(); - ifail = -1; - d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rm.getRESULT(); - abserr = d01rm.getABSERR(); - ifail = d01rm.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",bound); - System.out.println(" B - upper limit of integration = infinity\n"); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RM.D01RM_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01TCJE.java b/simple_examples/int32/D01TCJE.java deleted file mode 100644 index cde8428..0000000 --- a/simple_examples/int32/D01TCJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.routines.D01.D01TC; -import java.util.Arrays; - -/** - * D01TC example program text. - * @author Mo - */ -public class D01TCJE { - - public static void main(String[] args) { - - double a, b, c, d; - double[] abscis, weight; - int n, ifail, itype; - - /* Header */ - System.out.println(" D01TCJ Example Program Results"); - - n = 7; - a = 0.0; - b = 1.0; - c = 0.0; - d = 0.0; - itype = -3; - - abscis = new double[n]; - weight = new double[n]; - - D01TC d01tc = new D01TC(); - ifail = 0; - d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); - abscis= d01tc.getABSCIS(); - weight = d01tc.getWEIGHT(); - - System.out.println(); - System.out.printf(" Laguerre formula, %2d points\n",n); - System.out.println(); - System.out.println(" Abscissae Weights\n"); - for (int j = 0; j < n; j++) { - System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); - } - - } - -} diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java deleted file mode 100644 index 34a5b25..0000000 --- a/simple_examples/int32/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java deleted file mode 100644 index 601b3ce..0000000 --- a/simple_examples/int32/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/int32/D03PCJE.java b/simple_examples/int32/D03PCJE.java deleted file mode 100644 index 4901e2e..0000000 --- a/simple_examples/int32/D03PCJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.D03.D03PC; -import com.nag.routines.D03.D03PZ; -import com.nag.routines.X01.X01AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.StringBuilder; - -/** - * D03PCJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D03PCJE{ - - /** - * D03PCJE main program - */ - public static void main(String[] args){ - int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; - double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; - int[] isave, iuser, iwsav; - double[] rsave, u, uout, x, xout, ruser, rwsav; - boolean[] lwsav; - String[] cwsav; - - xout = new double[0]; // placeholders - ruser = new double[1]; - rwsav = new double[1100]; - iuser = new int[1]; - iwsav = new int[505]; - lwsav = new boolean[100]; - cwsav = new String[10]; - - System.out.println("D03PCJ Example Program Results"); - - //Specify path to data file - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - intpts = Integer.parseInt(sVal[0]); - npts = Integer.parseInt(sVal[1]); - itype = Integer.parseInt(sVal[2]); - - xout = new double[intpts]; - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < intpts; i++){ - xout[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.split("\\s+"); - acc = Double.parseDouble(sVal[0]); - alpha = Double.parseDouble(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - itrace = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - ts = Double.parseDouble(sVal[0]); - tout = Double.parseDouble(sVal[1]); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - neqn = npde * npts; - lisave = neqn + 24; - nwk = (10 + (6 * npde)) * neqn; - lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; - - rsave = new double[lrsave]; - u = new double[npde * npts]; - uout = new double[npde * intpts * itype]; - x = new double[npts]; - isave = new int[lisave]; - ruser[0] = alpha; - ind = 0; - itask = 1; - - X01AA x01aa = new X01AA(); - pi = x01aa.eval(); - piby2 = 0.5 * pi; - hx = piby2/(double)(npts - 1); - x[0] = 0.0; - x[npts - 1] = 1.0; - for(int i = 1; i < (npts - 1); i++){ - x[i] = Math.sin(hx * (double)(i)); - } - - u = uinit(x, npts, iuser, ruser); - - //Character (80) :: cwsav(10) - //Surely a better way of doing this? - for(int i = 0; i < 10; i++){ - StringBuilder builder = new StringBuilder(""); - for(int j = 0; j < 80; j++){ - builder.append(" "); - } - cwsav[i] = builder.toString(); - } - - for(int i = 0; i <5; i++){ - tout = 10 * tout; - - ifail = 0; - pdedef pdedef1 = new pdedef(); - bndary bndary1 = new bndary(); - D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, - isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, - rwsav, ifail); - d03pc.eval(); - - //update ind - ind = d03pc.getIND(); - - if(i == 0){ - System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); - System.out.printf("T / X "); - for(int j = 0; j < xout.length; j++){ - System.out.printf("\t%.4f", xout[j]); - } - System.out.printf("\n"); - } - System.out.println(); - - //Interpolate at required spatial points - ifail = 0; - - D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); - d03pz.eval(); - - System.out.printf("%.4f \tU(1)", tout); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2]); - } - System.out.printf("\n"); - System.out.printf("\tU(2)"); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2 + 1]); - } - System.out.printf("\n"); - System.out.println(); - } - - System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); - System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); - System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); - System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); - } - - /** - * PDE initial condition - */ - public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ - double alpha = ruser[0]; - double[] u = new double[2 * npts]; - for(int i = 0; i < npts; i++){ - u[2 * i] = 2 * alpha * x[i]; - u[(2 * i) + 1] = 1; - } - return u; - } - - public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ - public void eval(){ - double alpha = this.RUSER[0]; - this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); - this.Q[1] = 0; - this.R[0] = this.X * this.UX[0]; - this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); - this.P[0] = 0; - this.P[1] = 0; - this.P[2] = 0; - this.P[3] = 1 - (this.X * this.X); - } - } - - public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ - public void eval(){ - if(this.IBND == 0){ - this.BETA[0] = 0; - this.BETA[1] = 1; - this.GAMMA[0] = this.U[0]; - this.GAMMA[1] = -this.U[0] * this.U[1]; - } - else{ - this.BETA[0] = 1; - this.BETA[1] = 0; - this.GAMMA[0] = -this.U[0]; - this.GAMMA[1] = this.U[1]; - } - } - } - -} - - - diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java deleted file mode 100644 index 88d49aa..0000000 --- a/simple_examples/int32/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java deleted file mode 100644 index 9b1b482..0000000 --- a/simple_examples/int32/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/D05BAJE.java b/simple_examples/int32/D05BAJE.java deleted file mode 100644 index 7a8caf7..0000000 --- a/simple_examples/int32/D05BAJE.java +++ /dev/null @@ -1,111 +0,0 @@ -import com.nag.routines.D05.D05BA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BAJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D05BAJE{ - - /** - * D05BAJE main program - */ - public static void main(String[] args){ - double alim, h, hi, si, thresh, tlim, tol; - int ifail, iorder, lwk, nmesh = 6; - String method; - double[] errest, yn, work; - - errest = new double[nmesh]; - yn = new double[nmesh]; - - System.out.println("D05BAJ Example Program Results"); - - method = "A"; - iorder = 6; - alim = 0; - tlim = 20; - h = (tlim - alim) / (double) nmesh; - tol = 0.001; - X02AJ x02aj = new X02AJ(); - thresh = x02aj.eval(); - lwk = 10 * nmesh + 6; - work = new double[lwk]; - - //Loop until the supplied workspace is big enough - //breakflag used to exit loop - boolean breakflag = false; - while(true){ - ifail = 1; - - ck ck1 = new ck(); - cf cf1 = new cf(); - cg cg1 = new cg(); - - D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, - tol, thresh, work, lwk, ifail); - d05ba.eval(); - - //update - ifail = d05ba.getIFAIL(); - lwk = d05ba.getLWK(); - work = d05ba.getWORK(); - - switch(ifail){ - case 5: - lwk = (int) work[0]; - work = new double[lwk]; - break; - case 6: - lwk = (int) work[0]; - work = new double[lwk]; - break; - default: - breakflag = true; - } - - if(breakflag == true){ - break; - } - } - - if(ifail != 0){ - System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); - } - - System.out.println(); - System.out.printf("Size of workplace = %d\n", lwk); - System.out.printf("Tolerance = %.4e\n", tol); - System.out.println(); - System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); - for(int i = 0; i < nmesh; i++){ - hi = (double) (i + 1) * h; - si = sol(hi); - System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); - } - } - - private static double sol(double t){ - return Math.log(t + Math.exp(1)); - } - - public static class ck extends D05BA.Abstract_D05BA_CK{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cf extends D05BA.Abstract_D05BA_CF{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cg extends D05BA.Abstract_D05BA_CG{ - public double eval(){ - return (this.Y + Math.exp(-this.Y)); - } - } -} - diff --git a/simple_examples/int32/D05BEJE.java b/simple_examples/int32/D05BEJE.java deleted file mode 100644 index f98bea3..0000000 --- a/simple_examples/int32/D05BEJE.java +++ /dev/null @@ -1,185 +0,0 @@ -import com.nag.routines.D05.D05BE; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BEJ example program text. - * @author willa - */ -public class D05BEJE{ - - private static final int iorder = 4; - private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); - private static final int nout = 6; - private static final int lct = nmesh / 32 + 1; - private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; - - public static void main(String[] args){ - double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; - int ifail; - double[] work, yn; - int[] nct; - - work = new double[lwk]; - yn = new double[nmesh]; - nct = new int[lct]; - - System.out.println("D05BEJ Example Program Results"); - - X02AJ x02aj = new X02AJ(); - tlim = 7; - tolnl = Math.sqrt(x02aj.eval()); - h = tlim /(double) (nmesh - 1); - yn[0] = 0; - - ifail = 0; - - D05BE d05be = new D05BE(); - ck1 k1 = new ck1(); - cf1 f1 = new cf1(); - cg1 g1 = new cg1(); - d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 1"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 1; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol1(hi1)); - - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 4) && (i % 5 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - System.out.println(); - - tlim = 5; - h = tlim /(double) (nmesh - 1); - yn[0] = 1; - - ifail = 0; - - ck2 k2 = new ck2(); - cf2 f2 = new cf2(); - cg2 g2 = new cg2(); - d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 2"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 0; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol2(hi1)); - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 6) && (i % 7 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - } - - private static double sol1(double t){ - double c, pi, t1, x = 0; - - //x is dummy variable - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + t; - c = 1 / Math.sqrt(2 * pi); - - return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); - } - - private static double sol2(double t){ - return (1 / (1 + t)); - } - - private static class ck1 extends D05BE.Abstract_D05BE_CK{ - public double eval(){ - return (Math.exp(-0.5 * this.T)); - } - } - - private static class ck2 extends D05BE.Abstract_D05BE_CK{ - double pi, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - return Math.sqrt(pi); - } - } - - private static class cf1 extends D05BE.Abstract_D05BE_CF{ - double a, pi, t1, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + this.T; - a = 1 / Math.sqrt(pi * this.T); - return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); - } - } - - private static class cf2 extends D05BE.Abstract_D05BE_CF{ - double st1; - - public double eval(){ - st1 = Math.sqrt(1 + this.T); - return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); - } - } - - private static class cg1 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } - - private static class cg2 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } -} diff --git a/simple_examples/int32/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java deleted file mode 100644 index a88b114..0000000 --- a/simple_examples/int32/DTFSMJE.java +++ /dev/null @@ -1,54 +0,0 @@ -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; - -/** - * DTFSM example program text. Adapted from f06wbfe.f90 - * @author joed - */ -public class DTFSMJE { - - public static void main(String[] args) { - - double alpha = 4.21; - int ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[m*m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - a[i*m+j] = (j >= i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[(m*(m+1))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/int32/E01DAJE.java b/simple_examples/int32/E01DAJE.java deleted file mode 100644 index 10c008f..0000000 --- a/simple_examples/int32/E01DAJE.java +++ /dev/null @@ -1,182 +0,0 @@ -import com.nag.routines.E01.E01DA; -import com.nag.routines.E02.E02DF; - -/** - * E01DA example program text. - */ -public class E01DAJE { - - public static void main(String[] args) { - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = e01da.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) { - if (i <= mx) { - System.out.printf("%4d %9.4f", i+1, lamda[i]); - } - else { - System.out.printf(" "); - } - if (i <= my) { - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - } - else { - System.out.printf("\n"); - } - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = e01da.getPX(); - py = e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px, 4*ny+py); - if (4*nx+px > 4*ny+py) { - liwrk = ny + py - 4; - } - else { - liwrk = nx + px - 4; - } - double[] tx = new double[nx]; - double[] ty = new double[ny]; - double[] ff = new double[nx*ny]; - wrk = new double[lwrk]; - int[] iwrk = new int[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i < nx-1; i++) { - tx[i] = tx[i-1] + step; - } - tx[nx-1] = xhi; - - step = (yhi-ylo)/(ny-1); - ty[0] = ylo; - for (int i = 1; i < ny-1; i++) { - ty[i] = ty[i-1] + step; - } - ty[ny-1] = yhi; - - /* Evaluate the spline. */ - E02DF e02df = new E02DF(); - ifail = 0; - e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); - - ifail = e02df.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); - System.out.printf(" "); - for (int i = 0; i < nx; ++i) { - System.out.printf(" %5.2f ", tx[i]); - } - System.out.printf("\n"); - for (int i = 0; i < ny; ++i) { - System.out.printf(" %5.2f ", ty[i]); - for (int j = 0; j < nx; ++j) { - System.out.printf(" %8.3f", ff[ny*j+i]); - } - System.out.printf("\n"); - } - break; - default: - System.out.printf("\n Error detected by E02DF: %d\n", ifail); - } - - } - -} diff --git a/simple_examples/int32/E02ALJE.java b/simple_examples/int32/E02ALJE.java deleted file mode 100644 index 372f125..0000000 --- a/simple_examples/int32/E02ALJE.java +++ /dev/null @@ -1,101 +0,0 @@ -import com.nag.routines.E02.E02AL; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E02ALJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E02ALJE{ - - /** - * E02ALJ Example main program - */ - public static void main(String[] args){ - double dxx, ref = 0, s, t, xx; - int ifail, n = 0, m = 0, neval = 0; //placeholders - double[] a, x, y; - - a = new double[0]; - x = new double[0]; - y = new double[0]; //placeholders - - System.out.println("E02ALJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - m = Integer.parseInt(sVal[2]); - neval = Integer.parseInt(sVal[3]); - - a = new double[m + 1]; - x = new double[n]; - y = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - y[i] = Double.parseDouble(sVal[2]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - ifail = 0; - E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); - e02al.eval(); - - //update - ref = e02al.getREF(); - x = e02al.getX(); - y = e02al.getY(); - - - System.out.println(); - System.out.printf(" Polynomial coefficients\n"); - for(int i = 0; i <= m; i++){ - System.out.printf("\t%.4e\n", a[i]); - } - System.out.println(); - System.out.printf(" Reference deviation = %.2e\n", ref); - System.out.println(); - System.out.printf("\tX\tFit\texp(x)\tResidual\n"); - - dxx = 1/(double)(neval - 1); - - for(int j = 0; j < neval; j++){ - xx = (double) j * dxx; - - s = a[m]; - - for(int i = m - 1; i >=0; i--){ - s = s * xx + a[i]; - } - - t = Math.exp(xx); - System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); - } - } -} - diff --git a/simple_examples/int32/E04ABJE.java b/simple_examples/int32/E04ABJE.java deleted file mode 100644 index 773f1ff..0000000 --- a/simple_examples/int32/E04ABJE.java +++ /dev/null @@ -1,76 +0,0 @@ -import com.nag.routines.E04.E04AB; - -/** - * E04ABJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04ABJE{ - - /** - * E04ABJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04ABJ Example Program Results"); - - //e1 and e2 are set to zero so that E04ABA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); - e04ab.eval(); - - //update - ifail = e04ab.getIFAIL(); - a = e04ab.getA(); - b = e04ab.getB(); - x = e04ab.getX(); - f = e04ab.getF(); - maxcal = e04ab.getMAXCAL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04AB.Abstract_E04AB_FUNCT{ - public void eval(){ - FC = Math.sin(this.XC) / this.XC; - } - } -} diff --git a/simple_examples/int32/E04BBJE.java b/simple_examples/int32/E04BBJE.java deleted file mode 100644 index d7032f5..0000000 --- a/simple_examples/int32/E04BBJE.java +++ /dev/null @@ -1,81 +0,0 @@ -import com.nag.routines.E04.E04BB; - -/** - * E04BBJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04BBJE{ - - /** - * E04BBJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04BBJ Example Program Results"); - - //e1 and e2 are set to zero so that E04BBA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); - e04bb.eval(); - - //update - a = e04bb.getA(); - b = e04bb.getB(); - maxcal = e04bb.getMAXCAL(); - x = e04bb.getX(); - f = e04bb.getF(); - g = e04bb.getG(); - ifail = e04bb.getIFAIL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04BB.Abstract_E04BB_FUNCT{ - public void eval(){ - this.FC = Math.sin(this.XC) / this.XC; - this.GC = (Math.cos(this.XC) - this.FC)/this.XC; - } - } -} - diff --git a/simple_examples/int32/E04CBJE.java b/simple_examples/int32/E04CBJE.java deleted file mode 100644 index fbde674..0000000 --- a/simple_examples/int32/E04CBJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.E04.E04CB; -import com.nag.routines.E04.E04CBK; -import com.nag.routines.X02.X02AJ; - -/** - * E04CBJ Example Program text - * @author willa - * @since 27.1.0.0 - */ -public class E04CBJE{ - - /** - * E04CBJE main program - */ - public static void main(String[] args){ - int n = 2, ifail, maxcal; - double f = 0, tolf, tolx; //placeholders - boolean monitoring; - int[] iuser; - double[] ruser, x; - - iuser = new int[1]; - ruser = new double[1]; - x = new double[n]; - - System.out.println("E04CBJ Example Program Results"); - - //Set monitoring to true to obtain monitoring information - monitoring = false; - - x[0] = -1.0; - x[1] = 1.0; - X02AJ x02aj = new X02AJ(); - tolf = Math.sqrt(x02aj.eval()); - tolx = Math.sqrt(tolf); - maxcal = 100; - - ifail = 0; - - funct funct1 = new funct(); - if(!monitoring){ - defMonit monit = new defMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - else{ - myMonit monit = new myMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - - System.out.println(); - System.out.printf("The final function value is \t%.4f\n", f); - System.out.printf("at the point\t"); - for(int i = 0; i < n; i++){ - System.out.printf("%.4f\t", x[i]); - } - System.out.printf("\n"); - } - - public static class funct extends E04CB.Abstract_E04CB_FUNCT{ - public void eval(){ - this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); - } - } - - public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ - public void eval(){ - System.out.println(); - System.out.printf("There have been %d function calls\n", this.NCALL); - System.out.printf("The smallest function value is %.4f\n", this.FMIN); - System.out.printf("The simplex is\n"); - for(int i = 0; i <= this.N; i++){ - for(int j = 0; j < this.N; j++){ - System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); - } - System.out.printf("\n"); - } - System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); - System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); - } - } - - //This is how to use NAG supplied function as argument - public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ - public void eval(){ - super.eval(); - } - } -} diff --git a/simple_examples/int32/E04FCJE.java b/simple_examples/int32/E04FCJE.java deleted file mode 100644 index 939f68d..0000000 --- a/simple_examples/int32/E04FCJE.java +++ /dev/null @@ -1,420 +0,0 @@ -import com.nag.routines.E04.E04FC; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04FC example program text. - * @author ludovic - */ -public class E04FCJE { - - public static void main(String[] args) { - - BufferedReader dataIn = null; - - try { - E04FC e04fc = new E04FC(); - System.out.println(" E04FCJ Example Program Results"); - dataIn = new BufferedReader(new FileReader(args[0])); - //skip header - dataIn.readLine(); - - int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, - lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; - String trans = "T"; - - double eta, fsumsq, stepmx, xtol; - eta = fsumsq = stepmx = xtol = Double.NaN; - int ifail, iprint, maxcal, nf, niter; - ifail = iprint = maxcal = nf = niter = 0; - double[] fjac = new double[m * n], - fvec = new double[m], - g = new double[n], - s = new double[n], - v = new double[ldv * n], - w = new double[lw], - x = new double[n], - y = new double[m], - t = new double[m * nt]; - - - int[] iw = new int[liw]; - - for (int i = 0; i < m; ++i) { - String[] line = dataIn.readLine().trim().split("\\s+"); - if (line.length != nt + 1) { - System.err.println("Error in data file - only " + line.length - + " records at line " + (i + 2) + " while expecting " + (nt + 1) - + " elements"); - System.exit(1); - } - y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format - for (int j = 1; j <= nt; ++j) { - t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); - } - } - - // Set IPRINT to 1 to obtain output from LSQMON at each iteration - iprint = -1; - - maxcal = 400 * n; - eta = 0.5; - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - - // We estimate that the minimum will be within 10 units of the starting point - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - - LSQFUN lsqfun = new LSQFUN(); - lsqfun.t = t; - lsqfun.y = y; - LSQMON lsqmon = new LSQMON(); - - e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, - fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); - - ifail = e04fc.getIFAIL(); - - - switch (ifail) { - case (1): - System.err.println("Unexpected ifail = " + ifail); - break; - default: - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); - System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); - lsqgrd(m, n, fvec, fjac, ldfjac, g); - System.out.print(" The estimated gradient is "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.3e\t", g[i]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int i = 0; i < m; ++i) { - System.out.printf(" %9.1e\n", fvec[i]); - } - } - - - - } - catch (Exception ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - finally { - try { - dataIn.close(); - } - catch (IOException ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - } - - - } - - public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); - dgemv.eval(); - for (int i = 0; i < g.length; ++i) { - g[i] = 2.0 * g[i]; - } - } - - public static class LSQFUN implements E04FC.E04FC_LSQFUN { - - public double[] t, y; - int IFLAG, M, N, LW, LIW; - double[] XC, FVEC, W; - int[] IW; - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, - int[] IW, int LIW, double[] W, int LW) { - for (int i = 0; i < M; ++i) { - FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; - } - } - - } - - public static class LSQMON implements E04FC.E04FC_LSQMON { - - int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; - int[] IW; - double[] XC, FVEC, FJAC, S, W; - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setFJAC(double[] FJAC) { - this.FJAC = FJAC; - } - - @Override - public double[] getFJAC() { - return FJAC; - } - - @Override - public void setLDFJAC(int LDFJAC) { - this.LDFJAC = LDFJAC; - } - - @Override - public int getLDFJAC() { - return LDFJAC; - } - - @Override - public void setS(double[] S) { - this.S = S; - } - - @Override - public double[] getS() { - return S; - } - - @Override - public void setIGRADE(int IGRADE) { - this.IGRADE = IGRADE; - } - - @Override - public int getIGRADE() { - return IGRADE; - } - - @Override - public void setNITER(int NITER) { - this.NITER = NITER; - } - - @Override - public int getNITER() { - return NITER; - } - - @Override - public void setNF(int NF) { - this.NF = NF; - } - - @Override - public int getNF() { - return NF; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, - int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, - int LIW, double[] W, int LW) { - - int ndec = 3; - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); - fsumsq = ddot.eval(); - - lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); - - gtg = ddot.eval(N, g, 1, g, 1); - // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", - NITER, NF, fsumsq, gtg, IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < N; ++j) { - System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); - } - - } - - } - -} diff --git a/simple_examples/int32/E04FFJE.java b/simple_examples/int32/E04FFJE.java deleted file mode 100644 index ad81e32..0000000 --- a/simple_examples/int32/E04FFJE.java +++ /dev/null @@ -1,140 +0,0 @@ -import com.nag.routines.E04.E04FF; -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.util.Arrays; - -/** - * E04FF example program text. - * @author joed - */ -public class E04FFJE { - - public static void main(String[] args) { - double infbnd = 1.0e20; - double[] lx, rx, ux, x, ruser, pdy, pdz; - double[] rinfo = new double[100], stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; - int[] iuser; - int[] icolrd = new int[1], irowrd = new int[1]; - long cpuser, handle; // c_ptr - MONIT monit = new MONIT(); - OBJFUN objfun = new OBJFUN(); - - /* Header */ - System.out.printf(" E04FFJ Example Program Results\n\n"); - - /* Fill problem data structure */ - pdny = 11; - pdnz = 11; - pdy = new double[] { - 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, - 8.33e-2, 7.14e-2, 6.25e-2 - }; - pdz = new double[] { - 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, - 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 - }; - nvar = 4; - nres = 11; - - /* Initialize handle */ - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define residuals structure */ - E04RM e04rm = new E04RM(); - isparse = 0; // Dense => irowrd and icolrd are not accessed - nnzrd = 1; - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set options */ - E04ZM e04zm = new E04ZM(); - ifail = 0; - e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - - /* Define starting point */ - x = new double[] {0.25, 0.39, 0.415, 0.39}; - rx = new double[nres]; - - /* Define bounds for the second and the fourth variable */ - E04RH e04rh = new E04RH(); - lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; - ux = new double[] {infbnd, 1.0, infbnd, infbnd}; - ifail = 0; - e04rh.eval(handle, nvar, lx, ux, ifail); - - /* Call the solver */ - E04FF e04ff = new E04FF(); - ifail = -1; - iuser = new int[] {pdny, pdnz}; - ruser = new double[2 * nres]; - cpuser = 0L; - for (int i = 0; i < nres; i++) { - ruser[i] = pdy[i]; - ruser[nres + i] = pdz[i]; - } - e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, - iuser, ruser, cpuser, ifail); - - /* Free handle memory */ - E04RZ e04rz = new E04RZ(); - ifail = 0; - e04rz.eval(handle, ifail); - - } - - public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { - - public void eval() { - int pdny, pdnz; - double r1, r2; - double[] pdy, pdz; - - /* Interrupt solver if the dimensions are incorrect */ - if (this.NRES != 11 || this.NVAR != 4) { - this.INFORM = -1; - return; - } - - /* Extract the problem data structure from the workspaces */ - pdny = this.IUSER[0]; - pdnz = this.IUSER[1]; - if (pdny != this.NRES || pdnz != this.NRES) { - this.INFORM = -1; - return; - } - pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); - pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); - - for (int i = 0; i < this.NRES; i++) { - r1 = pdy[i] * (pdy[i] + this.X[1]); - r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; - this.RX[i] = pdz[i] - (this.X[0] * r1/r2); - } - - } - - } - - public static class MONIT extends E04FF.Abstract_E04FF_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04GBJE.java b/simple_examples/int32/E04GBJE.java deleted file mode 100644 index 7becf21..0000000 --- a/simple_examples/int32/E04GBJE.java +++ /dev/null @@ -1,183 +0,0 @@ -import com.nag.routines.A00.A00AA; -import com.nag.routines.E04.E04GB; -import com.nag.routines.E04.E04HEV; -import com.nag.routines.E04.E04YA; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.F06PA; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04GB example program text. - */ -public class E04GBJE { - - public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; - public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; - public static final String trans = "T"; - public static double[] y; - public static double[] t; - - public static void main(String[] args) { - - double eta, fsumq = 0.0, stepmx, xtol; - int ifail, iprint, maxcal, nf = 0, niter = 0; - double[] fjac = new double[ldfjac * n]; - double[] fvec = new double[m]; - double[] g = new double[n]; - double[] s = new double[n]; - double[] v = new double[ldv * n]; - double[] w = new double[lw * n]; - double[] x = new double[n]; - int[] iw = new int[liw]; - - System.out.println(" E04GBJ Example Program Results"); - - // Data - y = new double[] { - 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, - 0.96, 1.34, 2.10, 4.39 - }; - - t = new double[m * nt]; - for (int i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - // Check LSQFUN by calling E04YA at an arbitrary point - E04YA e04ya = new E04YA(); - LSQFUN lsqfun = new LSQFUN(); - x[0] = 0.19; - x[1] = -.34; - x[2] = 0.88; - ifail = 0; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); - - // Continue setting parameters for E04GB - E04GB e04gb = new E04GB(); - LSQMON lsqmon = new LSQMON(); - LSQLIN lsqlin = new LSQLIN(); - iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration - maxcal = 50 * n; - eta = 0.09; // Since E04HEV is being used as LSQLIN - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, - stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, - liw, w, lw, ifail); - fsumq = e04gb.getFSUMSQ(); - x = e04gb.getX(); - ifail = e04gb.getIFAIL(); - - if (ifail == 0 || ifail >= 2) { - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); - System.out.printf(" at the point "); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.4f", x[ii]); - } - System.out.println(); - - lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); - - System.out.print(" The corresponding gradient is"); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.3E", g[ii]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int ii = 0; ii < m; ++ii) { - System.out.printf(" %9.1E\n", fvec[ii]); - } - System.out.println(); - } - - } - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - - for (int i = 0; i < m; i++) { - denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; - this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; - - if (this.IFLAG != 0) { - this.FJAC[i] = 1.0; - dummy = -1.0 / (denom * denom); - this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; - this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; - } - } - - } - - } - - public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { - - public static final int ndec = 3; - - /** Monitoring routine. */ - public void eval() { - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(); - - fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); - this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); - gtg = ddot.eval(this.N, g, inc1, g, inc1); - - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", - this.NITER, this.NF, fsumsq, gtg, this.IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < n; j++) { - System.out.printf(" %13.5E %9.1E %9.1E\n", - this.XC[j], g[j], this.S[j]); - } - - } - - /** Routine to evaluate gradient of the sum of squares. */ - public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); - f06pa.eval(); - - for (int i = 0; i < n; ++i) { - g[i] = 2.0 * g[i]; - } - - } - - } - - /** Using E04HEV as LSQLIN. */ - private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { - - public void eval() { - super.eval(); - } - - } - -} diff --git a/simple_examples/int32/E04GGJE.java b/simple_examples/int32/E04GGJE.java deleted file mode 100644 index 8a18c6a..0000000 --- a/simple_examples/int32/E04GGJE.java +++ /dev/null @@ -1,219 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RX; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; - -/** - * E04GG example program text. - */ -public class E04GGJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser = 0, handle = 0; - int ifail, isparse, nnzrd, nres, nvar; - - double[] blx, bux, ruser, rx, x, z; - double[] rinfo = new double[100], stats = new double[100]; - int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; - - /* Header */ - System.out.println(" E04GGJ Example Program Results\n"); - - nvar = 6; - nres = 24; - // ruser = new double[2*nres]; - // Data from Lanczos 3 Problem - ruser = new double[] { - // t(:) = - 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, - 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, - 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, - // y(:) = - 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, - 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, - 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 - }; - - iuser[0] = 0; - - // Initialize handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define residuals structure, isparse=0 means the residual structure is - // dense => irowrd and icolrd are not accessed - isparse = 0; - nnzrd = 0; - E04RM e04rm = new E04RM(); - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); - e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); - e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); - // Change printed output verbosity - e04zm.eval(handle, "Print Level = 1",ifail); - - // Define starting point - rx = new double[nres]; - z = new double[nvar]; - // x = new double[nvar]; - x = new double[] { - 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 - }; - - // Define bounds - blx = new double[nvar]; - bux = new double[nvar]; - blx[0] = 0.0; - bux[0] = 1.0; - blx[1] = -1.0; - bux[1] = infbnd; - blx[2] = -1.0; - bux[2] = infbnd; - blx[3] = -1.0; - bux[3] = infbnd; - blx[4] = -1.0; - bux[4] = 1.0; - blx[5] = -1.0; - bux[5] = 10.0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, blx, bux, ifail); - - // Call the solver - ifail = -1; - E04GG e04gg = new E04GG(); - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); - ifail = e04gg.getIFAIL(); - - // Recover latest iterate from handle if available - if (ifail == 0) { - ifail = -1; - E04RX e04rx = new E04RX(); - e04rx.eval(handle,"X",1,nvar,z,ifail); - ifail = e04rx.getIFAIL(); - if (ifail == 0) { - System.out.println("\nSolver stored solution iterate in the handle"); - System.out.print("X: "); - for (int i = 0; i < nvar; i++){ - System.out.printf("%8.2E ", z[i]); - } - System.out.println(); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - - this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int i; - - for (i = 0; i < this.RDX.length; i++) { - this.RDX[i] = 0; - } - - for (i = 0; i < this.NRES; i++) { - this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); - this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - for (int i = 0; i < this.NVAR * this.NVAR; i++) { - this.HX[i] = 0.0; - } - - double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; - - for (int i = 0; i < this.NRES; i++){ - sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); - sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); - sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); - sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); - sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); - sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); - } - - this.HX[(2-1) + (1-1) * this.NVAR] = sum21; - this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; - this.HX[(2-1) + (2-1) * this.NVAR] = sum22; - this.HX[(4-1) + (3-1) * this.NVAR] = sum43; - this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; - this.HX[(4-1) + (4-1) * this.NVAR] = sum44; - this.HX[(6-1) + (5-1) * this.NVAR] = sum65; - this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; - this.HX[(6-1) + (6-1) * this.NVAR] = sum66; - - this.INFORM = 0; - } - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - } - -} diff --git a/simple_examples/int32/E04MTJE.java b/simple_examples/int32/E04MTJE.java deleted file mode 100644 index 6272e91..0000000 --- a/simple_examples/int32/E04MTJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RF; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04MT example program text. - */ -public class E04MTJE { - - public static void main(String[] args) throws IOException { - - System.out.println(" E04MTJ Example Program Results"); - int m = 7; - int n = 7; - int nnza = 41; - int nnzc = 7; - int nnzu = 2*n + 2*m; - - int[] cindex = {1,2,3,4,5,6,7}; - double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; - int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, - 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; - int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, - 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; - double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, - 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, - 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, - 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, - 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, - 0.12, 0.02, 0.01, 0.97}; - double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, - -0.0992,-0.003}; - double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, - 1.0e20, 0.002}; - double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; - double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; - double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; - - long handle = 0; - int ifail = 0; - E04RA e04ra = new E04RA(handle,n,ifail); - e04ra.eval(); - - handle = e04ra.getHANDLE(); - - int[] icolh = new int[1]; - int[] irowh = new int[1]; - double[] h = new double[1]; - E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); - e04rf.eval(); - handle = e04ra.getHANDLE(); - - E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); - e04rh.eval(); - handle = e04rh.getHANDLE(); - - int idlc = 0; - E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); - e04rj.eval(); - handle = e04rj.getHANDLE(); - - E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); - e04zm.eval(); - e04zm.setOPTSTR("Print Solution = YES"); - e04zm.eval(); - e04zm.setOPTSTR("Print Options = NO"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); - e04zm.eval(); - handle = e04zm.getHANDLE(); - - long cpuser = 2; - int[] iuser = {1}; - double[] ruser = new double[1]; - ifail = -1; - MONIT monit = new MONIT(); - double[] x = new double[n], u = new double[nnzu]; - double[] rinfo = new double[100], stats = new double[100]; - System.out.println(); - System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); - E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, - monit,iuser,ruser,cpuser,ifail); - e04mt.eval(); - System.out.println(); - System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); - e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); - e04zm.eval(); - iuser[0] = 2; - e04mt.setIFAIL(-1); - e04mt.setHANDLE(e04zm.getHANDLE()); - e04mt.setIUSER(iuser); - e04mt.eval(); - - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - - double tol = 1.2e-8; - - if (IUSER[0] == 1) { - if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - else { - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - - } - - } - -} diff --git a/simple_examples/int32/E04MXJE.java b/simple_examples/int32/E04MXJE.java deleted file mode 100644 index 642a933..0000000 --- a/simple_examples/int32/E04MXJE.java +++ /dev/null @@ -1,292 +0,0 @@ -import com.nag.routines.E04.E04MX; -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NS; -import com.nag.routines.E04.E04NT; -import com.nag.routines.X04.X04AC; -import com.nag.routines.X04.X04AD; -import java.util.Arrays; - -/** - * E04MX example program text. - */ -public class E04MXJE { - - public static void main(String[] args) { - - /* Parameters */ - int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; - boolean readints = false; - String fname = args[0]; - /* Local Scalars */ - double obj, objadd, sinf; - int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, - maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; - boolean verboseOutput; - String start; - /* Local Arrays */ - double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; - int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; - String[] crname, cw; - String[] cuser = new String[1], pnames = new String[5]; - cuser[0] = " "; - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - - System.out.println(" E04MXJ Example Program Results"); - - // Initialize - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - maxm = 0; - maxn = 0; - maxnnz = 0; - maxnnzh = 0; - maxncolh = 0; - maxlintvar = 0; - - // Open the data file for reading - X04AC x04ac = new X04AC(); - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Prep call to E04MX in query mode - E04MX e04mx = new E04MX(); - a = new double[1]; - irowa = new int[1]; - iccola = new int[1]; - bl = new double[1]; - bu = new double[1]; - crname = new String[]{" "}; - h = new double[1]; - irowh = new int[1]; - iccolh = new int[1]; - intvar = new int[1]; - ifail = 0; - - // Placeholders for output only scalars - n = 0; - m = 0; - nnz = 0; - ncolh = 0; - nnzh = 0; - lintvar = 0; - iobj = 0; - nname = 0; - minmax = 0; - - // Make call to E04MX - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - - // Get output scalar values - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close file - X04AD x04ad = new X04AD(); - ifail = 0; - x04ad.eval(nin, ifail); - - // Set maxm, maxn and maxnnz - maxm = m; - maxn = n; - maxnnz = nnz; - maxnnzh = nnzh; - maxncolh = ncolh; - maxlintvar = (readints) ? lintvar : 1; - - // Allocate memory - irowa = new int[maxnnz]; - iccola = new int[maxn + 1]; - a = new double[maxnnz]; - bl = new double[maxn + maxm]; - bu = new double[maxn + maxm]; - crname = new String[maxn + maxm]; - for (int j = 0; j < (maxn + maxm); j++) { - crname[j] = " "; - } - irowh = new int[maxnnzh]; - iccolh = new int[maxncolh + 1]; - h = new double[maxnnzh]; - intvar = new int[maxlintvar]; - - // Open the data file for reading - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Call E04MX to read the problem - ifail = 0; - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close the data file - ifail = 0; - x04ad.eval(nin, ifail); - - /* Data has been read. Set up and run the solver */ - - iw = new int[leniw]; - rw = new double[lenrw]; - cw = new String[lencw]; - for (int j = 0; j < lencw; j++) { - cw[j] = " "; - } - - // Call E04NP to initialize workspace - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); - - // Call option setter E04NS to change the direction of optimization. - // Minimization is assumed by default. - E04NS e04ns = new E04NS(); - if (minmax == 1) { - ifail = 0; - e04ns.eval("Maximize", cw, iw, rw, ifail); - } - else if (minmax == 0) { - ifail = 0; - e04ns.eval("Feasible Point", cw, iw, rw, ifail); - } - - // Set this to TRUE to cause E04NQ to produce intermediate progress output - verboseOutput = false; - - if (verboseOutput) { - // By default E04NQ does not print monitoring information. Set the print - // file unit or the summary file unit to get information. - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", nout, cw, iw, rw, ifail); - } - else { - System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); - } - - // We have no explicit objective vector so set LENC = 0; the objective vector - // is stored in row IOBJ of ACOL. - lenc = 0; - objadd = 0.0; - start = "C"; - - c = new double[Math.max(1, lenc)]; - helast = new int[n + m]; - x = new double[n + m]; - pi = new double[m]; - rc = new double[n + m]; - hs = new int[n + m]; - iuser = new int[ncolh + 1 + nnzh]; - ruser = new double[nnzh]; - - if (ncolh > 0) { - // Store the non zeros of H in ruser for use by qphx - for (int j = 0; j < nnzh; j++) { - ruser[j] = h[j]; - } - // Store iccolh and irowh in iuser for use by qphx - for (int j = 0; j < ncolh + 1; j++) { - iuser[j] = iccolh[j]; - } - for (int j = 0; j < nnzh; j++) { - iuser[j + ncolh + 1] = irowh[j]; - } - - } - - // Call E04NQ to solve the problem - E04NQ e04nq = new E04NQ(); - QPHX qphx = new QPHX(); - ns = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - ifail = 0; - e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, - pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, - x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, - lenrw,cuser,iuser,ruser,ifail); - ns = e04nq.getNS(); - ninf = e04nq.getNINF(); - sinf = e04nq.getSINF(); - obj = e04nq.getOBJ(); - ifail = e04nq.getIFAIL(); - - if (!verboseOutput) { - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n", obj); - System.out.printf(" Optimal X = \n"); - System.out.printf(" "); - for (int j = 0; j < n; j++) { - System.out.printf("%9.2f", x[j]); - } - System.out.printf("\n"); - } - - } - - public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { - - /** - * Subroutine to compute H*x. - * Note: IUSER and RUSER contain the following data: - * RUSER(1:NNZH) = H(1:NNZH) - * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) - * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) - */ - public void eval() { - /* Local Scalars */ - int end, icol, idx, irow, start; - - Arrays.fill(HX, 0.0); - - for (icol = 0; icol < this.NCOLH + 1; ++icol) { - - start = this.IUSER[icol] - 1; - end = IUSER[icol+1] - 2; - - for (idx = start; idx < end + 1; ++idx) { - - irow = this.IUSER[this.NCOLH + 1 + idx] - 1; - this.HX[irow] += this.X[icol] * this.RUSER[idx]; - - if (irow != icol) { - this.HX[icol] += this.X[irow] * this.RUSER[idx]; - } - - } - - } - - } - - } - - -} diff --git a/simple_examples/int32/E04NCJE.java b/simple_examples/int32/E04NCJE.java deleted file mode 100644 index d6c3010..0000000 --- a/simple_examples/int32/E04NCJE.java +++ /dev/null @@ -1,246 +0,0 @@ -import static java.lang.Math.max; - -import com.nag.routines.E04.E04NC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NC example program text. - * @author ludovic - */ -public class E04NCJE { - - public static void main(String[] args) { - - double one = 1.0; - double zero = 0.0; - int inc1 = 1, lcwsav = 1, liwsav = 610, - llwsav = 120, lrwsav = 475, nin = 5, - nout = 6; - double obj; - int i, ifail, iter, lda, ldc, liwork, - lwork, m, n, nclin, sdc; - double[] a, b, bl, bu, c, - clamda, cvec, work, x; - double[] rwsav = new double[lrwsav]; - int[] istate, iwork, kx; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - String[] cwsav = new String[lcwsav]; - - System.out.println(" E04NCJ Example Program Results"); - try { - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - m = Integer.parseInt(data[0]); - n = Integer.parseInt(data[1]); - nclin = Integer.parseInt(data[2]); - - liwork = n; - ldc = max(1,nclin); - lda = max(1,m); - - if (nclin > 0) { - sdc = n; - } - else { - sdc = 1; - } - - /* This particular example problem is of type LS1, so we allocate - * A(LDA,N), CVEC(1), B(M) and define LWORK as below - */ - if (nclin > 0) { - lwork = 2*n*n + 9*n + 6*nclin; - } - else { - lwork = 9*n; - } - - /* - * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column - * ie: - * 1 1 1 - * 2 2 2 - * 3 3 3 - * - * is stored [1,2,3,1,2,3,1,2,3] - */ - istate = new int[n+nclin]; - kx = new int[n]; - iwork = new int[liwork]; - c = new double[ldc*sdc]; - bl = new double[n+nclin]; - bu = new double[n+nclin]; - cvec = new double[1]; - x = new double[n]; - a = new double[lda * n]; - b = new double[m]; - clamda = new double[n+nclin]; - work = new double[lwork]; - - /* - * Extra arrays to initialize: - */ - for (int ii = 0; ii < cwsav.length; ++ii) { - // 80 characters long... - cwsav[ii] - = " "; - } - - for (int ii = 0; ii < lda; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < n; ++jj) { - a[lda*jj+ii] = Double.parseDouble(data[jj]); - } - } - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - - for (int ii = 0; ii < m; ++ii) { - b[ii] = Double.parseDouble(data[ii]); - } - - for (int ii = 0; ii < ldc; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < sdc; ++jj) { - c[ldc*jj+ii] = Double.parseDouble(data[jj]); - } - } - - //bl and bu to complicated to read properly -> hardcoded - line = br.readLine(); - line = br.readLine(); - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = -1.0E+25; - bl[3] = 0.0; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 0.0; - bl[8] = 0.0; - bl[9] = 2.0; - bl[10] = -1.0E+25; - bl[11] = 1.0; - - line = br.readLine(); - line = br.readLine(); - bu[0] = 2.0; - bu[1] = 2.0; - bu[2] = 2.0; - bu[3] = 2.0; - bu[4] = 2.0; - bu[5] = 2.0; - bu[6] = 2.0; - bu[7] = 2.0; - bu[8] = 2.0; - bu[9] = 1.0E+25; - bu[10] = 2.0; - bu[11] = 4.0; - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int ii = 0; ii < n; ++ii) { - x[ii] = Double.parseDouble(data[ii]); - } - - // CALL TO E04WBF - ifail = 0; - String routname = "E04NCA"; - E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, - lrwsav, ifail); - e04wb.eval(); - cwsav = e04wb.getCWSAV(); - iwsav = e04wb.getIWSAV(); - lwsav = e04wb.getLWSAV(); - rwsav = e04wb.getRWSAV(); - - // CALL TO E04NCF - ifail = -1; - - /* Java needs these to be initialized, so set it to an impossible value - * to trap possible error later */ - iter = Integer.MIN_VALUE; - obj = Double.NaN; - - E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, - clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); - e04nc.eval(); - - // Getting ifail's value back - ifail = e04nc.getIFAIL(); - - switch (ifail) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 7: - System.out.println("\n Varbl Istate Value Lagr Mult\n"); - - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println("\n\n L Con Istate Value Lagr Mult\n"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); - break; - default: - if (ifail > 7) { - System.out.println(" Varbl Istate Value Lagr Mult"); - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println(" L Con Istate Value Lagr Mult"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); - } - else { - System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); - } - } - } - catch (Exception ex) { - Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - -} diff --git a/simple_examples/int32/E04NFJE.java b/simple_examples/int32/E04NFJE.java deleted file mode 100644 index e341f9f..0000000 --- a/simple_examples/int32/E04NFJE.java +++ /dev/null @@ -1,234 +0,0 @@ -import com.nag.routines.E04.E04NF; -import com.nag.routines.E04.E04NH; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E54NFU; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NF example program text. - */ -public class E04NFJE { - - public static void main(String[] args) { - - /* Local Scalars */ - double obj; - int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; - /* Local Arrays */ - double[] a, ax, bl, bu, clamda, cvec, h, work, x; - int[] istate, iwork; - - try { - - System.out.println(" E04NFJ Example Program Results"); - - if (args.length == 0) { - System.err.println("You need to provide the path to the data file e04nfae.d"); - System.exit(-1); - } - - // Read data from file - DataFile datafile = new DataFile(args[0]); - datafile.read(); - - liwork = 2 * datafile.n + 3; - lda = Math.max(1, datafile.nclin); - - sda = (datafile.nclin > 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new int[datafile.n + datafile.nclin]; - ax = new double[Math.max(1, datafile.nclin)]; - iwork = new int[liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[datafile.n + datafile.nclin]; - work = new double[lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[lcwsav]; - cwsav[0] - = " "; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - double[] rwsav = new double[lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - int[] iuser = new int[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } - catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default. */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - super.eval(); - } - - } - - public static class DataFile { - - public String filename; - public int n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file" - + " - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } - else { - sda = 1; - } - ldh = n; - - cvec = new double[n]; - a = new double[lda * sda]; - bl = new double[n + nclin]; - bu = new double[n + nclin]; - x = new double[n]; - h = new double[ldh * n]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/int32/E04NKJE.java b/simple_examples/int32/E04NKJE.java deleted file mode 100644 index 604ee66..0000000 --- a/simple_examples/int32/E04NKJE.java +++ /dev/null @@ -1,295 +0,0 @@ -import com.nag.routines.E04.E04NK; -import com.nag.routines.E04.E04WB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NKJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class E04NKJE{ - private static int lcwsav = 1; - private static int liwsav = 380; - private static int llwsav = 20; - private static int lrwsav = 285; - - /** - * E04NKJ Example main program. - */ - public static void main(String[] args){ - double obj, sinf; - int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; - String start; - double[] a, bl, bu, clamda, xs, z, ruser, rwsav; - int[] ha, istate, iz, ka, iuser, iwsav; - boolean[] lwsav; - String[] crname, cwsav, names; - - System.out.println("E04NKJ Example Program Results"); - - ruser = new double[1]; - rwsav = new double[lrwsav]; - iuser = new int[1]; - iwsav = new int[liwsav]; - - cwsav = new String[lcwsav]; - //equivalent to ```Character (80) :: cwsav(lcwsav)``` - for(i = 0; i < lcwsav; i++){ - char[] chars = new char[80]; - Arrays.fill(chars, ' '); - cwsav[i] = new String(chars); - } - names = new String[5]; - //names all blank anyway this time - for(i = 0; i < 5; i++){ - char[] chars = new char[8]; - Arrays.fill(chars, ' '); - names[i] = new String(chars); - } - - //dummy arrays - crname = new String[0]; - - n = 7; - m = 8; - nnz = 48; - iobj = 8; - ncolh = 7; - start = "C"; - nname = 15; - - ha = new int[nnz]; - ka = new int[n + 1]; - istate = new int[n + m]; - a = new double[nnz]; - bl = new double[n + m]; - bu = new double[n + m]; - xs = new double[n + m]; - clamda = new double[n + m]; - crname = new String[nname]; - lwsav = new boolean[llwsav]; - - names[0] = " "; - names[1] = " "; - names[2] = " "; - names[3] = " "; - names[4] = " "; - - crname[0] = "...X1..."; - crname[1] = "...X2..."; - crname[2] = "...X3..."; - crname[3] = "...X4..."; - crname[4] = "...X5..."; - crname[5] = "...X6..."; - crname[6] = "...X7..."; - crname[7] = "..ROW1.."; - crname[8] = "..ROW2.."; - crname[9] = "..ROW3.."; - crname[10] = "..ROW4.."; - crname[11] = "..ROW5.."; - crname[12] = "..ROW6.."; - crname[13] = "..ROW7.."; - crname[14] = "..COST.."; - - //Matrix A. Set up KA - jcol = 1; - ka[0] = 1; - - a[0] = 0.02; ha[0] = 7; - a[1] = 0.02; ha[1] = 5; - a[2] = 0.03; ha[2] = 3; - a[3] = 1.00; ha[3] = 1; - a[4] = 0.70; ha[4] = 6; - a[5] = 0.02; ha[5] = 4; - a[6] = 0.15; ha[6] = 2; - a[7] = -200.00; ha[7] = 8; - a[8] = 0.06; ha[8] = 7; - a[9] = 0.75; ha[9] = 6; - a[10] = 0.03; ha[10] = 5; - a[11] = 0.04; ha[11] = 4; - a[12] = 0.05; ha[12] = 3; - a[13] = 0.04; ha[13] = 2; - a[14] = 1.00; ha[14] = 1; - a[15] = -2000.00; ha[15] = 8; - a[16] = 0.02; ha[16] = 2; - a[17] = 1.00; ha[17] = 1; - a[18] = 0.01; ha[18] = 4; - a[19] = 0.08; ha[19] = 3; - a[20] = 0.08; ha[20] = 7; - a[21] = 0.80; ha[21] = 6; - a[22] = -2000.00; ha[22] = 8; - a[23] = 1.00; ha[23] = 1; - a[24] = 0.12; ha[24] = 7; - a[25] = 0.02; ha[25] = 3; - a[26] = 0.02; ha[26] = 4; - a[27] = 0.75; ha[27] = 6; - a[28] = 0.04; ha[28] = 2; - a[29] = -2000.00; ha[29] = 8; - a[30] = 0.01; ha[30] = 5; - a[31] = 0.80; ha[31] = 6; - a[32] = 0.02; ha[32] = 7; - a[33] = 1.00; ha[33] = 1; - a[34] = 0.02; ha[34] = 2; - a[35] = 0.06; ha[35] = 3; - a[36] = 0.02; ha[36] = 4; - a[37] = -2000.00; ha[37] = 8; - a[38] = 1.00; ha[38] = 1; - a[39] = 0.01; ha[39] = 2; - a[40] = 0.01; ha[40] = 3; - a[41] = 0.97; ha[41] = 6; - a[42] = 0.01; ha[42] = 7; - a[43] = 400.00; ha[43] = 8; - a[44] = 0.97; ha[44] = 7; - a[45] = 0.03; ha[45] = 2; - a[46] = 1.00; ha[46] = 1; - a[47] = 400.00; ha[47] = 8; - - ka[1] = 9; - ka[2] = 17; - ka[3] = 24; - ka[4] = 31; - ka[5] = 39; - ka[6] = 45; - ka[7] = 49; - - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = 4.0e2; - bl[3] = 1.0e2; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 2.0e3; - bl[8] = -1.0e25; - bl[9] = -1.0e25; - bl[10] = -1.0e25; - bl[11] = -1.0e25; - bl[12] = 1.5e3; - bl[13] = 2.5e2; - bl[14] = -1.0e25; - - bu[0] = 2.0e2; - bu[1] = 2.5e3; - bu[2] = 8.0e2; - bu[3] = 7.0e2; - bu[4] = 1.5e3; - bu[5] = 1.0e25; - bu[6] = 1.0e25; - bu[7] = 2.0e3; - bu[8] = 6.0e1; - bu[9] = 1.0e2; - bu[10] = 4.0e1; - bu[11] = 3.0e1; - bu[12] = 1.0e25; - bu[13] = 3.0e2; - bu[14] = 1.0e25; - - istate[0] = 0; - istate[1] = 0; - istate[2] = 0; - istate[3] = 0; - istate[4] = 0; - istate[5] = 0; - istate[6] = 0; - istate[7] = 0; - - xs[0] = 0.0; - xs[1] = 0.0; - xs[2] = 0.0; - xs[3] = 0.0; - xs[4] = 0.0; - xs[5] = 0.0; - xs[6] = 0.0; - xs[7] = 0.0; - - ifail = 0; - E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, - lrwsav,ifail); - e04wb.eval(); - - leniz = 1; - lenz = 1; - iz = new int[leniz]; - z = new double[lenz]; - - QPHX qphx = new QPHX(); - - ifail = 1; - - //placeholders - ns = 0; - miniz = 0; - minz = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - - E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, - crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, - leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); - e04nk.eval(); - ifail = e04nk.getIFAIL(); - - minz = e04nk.getMINZ(); - miniz = e04nk.getMINIZ(); - - lenz = minz; - leniz = miniz; - - iz = new int[leniz]; - z = new double[lenz]; - - ifail = -1; - - e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, - istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, - lwsav,iwsav,rwsav,ifail); - - //update - ifail = e04nk.getIFAIL(); - obj = e04nk.getOBJ(); - - if(ifail == 0){ - System.out.println(); - System.out.println("\tVariable Istate Value Lagr Mult"); - System.out.println(); - - for(i = 0; i < n; i++){ - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - if(m > 0){ - System.out.println(); - System.out.println(); - System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); - System.out.println(); - - for(i = n; i < n + m - 1; i++){ - System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - System.out.println(); - System.out.println(); - System.out.printf("Final objetive value = %15.7g\n", obj); - } - - } - - public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ - public void eval(){ - this.HX[0] = 2 * this.X[0]; - this.HX[1] = 2 * this.X[1]; - this.HX[2] = 2 * (this.X[2] + this.X[3]); - this.HX[3] = this.HX[2]; - this.HX[4] = 2 * this.X[4]; - this.HX[5] = 2 * (this.X[5] + this.X[6]); - this.HX[6] = this.HX[5]; - } - } -} diff --git a/simple_examples/int32/E04NQJE.java b/simple_examples/int32/E04NQJE.java deleted file mode 100644 index 6cf84fe..0000000 --- a/simple_examples/int32/E04NQJE.java +++ /dev/null @@ -1,384 +0,0 @@ -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NT; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NQ example program text. - */ -public class E04NQJE { - - public static final int LENCW = 600; - public static final int LENIW = 600; - public static final int LENRW = 600; - public static final int NIN = 5; - public static final int NOUT = 6; - - public static void main(String[] args) throws IOException { - - /* Local Scalars */ - double obj, objadd, sinf; - int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; - boolean verboseOutput; - String prob; // Length = 8 - String start; // Length = 1 - /* Local Arrays */ - double[] acol, bl, bu, c, pi, rc, x; - double[] ruser = new double[1], rw = new double[LENRW]; - int[] helast, hs, inda, loca; - int[] iuser = new int[1], iw = new int[LENIW]; - String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 - String[] names; // Length = 8 - /* Init String arrays with same length*/ - Arrays.fill(cuser, " "); - Arrays.fill(cw, " "); - - System.out.println(" E04NQJ Example Program Results"); - - /* Read data file */ - - if (args.length != 1) { - usage(); - } - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - String line; - - // Skip heading in data file - line = dataIn.readLine(); - - // Read n, m - line = dataIn.readLine(); - String[] data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 2) { - System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" - + line + "\n"+Arrays.toString(data)); - System.exit(1); - } - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - - // Read ne, iobj, ncolh, start, nname - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 5) { - System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); - System.exit(1); - } - ne = Integer.parseInt(data[0]); - iobj = Integer.parseInt(data[1]); - ncolh = Integer.parseInt(data[2]); - start = data[3].replaceAll("'",""); - nname = Integer.parseInt(data[4]); - - // Allocate - inda = new int[ne]; - loca = new int[n+1]; - helast = new int[n+m]; - hs = new int[n+m]; - acol = new double[ne]; - bl = new double[n+m]; - bu = new double[n+m]; - x = new double[n+m]; - pi = new double[m]; - rc = new double[n+m]; - names = new String[nname]; - - // Read names - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - int nameIndex = 0; - int dataIndex = 0; - while (nameIndex < nname) { - names[nameIndex] = data[dataIndex].replaceAll("'", ""); - ++nameIndex; - ++dataIndex; - if (nameIndex < nname && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read matrix - line = dataIn.readLine(); // skipping blank line - int locaIndex = 0; - int currentCol = 0; - for (i = 0; i < ne; ++i) { - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 3) { - System.out.println("The line is not well formatted for input of A:\n\t"+line); - System.exit(1); - } - acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); - inda[i] = Integer.parseInt(data[1]); - if (i == 0) { - loca[locaIndex] = 1;//storing for Fortran use: 1-based - ++locaIndex; - ++currentCol; - } - else { - int tmp = Integer.parseInt(data[2]); - if (tmp != currentCol) { - loca[locaIndex] = i+1; - ++currentCol; - ++locaIndex; - } - } - } - loca[n] = ne + 1; - - // Read bl - line = dataIn.readLine(); // skipping blank line - int blindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (blindex < bl.length) { - bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++blindex; - ++dataIndex; - if (blindex < bl.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read bu - line = dataIn.readLine(); // skipping blank line - int buindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (buindex < bu.length) { - bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++buindex; - ++dataIndex; - if (buindex < bu.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read hs - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (start.equalsIgnoreCase("C")) { - if (data.length != n) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - else { - if (data.length != n+m) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - for (i = 0; i < data.length; ++i) { - hs[i] = Integer.parseInt(data[i]); - } - - // Read x - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != n) { - System.out.println("Wrong format for X data."); - System.exit(1); - } - for (i = 0; i < data.length; ++i) { - x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); - } - - /* Done reading data file */ - - System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); - - /* Call E04NP to initialize E04NQ. */ - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); - - /* Set this to .True. to cause e04nqf to produce intermediate - * progress output. */ - verboseOutput = true; - - if (verboseOutput) { - /* By default e04nqf does not print monitoring - * information. Set the print file unit or the summary - * file unit to get information. */ - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); - } - - /* We have no explicit objective vector so set LENC = 0; the - * objective vector is stored in row IOBJ of ACOL. */ - lenc = 0; - c = new double[Math.max(1,lenc)]; - objadd = 0.0; - sinf = 0.0; - obj = Double.NaN; - prob = " "; - - /* Do not allow any elastic variables (i.e. they cannot be - * infeasible). If we'd set optional argument "Elastic mode" to 0, - * we wouldn't need to set the individual elements of array HELAST. */ - - for (int j = 0; j < (n+m); j++) { - helast[j] = 0; - } - - /* Solve the QP problem. */ - - E04NQ e04nq = new E04NQ(); - ifail = 0; - ns = 0; - ninf = 0; - e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, - inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, - iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); - - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); - System.out.print(" Optimal X = "); - for (i = 0; i < n; ++i) { - System.out.printf("%9.2f ", x[i]); - } - System.out.println(); - - } - - private static void usage() { - System.out.println("Usage:\n" - + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator - + ". E04NQJE " + File.separator + "e04nqfe.d"); - System.exit(1); - } - - public static class QPHX implements E04NQ.E04NQ_QPHX { - - private int NCOLHREF; - - public QPHX(int NCOLHREF) { - this.NCOLHREF = NCOLHREF; - } - - // @Override - public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, - String[] CUSER, int[] IUSER, double[] RUSER) { - - if (NCOLH != NCOLHREF) { - System.out.println("NCOLH value is wrong!"); - System.out.println("TEST FAILED"); - System.exit(1); - } - HX[0] = 2.0*X[0]; - HX[1] = 2.0*X[1]; - HX[2] = 2.0*(X[2]+X[3]); - HX[3] = HX[2]; - HX[4] = 2.0*X[4]; - HX[5] = 2.0*(X[5]+X[6]); - HX[6] = HX[5]; - - } - - private String[] CUSER; - private double[] HX,RUSER,X; - private int[] IUSER; - private int NCOLH, NSTATE; - - // @Override - public String[] getCUSER() { - return CUSER; - } - - // @Override - public double[] getHX() { - return HX; - } - - // @Override - public int[] getIUSER() { - return IUSER; - } - - // @Override - public int getNCOLH() { - return NCOLH; - } - - // @Override - public int getNSTATE() { - return NSTATE; - } - - // @Override - public double[] getRUSER() { - return RUSER; - } - - // @Override - public double[] getX() { - return X; - } - - // @Override - public void setCUSER(String[] arg0) { - CUSER = arg0; - - } - - // @Override - public void setHX(double[] arg0) { - HX = arg0; - - } - - // @Override - public void setIUSER(int[] arg0) { - IUSER = arg0; - - } - - // @Override - public void setNCOLH(int arg0) { - NCOLH = arg0; - - } - - // @Override - public void setNSTATE(int arg0) { - NSTATE = arg0; - - } - - // @Override - public void setRUSER(double[] arg0) { - RUSER = arg0; - - } - - // @Override - public void setX(double[] arg0) { - X = arg0; - - } - - } - - - - -} diff --git a/simple_examples/int32/E04PTJE.java b/simple_examples/int32/E04PTJE.java deleted file mode 100644 index 75303ac..0000000 --- a/simple_examples/int32/E04PTJE.java +++ /dev/null @@ -1,344 +0,0 @@ -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RB; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.F08.DSYEVD; -import java.util.Arrays; - -/** - * E04PTJ example program text. - * @author joed - * @since 27.0.0.0 - */ -public class E04PTJE { - - - /** - * Monitoring function can be used to monitor the progress - * or, for example, to implement bespoke stopping criteria. - */ - private static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - - double tol = RUSER[0]; - int tolReached = IUSER[1]; - - // If x is close to the solution, print a message - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - if (tolReached == 0) { - System.out.println(); - System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); - IUSER[1] = 1; - } - } - - } - - } - - - /** - * E04PTJ example main program. - */ - public static void main(String[] args) { - - DSYEVD dsyevd = new DSYEVD(); - E04PT e04pt = new E04PT(); - E04RA e04ra = new E04RA(); - E04RB e04rb = new E04RB(); - E04RE e04re = new E04RE(); - E04RH e04rh = new E04RH(); - E04RJ e04rj = new E04RJ(); - E04RZ e04rz = new E04RZ(); - E04ZM e04zm = new E04ZM(); - MONIT monit = new MONIT(); - - final int nqc = 1; - long cpuser, handle; - double r1; - int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, - nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; - boolean verboseOutput; - String ctype1, ctype2; // Length must be 8 - double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, - work, x, xl, xu; - double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; - int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; - int[] iuser = new int[2]; - - System.out.println("E04PTJ Example Program Results\n"); - - // Dimensions of the problem - n = 3; - nnzp0 = 6; - nnzp1 = 6; - - // Initialize size of linear constraints in SOCP - m = nqc; - na = n + nqc + 1; - nnza = nqc + n; - - // Initialize size of cone constraints - nvarc1 = 2; - nvarc2 = 2; - - // Set problem data - lwork = Math.max(2*n*n+6*n+1, 120+9*n); - liwork = 5*n + 3; - irowp0 = new int[]{1, 2, 3, 2, 3, 3}; - icolp0 = new int[]{1, 1, 1, 2, 2, 3}; - p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; - irowp1 = new int[]{1, 2, 3, 2, 3, 3}; - icolp1 = new int[]{1, 1, 1, 2, 2, 3}; - p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; - q0 = new double[]{0.847, 0.08, 0.505}; - q1 = new double[]{0.065, 0.428, 0.097}; - r1 = 1.276; - f0 = new double[n*n]; - f1 = new double[n*n]; - lambda0 = new double[n]; - lambda1 = new double[n]; - work = new double[lwork]; - iwork = new int[liwork]; - - // Store full P0 and P1 in F0 and F1 - Arrays.fill(f0, 0.0); - for (i = 0; i < nnzp0; i++) { - f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; - } - Arrays.fill(f1, 0.0); - for (i = 0; i < nnzp1; i++) { - f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; - } - - // Factorize P0 and P1 via eigenvalue decomposition - ifail = 0; - dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); - dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); - - // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 - nu = 0; - nv = 0; - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - for (j = 1; j <= n; j++) { - f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); - } - m++; - nu++; - nnza += n; - } - if (lambda1[i-1] > 0) { - for (j = 1; j <= n; j++) { - f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); - } - m++; - nv++; - nnza += n; - } - } - nnza += nu + nv; - na += nu+ nv; - nvarc1 += nu; - nvarc2 += nv; - - // Add two fixed variable for two rotated quadratic cones - na += 2; - m += 2; - nnza += 2; - - // Compute size of multipliers - nnzu = 2*na + 2*m; - nnzuc = nvarc1 + nvarc2; - - // Initialize arrays to build SOCP - icola = new int[nnza]; - irowa = new int[nnza]; - a = new double[nnza]; - bla = new double[m]; - bua = new double[m]; - xl = new double[na]; - xu = new double[na]; - c = new double[na]; - x = new double[na]; - u = new double[nnzu]; - uc = new double[nnzuc]; - idxc1 = new int[nvarc1]; - idxc2 = new int[nvarc2]; - - // Build objective function parameter c - // [x, t1, u, v, y1, y2, t0] - Arrays.fill(c, 0.0); - for (j = 0; j < n; j++) { - c[j] = q0[j]; - } - c[na-1] = 1.0; - - // Build linear constraints parameter A - idxa = 0; - rptr = 0; - // q1 in First row - rptr++; - Arrays.fill(irowa, 0, n, rptr); - for (j = 0; j < n; j++) { - icola[j] = j+1; - a[j] = q1[j]; - } - idxa += n; - - // F0 in F0*x-u=0 row - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f0[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // F1 in F1*x-v=0 row - for (i = 1; i <= n; i++) { - if (lambda1[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f1[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // Rest of A, a diagonal matrix - for (j = 0; j < m; j++) { - irowa[idxa+j] = j+1; - icola[idxa+j] = n+j+1; - a[idxa+j] = 1.0; - } - for (j = 1; j < (nu+nv+1); j++) { - a[idxa+j] = -1.0; - } - // RHS in linear constraints - Arrays.fill(bla, 0.0); - Arrays.fill(bua, 0.0); - bla[0] = -r1; - bua[0] = -r1; - for (j = (m-nqc); j <= m; j++) { - bla[j-1] = 1.0; - bua[j-1] = 1.0; - } - - // Box constraints, all variables are free - Arrays.fill(xl, -1E+20); - Arrays.fill(xu, 1E+20); - - // Cone constraints - // First cone - idxc1[0] = na; - idxc1[1] = n + 1 + nu + nv + 1; - for (j = 2; j < nvarc1; j++) { - idxc1[j] = n + j; - } - ctype1 = "RQUAD "; - // Second cone - idxc2[0] = n + 1; - idxc2[1] = n + 1 + nu + nv + 2; - for (j = 2; j < nvarc2; j++) { - idxc2[j] = n + nu + j; - } - ctype2 = "RQUAD "; - - // Create the problem handle - handle = 0; - ifail = 0; - e04ra.eval(handle, na, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - ifail = 0; - e04re.eval(handle, na, c, ifail); - - // Set box constraints - ifail = 0; - e04rh.eval(handle, na, xl, xu, ifail); - - // Set linear constraints - ifail = 0; - idlc = 0; - e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); - idlc = e04rj.getIDLC(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Turn on monitoring - ifail = 0; - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - /* Set this to true to cause e04pt to produce intermediate - * progress output */ - verboseOutput = false; - - if (verboseOutput) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } - else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = 0; // unused in this example - iuser[1] = 0; - ruser[0] = 1.0E-7; - ifail = -1; - e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, - ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if (ifail == 0 || ifail == 50) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (xIdx = 1; xIdx <= n; xIdx++) { - System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); - } - } - - // Free the handle memory - ifail = 0; - e04rz.eval(handle, ifail); - - } - - - /** - * Convert from 2D Fortran index to 1D-column major Java index. - * @param x 1-based row index for a 2D array - * @param y 1-based column index for a 2D array - * @return the corresponding 0-based index for a 1D column-major array - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/E04RPJE.java b/simple_examples/int32/E04RPJE.java deleted file mode 100644 index d22d3d1..0000000 --- a/simple_examples/int32/E04RPJE.java +++ /dev/null @@ -1,199 +0,0 @@ -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RN; -import com.nag.routines.E04.E04RP; -import com.nag.routines.E04.E04RY; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04SV; - -/** - * E04RPJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ - -public class E04RPJE{ - - /** - * E04RPJ Example main program - */ - public static void main(String[] args){ - int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, - nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; - double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; - int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, - nnzq, qi, qj, idummy; - long cpuser, handle; - - rdummy = new double[1]; - rinfo = new double[32]; - stats = new double[32]; - idummy = new int[1]; - - System.out.println("E04RPJ Example Program Results"); - System.out.println(); - - //Problem size - nvar = 5; - nnzh = 0; - nclin = 0; - nnzb = 0; - nblk = 2; - - //Initialize handle to an empty problem - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - //Linear part of the objective function - cvec = new double[nvar]; - cvec[0] = 1; - cvec[1] = 0; - cvec[2] = 1; - cvec[3] = 0; - cvec[4] = 0; - - //Add the linear objetive function to the problem formulation - ifail = 0; - E04RE e04re = new E04RE(handle, nvar, cvec, ifail); - e04re.eval(); - - //Matrix inequalities - //block 1 - dimaq = 2; - nnzasum = 9; nnzqsum = 8; - idblk = 0; - - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 2; - nnza[2] = 3; - nnza[3] = 2; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 2.0; irowa[2] = 1; icola[2] = 1; - a[3] = -2.0; irowa[3] = 1; icola[3] = 2; - a[4] = 6.0; irowa[4] = 1; icola[4] = 1; - a[5] = 5.0; irowa[5] = 1; icola[5] = 2; - a[6] = -4.0; irowa[6] = 2; icola[6] = 2; - a[7] = 3.0; irowa[7] = 1; icola[7] = 2; - a[8] = 8.0; irowa[8] = 2; icola[8] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - //update - idblk = e04rn.getIDBLK(); - - nq = 6; - - qi = new int[nq]; - qj = new int[nq]; - nnzq = new int[nq]; - irowq = new int[nnzqsum]; - icolq = new int[nnzqsum]; - q = new double[nnzqsum]; - - qi[0] = 1; qj[0] = 4; - qi[1] = 2; qj[1] = 4; - qi[2] = 3; qj[2] = 4; - qi[3] = 1; qj[3] = 5; - qi[4] = 2; qj[4] = 5; - qi[5] = 3; qj[5] = 5; - - nnzq[0] = 1; - nnzq[1] = 2; - nnzq[2] = 1; - nnzq[3] = 1; - nnzq[4] = 2; - nnzq[5] = 1; - - q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; - q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; - q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; - q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; - q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; - q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; - q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; - q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; - - ifail = 0; - //Expand the existing linear matrix inequality with bilnear term - E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, - q,idblk,ifail); - e04rp.eval(); - - //block 2 - dimaq = 2; - nnzasum = 5; - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 1; - nnza[2] = 1; - nnza[3] = 1; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 1.0; irowa[2] = 1; icola[2] = 1; - a[3] = 1.0; irowa[3] = 1; icola[3] = 2; - a[4] = 1.0; irowa[4] = 2; icola[4] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - - System.out.println("Passing SDP problem to solver"); - System.out.println(); - - ifail = 0; - //Print overview of handle - //nout = 6 is default output for fortran - E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); - e04ry.eval(); - - //Allocate memory for the solver - x = new double[nvar]; - nnzu = 0; - nnzuc = 0; - nnzua = 0; - inform = 0; - for(int i = 0; i < nvar; i++){ - x[i] = 0.0; - } - - ifail = 0; - E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, - rinfo,stats,inform,ifail); - e04sv.eval(); - - //Destroy handle - ifail = 0; - E04RZ e04rz = new E04RZ(handle,ifail); - e04rz.eval(); - } - -} - - - diff --git a/simple_examples/int32/E04RSJE.java b/simple_examples/int32/E04RSJE.java deleted file mode 100644 index d614fbb..0000000 --- a/simple_examples/int32/E04RSJE.java +++ /dev/null @@ -1,229 +0,0 @@ -import com.nag.routines.E04.E04RS; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RS - */ -public class E04RSJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - double s = 0.0; - int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; - int[] iuser = new int[2]; - - System.out.println(" E04RSJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - nnzq0 = Integer.parseInt(sVal[1]); - nnzq1 = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - irowq0 = new int[nnzq0]; - icolq0 = new int[nnzq0]; - q0 = new double[nnzq0]; - irowq1 = new int[nnzq1]; - icolq1 = new int[nnzq1]; - q1 = new double[nnzq1]; - idxr0 = new int[n]; - r0 = new double[n]; - idxr1 = new int[n]; - r1 = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - irowq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - icolq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - q0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - irowq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - icolq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - q1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - s = Double.parseDouble(sVal[0]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute size of multipliers - // One quadratic constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - idqc = -1; - ifail = 0; - E04RS e04rs = new E04RS(); - e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); - - // Set quadratic constraint - idqc = 0; - ifail = 0; - e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } -} diff --git a/simple_examples/int32/E04RTJE.java b/simple_examples/int32/E04RTJE.java deleted file mode 100644 index dd4bce8..0000000 --- a/simple_examples/int32/E04RTJE.java +++ /dev/null @@ -1,225 +0,0 @@ -import com.nag.routines.E04.E04RT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RT example program text. - */ -public class E04RTJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; - double[] lc = new double[3]; - double[] lc_rhs = new double[1]; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icola = null, idxr0 = null, irowa = null; - int[] icollc = new int[3]; - int[] irowlc = new int[3]; - int[] iuser = new int[2]; - - System.out.println(" E04RTJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - m = Integer.parseInt(sVal[1]); - nnza = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - a = new double[nnza]; - icola = new int[nnza]; - irowa = new int[nnza]; - idxr0 = new int[n]; - r0 = new double[n]; - b = new double[m]; - xl = new double[n]; - xu = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - irowa[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - icola[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < m; i++) { - b[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xl[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xu[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute -2*b'A as linear term in quadratic function - for (j = 0; j < n; j++) { - r0[j] = 0.0; - idxr0[j] = j + 1; - } - for (i = 0; i < nnza; i++) { - r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; - } - - // Compute size of multipliers - // One linear constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2 * n + 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set quadratic objective function - idqc = -1; - ifail = 0; - E04RT e04rt = new E04RT(); - e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); - - // Set box constraints - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, n, xl, xu, ifail); - - // Set linear constraint: x1 + x2 + x3 = 1 - for (j = 0; j < n; j++) { - irowlc[j] = 1; - icollc[j] = j + 1; - lc[j] = 1.0; - } - lc_rhs[0] = 1.0; - ifail = 0; - idlc = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } - } diff --git a/simple_examples/int32/E04SAJE.java b/simple_examples/int32/E04SAJE.java deleted file mode 100644 index 325267b..0000000 --- a/simple_examples/int32/E04SAJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.routines.E04.E04RC; -import com.nag.routines.E04.E04SA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04PTU; - -/** - * E04SA example program text. - */ -public class E04SAJE { - - public static final String fname = "e04saje.opt"; - public static void main(String[] args) { - - long cpuser, handle = 0; - int ifail, n, nnzu, nnzuc, x_idx; - boolean verbose_output; - String ftype; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u, uc, x; - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04SAJ Example Program Results"); - - // Read mps file to a handle - ifail = 0; - ftype = "mps"; - E04SA e04sa = new E04SA(); - e04sa.eval(handle, fname, ftype, pinfo, ifail); - handle = e04sa.getHANDLE(); - - // Get problem size from pinfo - pinfo = e04sa.getPINFO(); - n = pinfo[0]; - nnzu = pinfo[10]; - nnzuc = pinfo[11]; - - // Set all variables as continuous - ifail = 0; - E04RC e04rc = new E04RC(); - - int[] x_idx_Arr = new int[n]; - for (x_idx = 1; x_idx <= n; x_idx++) { - x_idx_Arr[x_idx - 1] = x_idx; - } - - e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); - - // Allocate memory - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Set this to .True. to cause e04ptf to produce intermediate progress output - verbose_output = false; - - E04ZM e04zm = new E04ZM(); - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx " + " Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - E04PTU e04ptu = new E04PTU(); - e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); - this.INFORM = e04ptu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TAJE.java b/simple_examples/int32/E04TAJE.java deleted file mode 100644 index 97cebe2..0000000 --- a/simple_examples/int32/E04TAJE.java +++ /dev/null @@ -1,188 +0,0 @@ -import com.nag.routines.E04.E04TA; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04MTU; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04TE; -import com.nag.routines.E04.E04TJ; -import com.nag.routines.E04.E04RW; -import com.nag.routines.E04.E04RZ; - -import java.util.Arrays; - -/** - * E04TA - */ -public class E04TAJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser, handle; - int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; - - double[] a, bla, bua, cvec, ulag, x, xl, xu; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u = new double[1]; - - int[] icola, irowa; - - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04TAJ Example Program Results\n"); - System.out.println(" Solve the first LP\n"); - - handle = 0; - cpuser = 0; - - // Initialize the handle - nvar = 2; - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define the objective function - cvec = new double[nvar]; - cvec[0] = 2.0; - cvec[1] = 4.5; - ifail = 0; - E04RE e04re = new E04RE(); - e04re.eval(handle, nvar, cvec, ifail); - - // Box constraints - xl = new double[nvar]; - xu = new double[nvar]; - Arrays.fill(xl, 0.0); - xu[0] = infbnd; - xu[1] = 100.0; - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, xl, xu, ifail); - - // Set the linear constraints - idlc = 0; - nclin = 3; - nnza = 6; - bla = new double[nclin]; - bua = new double[nclin]; - irowa = new int[nnza]; - icola = new int[nnza]; - a = new double[nnza]; - Arrays.fill(bla, -infbnd); - bua = new double[] { - 1500.0, 6000.0, 16000.0 - }; - irowa = new int[] { - 1, 1, 2, 2, 3, 3 - }; - icola = new int[] { - 1, 2, 1, 2, 1, 2 - }; - a = new double[] { - 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 - }; - ifail = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); - - // Optional parameters - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Task = Max", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - - // Call the LP solver - x = new double[nvar + 1]; - nnzu = 0; - ifail = -1; - E04MT e04mt = new E04MT(); - MONIT monit = new MONIT(); - e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a variable - ifail = 0; - E04TA e04ta = new E04TA(); - e04ta.eval(handle, 1, nvar, ifail); - nvar = e04ta.getNVAR(); - - // Box constraint on the new variable - ifail = 0; - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); - - // Add the linear objective component - ifail = 0; - E04TE e04te = new E04TE(); - e04te.eval(handle, 3, 7.0, ifail); - - // Add linear constraints coefficients - E04TJ e04tj = new E04TJ(); - ifail = 0; - e04tj.eval(handle, 1, 3, 5.0, ifail); - ifail = 0; - e04tj.eval(handle, 2, 3, 12.0, ifail); - ifail = 0; - e04tj.eval(handle, 3, 3, 120.0, ifail); - - System.out.println("\n The new variable has been added, solve the handle again\n"); - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a linear constraint - nclin = 1; - bla[0] = -infbnd; - bua[0] = 100.0; - nnza = 2; - irowa[0] = 1; - irowa[1] = 1; - icola[0] = 2; - icola[1] = 3; - a[0] = 1.0; - a[1] = 1.0; - idlc = 0; - e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); - - System.out.println("\n The new constraint has been added, solve the handle again\n"); - - // Query the problem sizes to request the Lagrangian multipliers for the - // last solve - ioflag = 1; - liarr = 100; - E04RW e04rw = new E04RW(); - e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); - nnzu = pinfo[10]; - ulag = new double[nnzu]; - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Free the memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - E04MTU e04mtu = new E04MTU(); - e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, - this.CPUSER, this.INFORM); - this.INFORM = e04mtu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TCJE.java b/simple_examples/int32/E04TCJE.java deleted file mode 100644 index d28d78b..0000000 --- a/simple_examples/int32/E04TCJE.java +++ /dev/null @@ -1,263 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGU; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04TB; -import com.nag.routines.E04.E04TC; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Arrays; - -/** - * E04TC example program text. - * @author Mo - */ -public class E04TCJE { - - public static void main(String[] args) { - double[] rx, x, udt, udy; - double[] rinfo = new double[100], ruser = new double[0], - stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, udnres; - int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; - int[] idx; - long cpuser, handle; // c_ptr - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - /* Header */ - System.out.printf(" E04TCJ Example Program Results\n\n"); - try { - - handle = 0L; - cpuser = 0L; - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - - /* Read number of residuals */ - nres = Integer.parseInt(data[0]); - - udnres = nres; - - /* Allocate memory */ - udt = new double[nres]; - udy = new double[nres]; - - /* Read observations */ - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udt[ii+jj] = Double.parseDouble(data[jj]); - } - } - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udy[ii+jj] = Double.parseDouble(data[jj]); - } - } - - /* try to fit the model */ - /* f(t) = at^2 + bt + c + d sin(omega t) */ - /* To the data {(t_i, y_i)} */ - nvar = 5; - - /* Initialize the NAG optimization handle */ - E04RA e04ra = new E04RA(); - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define a dense nonlinear least-squares objective function */ - /* (isparse = 0 => the sparsity pattern of the Jacobian */ - /* doesn't need to be defined) */ - E04RM e04rm = new E04RM(); - isparse = 0; - nnzrd = 1; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set some optional parameters to control the output of the solver */ - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - - System.out.println("First solve the problem with the outliers"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Call the solver */ - E04GG e04gg = new E04GG(); - x = new double[nvar]; - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - rx = new double[nres]; - iuser = new int[] {udnres}; - ruser = new double[2 * udnres];; - for (int ii = 0; ii < udnres; ii++) { - ruser[ii] = udt[ii]; - ruser[udnres + ii] = udy[ii]; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Now remove the outlier residuals from the problem handle"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Disable the two outlier residuals */ - E04TC e04tc = new E04TC(); - idx = new int[] {10, 20}; - e04tc.eval(handle, "NLS", 2, idx, ifail); - - /* Solve the problem again */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Assuming the outliers points are measured again"); - System.out.println("we can enable the residuals and adjust the values"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Fix the first variable to its known value of 0.3 */ - /* enable the residuals and adjust the values in the data */ - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); - E04TB e04tb = new E04TB(); - e04tb.eval(handle, "NLS", 2, idx, ifail); - udy[9] = -0.515629; - udy[19] = 0.54920; - - /* Solve the problem */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - } - catch (Exception ex) { - Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + - this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - - udy[i]; - } - - this.INFORM = 0; - - } - - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 1; i <= this.NRES; i++) { - this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); - this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; - this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; - this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); - this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * - Math.cos(this.X[4] * udt[i-1]); - - } - - this.INFORM = 0; - - } - - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - E04GGU e04ggu = new E04GGU(); - e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggu.getINFORM(); - } - - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04UCJE.java b/simple_examples/int32/E04UCJE.java deleted file mode 100644 index e43d457..0000000 --- a/simple_examples/int32/E04UCJE.java +++ /dev/null @@ -1,211 +0,0 @@ -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E04UE; -import com.nag.routines.F06.DGEMV; -import java.util.Arrays; - -/** - * E04UC example program text. - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) { - - /* Local Scalars */ - double objf; - int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[LRWSAV]; - int[] istate, iwork; - int[] iuser = new int[1], iwsav = new int[LIWSAV]; - boolean[] lwsav = new boolean[LLWSAV]; - String[] cwsav = new String[LCWSAV]; - Arrays.fill(cwsav, - " "); - - System.out.println(" E04UCJ Example Program Results"); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new int[n + nclin + ncnln]; - iwork = new int[liwork]; - c = new double[Math.max(1, ncnln)]; - cjac = new double[ldcj * sdcjac]; - clamda = new double[n + nclin + ncnln]; - objgrd = new double[n]; - r = new double[ldr * n]; - work = new double[lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - E04UE e04ue = new E04UE(); - inform = 0; - e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives. */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[LDCJ] = X[1] + X[1]; - CJAC[2*LDCJ] = X[2] + X[2]; - CJAC[3*LDCJ] = X[3] + X[3]; - } - - } - - if (NEEDC[1] > 0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[1+LDCJ] = X[0]*X[2]*X[3]; - CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; - CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/int32/E04YAJE.java b/simple_examples/int32/E04YAJE.java deleted file mode 100644 index 72d80da..0000000 --- a/simple_examples/int32/E04YAJE.java +++ /dev/null @@ -1,112 +0,0 @@ -import com.nag.routines.E04.E04YA; - - -/** - * E04YA example program text. - * @author joed - */ -public class E04YAJE { - - public static LSQFUN lsqfun = new LSQFUN(); - public static final int LIW = 1, MDEC = 15, NDEC = 3; - public static final int LDFJAC = MDEC; - public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; - public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - int i; - - for (i = 0; i < M; i++) { - denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); - - if (IFLAG != 1) { - FVEC[i] = XC[0] + (t[i]/denom) - y[i]; - } - - if (IFLAG != 0) { - FJAC[i] = 1.0; - dummy = -1.0/(denom*denom); - FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; - FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; - } - - } - } - - } - - public static void main(String[] args) { - int i, ifail, m, n; - double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], - w = new double[LW], x = new double[NDEC]; - int[] iw = new int[LIW]; - - System.out.println(" E04YAJ Example Program Results"); - - n = NDEC; - m = MDEC; - - /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) - * (I = 1, 2, ..., m) */ - - y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, - 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; - for (i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - /* Set up an arbitrary point at which to check the 1st derivatives */ - - x[0] = 0.19; - x[1] = -1.34; - x[2] = 0.88; - - System.out.println(); - System.out.println("The test point is"); - System.out.printf(" "); - for (i = 0; i < n; i++) { - System.out.printf("%10.5f", x[i]); - } - System.out.printf("\n"); - - E04YA e04ya = new E04YA(); - ifail = -1; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); - ifail = e04ya.getIFAIL(); - - if (ifail >= 0 && ifail != 1) { - - switch (ifail) { - case 0: - System.out.println(); - System.out.println("1st derivatives are consistent with residual values"); - break; - case 2: - System.out.println(); - System.out.println("Probable error in calculation of 1st derivatives"); - break; - default: - } - - System.out.println(); - System.out.println("At the test point, LSQFUN gives"); - System.out.println(); - System.out.println(" Residuals 1st derivatives"); - for (i = 0; i < m; i++) { - System.out.printf(" %15.3E", fvec[i]); - System.out.printf("%15.3E", fjac[i]); - System.out.printf("%15.3E", fjac[LDFJAC + i]); - System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); - } - - } - - } - -} diff --git a/simple_examples/int32/F01ADJE.java b/simple_examples/int32/F01ADJE.java deleted file mode 100644 index 4167f71..0000000 --- a/simple_examples/int32/F01ADJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.F01.F01AD; -import com.nag.routines.X04.X04CA; - - -/** - * F01AD example program text. - * @author joed - */ -public class F01ADJE { - - public static void main(String[] args) { - - int i, ifail, lda, n; - double[] a; - - System.out.println(" F01ADJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n + 1; - a = new double[] { - 5.0, 7.0, 6.0, 5.0, 0.0, - 7.0, 10.0, 8.0, 7.0, 0.0, - 6.0, 8.0, 10.0, 9.0, 0.0, - 5.0, 7.0, 9.0, 10.0, 0.0 - }; - - F01AD f01ad = new F01AD(); - ifail = -1; - f01ad.eval(n, a, lda, ifail); - ifail = f01ad.getIFAIL(); - - /* Print the result matrix A */ - X04CA x04ca = new X04CA(); - x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); - - } - -} diff --git a/simple_examples/int32/F01CKJE.java b/simple_examples/int32/F01CKJE.java deleted file mode 100644 index ed3ffa2..0000000 --- a/simple_examples/int32/F01CKJE.java +++ /dev/null @@ -1,60 +0,0 @@ -import com.nag.routines.F01.F01CK; -import com.nag.routines.X04.X04CB; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CK example program text. - * @author ludovic - */ -public class F01CKJE { - - public static void main(String[] args) { - - double[] a, b, c, z; - int n, p, m, iz, opt; - int ifail; - - m = 3; - n = p = 2; - iz = 1; - opt = 1; - a = new double[n * p]; - b = new double[n * m]; - c = new double[m * p]; - z = new double[iz]; - ifail = 0; - - System.out.println(" F01CKJ Example Program Results"); - - // Initialising b and c - - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - b[j+i*n] = (double) (i+j); - } - for (int j = 0; j < p; ++j) { - c[i+j*m] = (double) (i+j); - } - } - - F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); - f01ck.eval(); - ifail = f01ck.getIFAIL(); - String title = "Matrix A"; - System.out.println(); - System.out.flush(); - ifail = 0; - - String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; - String[] dummy = {" "}; - int ncols = 80; - int indent = 0; - - (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, - dummy,ncols,indent, ifail); - - } - -} diff --git a/simple_examples/int32/F01CRJE.java b/simple_examples/int32/F01CRJE.java deleted file mode 100644 index c10b284..0000000 --- a/simple_examples/int32/F01CRJE.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.nag.routines.F01.F01CR; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CR example program text. - * @author ludovic - */ -public class F01CRJE { - - public static void main(String[] args) { - System.out.println(" F01CRJ Example Program Results"); - double[] a; - int m,n,mn,lmove; - int[] move; - int ifail; - n = 7; - m = 3; - mn = m*n; - lmove = (m + n)/2; - a = new double[mn]; - move = new int[lmove]; - ifail = 1; - - for (int i = 0; i < mn; i++) { - a[i] = i+1.0; - } - - F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); - f01cr.eval(); - - System.out.println(); - int index = 0; - for (int i = 0; i < mn; ++i) { - System.out.printf(" %7.1f",a[i]); - ++index; - if (index == 7) { - System.out.println(); - index = 0; - } - } - System.out.println(); - - } - -} diff --git a/simple_examples/int32/F01DGJE.java b/simple_examples/int32/F01DGJE.java deleted file mode 100644 index 107137f..0000000 --- a/simple_examples/int32/F01DGJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F01.F01DG; -import com.nag.routines.X04.X04CA; - -/** - * F01DG example program text. - * @author joed - * @since 27.0.0.0 - */ -public class F01DGJE { - - /** - * F01DG example main program. - */ - public static void main(String[] args) { - - F01DG f01dg = new F01DG(); - X04CA x04ca = new X04CA(); - double alpha; - int i, ifail, lda, ldb, n; - String side, transa, uplo; // Length 1 - double[] a, b; - - System.out.println("F01DGJ Example Program Results\n"); - - // Values for side, uplo and transa - side = "L"; - uplo = "U"; - transa = "T"; - - // Order of square matrices - n = 4; - lda = n; - ldb = n; - - // Scaling constant alpha - alpha = 0.4; - - // Set input matrices (column-major order) - a = new double[]{ - 1.5, 0.0, 0.0, 0.0, - 2.3, 3.4, 0.0, 0.0, - 6.7, 5.4, 8.1, 0.0, - 1.9, 8.6, 2.0, 5.9 - }; - b = new double[]{ - 3.5, 0.0, 0.0, 0.0, - 2.1, 5.6, 0.0, 0.0, - 4.0, 2.1, 1.7, 0.0, - 2.1, 2.5, 1.1, 7.4 - }; - - /* ifail: behaviour on error exit - * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ - ifail = 0; - - // Find B=alpha*A*B - f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); - ifail = f01dg.getIFAIL(); - - // Print the solution - if (ifail == 0) { - if (transa.equals("N")) { - x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); - } - else { - x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); - } - } - - } - -} diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java deleted file mode 100644 index 9986c6c..0000000 --- a/simple_examples/int32/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/int32/F01EMJE.java b/simple_examples/int32/F01EMJE.java deleted file mode 100644 index 716a7b5..0000000 --- a/simple_examples/int32/F01EMJE.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.nag.routines.F01.F01EM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F01EMJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F01EMJE{ - - /** - * F01EMJ Example main program - */ - public static void main(String[] args){ - double imnorm = 0; - int ifail, iflag = 0, lda, n; //placeholders - double[] a, ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("F01EMJ Example Program Results"); - System.out.println(); - - //Tell wrapper what type of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //Problem size - n = 4; - lda = n; - - //Allocate - a = new double[lda * n]; - - //Data - //A = ( 1, 0,-2, 1) - // (-1, 2, 0, 1) - // ( 2, 0, 1, 0) - // ( 1, 0,-2, 2) - a[0] = 1; - a[1] = -1; - a[2] = 2; - a[3] = 1; - a[4] = 0; - a[5] = 2; - a[6] = 0; - a[7] = 0; - a[8] = -2; - a[9] = 0; - a[10] = 1; - a[11] = -1; - a[12] = 1; - a[13] = 1; - a[14] = 0; - a[15] = 2; - - //Find f(A) - ifail = 0; - //Create fexp2 object to pass to wrapper - fexp2 f = new fexp2(); - F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); - f01em.eval(); - - //Print solution - ifail = 0; - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); - x04ca.eval(); - - //Print the norm oof the imaginary part to check if it small - System.out.println(); - System.out.printf("Imnorm = %.2f\n", imnorm); - } - - /** - * fexp2 class representing f routine argument - */ - public static class fexp2 extends F01EM.Abstract_F01EM_F{ - public void eval(){ - NAGComplex two = new NAGComplex(2, 0); - NAGComplex twoPowM = new NAGComplex(2, 0); - - twoPowM.setRe(Math.pow(2, this.M)); - - for(int i = 0; i < this.NZ; i++){ - this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); - } - - //Set iflag nonzero to terminate exectuion for any reason - this.IFLAG = 0; - } - - //Raises e ^ z where z is a complex number - //Uses eulers formula; - //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) - public NAGComplex complexExp(NAGComplex x){ - NAGComplex tmp = new NAGComplex(); - tmp.setRe(Math.cos(x.getIm())); - tmp.setIm(Math.sin(x.getIm())); - NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); - return ans; - } - } -} diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java deleted file mode 100644 index 3737022..0000000 --- a/simple_examples/int32/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java deleted file mode 100644 index 0dd7ab9..0000000 --- a/simple_examples/int32/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java deleted file mode 100644 index 36c26c6..0000000 --- a/simple_examples/int32/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/int32/F03BAJE.java b/simple_examples/int32/F03BAJE.java deleted file mode 100644 index 673ddec..0000000 --- a/simple_examples/int32/F03BAJE.java +++ /dev/null @@ -1,108 +0,0 @@ -import com.nag.routines.F03.F03BA; -import com.nag.routines.F07.F07AD; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F03BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F03BAJE{ - - /** - * F03BAJ example main program. - */ - public static void main(String[] args){ - double d = 0; - int id = 0, ifail, info = 0, lda = 0, n = 0; - double[] a; - int[] ipiv; - - //Should initialise values so java doesn't give any errors because of try/catch - a = new double[n]; - ipiv = new int[n]; - - System.out.println("F03BAJ Example Program Results"); - - //If file name not given print usage info - if(args.length != 1){ - F03BAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - lda = n; - - //reallocate with values from data file - a = new double[n * lda]; - ipiv = new int[n]; - - //read in matrix - for(int i = 0; i < n; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); - f07ad.eval(); - - ifail = 0; - - //Print out matrix - System.out.println(); - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivots"); - for(int i = 0; i < n; i++){ - System.out.printf("\t%d ", ipiv[i]); - } - System.out.printf("\n"); - System.out.println(); - - ifail = 0; - - F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); - f03ba.eval(); - d = f03ba.getD(); - id = f03ba.getID(); - - System.out.printf("D = \t%.5f ID = \t%d\n", d, id); - System.out.println(); - System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); - - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - -} - diff --git a/simple_examples/int32/F04AMJE.java b/simple_examples/int32/F04AMJE.java deleted file mode 100644 index a498b2b..0000000 --- a/simple_examples/int32/F04AMJE.java +++ /dev/null @@ -1,114 +0,0 @@ -import com.nag.routines.F04.F04AM; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04AMJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04AMJE{ - - /** - * F04AMJ example main program. - */ - public static void main(String[] args){ - int m = 0, n = 0; - int ifail, ir, lda, ldb, ldqr, ldx; - double eps; - double[] a, b, alpha, e, qr, r, x, y, z; - int[] ipiv; - - System.out.println("F04AMJ Example Program Results"); - - if(args.length != 1){ - F04AMJE.usage(); - } - - //declare so try/catch works - a = new double[0]; - b = new double[0]; - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[1]); - n = Integer.parseInt(sVal[2]); - - a = new double[m * n]; - b = new double[m * 1]; - - for(int i = 0; i < m; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * m) ] = Double.parseDouble(sVal[j]); - } - for(int j = n; j < m; j++){ - b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - //Setting these in try block is more robust but less neat - //May be needed for array sizes~ - ir = 1; - lda = m; - ldb = m; - ldqr = m; - ldx = n; - - alpha = new double[n]; - e = new double[n]; - qr = new double[ldqr * n]; - r = new double[m]; - x = new double[ldx * ir]; - y = new double[n]; - z = new double[n]; - ipiv = new int[n]; - - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - - ifail = 0; - - F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); - f04am.eval(); - //update any values you want here - x = f04am.getX(); - - System.out.println("Solution"); - for(int i = 0; i < n; i++){ - for(int j = 0; j < ir; j++){ - System.out.printf("%.4f ", x[j + (i * ir)]); - } - System.out.printf("\n"); - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - - - - - - diff --git a/simple_examples/int32/F04BAJE.java b/simple_examples/int32/F04BAJE.java deleted file mode 100644 index 79c2b01..0000000 --- a/simple_examples/int32/F04BAJE.java +++ /dev/null @@ -1,144 +0,0 @@ -import com.nag.routines.F04.F04BA; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04BAJE{ - - /** - * F04BAJ example main program. - */ - public static void main(String[] args){ - int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder - int ierr, ifail; - double errbnd, rcond; - double a[], b[]; - int ipiv[]; - - a = new double[0]; b = new double[0]; //placeholder - - if(args.length != 1){ - F04BAJE.usage(); - } - - System.out.println("F04BAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - nrhs = Integer.parseInt(sVal[2]); - - lda = n; - ldb = n; - - a = new double[lda * n]; - b = new double[ldb * nrhs]; - - line = reader.readLine(); - for(int i = 0; i < lda; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < ldb; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < nrhs; j++){ - b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 1; - ipiv = new int[n]; - rcond = 0; - errbnd = 0; - F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); - f04ba.eval(); - - ifail = f04ba.getIFAIL(); - rcond = f04ba.getRCOND(); - errbnd = f04ba.getERRBND(); - ipiv = f04ba.getIPIV(); - a = f04ba.getA(); - b = f04ba.getB(); - - if(ifail == 0){ - //Print solution, estimate of condition number and approximate error bound. - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Estimate of condition number"); - System.out.printf("%.1e\n", 1/rcond); - System.out.println(); - System.out.println("Esttimate of error bound for computed solutions"); - System.out.printf("%.1e\n", errbnd); - } - else if(ifail == (n + 1)){ - //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. - System.out.println(); - System.out.println("Estimate of reciprocal of condition number"); - System.out.printf("%.1e\n", rcond); - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - } - else if(ifail > 0 && ifail <= n){ - //The upper triangular matrix U is exactly singular. Print details of factorization. - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivot indices"); - for(int i = 0; i < n; i++){ - System.out.printf("%d ", ipiv[i]); - } - System.out.printf("\n"); - } - else{ - System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); - } - - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/F05AAJE.java b/simple_examples/int32/F05AAJE.java deleted file mode 100644 index 317c269..0000000 --- a/simple_examples/int32/F05AAJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F05.F05AA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F05AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F05AAJE{ - - /** - * F05AAJ example main program. - */ - public static void main(String[] args) { - //Should initialise values to avoid issues with try/catch - int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; - double cc = 0; - double[] a, s; - - //same as ints - a = new double[1]; - s = new double[1]; - System.out.println("F05AAJ Example Program Results"); - System.out.println(); - - //supply data - if(args.length != 1){ - F05AAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+");; - m = Integer.parseInt(sVal[1]); - n1 = Integer.parseInt(sVal[2]); - n2 = Integer.parseInt(sVal[3]); - lda = m; - - a = new double[lda*n2]; - s = new double[n2]; - - //read in a from data - for(int i = 0; i < n2; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - a[i + (j * n2)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //create object then eval - F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); - f05aa.eval(); - - //update values - n1 = f05aa.getN1(); - n2 = f05aa.getN2(); - cc = f05aa.getCC(); - icol = f05aa.getICOL(); - a = f05aa.getA(); - - System.out.printf("N1 = %d N2 = %d\n", n1, n2); - System.out.println(); - System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); - System.out.println(); - System.out.println("Final Vectors"); - - for(int i = 0; i < n2; i++){ - for(int j = 1; j < m; j++){ - System.out.printf("%.4f ", a[i +(j * n2)]); - } - System.out.printf("\n"); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/F06CLJE.java b/simple_examples/int32/F06CLJE.java deleted file mode 100644 index ca2ac5e..0000000 --- a/simple_examples/int32/F06CLJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.F06.F06CL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F06CL example program text. - * @author ludovic - */ -public class F06CLJE { - - public static void main(String[] args) { - boolean fail = false; - NAGComplex z1 = new NAGComplex(); - NAGComplex z2 = new NAGComplex(); - NAGComplex z3 = new NAGComplex(); - - System.out.println(" F06CLJ Example Program Results"); - System.out.println(); - - Routine.complex = z1; - - z1.setRe(1.0); - z1.setIm(1.0); - z2.setRe(2.0); - z2.setIm(2.0); - - F06CL f06cl = new F06CL(z1,z2,fail); - z3 = (NAGComplex)f06cl.eval(); - fail = f06cl.getFAIL(); - - if (fail) { - System.err.println(" Something went wrong..."); - } - else { - System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); - } - - } - -} diff --git a/simple_examples/int32/F07AAJE.java b/simple_examples/int32/F07AAJE.java deleted file mode 100644 index 26eb5dc..0000000 --- a/simple_examples/int32/F07AAJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.F07.F07AA; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F07AA example program text. - * @author joed - */ -public class F07AAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, ldb, n; - double[] a, b; - int[] ipiv; - - System.out.println(" F07AAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - ldb = n; - - a = new double[n*n]; - b = new double[n]; - ipiv = new int[n]; - - a[0+0*n] = 1.80; - a[0+1*n] = 2.88; - a[0+2*n] = 2.05; - a[0+3*n] = -0.89; - a[1+0*n] = 5.25; - a[1+1*n] = -2.95; - a[1+2*n] = -0.95; - a[1+3*n] = -3.80; - a[2+0*n] = 1.58; - a[2+1*n] = -2.69; - a[2+2*n] = -2.90; - a[2+3*n] = -1.04; - a[3+0*n] = -1.11; - a[3+1*n] = -0.66; - a[3+2*n] = -0.59; - a[3+3*n] = 0.80; - - b[0] = 9.52; - b[1] = 24.35; - b[2] = 0.77; - b[3] = -6.22; - - /* Solve the equations Ax = b for x */ - - F07AA f07aa = new F07AA(); - info = 0; - f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); - info = f07aa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); - - /* Print pivot indices */ - - System.out.println(); - System.out.println(" Pivot indices"); - for (i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.printf("\n"); - - } - else { - System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); - } - - } - -} diff --git a/simple_examples/int32/F07ABJE.java b/simple_examples/int32/F07ABJE.java deleted file mode 100644 index 6362739..0000000 --- a/simple_examples/int32/F07ABJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.F07.DGESVX; -import com.nag.routines.X04.X04CA; - -/** - * F07ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ABJE{ - - /** - * F07ABJ example main program - */ - public static void main(String[] args){ - double rcond = 0; - int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders - String equed; - double[] a, af, b, berr, c, ferr, r, work, x; - int[] ipiv, iwork; - - System.out.println("F07ABJ Example Program Results"); - System.out.println(); - - //Problem size - n = 4; - nrhs = 2; - lda = n; - ldaf = n; - ldb = n; - ldx = n; - - //Allocate - a = new double[lda * n]; - af = new double[ldaf * n]; - b = new double[ldb * nrhs]; - berr = new double[nrhs]; - c = new double[n]; - ferr = new double[nrhs]; - r = new double[n]; - work = new double[4 * n]; - x = new double[ldx * nrhs]; - ipiv = new int[n]; - iwork = new int[n]; - equed = " "; - - //Matrices A and B - a[0] = 1.8; - a[1] = 525; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -295; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -380; - a[14] = -1.04; - a[15] = 0.8; - b[0] = 9.52; - b[1] = 2435; - b[2] = 0.77; - b[3] = -6.22; - b[4] = 18.47; - b[5] = 225; - b[6] = -13.28; - b[7] = -6.21; - - //Solve the equations AX = B for X - //The NAG name equivalent of dgesvx is f07abf - DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, - c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - dgesvx.eval(); - - //Update - info = dgesvx.getINFO(); - equed = dgesvx.getEQUED(); - rcond = dgesvx.getRCOND(); - - if(info == 0 || info == n + 1){ - //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Backward errors (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", berr[i]); - } - System.out.println(); - System.out.println(); - System.out.println("Estimated forward error bounds (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", ferr[i]); - } - System.out.println(); - System.out.println(); - if(equed.equals("N")){ - System.out.println("A has not been equilibrated"); - } - else if(equed.equals("R")){ - System.out.println("A has been row scaled as diag(R)*A"); - } - else if(equed.equals("C")){ - System.out.println("A has been column scaled as A*diag(C)"); - } - else if(equed.equals("B")){ - System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); - } - System.out.println(); - System.out.println("Reciprocal condition number estimate of scaled matrix"); - System.out.printf(" %.1e\n", rcond); - System.out.println(); - System.out.println("Estimate of reciprocal pivot growth factor"); - System.out.printf(" %.1e\n", work[0]); - System.out.println(); - - if(info == n + 1){ - System.out.println(); - System.out.println("The matrix A is singular to working precision"); - } - } - else{ - System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); - } - } -} diff --git a/simple_examples/int32/F07ADJE.java b/simple_examples/int32/F07ADJE.java deleted file mode 100644 index 4450683..0000000 --- a/simple_examples/int32/F07ADJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F07.DGETRF; -import com.nag.routines.X04.X04CA; - -/** - * F07ADJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ADJE{ - - /** - * F07ADJ Example main program - */ - public static void main(String[] args){ - int ifail, info = 0, lda, m, n; - double[] a; - int[] ipiv; - - System.out.println("F07ADJ Example Program Results"); - System.out.println(); - - //Problem size (can be read from data file) - m = 4; - n = 4; - lda = m; - - //Data - ipiv = new int[n]; - a = new double[m * n]; - a[0] = 1.8; - a[1] = 5.25; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -2.95; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -0.95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -3.8; - a[14] = -1.04; - a[15] = 0.8; - - //Factorize A - //The NAG name equivalent of dgetrf is F07ADF - DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); - dgetrf.eval(); - - //Update - info = dgetrf.getINFO(); - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); - x04ca.eval(); - - //Print pivot indices - System.out.println("IPIV"); - for(int i = 0; i < Math.min(m, n); i++){ - System.out.printf("\t%d", ipiv[i]); - } - System.out.println(); - - if(info != 0){ - System.out.println("The factor U is singular"); - } - } -} diff --git a/simple_examples/int32/F07AQJE.java b/simple_examples/int32/F07AQJE.java deleted file mode 100644 index 5ee47e5..0000000 --- a/simple_examples/int32/F07AQJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F07.F07AQ; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexF; - -/** - * F07AQ example program text. - * @author joed - * @since 27.1.0.0 - */ -public class F07AQJE { - - public static void main(String[] args) { - - F07AQ f07aq = new F07AQ(); - int info, iter, lda, ldb, ldx, n, r; - NAGComplex[] a, b, work, x; - NAGComplexF[] swork; - double[] rwork; - int[] ipiv; - - System.out.println(" F07AQJ Example Program Results"); - System.out.println(); - - // Set dimensions and instantiate arrays - n = 4; - r = 1; - lda = ldb = ldx = n; - a = new NAGComplex[lda*n]; - b = new NAGComplex[ldb*r]; - work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); - x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); - swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); - ipiv = new int[n]; - rwork = new double[n]; - - // Set A - a[0] = new NAGComplex(-1.34, 2.55); // Column 1 - a[1] = new NAGComplex(-0.17, -1.41); - a[2] = new NAGComplex(-3.29, -2.39); - a[3] = new NAGComplex(2.41, 0.39); - a[4] = new NAGComplex(0.28, 3.17); // Column 2 - a[5] = new NAGComplex(3.31, -0.15); - a[6] = new NAGComplex(-1.91, 4.42); - a[7] = new NAGComplex(-0.56, 1.47); - a[8] = new NAGComplex(-6.39, -2.20); // Column 3 - a[9] = new NAGComplex(-0.15, 1.34); - a[10] = new NAGComplex(-0.14, -1.35); - a[11] = new NAGComplex(-0.83, -0.69); - a[12] = new NAGComplex(0.72, -0.92); // Column 4 - a[13] = new NAGComplex(1.29, 1.38); - a[14] = new NAGComplex(1.72, 1.35); - a[15] = new NAGComplex(-1.96, 0.67); - - // Set B - b[0] = new NAGComplex(26.26,51.78); - b[1] = new NAGComplex( 6.43,-8.68); - b[2] = new NAGComplex(-5.75,25.31); - b[3] = new NAGComplex( 1.16, 2.57); - - // Notify wrappers of complex types - Routine.setComplex(new NAGComplex()); - Routine.setComplexF(new NAGComplexF()); - - // Solve the equations Ax = b for x - iter = info = 0; - f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); - iter = f07aq.getITER(); - info = f07aq.getINFO(); - - if (info == 0) { - - // Print solution - - System.out.println(" Solution"); - for (int i = 0; i < n; i++) { - for (int j = 0; j < r; j++) { - System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); - } - } - System.out.println(); - - // Print pivot indices - - System.out.println(); - System.out.println(" Pivot indices"); - for (int i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.println(); - - } - else { - System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); - } - - } - -} diff --git a/simple_examples/int32/F07FAJE.java b/simple_examples/int32/F07FAJE.java deleted file mode 100644 index e516051..0000000 --- a/simple_examples/int32/F07FAJE.java +++ /dev/null @@ -1,79 +0,0 @@ -import com.nag.routines.F07.F07FA; -import com.nag.routines.X04.X04CA; - -/** - * F07FA example program text. - * @author saraht - */ -public class F07FAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, n; - double[] a, b; - - System.out.println(" F07FAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - - a = new double[n*n]; - b = new double[n]; - - /* A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18 */ - - a[0+0*n] = 4.16; - a[0+1*n] = -3.12; - a[0+2*n] = 0.56; - a[0+3*n] = -0.10; - - a[1+1*n] = 5.03; - a[1+2*n] = -0.83; - a[1+3*n] = 1.18; - - a[2+2*n] = 0.76; - a[2+3*n] = 0.34; - - a[3+3*n] = 1.18; - - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - /* Solve the equations Ax = b for x */ - - F07FA f07fa = new F07FA(); - info = 0; - f07fa.eval("Upper", n, 1, a, lda, b, n, info); - info = f07fa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); - - } - else { - System.err.printf(" The leading minor of order %d is not positive definite \n", info); - } - - } - -} diff --git a/simple_examples/int32/F07FBJE.java b/simple_examples/int32/F07FBJE.java deleted file mode 100644 index 09bbd37..0000000 --- a/simple_examples/int32/F07FBJE.java +++ /dev/null @@ -1,122 +0,0 @@ -import com.nag.routines.F07.F07FB; -import com.nag.routines.X04.X04CA; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * F07FB example program text. - * @author ludovic - */ -public class F07FBJE { - - public static void main(String[] args) { - String fact,uplo,equed; - int n, nrhs,lda,ldaf,ldb,ldx; - int[] iwork; - double rcond; - double[] a,af,s,b,x,ferr,berr,work; - int info,ifail; - lda = 4; - ldaf = lda; - ldb = lda; - ldx = lda; - nrhs = 2; - n = 4; - a = new double[lda*lda]; - af = new double[ldaf*ldaf]; - b = new double[ldb*nrhs]; - berr = new double[nrhs]; - ferr = new double[nrhs]; - s = new double[lda]; - work = new double[3*lda]; - x = new double[ldx*nrhs]; - iwork = new int[lda]; - info = 1; - rcond = Double.NaN; - fact = "E"; - uplo = "U"; - equed = "Z";//dummy value - /*A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18*/ - a[0] = 4.16; - - a[4] = -3.12; - a[5] = 5.03; - - a[8] = 0.56; - a[9] = -0.83; - a[10] = 0.76; - - a[12] = -0.10; - a[13] = 1.18; - a[14] = 0.34; - a[15] = 1.18; - - /*B= 8.70 8.30 - -13.35 2.13 - 1.89 1.61 - - 4.14 5.00*/ - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - b[4] = 8.30; - b[5] = 2.13; - b[6] = 1.61; - b[7] = 5.00; - - System.out.println(" F07FBJ Example Program Results"); - System.out.println(); - - F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, - ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - f07fb.eval(); - fact = f07fb.getFACT(); - uplo = f07fb.getUPLO(); - equed = f07fb.getEQUED(); - rcond = f07fb.getRCOND(); - info = f07fb.getINFO(); - - - if ((info == 0) || (info == n+1)) { - ifail = 0; - (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); - System.out.println(); - System.out.println(" Backward errors (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",berr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimated forward error bounds (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",ferr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimate of reciprocal condition number"); - System.out.printf(" %11.1e\n",rcond); - System.out.println(); - if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has not been equilibrated"); - } - else if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); - } - - if (info == n+1) { - System.out.println(); - System.out.println(" The matrix A is singular to working precision"); - } - - } - else { - System.out.printf(" The leading minor of order %3d is not positive definite\n"); - } - - } - -} diff --git a/simple_examples/int32/F08BTJE.java b/simple_examples/int32/F08BTJE.java deleted file mode 100644 index 43c219b..0000000 --- a/simple_examples/int32/F08BTJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import static java.lang.Math.*; - -import com.nag.routines.F06.F06JJ; -import com.nag.routines.F06.F06ZJ; -import com.nag.routines.F08.F08AU; -import com.nag.routines.F08.F08BT; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04DB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * F08BT example program text. - * @author ludovic - */ -public class F08BTJE { - - public static void main(String[] args) throws FileNotFoundException, IOException { - int incl = 1, nb = 64; - double tol; - int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; - NAGComplex[] a, b, tau, work; - double[] rnorm, rwork; - int[] jpvt; - String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; - - // Setup complex constants - NAGComplex one = new NAGComplex(); - NAGComplex zero = new NAGComplex(); - one.setRe(1.0); - one.setIm(0.0); - zero.setRe(0.0); - zero.setIm(0.0); - - // Inform the Routine class of the type of complex in use - can use any complex object - Routine.complex = one; - - System.out.println(" F08BTJ Example Program Results"); - System.out.println(); - - // Read values from data file - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); - line = br.readLine().trim(); - line = br.readLine().trim(); - String[] vals = line.split("\\s+"); - m = Integer.parseInt(vals[0].trim()); - n = Integer.parseInt(vals[1].trim()); - nrhs = Integer.parseInt(vals[2].trim()); - lda = ldb = m; - lwork = (n + 1) * nb; - a = new NAGComplex[lda * n]; - b = new NAGComplex[ldb * nrhs]; - tau = new NAGComplex[n]; - work = new NAGComplex[lwork]; - rnorm = new double[nrhs]; - rwork = new double[2 * n]; - jpvt = new int[n]; - - // Actually initialize the complex arrays - for (int i = 0; i < a.length; ++i) { - a[i] = new NAGComplex(); - } - for (int i = 0; i < b.length; ++i) { - b[i] = new NAGComplex(); - } - for (int i = 0; i < tau.length; ++i) { - tau[i] = new NAGComplex(); - } - for (int i = 0; i < work.length; ++i) { - work[i] = new NAGComplex(); - } - - /* Read A and B from data file */ - - readCompMatrix(br, a, lda, n); - readCompMatrix(br, b, ldb, nrhs); - br.close(); - - /* Initialize JPVT to be zero so that all columns are free */ - - for (int i = 0; i < n; ++i) { - jpvt[i] = 0; - } - - /* Compute the QR factorization of A */ - - F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); - f08bt.eval(); - - /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ - - String side = "Left"; - String conjTrans = "Conjugate Transpose"; - F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); - f08au.eval(); - a = (NAGComplex[])f08au.getA(); - - /* Choose TOL to reflect the relative accuracy of the input data */ - - tol = 0.01; - - /* Determine and print the rank, K, or R relative to TOL */ - - for (k = 1; k < n + 1; ++k) { - if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { - break; - } - } - k = k - 1; - - System.out.println(" Tolerance used to estimate the rank of A"); - System.out.printf(" %11.2E\n", tol); - System.out.println(" Estimated rank of A"); - System.out.printf(" %8d\n", k); - - /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 - * storing the result in B */ - - String upDown = "Upper"; - String trans = "No transpose"; - String unit = "Non-Unit"; - F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); - f06zj.eval(); - - /* Compute estimates of the square roots of the residual sums of squares - * (2-norm of each of the columns of C2) */ - - int mMinusK = m - k; - NAGComplex[] btmp = new NAGComplex[b.length]; - for (int i = 0; i < btmp.length; ++i) { - btmp[i] = new NAGComplex(); - } - System.arraycopy(b, k, btmp, 0, b.length - k); - - F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); - rnorm[0] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp, 0, b, k, b.length - k); - for (int j = 1; j < nrhs; ++j) { - System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); - rnorm[j] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); - } - - /* Set the remaining elements of the solutions to zero (to give the - * basic solutions) */ - - for (int i = k; i < n; ++i) { - for (int j = 0; j < nrhs; ++j) { - NAGComplex tmp = new NAGComplex(); - tmp.setRe(0.0); - tmp.setIm(0.0); - b[i + j * ldb] = tmp; - } - } - - /* Permute the least squares solution stored in B to give X = P*Y */ - - for (int j = 0; j < nrhs; j++) { - for (int i = 0; i < n; i++) { - work[jpvt[i] - 1] = b[j*ldb + i]; - } - for (int i = 0; i < n; i++) { - b[j*ldb + i] = work[i]; - } - } - - /* Print least squares solutions */ - - X04DB x04db = new X04DB(); - ifail = 0; - x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", - "Integer",rlabs,"Integer",clabs,80,0,ifail); - - /* Print the square roots of the residual sums of squares */ - - System.out.println(); - System.out.println(" Square root(s) of the residual sum(s) of squares"); - System.out.printf(" "); - for (int i = 0; i < nrhs; ++i) { - System.out.printf("%11.2E", rnorm[i]); - } - System.out.println(); - - } - - private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, - int col) throws IOException { - - // matches one complex number (without the brackets...) - String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; - String fullPattern = complexPat; - for (int i = 0; i < col -1; ++i) { - fullPattern = fullPattern + "\\s*" + complexPat; - } - fullPattern = fullPattern + ".*"; - Pattern comppat = Pattern.compile(fullPattern); - - for (int i = 0; i < row; ++i) { - String line = br.readLine().trim(); - if (line.equalsIgnoreCase("")) { - line = br.readLine().trim(); - } - Matcher m = comppat.matcher(line.trim()); - if (m.matches()) { - for (int j = 0; j < col; ++j) { - String[] numbers = m.group(j + 1).trim().split(","); - mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); - mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); - // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); - } - // System.out.println(); - } - - - } - } - - private static double abs(NAGComplex z) { - return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); - } - -} diff --git a/simple_examples/int32/F08FAJE.java b/simple_examples/int32/F08FAJE.java deleted file mode 100644 index 028f854..0000000 --- a/simple_examples/int32/F08FAJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.routines.F08.DDISNA; -import com.nag.routines.F08.F08FA; -import com.nag.routines.F16.F16JQ; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F08FA example program text. - * @author ludovic - */ -public class F08FAJE { - - public static void main(String[] args) { - int n = 4, LWork = n*64, lda = n; - double[] a, w, work,zerrbd,rcondz, colVector; - int info = 0, ifail = 0, k = 0; - a = new double[n * n]; - w = new double[n]; - work = new double[LWork]; - zerrbd = new double[n]; - rcondz = new double[n]; - colVector = new double[n]; - - System.out.println(" F08FAJ Example Program Results\n"); - - //array a : Stored in column major way - - a[0] = 1.0; - a[1] = 2.0; - a[2] = 3.0; - a[3] = 4.0; - - a[4] = 2.0; - a[5] = 2.0; - a[6] = 3.0; - a[7] = 4.0; - - a[8] = 3.0; - a[9] = 3.0; - a[10] = 3.0; - a[11] = 4.0; - - a[12] = 4.0; - a[13] = 4.0; - a[14] = 4.0; - a[15] = 4.0; - - //initializing the info parameter - info = 0; - w[0] = Double.NaN; - w[1] = Double.NaN; - w[2] = Double.NaN; - w[3] = Double.NaN; - F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); - f08fa.eval(); - info = f08fa.getINFO(); - - if (info == 0) { - System.out.println(" Eigenvalues"); - System.out.print(" "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %8.4f",w[i]); - } - System.out.println(); - - // Normalize the eigenvectors: largest element positive - F16JQ f16jq = new F16JQ(); // aka blas_damax_val - for (int i = 0; i < n; i++) { - System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate - f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value - k = f16jq.getK() - 1; // Make index zero based - - // Invert sign of column if largest element is negative - if (a[(4*i)+k] < 0) { - for (int j = 0; j < n; j++) { - a[(4*i)+j] = (-1) * a[(4*i)+j]; - } - } - - } - - (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); - - double eps = (new X02AJ()).eval(); - double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); - - (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); - for (int i = 0; i < n; ++i) { - zerrbd[i] = eerrbd/rcondz[i]; - } - - System.out.println(); - System.out.println(" Error estimate for the eigenvalues"); - System.out.printf(" %11.1e\n",eerrbd); - System.out.println(); - System.out.println(" Error estimates for the eigenvectors"); - for (int i = 0; i < n; ++i) { - System.out.printf(" %11.1e",zerrbd[i]); - } - System.out.println(); - - } - else { - System.out.printf(" Failure in DSYEV. INFO =%4d",info); - } - - } - -} diff --git a/simple_examples/int32/F08XPJE.java b/simple_examples/int32/F08XPJE.java deleted file mode 100644 index cc894d3..0000000 --- a/simple_examples/int32/F08XPJE.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.nag.routines.F06.F06UA; -import com.nag.routines.F06.F06BN; -import com.nag.routines.F06.ZGEMM; -import com.nag.routines.F08.ZGGESX; -import com.nag.routines.M01.M01DA; -import com.nag.routines.M01.M01ED; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04DB; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * F08XPJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F08XPJE{ - - public static boolean chkfac = false; - public static boolean prcond = false; - public static boolean prmat = false; - public static int nb = 64; - - /* - * F08XPJ Example main program - */ - public static void main(String[] args){ - NAGComplex alph, bet; - double abnorm, anorm, bnorm, eps, normd, norme, tol; - int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; - boolean factor; - NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; - double[] rconde, rcondv, rwork; - int[] idum, iwork; - boolean[] bwork; - String[] clabs, rlabs; - - //Placeholders - idum = new int[1]; - rconde = new double[2]; - rcondv = new double[2]; - dummy = NAGComplex.createArray(1); - - System.out.println("F08XPJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - //Tell wrappers what time of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //n declared here for neater code but can be read in from data file - n = 4; - lda = n; - ldb = n; - ldc = n; - ldd = n; - lde = n; - ldvsl = n; - ldvsr = n; - - //Allocate - a = NAGComplex.createArray(lda * n); - alpha = NAGComplex.createArray(n); - b = NAGComplex.createArray(ldb * n); - beta = NAGComplex.createArray(n); - c = NAGComplex.createArray(ldc * n); - d = NAGComplex.createArray(ldd * n); - e = NAGComplex.createArray(lde * n); - vsl = NAGComplex.createArray(ldvsl * n); - vsr = NAGComplex.createArray(ldvsr * n); - rwork = new double[8 * n]; - bwork = new boolean[n]; - clabs = new String[1]; - clabs[0] = " "; - rlabs = new String[1]; - rlabs[0] = " "; - - //Use routine workspace query to get optimal workspace - lwork = -1; - liwork = -1; - //The NAG name equivalent of zggesx is f08xpf - selctg selctg1 = new selctg(); - ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, - rwork, idum, liwork, bwork, info); - zggesx.eval(); - - //Make sure that there is a enough workspace for block size nb - lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); - liwork = Math.max(n + 2, idum[0]); - work = NAGComplex.createArray(lwork); - iwork = new int[liwork]; - - //Read in matrices A and B - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - line = reader.readLine(); //skip n (set manually for neater code) - String[] sVal; - - for(int i = 0; i < 2; i++){ - for(int j = 0; j < n; j++){ - line = reader.readLine(); - sVal = line.split("\\)"); - for(int k = 0; k < n; k++){ - if(i == 0){ - a[(k * n) + j] = parseComplex(sVal[k]); - } - else{ - b[(k * n) + j] = parseComplex(sVal[k]); - } - } - } - } - - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - - if(chkfac){ - for(int i = 0; i < a.length; i++){ - //Copy A and B into D and E respectively - d[i] = a[i]; - e[i] = b[i]; - } - } - - //Find the Forbenius norms of A and B - //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf - F06UA f06ua = new F06UA(); - anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); - bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); - - if(prmat){ - //Print matrices A and B - //ifail : behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - - ifail = 0; - x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - } - - factor = true; - //Find the generalized Schur form - //The NAG name equivalent of zggesx is f08xpf - zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, - rwork, iwork, liwork, bwork, info); - zggesx.eval(); - - //update - sdim = zggesx.getSDIM(); - - if(info != 0 && info != (n + 2)){ - System.out.printf("Failure in ZGGESX. INFO = %d\n", info); - factor = false; - } - else if(chkfac){ - //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D - //The NAG name equivalent of zgemm is f06zaf - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); - zgemm.eval(); - - //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); - zgemm.eval(); - - //Find norms of matrices D and E and warn if either is too large - f06ua = new F06UA("0", ldd, n, d, ldd, rwork); - normd = f06ua.eval(); - X02AJ x02aj = new X02AJ(); - if(normd > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); - factor = false; - System.out.println("Schur factorization has failed"); - } - f06ua = new F06UA("0", lde, n, e, lde, rwork); - norme = f06ua.eval(); - if(norme > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); - factor = false; - } - } - - if(factor){ - //Print eigenvalue details - System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); - System.out.println("(dimension of deflating subspaces)"); - - System.out.println(); - //Print selected (finite) generalized eigenvalues - System.out.println("Selected generalized eigenvalues"); - - //Store absolute values of eigenvalues for ranking - for(int i = 0; i < n; i++){ - work[i] = alpha[i].divide(beta[i]); - rwork[i] = NAGComplex.abs(work[i]); - } - - //Rank eigenvalues - ifail = 0; - M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); - m01da.eval(); - - //Sort eigevalues in work - M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); - m01ed.eval(); - for(int i = 0; i < sdim; i++){ - System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); - } - - if(info == n + 2){ - System.out.println("*** note that rounding errors mean that leading eigenvalues in"); - System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); - System.out.println(); - } - - if(prcond){ - //Compute the machine precision and sqrt(anorm^2 + bnorm^2) - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - F06BN f06bn = new F06BN(anorm, bnorm); - abnorm = f06bn.eval(); - tol = eps * abnorm; - - //Print out the reciprocal condition numbers and error bound for selected eigenvalues - System.out.println("Reciprocal condition numbers for the average of the selected"); - System.out.println("eigenvalues and their asymptotic error bound"); - System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); - } - } - else{ - System.out.println("Schur factorization has failed"); - } - - } - - /** - * Converts String read in from data file to NAGComplex value. - * @param s - * Complex number string - * @return new NAGComplex representing s - */ - public static NAGComplex parseComplex(String s){ - s = s.trim(); - double re = Double.parseDouble(s.substring(1, 7)); - double im = Double.parseDouble(s.substring(8)); - return new NAGComplex(re, im); - } - - /** - * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. - */ - public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ - public boolean eval(){ - return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); - } - } - -} diff --git a/simple_examples/int32/G01ALJE.java b/simple_examples/int32/G01ALJE.java deleted file mode 100644 index 672a151..0000000 --- a/simple_examples/int32/G01ALJE.java +++ /dev/null @@ -1,55 +0,0 @@ -import com.nag.routines.G01.G01AL; - -/** - * G01ALJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G01ALJE{ - - /** - * G01ALJ Example main program - */ - public static void main(String[] args){ - int ifail, n; - double[] x, res; - int[] iwrk; - - res = new double[5]; - - System.out.println("G01ALJ Example Program Results"); - System.out.println(); - - //Problem size - n = 12; - - //Allocate - x = new double[n]; - iwrk = new int[n]; - - //Data - x[0] = 12; - x[1] = 9; - x[2] = 2; - x[3] = 5; - x[4] = 6; - x[5] = 8; - x[6] = 2; - x[7] = 7; - x[8] = 3; - x[9] = 1; - x[10] = 11; - x[11] = 10; - - //Calculate summary statistics - ifail = 0; - G01AL g01al = new G01AL(n, x, iwrk, res, ifail); - g01al.eval(); - - System.out.printf("Maximum %.4f\n", res[4]); - System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); - System.out.printf("Median (50%% quantile) %.4f\n", res[2]); - System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); - System.out.printf("Minimum %.4f\n", res[0]); - } -} diff --git a/simple_examples/int32/G02AKJE.java b/simple_examples/int32/G02AKJE.java deleted file mode 100644 index 8ddaff2..0000000 --- a/simple_examples/int32/G02AKJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.G02.G02AK; -import com.nag.routines.X04.X04CA; - -/** - * G02AK example program text. - * @author joed - * @since 27.0.0.0 - */ -public class G02AKJE { - - /** - * G02AKJ example main program. - */ - public static void main(String[] args) { - - G02AK g02ak = new G02AK(); - X04CA x04ca = new X04CA(); - double errtol, f, rankerr, ranktol; - int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; - double[] g, x; - - System.out.println("G02AKJ Example Program Results\n"); - - // Problem size - n = 4; - ldg = n; - ldx = n; - - // Rank constraint - rank = 2; - - // Matrix G (column-major) - g = new double[]{ - 2.0, -1.0, 0.0, 0.0, - -1.0, 2.0, -1.0, 0.0, - 0.0, -1.0, 2.0, -1.0, - 0.0, 0.0, -1.0, 2.0 - }; - - // Use the defaults for errtol, ranktol, maxits, maxit - errtol = 0.0; - ranktol = 0.0; - maxits = 0; - maxit = 0; - - // Calculate rank constrained nearest correlation matrix - ifail = 0; - x = new double[ldx*n]; - f = 0.0; - rankerr = 0.0; - nsub = 0; - g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, - rankerr, nsub, ifail); - nsub = g02ak.getNSUB(); - f = g02ak.getF(); - rankerr = g02ak.getRANKERR(); - - // Display results - ifail = 0; - x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); - System.out.println(); - System.out.printf("Number of subproblems solved: %12d\n\n", nsub); - System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); - System.out.printf("Rank error: %35.4f\n", rankerr); - - } - -} diff --git a/simple_examples/int32/G02BJJE.java b/simple_examples/int32/G02BJJE.java deleted file mode 100644 index 3de843e..0000000 --- a/simple_examples/int32/G02BJJE.java +++ /dev/null @@ -1,303 +0,0 @@ -import com.nag.routines.G02.G02BJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G02BJ example program text. - * @author ludovic - */ -public class G02BJJE { - - public static void main(String[] args) { - int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; - double[] cnt, r, ssp, std, xbar;//, xmiss; - - if (args.length != 1) { - G02BJJE.usage(); - } - - String dataFile = args[0]; - DataHolder data = new DataHolder(); - readDataFile(dataFile, data); - System.out.println(" G02BJJ Example Program Results"); - System.out.println(); - - ldcnt = ldr = ldssp = data.nvars; - ldx = data.n; - cnt = new double[ldcnt * data.nvars]; - r = new double[ldr * data.nvars]; - ssp = new double[ldssp * data.nvars]; - std = new double[data.nvars]; - xbar = new double[data.nvars]; - - - //Display the data - - System.out.printf(" Number of variables (columns) = %5d\n", data.m); - System.out.printf(" Number of cases (rows) = %5d\n", data.n); - System.out.println(); - System.out.println(" Data matrix is:-"); - for (int ii = 0; ii < data.m; ++ii) { - System.out.printf(" %12d",ii+1); - } - System.out.println(); - for (int ii = 0; ii < data.n; ++ii) { - System.out.printf(" %3d ",ii+1); - for (int jj = 0; jj < data.m; ++jj) { - System.out.printf("%12.4f ",data.x[ii + jj * data.n]); - } - System.out.println(); - } - - ifail = 0; - G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, - data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, - ldcnt, ifail); - g02bj.eval(); - - data.n = g02bj.getN(); - data.m = g02bj.getM(); - data.x = g02bj.getX(); - ldx = g02bj.getLDX(); - data.miss = g02bj.getMISS(); - data.xmiss = g02bj.getXMISS(); - data.nvars = g02bj.getNVARS(); - data.kvar = g02bj.getKVAR(); - xbar = g02bj.getXBAR(); - std = g02bj.getSTD(); - ssp = g02bj.getSSP(); - ldssp = g02bj.getLDSSP(); - r = g02bj.getR(); - ldr = g02bj.getLDR(); - ncases = g02bj.getNCASES(); - cnt = g02bj.getCNT(); - ldcnt = g02bj.getLDCNT(); - ifail = g02bj.getIFAIL(); - - //Display results - System.out.println(); - System.out.println(" Variable\tMean\tSt.dev."); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); - } - System.out.println(); - System.out.println(" Sums of squares and cross-products of deviations"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.println(" Correlation coefficients"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",r[ii + ldr * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); - System.out.println(); - System.out.println(" Numbers used for each pair are:"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); - } - System.out.println(); - } - System.out.println(); - } - - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - /** - G02BJF Example Program Data - 5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 - 12.0 2.0 0.0 0.0 - -1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS - -1.0 0.0 0.0 0.0 :: XMISS - 4 1 2 :: KVAR - */ - private static void readDataFile(String filename, DataHolder data) { - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String line = br.readLine(); // skip header - line = br.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvars(Integer.parseInt(sVal[2])); - - data.x = new double[data.n * data.m]; - data.miss = new int[data.m]; - data.xmiss = new double[data.m]; - data.kvar = new int[data.nvars]; - - for (int i = 0; i < data.n; ++i) { - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.x[i + j * data.n] = Double.parseDouble(sVal[j]); - } - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.miss[j] = Integer.parseInt(sVal[j]); - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.xmiss[j] = Double.parseDouble(sVal[j]); - } - - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.nvars; ++j) { - data.kvar[j] = Integer.parseInt(sVal[j]); - } - } - catch (FileNotFoundException ex) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch (IOException ex) { - System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); - System.exit(-3); - } - - } - - private static class DataHolder { - private int n; - private int m; - private int nvars; - private double[] x; - private int[] miss; - private double[] xmiss; - private int[] kvar; - - /** - * @return the n - */ - public int getN() { - return n; - } - - /** - * @param n the n to set - */ - public void setN(int n) { - this.n = n; - } - - /** - * @return the m - */ - public int getM() { - return m; - } - - /** - * @param m the m to set - */ - public void setM(int m) { - this.m = m; - } - - /** - * @return the nvars - */ - public int getNvars() { - return nvars; - } - - /** - * @param nvars the nvars to set - */ - public void setNvars(int nvars) { - this.nvars = nvars; - } - - /** - * @return the x - */ - public double[] getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(double[] x) { - this.x = x; - } - - /** - * @return the miss - */ - public int[] getMiss() { - return miss; - } - - /** - * @param miss the miss to set - */ - public void setMiss(int[] miss) { - this.miss = miss; - } - - /** - * @return the xmiss - */ - public double[] getXmiss() { - return xmiss; - } - - /** - * @param xmiss the xmiss to set - */ - public void setXmiss(double[] xmiss) { - this.xmiss = xmiss; - } - - /** - * @return the kvar - */ - public int[] getKvar() { - return kvar; - } - - /** - * @param kvar the kvar to set - */ - public void setKvar(int[] kvar) { - this.kvar = kvar; - } - } -} diff --git a/simple_examples/int32/G02BRJE.java b/simple_examples/int32/G02BRJE.java deleted file mode 100644 index 084f478..0000000 --- a/simple_examples/int32/G02BRJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.G02.G02BR; - -/** - * G02BRJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G02BRJE{ - - /** - * G02BRJ Example main program - */ - public static void main(String[] args){ - int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder - double[] rr, work1, work2, x, xmiss; - int[] incase, kworka, kworkb, kworkc, miss; - - System.out.println("G02BRJ Example Program Results"); - System.out.println(); - - //Problem size - n = 9; - m = 3; - itype = 0; - - ldrr = m; - ldx = n; - - //Allocate - rr = new double[ldrr * m]; - work1 = new double[n]; - work2 = new double[n]; - x = new double[ldx * m]; - xmiss = new double[m]; - incase = new int[n]; - kworka = new int[n]; - kworkb = new int[n]; - kworkc = new int[n]; - miss = new int[m]; - - //Data - //X = (1.70, 1.00, 0.50) - // (2.80, 4.00, 3.00) - // (0.60, 6.00, 2.50) - // (1.80, 9.00, 6.00) - // (0.99, 4.00, 2.50) - // (1.40, 2.00, 5.50) - // (1.80, 9.00, 7.50) - // (2.50, 7.00, 0.00) - // (0.99, 5.00, 3.00) - x[0] = 1.7; - x[1] = 2.8; - x[2] = 0.6; - x[3] = 1.8; - x[4] = 0.99; - x[5] = 1.4; - x[6] = 1.8; - x[7] = 2.5; - x[8] = 0.99; - x[9] = 1; - x[10] = 4; - x[11] = 6; - x[12] = 9; - x[13] = 4; - x[14] = 2; - x[15] = 9; - x[16] = 7; - x[17] = 5; - x[18] = 0.5; - x[19] = 3; - x[20] = 2.5; - x[21] = 6; - x[22] = 2.5; - x[23] = 5.5; - x[24] = 7.5; - x[25] = 0; - x[26] = 3; - - //Missing value flags - miss[0] = 1; - miss[1] = 0; - miss[2] = 1; - xmiss[0] = 0.99; - xmiss[1] = 0; - xmiss[2] = 0; - - //Display data - System.out.printf("Number of variables (columns) = %d\n", m); - System.out.printf("Number of case (rows) = %d\n", n); - System.out.println(); - System.out.println("Data matrix is:-\n"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", x[(j * n) + i]); - } - System.out.println(); - } - System.out.println(); - - //Calculate correlation coefficients - ifail = 0; - G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, - work1, work2, ifail); - g02br.eval(); - - //Update - ncases = g02br.getNCASES(); - - //Display results - System.out.println("Matrix of rank correlation coefficients:"); - System.out.println("Upper triangle -- Spearman's"); - System.out.println("Lower triangle -- Kendall's tau"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", rr[(j * m) + i]); - } - System.out.println(); - } - System.out.println(); - System.out.printf("Number of cases actually used: %d\n", ncases); - } -} diff --git a/simple_examples/int32/G02DAJE.java b/simple_examples/int32/G02DAJE.java deleted file mode 100644 index c390197..0000000 --- a/simple_examples/int32/G02DAJE.java +++ /dev/null @@ -1,187 +0,0 @@ -import com.nag.routines.G02.G02BU; -import com.nag.routines.G02.G02DA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G02DAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02DAJE{ - - /** - * G02DAJ Example main program - */ - public static void main(String[] args){ - double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; - int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; - boolean svd = false; - String mean, weight; - double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; - int[] isx; - - System.out.println("G02DAJ Example Program Results"); - System.out.println(); - - c = new double[1]; - wmean = new double[1]; - - //Problem size (can be read in from data file - n = 12; - m = 4; - weight = "U"; - mean = "M"; - - if(weight.toLowerCase().equals("w")){ - lwt = n; - } - else{ - lwt = 0; - } - ldx = n; - - x = new double[ldx * m]; - y = new double[n]; - wt = new double[n]; - isx = new int[m]; - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip n, m, weight, mean - - //Read in data - String[] sVal; - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - x[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - if(lwt > 0){ - wt[i] = Double.parseDouble(sVal[m + 1]); - } - } - - //Read in variable inclusion flags - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < m; i++){ - isx[i] = Integer.parseInt(sVal[i]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Calcluate IP - ip = 0; - for(int i = 0; i < m; i++){ - if(isx[i] == 1){ - ip++; - } - } - if(mean.toLowerCase().equals("m")){ - ip = ip + 1; - } - - //Allocate - ldq = n; - b = new double[ip]; - cov = new double[((ip * ip) + ip)/2]; - h = new double[n]; - p = new double[ip * ip * (ip + 2)]; - q = new double[ldq * (ip + 1)]; - res = new double[n]; - se = new double[ip]; - wk = new double[ip * ip + (5 * (ip - 1))]; - - //Use suggested value for tolerance - tol = 0.000001; - - //fit general linear regression model - ifail = -1; - G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, - ldq, svd, irank, p, tol, wk, ifail); - g02da.eval(); - ifail = g02da.getIFAIL(); - if(ifail != 0){ - if(ifail != 5){ - System.exit(-3); - } - } - - //Calculate (weighted) total sums of squares, adjusted for mean if required - //If in G02DAF, an intercept is added to the regression by including a comlumn of - //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used - //in this call to G02BUF - ifail = 0; - G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); - g02bu.eval(); - - idf = g02da.getIDF(); - irank = g02da.getIRANK(); - //Get effective number of observations (=N if there are no zero weights) - en = (double) idf + irank; - - rss = g02da.getRSS(); - //Calculate R-squared, corrected R-Squared and AIC - rsq = 1 - rss/c[0]; - if(mean.toLowerCase().equals("m")){ - mult = (en - 1) / (en - irank); - } - else{ - mult = en / (en - irank); - } - arsq = 1 - mult * (1 - rsq); - aic = en * Math.log(rss/en) + (2 * irank); - - svd = g02da.getSVD(); - //Disply results - if(svd){ - System.out.printf("Model not of full rank, rank = %d", irank); - System.out.println(); - } - System.out.printf("Residual sum of squares = %.4e\n", rss); - System.out.printf("Degrees of freedom = %d\n", idf); - System.out.printf("R-squared = %.4e\n", rsq); - System.out.printf("Adjusted R-squared = %.4e\n", arsq); - System.out.printf("AIC = %.4e\n", aic); - System.out.println(); - System.out.printf("Variable\tParameter estimate\tStandard error\n"); - System.out.println(); - if(ifail == 0){ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); - } - } - else{ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); - } - } - System.out.println(); - System.out.printf(" Obs\t\t Residuals\t\t H\n"); - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); - } - - } -} diff --git a/simple_examples/int32/G02EEJE.java b/simple_examples/int32/G02EEJE.java deleted file mode 100644 index 5856fde..0000000 --- a/simple_examples/int32/G02EEJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.G02.G02EE; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G02EE example program text. - */ -public class G02EEJE { - - public static void main(String[] args) throws Exception { - int vnlen = 3; - double chrss, f, fin, rss; - rss = chrss = f = Double.NaN; - int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; - boolean addvar = false; - String mean, weight, newvar; - newvar = " "; - double[] exss, p, q, wk, wt, x, y; - int[] isx; - String[] free, model, vname; - - System.out.println(" G02EEJ Example Program Results\n"); - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - String line = dataIn.readLine(); - - String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - mean = data[2].substring(1,2); - weight = data[3].substring(1,2); - fin = Double.parseDouble(data[4]); - - if (weight.equalsIgnoreCase("W")) { - lwt = n; - } - else { - lwt = 0; - } - ldx = n; - - x = new double[ldx*m]; - y = new double[n]; - wt = new double[lwt]; - isx = new int[m]; - vname = new String[m]; - - for (int i = 0; i < vname.length;++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - vname[i] = tmp.toString(); - } - - if (lwt > 0) { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - wt[i] = Double.parseDouble(data[m+1]); - } - } - else { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - } - } - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int i = 0; i < m; ++i) { - isx[i] = Integer.parseInt(data[i]); - } - - data = dataIn.readLine().trim().split("::")[0].trim() - .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); - for (int i = 0; i < m; ++i) { - vname[i] = data[i].substring(0,3); - } - - dataIn.close(); - - maxip = 0; - for (int i = 0; i < m; ++i) { - if (isx[i] > 0) { - ++maxip; - } - } - - if (mean.equalsIgnoreCase("M")) { - maxip += 1; - } - - ldq = n; - model = new String[maxip]; - free = new String[maxip]; - exss = new double[maxip]; - q = new double[ldq*(maxip+2)]; - p = new double[maxip+1]; - wk = new double[2*maxip]; - - for (int i = 0; i < model.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - model[i] = tmp.toString(); - } - for (int i = 0; i < free.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - free[i] = tmp.toString(); - } - istep = 0; - ifail = -1; - - - G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, - addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, - wk,ifail); - for (int i = 0; i < m; ++i) { - g02ee.setIFAIL(0); - g02ee.eval(); - - System.out.printf(" Step %2d\n",g02ee.getISTEP()); - if (!g02ee.getADDVAR()) { - System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - break; - } - else { - System.out.println(" Added variable is "+g02ee.getNEWVAR()); - System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); - System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); - System.out.println(); - System.out.print(" Variables in model:"); - for (int j = 0; j < g02ee.getNTERM(); ++j) { - System.out.print(" "+g02ee.getMODEL()[j]); - } - System.out.println("\n"); - System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); - System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); - System.out.println(); - if (g02ee.getIFR() == 0) { - System.out.println(" No free variables remaining"); - break; - } - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - - } - - } - - } - -} diff --git a/simple_examples/int32/G02MAJE.java b/simple_examples/int32/G02MAJE.java deleted file mode 100644 index 4a8bfcb..0000000 --- a/simple_examples/int32/G02MAJE.java +++ /dev/null @@ -1,130 +0,0 @@ -import com.nag.routines.G02.G02MA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * G02MAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02MAJE{ - - /** - * G02MAJ example main program - */ - public static void main(String[] args){ - int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; - double[] b, d, fitsum, ropt, y; - int[] isx; - - isx = new int[0]; //placeholder - - System.out.println("G02MAJ Example Program Results"); - System.out.println(); - - //data (Could also read in from data file) - //Problem size - n = 20; - m = 6; - - //Model Specification - mtype = 1; - pred = 3; - prey = 1; - mnstep = 6; - lisx = 0; - - //Variable inclusion flags aren't needed in this example - ip = m; - - //Optional arguments (using defaults) - lropt = 0; - ropt = new double[lropt]; - - //D and Y - ldd = n; - y = new double[n]; - d = new double[ldd * m]; - - //Read in D and Y from data file (too large to write out) - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip N, M - line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx - - String sVal[]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - d[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Allocate output arrays - ldb = ip; - b = new double[ldb * (mnstep + 2)]; - fitsum = new double[6 * (mnstep + 1)]; - - //Call the model fitting routine - ifail = -1; - G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, - fitsum, ropt, lropt, ifail); - g02ma.eval(); - ifail = g02ma.getIFAIL(); - if(ifail != 0){ - if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ - //ifail = 112, 161, 162, 163 are warnings, so no need to terminate - System.exit(-2); - } - } - - //update - nstep = g02ma.getNSTEP(); - - //Display the parameter estimates - System.out.printf(" Step\t\t\tParameter Estimate\n"); - System.out.println("------------------------------------------------------"); - for(int i = 0; i < nstep; i++){ - System.out.printf(" %d", (i + 1)); - for(int j = 0; j < ip; j++){ - System.out.printf("\t%.3f", b[j + (i * nstep)]); - } - System.out.printf("\n"); - } - System.out.println(); - System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); - System.out.println(); - System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); - System.out.println("---------------------------------------------------------"); - for(int k = 0; k < nstep; k++){ - System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], - (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], - fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); - } - System.out.println(); - System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); - } -} diff --git a/simple_examples/int32/G03GAJE.java b/simple_examples/int32/G03GAJE.java deleted file mode 100644 index ba20592..0000000 --- a/simple_examples/int32/G03GAJE.java +++ /dev/null @@ -1,355 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import com.nag.routines.G03.G03GA; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * G03GAJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G03GAJE{ - - /** - * G03GAJ example main program. - */ - public static void main(String[] args){ - int i, ldx, lprob, riter, lds, sds, ifail = 0; - double[] w, g, s, f; - double tol, loglik = 0; - - if(args.length != 1){ - G03GAJE.usage(); - } - - // Data file name as argument - String filename = args[0]; - // DataHolder object to hold data read in from data file - DataHolder data = new DataHolder(); - - readDataFile(filename, data); - - System.out.println(" G03GAJ Example Program Results"); - System.out.println(); - - // Leading dimensions - ldx = data.n; - lprob = data.n; - - - switch(data.sopt){ - case 1: - s = new double[data.nvar * data.nvar * data.ng]; - lds = data.nvar; - sds = data.nvar; - break; - case 2: - s = new double[data.nvar * data.nvar * 1]; - lds = data.nvar; - sds = data.nvar; - break; - case 3: - s = new double[data.nvar * data.ng * 1]; - lds = data.nvar; - sds = data.ng; - break; - case 4: - s = new double[data.nvar * 1 * 1]; - lds = data.nvar; - sds = 1; - break; - default: - s = new double[1 * 1 * 1]; - lds = 1; - sds = 1; - break; - } - - // Allocate array size - g = new double[data.nvar * data.ng]; - w = new double[data.ng]; - f = new double[data.n * data.ng]; - tol = 0.0; - riter = 5; - - ifail = 0; - - // Create g03ga object with variables from data file - G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, - lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); - - // Run routine - g03ga.eval(); - - // Update variables - data.n = g03ga.getN(); - data.m = g03ga.getM(); - data.x = g03ga.getX(); - ldx = g03ga.getLDX(); - data.isx = g03ga.getISX(); - data.nvar = g03ga.getNVAR(); - data.ng = g03ga.getNG(); - data.popt = g03ga.getPOPT(); - data.prob = g03ga.getPROB(); - lprob = g03ga.getLPROB(); - data.niter = g03ga.getNITER(); - riter = g03ga.getRITER(); - w = g03ga.getW(); - g = g03ga.getG(); - data.sopt = g03ga.getSOPT(); - s = g03ga.getS(); - lds = g03ga.getLDS(); - sds = g03ga.getSDS(); - f = g03ga.getF(); - tol = g03ga.getTOL(); - loglik = g03ga.getLOGLIK(); - ifail = g03ga.getIFAIL(); - - // Results - X04CA x04ca = new X04CA(); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); - - System.out.println(); - switch(data.sopt){ - case 1: - for(i = 0; i < data.ng; i++){ - ifail = 0; - // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic - // calling X04CA along the 3rd dimension - x04ca.eval("g", "n", data.nvar, data.nvar, - Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), - lds, "Variance-cavariance matrix", ifail); - } - break; - case 2: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); - break; - case 3: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); - break; - case 4: - ifail = 0; - x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); - break; - case 5: - ifail = 0; - x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); - break; - } - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); - - System.out.println(); - System.out.println("No. iterations: " + data.niter); - System.out.printf("Log-likelihood: %.04f\n", loglik); - } - - /** - * Read data from given filename and puts into DataHolder object - * @param filename - * Name of data file (absolute or relative path) - * @param data - * DataHolder object to store data from data file - */ - public static void readDataFile(String filename, DataHolder data){ - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - // Problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvar(Integer.parseInt(sVal[2])); - - // Number of groups - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNg(Integer.parseInt(sVal[0])); - - // Scaling option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setSopt(Integer.parseInt(sVal[0])); - - // Initial probabilities option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setPopt(Integer.parseInt(sVal[0])); - - // Maximum number of iterations - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNiter(Integer.parseInt(sVal[0])); - - // - data.x = new double[data.m * data.n]; - data.prob = new double[data.ng * data.n]; - data.isx = new int[data.m]; - - //Data matrix X - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.m; ++j){ - data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - - //Included variables - if(data.nvar != data.m){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int i = 0; i < data.m; ++i){ - data.isx[i] = Integer.parseInt(sVal[i]); - } - } - - - //Optionally read initial probabilities of group memebership (included in example data) - if(data.popt == 2){ - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.ng; ++j){ - data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - } - - /** - * Stores data from data file for later reference - */ - private static class DataHolder{ - private int n; - private int m; - private int nvar; - private int ng; - private int sopt; - private int popt; - private int niter; - private int isx[]; - private double x[]; - private double prob[]; - - public void setN(int n){ - this.n = n; - } - - public int getN(){ - return n; - } - - public void setM(int m){ - this.m = m; - } - - public int getM(){ - return m; - } - - public void setNvar(int nvar){ - this.nvar = nvar; - } - - public int getNvar(){ - return nvar; - } - - public void setNg(int ng){ - this.ng = ng; - } - - public int getNg(){ - return ng; - } - - public void setSopt(int sopt){ - this.sopt = sopt; - } - - public int getSopt(){ - return sopt; - } - - public void setPopt(int popt){ - this.popt = popt; - } - - public int getPopt(){ - return popt; - } - - public void setNiter(int niter){ - this.niter = niter; - } - - public int getNiter(){ - return niter; - } - - public void setIsx(int[] isx){ - this.isx = isx; - } - - public int[] getIsx(){ - return isx; - } - - public void setX(double[] x){ - this.x = x; - } - - public double[] getX(){ - return x; - } - - public void setProb(double[] prob){ - this.prob = prob; - } - - public double[] getProb(){ - return prob; - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/G05KFJE.java b/simple_examples/int32/G05KFJE.java deleted file mode 100644 index 18ce755..0000000 --- a/simple_examples/int32/G05KFJE.java +++ /dev/null @@ -1,105 +0,0 @@ -import com.nag.routines.G05.G05KF; -import com.nag.routines.G05.G05SA; -import com.nag.routines.Routine; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G05KFJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G05KFJE{ - - /** - * G05KFJ example main program. - */ - public static void main(String[] args){ - //genid, subid only initilised so they can be set in try{} without java throwing error - int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; - int ifail, lstate; - int[] seed, state; - double x[]; - - System.out.println("G05KFJ Example Program Results"); - System.out.println(); - - //No file input given - if(args.length != 1){ - G05KFJE.usage(); - } - - seed = new int[lseed]; - - //Read in data from data fiel - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the base generator information and seed - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - genid = Integer.parseInt(sVal[0]); - subid = Integer.parseInt(sVal[1]); - seed[0] = Integer.parseInt(sVal[2]); - - //Read in sample size - line = reader.readLine(); - sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - lstate = 0; - ifail = 0; - state = new int[lstate]; - - //Initial call to get size of STATE array - G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); - g05kf.eval(); - - //Update local variables - lstate = g05kf.getLSTATE(); - state = g05kf.getSTATE(); - - //Reallocate STATE - state = new int[lstate]; - - //Update object variables - g05kf.setSTATE(state); - g05kf.eval(); - - //Update local variables - state = g05kf.getSTATE(); - - x = new double[n]; - - //Generate the variates - ifail = 0; - G05SA g05sa = new G05SA(n, state, x, ifail); - g05sa.eval(); - - //Display the variates - for(int i = 0; i < x.length; i++){ - System.out.printf("%.4f\n", x[i]); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/G13AWJE.java b/simple_examples/int32/G13AWJE.java deleted file mode 100644 index 9e829bd..0000000 --- a/simple_examples/int32/G13AWJE.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.nag.routines.G01.G01EW; -import com.nag.routines.G13.G13AW; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G13AW example program text. - */ -public class G13AWJE { - - public static void main(String[] args) { - - int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; - double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., - -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., - 88.,122.,126.,114.,85.,64}; - int[] state = new int[1]; - G13AW g13aw = new G13AW(type, p, n, y, ifail); - System.out.println(" G13AWJ Example Program Results\n"); - double ts = g13aw.eval(); - G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); - double pvalue = g01ew.eval(); - ifail = g01ew.getIFAIL(); - if (ifail == 0 || ifail == 201) { - System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); - System.out.printf("associated p-value = %6.3f\n", pvalue); - } - - } - -} diff --git a/simple_examples/int32/G13MEJE.java b/simple_examples/int32/G13MEJE.java deleted file mode 100644 index a768a46..0000000 --- a/simple_examples/int32/G13MEJE.java +++ /dev/null @@ -1,160 +0,0 @@ -import com.nag.routines.G13.G13ME; - -/** - * G13MEJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13MEJE{ - - /** - * G13MEJ main program - */ - public static void main(String[] args){ - double tau; - int ifail, lrcomm, m, nb, pn; - double[] iema, rcomm, sinit, t; - int[] inter, nbVal; - - inter = new int[2]; - - System.out.println("G13MEJ Example Program Results"); - System.out.println(); - - //data (can read in from data file) - //Number of iteration required - m = 2; - - //Decay parameter and interpolation method - tau = 2; - inter[0] = 3; - inter[1] = 2; - - //Initial values - sinit = new double[m + 2]; - sinit[0] = 5; - sinit[1] = 0.5; - sinit[2] = 0.5; - sinit[3] = 0.5; - - //Array of NB values in order - nbVal = new int[3]; - nbVal[0] = 5; - nbVal[1] = 10; - nbVal[2] = 15; - - //First block - double[] t1 = new double[nbVal[0]]; - double[] iema1 = new double[nbVal[0]]; - t1[0] = 7.5; - t1[1] = 8.2; - t1[2] = 18.1; - t1[3] = 22.8; - t1[4] = 25.8; - iema1[0] = 0.6; - iema1[1] = 0.6; - iema1[2] = 0.8; - iema1[3] = 0.1; - iema1[4] = 0.2; - - //Second block - double[] t2 = new double[nbVal[1]]; - double[] iema2 = new double[nbVal[1]]; - t2[0] = 26.8; - t2[1] = 31.1; - t2[2] = 38.4; - t2[3] = 45.9; - t2[4] = 48.2; - t2[5] = 48.9; - t2[6] = 57.9; - t2[7] = 58.5; - t2[8] = 63.9; - t2[9] = 65.2; - iema2[0] = 0.2; - iema2[1] = 0.5; - iema2[2] = 0.7; - iema2[3] = 0.1; - iema2[4] = 0.4; - iema2[5] = 0.7; - iema2[6] = 0.8; - iema2[7] = 0.3; - iema2[8] = 0.2; - iema2[9] = 0.5; - - //Third block - double[] t3 = new double[nbVal[2]]; - double[] iema3 = new double[nbVal[2]]; - t3[0] = 66.6; - t3[1] = 67.4; - t3[2] = 69.3; - t3[3] = 69.9; - t3[4] = 73.0; - t3[5] = 75.6; - t3[6] = 77.0; - t3[7] = 84.7; - t3[8] = 86.8; - t3[9] = 88.0; - t3[10] = 88.5; - t3[11] = 91.0; - t3[12] = 93.0; - t3[13] = 93.7; - t3[14] = 94.0; - iema3[0] = 0.2; - iema3[1] = 0.3; - iema3[2] = 0.8; - iema3[3] = 0.6; - iema3[4] = 0.1; - iema3[5] = 0.7; - iema3[6] = 0.9; - iema3[7] = 0.6; - iema3[8] = 0.3; - iema3[9] = 0.1; - iema3[10] = 0.1; - iema3[11] = 0.4; - iema3[12] = 1.0; - iema3[13] = 1.0; - iema3[14] = 0.1; - - //Print some titles - System.out.printf("\t\t\tIterated\n"); - System.out.println("\t\tTime\t EMA\n"); - System.out.println("--------------------------------"); - - lrcomm = 20 + m; - rcomm = new double[lrcomm]; - - pn = 0; - - //Loop through 3 blocks - for(int i = 0; i < nbVal.length; i++){ - //nb for given block - nb = nbVal[i]; - - //Use data for current block - if(i == 0){ - t = t1; - iema = iema1; - } - else if(i == 1){ - t = t2; - iema = iema2; - } - else{ - t = t3; - iema = iema3; - } - - ifail = 0; - G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); - g13me.eval(); - pn = g13me.getPN(); - - //Display results for this block of data - for(int j = 0; j < nb; j++){ - System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); - } - System.out.println(); - } - } -} - diff --git a/simple_examples/int32/G13NAJE.java b/simple_examples/int32/G13NAJE.java deleted file mode 100644 index 2032eb1..0000000 --- a/simple_examples/int32/G13NAJE.java +++ /dev/null @@ -1,123 +0,0 @@ -import com.nag.routines.G13.G13NA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G13NAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13NAJE{ - - /** - * G13NAJ example main program - */ - public static void main(String[] args){ - double beta = 0; - int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder - double[] param, sparam, y; - int[] tau; - - param = new double[1]; - //Placeholder y to be read in from data file - y = new double[0]; - - System.out.println("G13NAJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - //Allocate enough size to hold the input series - y = new double[n]; - - //Read in the input series - for(int i = 0; i < 10; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < 10; j++){ - y[(i * 10) + j] = Double.parseDouble(sVal[j]); - } - } - - //Read in the type of change point, penalty and minimum segment size - line = reader.readLine(); - sVal = line.split("\\s+"); - ctype = Integer.parseInt(sVal[0]); - iparam = Integer.parseInt(sVal[1]); - beta = Double.parseDouble(sVal[2]); - minss = Integer.parseInt(sVal[3]); - - //Read in the distribution parameter (if required) - if(iparam == 1){ - line = reader.readLine(); - sVal = line.split("\\s+"); - param[0] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Output arrays - tau = new int[n]; - sparam = new double[(2 * n) + 2]; - - ifail = -1; - - //Call routine to detece change points - G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); - g13na.eval(); - - //update - ifail = g13na.getIFAIL(); - ctype = g13na.getCTYPE(); - ntau = g13na.getNTAU(); - - if(ifail == 0 || ifail == 200 || ifail == 201){ - //Display the results - if(ctype == 5 || ctype == 6){ - //Exponential or Poisson distribtion - System.out.printf(" -- Charge Points -- Distribution\n"); - System.out.printf(" Number Position Parameter \n"); - System.out.println("====================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); - } - - } - else{ - //Normal of Gamma distribution - System.out.printf(" -- Charge Points -- --- Distribution ---\n"); - System.out.printf(" Number Position Parameters\n"); - System.out.println("================================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); - } - } - } - if(ifail == 200 || ifail == 201){ - System.out.println("Some truncation occured internally to avoid overflow"); - } - } -} diff --git a/simple_examples/int32/H02BBJE.java b/simple_examples/int32/H02BBJE.java deleted file mode 100644 index 04f4207..0000000 --- a/simple_examples/int32/H02BBJE.java +++ /dev/null @@ -1,92 +0,0 @@ -import com.nag.routines.H.H02BB; - -/** - * H02BBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class H02BBJE{ - - /** - * H02BBJ example main program - */ - public static void main(String[] args){ - double bigbnd, objmip = 0, tolfes, toliv; - int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; - double[] a, bl, bu, cvec, rwork, x; - int[] intvar, iwork; - - System.out.println("H02BBJ Example Program Results"); - System.out.println(); - - //Data (can be read in from data file) - n = 2; - m = 3; - lda = m; - - a = new double[lda * n]; - bl = new double[m + n]; - bu = new double[m + n]; - cvec = new double[n]; - x = new double[n]; - intvar = new int[n]; - - itmax = 0; - msglvl = 10; - maxnod = 0; - intfst = 0; - maxdpt = 4; - tolfes = 0; - toliv = 0; - - cvec[0] = -3; - cvec[1] = -4; - - //A = ( 2, 5) - // ( 2, -2) - // ( 3, 2) - a[0] = 2; - a[1] = 2; - a[2] = 3; - a[3] = 5; - a[4] = -2; - a[5] = 2; - - bigbnd = 1E+20; - - bl[0] = 0; - bl[1] = 0; - bl[2] = -1E+20; - bl[3] = -1E+20; - bl[4] = 5; - - bu[0] = 1E+20; - bu[1] = 1E+20; - bu[2] = 15; - bu[3] = 5; - bu[4] = 1E+20; - - intvar[0] = 1; - intvar[1] = 1; - - x[0] = 1; - x[1] = 1; - - liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; - //Math.pow() needs to be casted to int in java - lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); - iwork = new int[liwork]; - rwork = new double[lrwork]; - - ifail = 0; - - H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, - tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); - h02bb.eval(); - } -} - - - - - diff --git a/simple_examples/int32/H02DAJE.java b/simple_examples/int32/H02DAJE.java deleted file mode 100644 index 6e90401..0000000 --- a/simple_examples/int32/H02DAJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import com.nag.routines.H.H02DA; -import com.nag.routines.H.H02ZK; -import com.nag.routines.H.H02ZL; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * H02DAJ exmaple program text - * @author willa - * @since 27.1.0.0 - */ -public class H02DAJE{ - - /** - * H02DAJ example main program - */ - public static void main(String[] args){ - double acc, accqp = 0, objmip = 0; - int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; - String cvalue; - double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; - int[] iopts, iuser, varcon; - - System.out.println("H02DAJ Example Program Results"); - System.out.println(); - - opts = new double[100]; - ruser = new double[1]; - iopts = new int[200]; - iuser = new int[1]; - - //Blank 40 character string to represent ```Character (40) :: cvalue``` - char[] ch = new char[40]; - Arrays.fill(ch, ' '); - cvalue = new String(ch); - - n = 8; - nclin = 5; - ncnln = 2; - lda = nclin; - - a = new double[lda * n]; - d = new double[nclin]; - ax = new double[nclin]; - bl = new double[n]; - bu = new double[n]; - varcon = new int[n + nclin + ncnln]; - x = new double[n]; - c = new double[ncnln]; - cjac = new double[ncnln * n]; - objgrd = new double[n]; - - //Set variable types: continuous then binary - varcon[0] = 0; - varcon[1] = 0; - varcon[2] = 0; - varcon[3] = 0; - varcon[4] = 1; - varcon[5] = 1; - varcon[6] = 1; - varcon[7] = 1; - - //Set continuous variable bounds - bl[0] = 0; - bl[1] = 0; - bl[2] = 0; - bl[3] = 0; - bu[0] = 1000; - bu[1] = 1000; - bu[2] = 1000; - bu[3] = 1000; - - //Bounds for binary variables need not be provided - bl[4] = 0; - bl[5] = 0; - bl[6] = 0; - bl[7] = 0; - bu[4] = 1; - bu[5] = 1; - bu[6] = 1; - bu[7] = 1; - - //Set linear constraint, equality first - varcon[n] = 3; - varcon[n + 1] = 4; - varcon[n + 2] = 4; - varcon[n + 3] = 4; - varcon[n + 4] = 4; - - //Set Ax=d then Ax>=d - //( 1, 1, 1, 1, 0, 0, 0, 0) - //(-1, 0, 0, 0, 1, 0, 0, 0) - //( 0,-1, 0, 0, 0, 1, 0, 0) - //( 0, 0,-1, 0, 0, 0, 1, 0) - //( 0, 0, 0,-1, 0, 0, 0, 1) - a[0] = 1; - a[1] = -1; - a[5] = 1; - a[7] = -1; - a[10] = 1; - a[13] = -1; - a[15] = 1; - a[19] = -1; - a[21] = 1; - a[27] = 1; - a[33] = 1; - a[39] = 1; - d[0] = 1; - d[1] = 0; - d[2] = 0; - d[3] = 0; - d[4] = 0; - - //Set constraints supplied by CONFUN, equality first - varcon[n + nclin] = 3; - varcon[n + nclin + 1] = 4; - - liopts = iopts.length; - lopts = opts.length; - - //Initialize communication arrays - ifail = 0; - H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); - h02zk.eval(); - - - //Optimization parameters - maxit = 500; - acc = 0.000001; - - //Initial estimate (binary variables need not be given) - x[0] = 1; - x[1] = 1; - x[2] = 1; - x[3] = 1; - x[4] = 0; - x[5] = 0; - x[6] = 0; - x[7] = 0; - - //Portfolio parameters p and rho - iuser[0] = 3; - ruser[0] = 10; - - ifail = 0; - //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines - objfun objfun1 = new objfun(); - confun confun1 = new confun(); - H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, - objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); - h02da.eval(); - - //Results - ifail = h02da.getIFAIL(); - if(ifail == 0){ - X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); - x04ca.eval(); - - //Query the accuracy of the mixed integer QP Solver - ifail = -1; - H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); - h02zl.eval(); - - //Update values to print - accqp = h02zl.getRVALUE(); - objmip = h02da.getOBJMIP(); - ifail = h02zl.getIFAIL(); - if(ifail == 0){ - System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); - } - System.out.printf("Optimised value:\t%.3f\n", objmip); - } - else{ - System.out.printf("h02daf returns ifail = %d\n", ifail); - } - } - - /** - * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA - */ - public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ - public void eval(){ - if(this.MODE == 0){ - //Objective value - this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) - + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) - + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); - } - else{ - //Objective gradients for continous varaiables - this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); - this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); - this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); - this.OBJGRD[3] = 0; - } - } - } - - /** - * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA - */ - public static class confun extends H02DA.Abstract_H02DA_CONFUN{ - public void eval(){ - if(this.MODE == 0){ - //Constraints - int p = this.IUSER[0]; - double rho = this.RUSER[0]; - - //Mean return rho: - this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; - //Maximum of p assets in portfolio - this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; - } - else{ - //Jacobian - this.CJAC[0] = 8; - this.CJAC[2] = 9; - this.CJAC[4] = 12; - this.CJAC[6] = 7; - //c[2] does not include continuours varaibles which requries that their derivatives are zero - this.CJAC[1] = 0; - this.CJAC[3] = 0; - this.CJAC[5] = 0; - this.CJAC[7] = 0; - } - } - } -} diff --git a/simple_examples/int32/M01CCJE.java b/simple_examples/int32/M01CCJE.java deleted file mode 100644 index fda5e2f..0000000 --- a/simple_examples/int32/M01CCJE.java +++ /dev/null @@ -1,42 +0,0 @@ -import com.nag.routines.M01.M01CC; -import java.io.*; - -/** - * M01CC example program text. - */ -public class M01CCJE { - - public static void main(String[] args) throws Exception { - - String[] ch; - String order = "Reverse ASCII"; - int m1,m2,l1,l2; - int ifail = 0; - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); - ch = new String[m2]; - m1 = 1; - for (int i = m1-1; i < m2; ++i) { - ch[i] = dataIn.readLine(); - } - dataIn.close(); - l1 = 7; - l2 = 12; - - System.out.println(" M01CCJ Example Program Results"); - M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); - m01cc.eval(); - ifail = m01cc.getIFAIL(); - System.out.println(); - System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); - System.out.println(); - for (int i = m1-1; i < m2; ++i) { - System.out.println(" "+ch[i]); - } - - } - -} diff --git a/simple_examples/int32/S01BAJE.java b/simple_examples/int32/S01BAJE.java deleted file mode 100644 index 4bf2823..0000000 --- a/simple_examples/int32/S01BAJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.S.S01BA; - -/** - * S01BAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S01BAJE{ - - /** - * S01BAJE main program - */ - public static void main(String[] args){ - double y; - int ifail; - double[] xVal; //data - - //store data - xVal = new double[6]; - xVal[0] = 2.5; - xVal[1] = 0.125; - xVal[2] = -0.906; - xVal[3] = 0.00129; - xVal[4] = -0.00000783; - xVal[5] = 0.000000001; - - System.out.println("S01BAJ Example Program Results"); - System.out.println(); - System.out.printf("\tX\t\tY\n"); - - for(double x : xVal){ - ifail = -1; - S01BA s01ba = new S01BA(x, ifail); - y = s01ba.eval(); - - System.out.printf("\t%.4e\t%.4e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10AAJE.java b/simple_examples/int32/S10AAJE.java deleted file mode 100644 index 2a0878a..0000000 --- a/simple_examples/int32/S10AAJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.S.S10AA; - -/** - * S10AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10AAJE{ - - /** - * S10AAJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[4]; - xVal[0] = -20; - xVal[1] = -5.0; - xVal[2] = 0.5; - xVal[3] = 5.0; - - System.out.println("S10AAJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AA s10aa = new S10AA(x, ifail); - y = s10aa.eval(); - ifail = s10aa.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ABJE.java b/simple_examples/int32/S10ABJE.java deleted file mode 100644 index dd84ab7..0000000 --- a/simple_examples/int32/S10ABJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AB; - -/** - * S10ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ABJE{ - - /** - * S10ABJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ABJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AB s10ab = new S10AB(x, ifail); - y = s10ab.eval(); - ifail = s10ab.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ACJE.java b/simple_examples/int32/S10ACJE.java deleted file mode 100644 index cc0c04c..0000000 --- a/simple_examples/int32/S10ACJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AC; - -/** - * S10ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ACJE{ - - /** - * S10ACJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ACJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AC s10ac = new S10AC(x, ifail); - y = s10ac.eval(); - ifail = s10ac.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S14ABJE.java b/simple_examples/int32/S14ABJE.java deleted file mode 100644 index 673a4b3..0000000 --- a/simple_examples/int32/S14ABJE.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.nag.routines.S.S14AB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ABJE{ - - /** - * S14ABJ example main program - */ - public static void main(String[] args){ - double x, y; - int ifail; - - System.out.println("S14ABJ Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //loop until break - while(true){ - line = reader.readLine(); - - //if finished looping through file break - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[1]); - - ifail = -1; - S14AB s14ab = new S14AB(x, ifail); - y = s14ab.eval(); - //update ifail - ifail = s14ab.getIFAIL(); - - if(ifail < 0){ - break; - } - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S14ACJE.java b/simple_examples/int32/S14ACJE.java deleted file mode 100644 index e2fff05..0000000 --- a/simple_examples/int32/S14ACJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.S.S14AC; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ACJE{ - - /** - * S14ACJ example main program - */ - public static void main(String[] args){ - double f, x; - int ifail; - - System.out.println("S14ACJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\tpsi(X)-log(X)\n"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[0]); - - ifail = -1; - S14AC s14ac = new S14AC(x, ifail); - f = s14ac.eval(); - ifail = s14ac.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("\t%.4f\t%.4f\n", x, f); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S14AFJE.java b/simple_examples/int32/S14AFJE.java deleted file mode 100644 index 9005cc1..0000000 --- a/simple_examples/int32/S14AFJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.S.S14AF; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14AFJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14AFJE{ - - /** - * S14AFJ Example main program - */ - public static void main(String[] args){ - NAGComplex y, z; - int ifail, k; - - //Tell the wrapper the type of complex being used before calling a routine - Routine.setComplex(new NAGComplex()); - - y = new NAGComplex(); - z = new NAGComplex(); - - System.out.println("S14AFJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); - - System.out.println(); - System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); - System.out.println(); - - //loop until break... - while(true){ - line = reader.readLine(); - - //end of file reached - if(line == null){ - break; - } - - String[] sVal = line.split("\\s+"); - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - k = Integer.parseInt(sVal[2]); - - ifail = -1; - S14AF s14af = new S14AF(z, k, ifail); - y = (NAGComplex) s14af.eval(); - ifail = s14af.getIFAIL(); - - //ifail < 0 => error - if(ifail < 0){ - break; - } - System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S17DCJE.java b/simple_examples/int32/S17DCJE.java deleted file mode 100644 index ba01290..0000000 --- a/simple_examples/int32/S17DCJE.java +++ /dev/null @@ -1,69 +0,0 @@ -import com.nag.routines.S.S17DC; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class S17DCJE{ - private static int n = 2; - - public static void main(String[] args){ - double fnu; - int ifail, nz = 0; - String scal; - NAGComplex z; - NAGComplex[] cwrk, cy; - - z = new NAGComplex(); - //initiate complex arrays like this to save looping through and doing it manually by looping through - cwrk = NAGComplex.createArray(n); - cy = NAGComplex.createArray(n); - - System.out.println("S17DCF Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - System.out.println(); - System.out.printf("Calling with N = %d\n", n); - System.out.println(); - System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - fnu = Double.parseDouble(sVal[0]); - z.setRe(Double.parseDouble(sVal[1])); - z.setIm(Double.parseDouble(sVal[2])); - scal = sVal[3].substring(1,2); - - ifail = 0; - S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); - s17dc.eval(); - - System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S17DGJE.java b/simple_examples/int32/S17DGJE.java deleted file mode 100644 index b93c9e0..0000000 --- a/simple_examples/int32/S17DGJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.S.S17DG; -import com.nag.types.NAGComplex; -import java.io.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * S17DG example program text. - */ -public class S17DGJE { - - public static void main(String[] args) throws Exception { - String deriv,scal; - int ifail = 1; - NAGComplex z,ai; - int nz = -1; - z = new NAGComplex(); - ai = new NAGComplex(); - ai.setRe(Double.NaN); - ai.setIm(Double.NaN); - - System.out.println(" S17DGJ Example Program Results"); - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - System.out.println(); - System.out.println(" DERIV Z SCAL AI NZ"); - System.out.println(); - String line = dataIn.readLine(); - Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," - + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); - Matcher m; - S17DG s17dg = new S17DG(); - while (line != null) { - m = linePatt.matcher(line); - if (m.matches()) { - deriv = m.group(1); - z.setRe(Double.parseDouble(m.group(2))); - z.setIm(Double.parseDouble(m.group(3))); - scal = m.group(4); - ifail = 1;// SOFT AND SILENT FAILURE - s17dg.eval(deriv,z,scal,ai,nz,ifail); - if (s17dg.getIFAIL() == 0) { - System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", - s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), - s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); - } - else { - System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); - System.exit(-1); - } - } - else { - System.out.println("Can't match:\n"+line); - } - line = dataIn.readLine(); - } - - } - -} diff --git a/simple_examples/int32/S30AAJE.java b/simple_examples/int32/S30AAJE.java deleted file mode 100644 index 7e01ffe..0000000 --- a/simple_examples/int32/S30AAJE.java +++ /dev/null @@ -1,109 +0,0 @@ -import com.nag.routines.S.S30AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S30AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S30AAJE{ - - /** - * S30AAJ main program - */ - public static void main(String[] args){ - double q = 0, r = 0, s = 0, sigma = 0; - int ifail, ldp, m = 0, n = 0; - String calput = ""; //placeholders - double[] p, t, x; - - //placeholders - t = new double[0]; - x = new double[0]; - - System.out.println("S30AAJ Example Program Results"); - - //Supply file path as arugment - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - calput = sVal[0].substring(1,2); - - line = reader.readLine(); - sVal = line.split("\\s+"); - s = Double.parseDouble(sVal[0]); - sigma = Double.parseDouble(sVal[1]); - r = Double.parseDouble(sVal[2]); - q = Double.parseDouble(sVal[3]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - n = Integer.parseInt(sVal[1]); - - t = new double[n]; - x = new double[m]; - - for(int i = 0; i < m; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[0]); - } - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - t[i] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ldp = m; - p = new double[ldp * n]; - - ifail = 0; - S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); - s30aa.eval(); - - System.out.println(); - System.out.println("Black-Scholes-Merton formula"); - - if(calput.toLowerCase().equals("c")){ - System.out.println("European Call : "); - } - else if(calput.toLowerCase().equals("p")){ - System.out.println("European Put : "); - } - - System.out.printf(" Spot =\t%.4f\n", s); - System.out.printf(" Volatility =\t%.4f\n", sigma); - System.out.printf(" Rate =\t%.4f\n", r); - System.out.printf(" Dividend =\t%.4f\n", q); - - System.out.println(); - System.out.printf(" Strike\tExpiry\tOption Price\n"); - for(int i = 0; i < m; i++){ - for(int j = 0; j < n; j++){ - System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); - } - } - } -} - diff --git a/simple_examples/int32/S30ACJE.java b/simple_examples/int32/S30ACJE.java deleted file mode 100644 index 8d994dc..0000000 --- a/simple_examples/int32/S30ACJE.java +++ /dev/null @@ -1,129 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -import com.nag.routines.S.S30AC; - -/** - * S30AC example program text. - */ -public class S30ACJE { - - public static void main(String[] args) { - - int i, ifail, mode = 0, n = 0; - String calput; - - double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; - int[] ivalid = null; - - // Strings must be length expected by Fortran - calput = getBlankString(1); - - /* Header */ - System.out.println(" S30ACJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - System.out.println(); - System.out.println(" SIGMA IVALID"); - System.out.println(); - - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - calput = sVal[0].replaceAll("\'", ""); - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - mode = Integer.parseInt(sVal[1]); - - line = reader.readLine(); // skip empty line - - p = new double[n]; - k = new double[n]; - s0 = new double[n]; - t = new double[n]; - r = new double[n]; - sigma = new double[n]; - ivalid = new int[n]; - - // Read p, k, s0, t and r from data file - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - p[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - k[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - s0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - t[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - r[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find the implied volatilities, sigma - ifail = 0; - S30AC s30ac = new S30AC(); - s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); - - // Print solution - for (i = 0; i < n; i++) { - System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); - } - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } -} diff --git a/simple_examples/int32/X03AAJE.java b/simple_examples/int32/X03AAJE.java deleted file mode 100644 index b03f1ab..0000000 --- a/simple_examples/int32/X03AAJE.java +++ /dev/null @@ -1,87 +0,0 @@ -import com.nag.routines.X03.X03AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * X03AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class X03AAJE{ - - /** - * X03AAJ example main program. - */ - public static void main(String[] args){ - int n = 3; - double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder - int ifail, isizea, isizeb, istepa, istepb; - boolean sw; - double[] a, b; - - a = new double[n * n]; - b = new double[n]; - - System.out.println("X03AAF Example Program Results"); - System.out.println(); - - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //stored column wise - //a = (-2, -3, 7) - // ( 2, -5, 3) - // (-9, 1, 0) - for(int i = 0; i < n; i++){ - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < n; i++){ - String[] sVal = line.split("\\s+"); - b[i] = Double.parseDouble(sVal[i + 1]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - c1 = 1; - c2 = 0; - isizea = n; - isizeb = n; - istepa = 1; - istepb = 1; - sw = true; - - ifail = 0; - X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); - x03aa.eval(); - - //update - c1 = x03aa.getC1(); - c2 = x03aa.getC2(); - d1 = x03aa.getD1(); - d2 = x03aa.getD2(); - - System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); - } -} diff --git a/simple_examples/int32/X04CBJE.java b/simple_examples/int32/X04CBJE.java deleted file mode 100644 index fa77c3a..0000000 --- a/simple_examples/int32/X04CBJE.java +++ /dev/null @@ -1,53 +0,0 @@ -import com.nag.routines.X04.X04CB; - -/** - * X04CBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class X04CBJE{ - - /** - * X04CBJ example main program - */ - public static void main(String[] args){ - int nmax = 5, lda = nmax, ifail, indent, ncols; - double[] a; - - a = new double[lda * nmax]; - - String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; - String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; - - System.out.println("X04CBJ Example Program Results"); - System.out.println(); - - //generate an array of data - for(int i = 0; i < nmax; i++){ - for(int j = 0; j < lda; j++){ - a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); - } - } - - ncols = 80; - indent = 0; - - //Print 3 by nmax rectangular matrix with default format and integer row and column labels - ifail = 0; - X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", - clabs, ncols, indent, ifail); - x04cb.eval(); - System.out.println(); - - //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels - ifail = 0; - x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", - clabs, ncols, indent, ifail); - System.out.println(); - - //Print 3 by nmax lower triangular matrix in MATLAB format - //Row and column labelling is ignored - ifail = 0; - x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); - } -} diff --git a/simple_examples/int32/X05ABJE.java b/simple_examples/int32/X05ABJE.java deleted file mode 100644 index acb3804..0000000 --- a/simple_examples/int32/X05ABJE.java +++ /dev/null @@ -1,25 +0,0 @@ -import com.nag.routines.X05.X05AB; - -/** - * X05AB example program text. - */ -public class X05ABJE { - - public static void main(String[] args) { - - int[] itime = new int[7]; - - itime[0] = 1789; - itime[1] = 7; - itime[2] = 14; - itime[3] = 13; - itime[4] = 11; - itime[5] = 48; - itime[6] = 320; - - System.out.println(" X05ABJ Example Program Results"); - System.out.println((new X05AB(itime)).eval()); - - } - -} From 12a9aae933e202af5c9acd2d4290b5e4b7739679 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:23:50 +0000 Subject: [PATCH 114/196] Simple Examples Synced --- simple_examples/D02NEJE.java | 776 +++++++++++++++++------------------ simple_examples/D02TLJE.java | 580 +++++++++++++------------- simple_examples/D03RAJE.java | 614 +++++++++++++-------------- simple_examples/D03RBJE.java | 776 +++++++++++++++++------------------ simple_examples/F01ELJE.java | 178 ++++---- simple_examples/F02EKJE.java | 454 ++++++++++---------- simple_examples/F02FKJE.java | 460 ++++++++++----------- simple_examples/F02WGJE.java | 264 ++++++------ 8 files changed, 2051 insertions(+), 2051 deletions(-) diff --git a/simple_examples/D02NEJE.java b/simple_examples/D02NEJE.java index 3d90bb8..34a5b25 100644 --- a/simple_examples/D02NEJE.java +++ b/simple_examples/D02NEJE.java @@ -1,388 +1,388 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/D02TLJE.java b/simple_examples/D02TLJE.java index 9333518..601b3ce 100644 --- a/simple_examples/D02TLJE.java +++ b/simple_examples/D02TLJE.java @@ -1,290 +1,290 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/D03RAJE.java b/simple_examples/D03RAJE.java index 03c2e3b..88d49aa 100644 --- a/simple_examples/D03RAJE.java +++ b/simple_examples/D03RAJE.java @@ -1,307 +1,307 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/D03RBJE.java b/simple_examples/D03RBJE.java index 97faf1c..9b1b482 100644 --- a/simple_examples/D03RBJE.java +++ b/simple_examples/D03RBJE.java @@ -1,388 +1,388 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/F01ELJE.java b/simple_examples/F01ELJE.java index 93ffe77..9986c6c 100644 --- a/simple_examples/F01ELJE.java +++ b/simple_examples/F01ELJE.java @@ -1,89 +1,89 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/F02EKJE.java b/simple_examples/F02EKJE.java index ffdced6..3737022 100644 --- a/simple_examples/F02EKJE.java +++ b/simple_examples/F02EKJE.java @@ -1,227 +1,227 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/F02FKJE.java b/simple_examples/F02FKJE.java index ecdac2e..0dd7ab9 100644 --- a/simple_examples/F02FKJE.java +++ b/simple_examples/F02FKJE.java @@ -1,230 +1,230 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/F02WGJE.java b/simple_examples/F02WGJE.java index 5e077cb..36c26c6 100644 --- a/simple_examples/F02WGJE.java +++ b/simple_examples/F02WGJE.java @@ -1,132 +1,132 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} From 3d697e15011521faf7d2e22b44929c100a6c66ec Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:27:24 +0000 Subject: [PATCH 115/196] Simple Examples Synced --- simple_examples/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/mytemp diff --git a/simple_examples/mytemp b/simple_examples/mytemp new file mode 100644 index 0000000..e69de29 From 9689d1f7fc7f1571c753b6a5ab5cb8cd4666cce4 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 13:36:46 +0000 Subject: [PATCH 116/196] Simple Examples Synced --- simple_examples/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/mytemp diff --git a/simple_examples/mytemp b/simple_examples/mytemp deleted file mode 100644 index e69de29..0000000 From cc87ce5c606668667eb7bf49bf84b2427308e17c Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:08:22 +0000 Subject: [PATCH 117/196] Simple Examples Synced --- simple_examples/{ => int32}/A00AAJE.java | 0 simple_examples/{ => int32}/A00ACJE.java | 0 simple_examples/{ => int32}/A00ADJE.java | 0 simple_examples/{ => int32}/C02AAJE.java | 0 simple_examples/{ => int32}/C02ABJE.java | 0 simple_examples/{ => int32}/C02AFJE.java | 0 simple_examples/{ => int32}/C02AGJE.java | 0 simple_examples/{ => int32}/C02AHJE.java | 0 simple_examples/{ => int32}/C02AJJE.java | 0 simple_examples/{ => int32}/C02AKJE.java | 0 simple_examples/{ => int32}/C02ALJE.java | 0 simple_examples/{ => int32}/C02AMJE.java | 0 simple_examples/{ => int32}/C02ANJE.java | 0 simple_examples/{ => int32}/C05AUJE.java | 0 simple_examples/{ => int32}/C05AWJE.java | 0 simple_examples/{ => int32}/C05AYJE.java | 0 simple_examples/{ => int32}/C05AZJE.java | 0 simple_examples/{ => int32}/C05BBJE.java | 0 simple_examples/{ => int32}/C05MBJE.java | 0 simple_examples/{ => int32}/C05QBJE.java | 0 simple_examples/{ => int32}/C06BAJE.java | 0 simple_examples/{ => int32}/C06FKJE.java | 0 simple_examples/{ => int32}/C09AAJE.java | 0 simple_examples/{ => int32}/D01BDJE.java | 0 simple_examples/{ => int32}/D01RJJE.java | 0 simple_examples/{ => int32}/D01RKJE.java | 0 simple_examples/{ => int32}/D01RLJE.java | 0 simple_examples/{ => int32}/D01RMJE.java | 0 simple_examples/{ => int32}/D01TCJE.java | 0 simple_examples/int32/D02NEJE.java | 388 +++++++++++++++++++++ simple_examples/int32/D02TLJE.java | 290 ++++++++++++++++ simple_examples/{ => int32}/D03PCJE.java | 0 simple_examples/int32/D03RAJE.java | 307 +++++++++++++++++ simple_examples/int32/D03RBJE.java | 388 +++++++++++++++++++++ simple_examples/{ => int32}/D05BAJE.java | 0 simple_examples/{ => int32}/D05BEJE.java | 0 simple_examples/{ => int32}/DTFSMJE.java | 0 simple_examples/{ => int32}/E01DAJE.java | 0 simple_examples/{ => int32}/E02ALJE.java | 0 simple_examples/{ => int32}/E04ABJE.java | 0 simple_examples/{ => int32}/E04BBJE.java | 0 simple_examples/{ => int32}/E04CBJE.java | 0 simple_examples/{ => int32}/E04FCJE.java | 0 simple_examples/{ => int32}/E04FFJE.java | 0 simple_examples/{ => int32}/E04GBJE.java | 0 simple_examples/{ => int32}/E04GGJE.java | 0 simple_examples/{ => int32}/E04MTJE.java | 0 simple_examples/{ => int32}/E04MXJE.java | 0 simple_examples/{ => int32}/E04NCJE.java | 0 simple_examples/{ => int32}/E04NFJE.java | 0 simple_examples/{ => int32}/E04NKJE.java | 0 simple_examples/{ => int32}/E04NQJE.java | 0 simple_examples/{ => int32}/E04PTJE.java | 0 simple_examples/{ => int32}/E04RPJE.java | 0 simple_examples/{ => int32}/E04RSJE.java | 0 simple_examples/{ => int32}/E04RTJE.java | 0 simple_examples/{ => int32}/E04SAJE.java | 0 simple_examples/{ => int32}/E04TAJE.java | 0 simple_examples/{ => int32}/E04TCJE.java | 0 simple_examples/{ => int32}/E04UCJE.java | 0 simple_examples/{ => int32}/E04YAJE.java | 0 simple_examples/{ => int32}/F01ADJE.java | 0 simple_examples/{ => int32}/F01CKJE.java | 0 simple_examples/{ => int32}/F01CRJE.java | 0 simple_examples/{ => int32}/F01DGJE.java | 0 simple_examples/int32/F01ELJE.java | 89 +++++ simple_examples/{ => int32}/F01EMJE.java | 0 simple_examples/int32/F02EKJE.java | 227 +++++++++++++ simple_examples/int32/F02FKJE.java | 230 +++++++++++++ simple_examples/int32/F02WGJE.java | 132 +++++++ simple_examples/{ => int32}/F03BAJE.java | 0 simple_examples/{ => int32}/F04AMJE.java | 0 simple_examples/{ => int32}/F04BAJE.java | 0 simple_examples/{ => int32}/F05AAJE.java | 0 simple_examples/{ => int32}/F06CLJE.java | 0 simple_examples/{ => int32}/F07AAJE.java | 0 simple_examples/{ => int32}/F07ABJE.java | 0 simple_examples/{ => int32}/F07ADJE.java | 0 simple_examples/{ => int32}/F07AQJE.java | 0 simple_examples/{ => int32}/F07FAJE.java | 0 simple_examples/{ => int32}/F07FBJE.java | 0 simple_examples/{ => int32}/F08BTJE.java | 0 simple_examples/{ => int32}/F08FAJE.java | 0 simple_examples/{ => int32}/F08XPJE.java | 0 simple_examples/{ => int32}/G01ALJE.java | 0 simple_examples/{ => int32}/G02AKJE.java | 0 simple_examples/{ => int32}/G02BJJE.java | 0 simple_examples/{ => int32}/G02BRJE.java | 0 simple_examples/{ => int32}/G02DAJE.java | 0 simple_examples/{ => int32}/G02EEJE.java | 0 simple_examples/{ => int32}/G02MAJE.java | 0 simple_examples/{ => int32}/G03GAJE.java | 0 simple_examples/{ => int32}/G05KFJE.java | 0 simple_examples/{ => int32}/G13AWJE.java | 0 simple_examples/{ => int32}/G13MEJE.java | 0 simple_examples/{ => int32}/G13NAJE.java | 0 simple_examples/{ => int32}/H02BBJE.java | 0 simple_examples/{ => int32}/H02DAJE.java | 0 simple_examples/{ => int32}/M01CCJE.java | 0 simple_examples/{ => int32}/S01BAJE.java | 0 simple_examples/{ => int32}/S10AAJE.java | 0 simple_examples/{ => int32}/S10ABJE.java | 0 simple_examples/{ => int32}/S10ACJE.java | 0 simple_examples/{ => int32}/S14ABJE.java | 0 simple_examples/{ => int32}/S14ACJE.java | 0 simple_examples/{ => int32}/S14AFJE.java | 0 simple_examples/{ => int32}/S17DCJE.java | 0 simple_examples/{ => int32}/S17DGJE.java | 0 simple_examples/{ => int32}/S30AAJE.java | 0 simple_examples/{ => int32}/S30ACJE.java | 0 simple_examples/{ => int32}/X03AAJE.java | 0 simple_examples/{ => int32}/X04CBJE.java | 0 simple_examples/{ => int32}/X05ABJE.java | 0 simple_examples/int64/A00AAJE.java | 14 + simple_examples/int64/A00ADJE.java | 113 ++++++ simple_examples/int64/C05AYJE.java | 45 +++ simple_examples/int64/C05AZJE.java | 65 ++++ simple_examples/int64/C05MBJE.java | 104 ++++++ simple_examples/int64/C05QBJE.java | 178 ++++++++++ simple_examples/int64/D01BDJE.java | 57 ++++ simple_examples/int64/D02NEJE.java | 393 +++++++++++++++++++++ simple_examples/int64/DTFSMJE.java | 61 ++++ simple_examples/int64/E01DAJE.java | 177 ++++++++++ simple_examples/int64/E04FCJE.java | 415 +++++++++++++++++++++++ simple_examples/int64/E04MTJE.java | 134 ++++++++ simple_examples/int64/E04NFJE.java | 223 ++++++++++++ simple_examples/int64/E04UCJE.java | 207 +++++++++++ simple_examples/int64/F02EKJE.java | 230 +++++++++++++ simple_examples/withdrawn/D02TKJE.java | 290 ++++++++++++++++ 129 files changed, 4757 insertions(+) rename simple_examples/{ => int32}/A00AAJE.java (100%) rename simple_examples/{ => int32}/A00ACJE.java (100%) rename simple_examples/{ => int32}/A00ADJE.java (100%) rename simple_examples/{ => int32}/C02AAJE.java (100%) rename simple_examples/{ => int32}/C02ABJE.java (100%) rename simple_examples/{ => int32}/C02AFJE.java (100%) rename simple_examples/{ => int32}/C02AGJE.java (100%) rename simple_examples/{ => int32}/C02AHJE.java (100%) rename simple_examples/{ => int32}/C02AJJE.java (100%) rename simple_examples/{ => int32}/C02AKJE.java (100%) rename simple_examples/{ => int32}/C02ALJE.java (100%) rename simple_examples/{ => int32}/C02AMJE.java (100%) rename simple_examples/{ => int32}/C02ANJE.java (100%) rename simple_examples/{ => int32}/C05AUJE.java (100%) rename simple_examples/{ => int32}/C05AWJE.java (100%) rename simple_examples/{ => int32}/C05AYJE.java (100%) rename simple_examples/{ => int32}/C05AZJE.java (100%) rename simple_examples/{ => int32}/C05BBJE.java (100%) rename simple_examples/{ => int32}/C05MBJE.java (100%) rename simple_examples/{ => int32}/C05QBJE.java (100%) rename simple_examples/{ => int32}/C06BAJE.java (100%) rename simple_examples/{ => int32}/C06FKJE.java (100%) rename simple_examples/{ => int32}/C09AAJE.java (100%) rename simple_examples/{ => int32}/D01BDJE.java (100%) rename simple_examples/{ => int32}/D01RJJE.java (100%) rename simple_examples/{ => int32}/D01RKJE.java (100%) rename simple_examples/{ => int32}/D01RLJE.java (100%) rename simple_examples/{ => int32}/D01RMJE.java (100%) rename simple_examples/{ => int32}/D01TCJE.java (100%) create mode 100644 simple_examples/int32/D02NEJE.java create mode 100644 simple_examples/int32/D02TLJE.java rename simple_examples/{ => int32}/D03PCJE.java (100%) create mode 100644 simple_examples/int32/D03RAJE.java create mode 100644 simple_examples/int32/D03RBJE.java rename simple_examples/{ => int32}/D05BAJE.java (100%) rename simple_examples/{ => int32}/D05BEJE.java (100%) rename simple_examples/{ => int32}/DTFSMJE.java (100%) rename simple_examples/{ => int32}/E01DAJE.java (100%) rename simple_examples/{ => int32}/E02ALJE.java (100%) rename simple_examples/{ => int32}/E04ABJE.java (100%) rename simple_examples/{ => int32}/E04BBJE.java (100%) rename simple_examples/{ => int32}/E04CBJE.java (100%) rename simple_examples/{ => int32}/E04FCJE.java (100%) rename simple_examples/{ => int32}/E04FFJE.java (100%) rename simple_examples/{ => int32}/E04GBJE.java (100%) rename simple_examples/{ => int32}/E04GGJE.java (100%) rename simple_examples/{ => int32}/E04MTJE.java (100%) rename simple_examples/{ => int32}/E04MXJE.java (100%) rename simple_examples/{ => int32}/E04NCJE.java (100%) rename simple_examples/{ => int32}/E04NFJE.java (100%) rename simple_examples/{ => int32}/E04NKJE.java (100%) rename simple_examples/{ => int32}/E04NQJE.java (100%) rename simple_examples/{ => int32}/E04PTJE.java (100%) rename simple_examples/{ => int32}/E04RPJE.java (100%) rename simple_examples/{ => int32}/E04RSJE.java (100%) rename simple_examples/{ => int32}/E04RTJE.java (100%) rename simple_examples/{ => int32}/E04SAJE.java (100%) rename simple_examples/{ => int32}/E04TAJE.java (100%) rename simple_examples/{ => int32}/E04TCJE.java (100%) rename simple_examples/{ => int32}/E04UCJE.java (100%) rename simple_examples/{ => int32}/E04YAJE.java (100%) rename simple_examples/{ => int32}/F01ADJE.java (100%) rename simple_examples/{ => int32}/F01CKJE.java (100%) rename simple_examples/{ => int32}/F01CRJE.java (100%) rename simple_examples/{ => int32}/F01DGJE.java (100%) create mode 100644 simple_examples/int32/F01ELJE.java rename simple_examples/{ => int32}/F01EMJE.java (100%) create mode 100644 simple_examples/int32/F02EKJE.java create mode 100644 simple_examples/int32/F02FKJE.java create mode 100644 simple_examples/int32/F02WGJE.java rename simple_examples/{ => int32}/F03BAJE.java (100%) rename simple_examples/{ => int32}/F04AMJE.java (100%) rename simple_examples/{ => int32}/F04BAJE.java (100%) rename simple_examples/{ => int32}/F05AAJE.java (100%) rename simple_examples/{ => int32}/F06CLJE.java (100%) rename simple_examples/{ => int32}/F07AAJE.java (100%) rename simple_examples/{ => int32}/F07ABJE.java (100%) rename simple_examples/{ => int32}/F07ADJE.java (100%) rename simple_examples/{ => int32}/F07AQJE.java (100%) rename simple_examples/{ => int32}/F07FAJE.java (100%) rename simple_examples/{ => int32}/F07FBJE.java (100%) rename simple_examples/{ => int32}/F08BTJE.java (100%) rename simple_examples/{ => int32}/F08FAJE.java (100%) rename simple_examples/{ => int32}/F08XPJE.java (100%) rename simple_examples/{ => int32}/G01ALJE.java (100%) rename simple_examples/{ => int32}/G02AKJE.java (100%) rename simple_examples/{ => int32}/G02BJJE.java (100%) rename simple_examples/{ => int32}/G02BRJE.java (100%) rename simple_examples/{ => int32}/G02DAJE.java (100%) rename simple_examples/{ => int32}/G02EEJE.java (100%) rename simple_examples/{ => int32}/G02MAJE.java (100%) rename simple_examples/{ => int32}/G03GAJE.java (100%) rename simple_examples/{ => int32}/G05KFJE.java (100%) rename simple_examples/{ => int32}/G13AWJE.java (100%) rename simple_examples/{ => int32}/G13MEJE.java (100%) rename simple_examples/{ => int32}/G13NAJE.java (100%) rename simple_examples/{ => int32}/H02BBJE.java (100%) rename simple_examples/{ => int32}/H02DAJE.java (100%) rename simple_examples/{ => int32}/M01CCJE.java (100%) rename simple_examples/{ => int32}/S01BAJE.java (100%) rename simple_examples/{ => int32}/S10AAJE.java (100%) rename simple_examples/{ => int32}/S10ABJE.java (100%) rename simple_examples/{ => int32}/S10ACJE.java (100%) rename simple_examples/{ => int32}/S14ABJE.java (100%) rename simple_examples/{ => int32}/S14ACJE.java (100%) rename simple_examples/{ => int32}/S14AFJE.java (100%) rename simple_examples/{ => int32}/S17DCJE.java (100%) rename simple_examples/{ => int32}/S17DGJE.java (100%) rename simple_examples/{ => int32}/S30AAJE.java (100%) rename simple_examples/{ => int32}/S30ACJE.java (100%) rename simple_examples/{ => int32}/X03AAJE.java (100%) rename simple_examples/{ => int32}/X04CBJE.java (100%) rename simple_examples/{ => int32}/X05ABJE.java (100%) create mode 100644 simple_examples/int64/A00AAJE.java create mode 100644 simple_examples/int64/A00ADJE.java create mode 100644 simple_examples/int64/C05AYJE.java create mode 100644 simple_examples/int64/C05AZJE.java create mode 100644 simple_examples/int64/C05MBJE.java create mode 100644 simple_examples/int64/C05QBJE.java create mode 100644 simple_examples/int64/D01BDJE.java create mode 100644 simple_examples/int64/D02NEJE.java create mode 100644 simple_examples/int64/DTFSMJE.java create mode 100644 simple_examples/int64/E01DAJE.java create mode 100644 simple_examples/int64/E04FCJE.java create mode 100644 simple_examples/int64/E04MTJE.java create mode 100644 simple_examples/int64/E04NFJE.java create mode 100644 simple_examples/int64/E04UCJE.java create mode 100644 simple_examples/int64/F02EKJE.java create mode 100644 simple_examples/withdrawn/D02TKJE.java diff --git a/simple_examples/A00AAJE.java b/simple_examples/int32/A00AAJE.java similarity index 100% rename from simple_examples/A00AAJE.java rename to simple_examples/int32/A00AAJE.java diff --git a/simple_examples/A00ACJE.java b/simple_examples/int32/A00ACJE.java similarity index 100% rename from simple_examples/A00ACJE.java rename to simple_examples/int32/A00ACJE.java diff --git a/simple_examples/A00ADJE.java b/simple_examples/int32/A00ADJE.java similarity index 100% rename from simple_examples/A00ADJE.java rename to simple_examples/int32/A00ADJE.java diff --git a/simple_examples/C02AAJE.java b/simple_examples/int32/C02AAJE.java similarity index 100% rename from simple_examples/C02AAJE.java rename to simple_examples/int32/C02AAJE.java diff --git a/simple_examples/C02ABJE.java b/simple_examples/int32/C02ABJE.java similarity index 100% rename from simple_examples/C02ABJE.java rename to simple_examples/int32/C02ABJE.java diff --git a/simple_examples/C02AFJE.java b/simple_examples/int32/C02AFJE.java similarity index 100% rename from simple_examples/C02AFJE.java rename to simple_examples/int32/C02AFJE.java diff --git a/simple_examples/C02AGJE.java b/simple_examples/int32/C02AGJE.java similarity index 100% rename from simple_examples/C02AGJE.java rename to simple_examples/int32/C02AGJE.java diff --git a/simple_examples/C02AHJE.java b/simple_examples/int32/C02AHJE.java similarity index 100% rename from simple_examples/C02AHJE.java rename to simple_examples/int32/C02AHJE.java diff --git a/simple_examples/C02AJJE.java b/simple_examples/int32/C02AJJE.java similarity index 100% rename from simple_examples/C02AJJE.java rename to simple_examples/int32/C02AJJE.java diff --git a/simple_examples/C02AKJE.java b/simple_examples/int32/C02AKJE.java similarity index 100% rename from simple_examples/C02AKJE.java rename to simple_examples/int32/C02AKJE.java diff --git a/simple_examples/C02ALJE.java b/simple_examples/int32/C02ALJE.java similarity index 100% rename from simple_examples/C02ALJE.java rename to simple_examples/int32/C02ALJE.java diff --git a/simple_examples/C02AMJE.java b/simple_examples/int32/C02AMJE.java similarity index 100% rename from simple_examples/C02AMJE.java rename to simple_examples/int32/C02AMJE.java diff --git a/simple_examples/C02ANJE.java b/simple_examples/int32/C02ANJE.java similarity index 100% rename from simple_examples/C02ANJE.java rename to simple_examples/int32/C02ANJE.java diff --git a/simple_examples/C05AUJE.java b/simple_examples/int32/C05AUJE.java similarity index 100% rename from simple_examples/C05AUJE.java rename to simple_examples/int32/C05AUJE.java diff --git a/simple_examples/C05AWJE.java b/simple_examples/int32/C05AWJE.java similarity index 100% rename from simple_examples/C05AWJE.java rename to simple_examples/int32/C05AWJE.java diff --git a/simple_examples/C05AYJE.java b/simple_examples/int32/C05AYJE.java similarity index 100% rename from simple_examples/C05AYJE.java rename to simple_examples/int32/C05AYJE.java diff --git a/simple_examples/C05AZJE.java b/simple_examples/int32/C05AZJE.java similarity index 100% rename from simple_examples/C05AZJE.java rename to simple_examples/int32/C05AZJE.java diff --git a/simple_examples/C05BBJE.java b/simple_examples/int32/C05BBJE.java similarity index 100% rename from simple_examples/C05BBJE.java rename to simple_examples/int32/C05BBJE.java diff --git a/simple_examples/C05MBJE.java b/simple_examples/int32/C05MBJE.java similarity index 100% rename from simple_examples/C05MBJE.java rename to simple_examples/int32/C05MBJE.java diff --git a/simple_examples/C05QBJE.java b/simple_examples/int32/C05QBJE.java similarity index 100% rename from simple_examples/C05QBJE.java rename to simple_examples/int32/C05QBJE.java diff --git a/simple_examples/C06BAJE.java b/simple_examples/int32/C06BAJE.java similarity index 100% rename from simple_examples/C06BAJE.java rename to simple_examples/int32/C06BAJE.java diff --git a/simple_examples/C06FKJE.java b/simple_examples/int32/C06FKJE.java similarity index 100% rename from simple_examples/C06FKJE.java rename to simple_examples/int32/C06FKJE.java diff --git a/simple_examples/C09AAJE.java b/simple_examples/int32/C09AAJE.java similarity index 100% rename from simple_examples/C09AAJE.java rename to simple_examples/int32/C09AAJE.java diff --git a/simple_examples/D01BDJE.java b/simple_examples/int32/D01BDJE.java similarity index 100% rename from simple_examples/D01BDJE.java rename to simple_examples/int32/D01BDJE.java diff --git a/simple_examples/D01RJJE.java b/simple_examples/int32/D01RJJE.java similarity index 100% rename from simple_examples/D01RJJE.java rename to simple_examples/int32/D01RJJE.java diff --git a/simple_examples/D01RKJE.java b/simple_examples/int32/D01RKJE.java similarity index 100% rename from simple_examples/D01RKJE.java rename to simple_examples/int32/D01RKJE.java diff --git a/simple_examples/D01RLJE.java b/simple_examples/int32/D01RLJE.java similarity index 100% rename from simple_examples/D01RLJE.java rename to simple_examples/int32/D01RLJE.java diff --git a/simple_examples/D01RMJE.java b/simple_examples/int32/D01RMJE.java similarity index 100% rename from simple_examples/D01RMJE.java rename to simple_examples/int32/D01RMJE.java diff --git a/simple_examples/D01TCJE.java b/simple_examples/int32/D01TCJE.java similarity index 100% rename from simple_examples/D01TCJE.java rename to simple_examples/int32/D01TCJE.java diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/D03PCJE.java b/simple_examples/int32/D03PCJE.java similarity index 100% rename from simple_examples/D03PCJE.java rename to simple_examples/int32/D03PCJE.java diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/D05BAJE.java b/simple_examples/int32/D05BAJE.java similarity index 100% rename from simple_examples/D05BAJE.java rename to simple_examples/int32/D05BAJE.java diff --git a/simple_examples/D05BEJE.java b/simple_examples/int32/D05BEJE.java similarity index 100% rename from simple_examples/D05BEJE.java rename to simple_examples/int32/D05BEJE.java diff --git a/simple_examples/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java similarity index 100% rename from simple_examples/DTFSMJE.java rename to simple_examples/int32/DTFSMJE.java diff --git a/simple_examples/E01DAJE.java b/simple_examples/int32/E01DAJE.java similarity index 100% rename from simple_examples/E01DAJE.java rename to simple_examples/int32/E01DAJE.java diff --git a/simple_examples/E02ALJE.java b/simple_examples/int32/E02ALJE.java similarity index 100% rename from simple_examples/E02ALJE.java rename to simple_examples/int32/E02ALJE.java diff --git a/simple_examples/E04ABJE.java b/simple_examples/int32/E04ABJE.java similarity index 100% rename from simple_examples/E04ABJE.java rename to simple_examples/int32/E04ABJE.java diff --git a/simple_examples/E04BBJE.java b/simple_examples/int32/E04BBJE.java similarity index 100% rename from simple_examples/E04BBJE.java rename to simple_examples/int32/E04BBJE.java diff --git a/simple_examples/E04CBJE.java b/simple_examples/int32/E04CBJE.java similarity index 100% rename from simple_examples/E04CBJE.java rename to simple_examples/int32/E04CBJE.java diff --git a/simple_examples/E04FCJE.java b/simple_examples/int32/E04FCJE.java similarity index 100% rename from simple_examples/E04FCJE.java rename to simple_examples/int32/E04FCJE.java diff --git a/simple_examples/E04FFJE.java b/simple_examples/int32/E04FFJE.java similarity index 100% rename from simple_examples/E04FFJE.java rename to simple_examples/int32/E04FFJE.java diff --git a/simple_examples/E04GBJE.java b/simple_examples/int32/E04GBJE.java similarity index 100% rename from simple_examples/E04GBJE.java rename to simple_examples/int32/E04GBJE.java diff --git a/simple_examples/E04GGJE.java b/simple_examples/int32/E04GGJE.java similarity index 100% rename from simple_examples/E04GGJE.java rename to simple_examples/int32/E04GGJE.java diff --git a/simple_examples/E04MTJE.java b/simple_examples/int32/E04MTJE.java similarity index 100% rename from simple_examples/E04MTJE.java rename to simple_examples/int32/E04MTJE.java diff --git a/simple_examples/E04MXJE.java b/simple_examples/int32/E04MXJE.java similarity index 100% rename from simple_examples/E04MXJE.java rename to simple_examples/int32/E04MXJE.java diff --git a/simple_examples/E04NCJE.java b/simple_examples/int32/E04NCJE.java similarity index 100% rename from simple_examples/E04NCJE.java rename to simple_examples/int32/E04NCJE.java diff --git a/simple_examples/E04NFJE.java b/simple_examples/int32/E04NFJE.java similarity index 100% rename from simple_examples/E04NFJE.java rename to simple_examples/int32/E04NFJE.java diff --git a/simple_examples/E04NKJE.java b/simple_examples/int32/E04NKJE.java similarity index 100% rename from simple_examples/E04NKJE.java rename to simple_examples/int32/E04NKJE.java diff --git a/simple_examples/E04NQJE.java b/simple_examples/int32/E04NQJE.java similarity index 100% rename from simple_examples/E04NQJE.java rename to simple_examples/int32/E04NQJE.java diff --git a/simple_examples/E04PTJE.java b/simple_examples/int32/E04PTJE.java similarity index 100% rename from simple_examples/E04PTJE.java rename to simple_examples/int32/E04PTJE.java diff --git a/simple_examples/E04RPJE.java b/simple_examples/int32/E04RPJE.java similarity index 100% rename from simple_examples/E04RPJE.java rename to simple_examples/int32/E04RPJE.java diff --git a/simple_examples/E04RSJE.java b/simple_examples/int32/E04RSJE.java similarity index 100% rename from simple_examples/E04RSJE.java rename to simple_examples/int32/E04RSJE.java diff --git a/simple_examples/E04RTJE.java b/simple_examples/int32/E04RTJE.java similarity index 100% rename from simple_examples/E04RTJE.java rename to simple_examples/int32/E04RTJE.java diff --git a/simple_examples/E04SAJE.java b/simple_examples/int32/E04SAJE.java similarity index 100% rename from simple_examples/E04SAJE.java rename to simple_examples/int32/E04SAJE.java diff --git a/simple_examples/E04TAJE.java b/simple_examples/int32/E04TAJE.java similarity index 100% rename from simple_examples/E04TAJE.java rename to simple_examples/int32/E04TAJE.java diff --git a/simple_examples/E04TCJE.java b/simple_examples/int32/E04TCJE.java similarity index 100% rename from simple_examples/E04TCJE.java rename to simple_examples/int32/E04TCJE.java diff --git a/simple_examples/E04UCJE.java b/simple_examples/int32/E04UCJE.java similarity index 100% rename from simple_examples/E04UCJE.java rename to simple_examples/int32/E04UCJE.java diff --git a/simple_examples/E04YAJE.java b/simple_examples/int32/E04YAJE.java similarity index 100% rename from simple_examples/E04YAJE.java rename to simple_examples/int32/E04YAJE.java diff --git a/simple_examples/F01ADJE.java b/simple_examples/int32/F01ADJE.java similarity index 100% rename from simple_examples/F01ADJE.java rename to simple_examples/int32/F01ADJE.java diff --git a/simple_examples/F01CKJE.java b/simple_examples/int32/F01CKJE.java similarity index 100% rename from simple_examples/F01CKJE.java rename to simple_examples/int32/F01CKJE.java diff --git a/simple_examples/F01CRJE.java b/simple_examples/int32/F01CRJE.java similarity index 100% rename from simple_examples/F01CRJE.java rename to simple_examples/int32/F01CRJE.java diff --git a/simple_examples/F01DGJE.java b/simple_examples/int32/F01DGJE.java similarity index 100% rename from simple_examples/F01DGJE.java rename to simple_examples/int32/F01DGJE.java diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/F01EMJE.java b/simple_examples/int32/F01EMJE.java similarity index 100% rename from simple_examples/F01EMJE.java rename to simple_examples/int32/F01EMJE.java diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/F03BAJE.java b/simple_examples/int32/F03BAJE.java similarity index 100% rename from simple_examples/F03BAJE.java rename to simple_examples/int32/F03BAJE.java diff --git a/simple_examples/F04AMJE.java b/simple_examples/int32/F04AMJE.java similarity index 100% rename from simple_examples/F04AMJE.java rename to simple_examples/int32/F04AMJE.java diff --git a/simple_examples/F04BAJE.java b/simple_examples/int32/F04BAJE.java similarity index 100% rename from simple_examples/F04BAJE.java rename to simple_examples/int32/F04BAJE.java diff --git a/simple_examples/F05AAJE.java b/simple_examples/int32/F05AAJE.java similarity index 100% rename from simple_examples/F05AAJE.java rename to simple_examples/int32/F05AAJE.java diff --git a/simple_examples/F06CLJE.java b/simple_examples/int32/F06CLJE.java similarity index 100% rename from simple_examples/F06CLJE.java rename to simple_examples/int32/F06CLJE.java diff --git a/simple_examples/F07AAJE.java b/simple_examples/int32/F07AAJE.java similarity index 100% rename from simple_examples/F07AAJE.java rename to simple_examples/int32/F07AAJE.java diff --git a/simple_examples/F07ABJE.java b/simple_examples/int32/F07ABJE.java similarity index 100% rename from simple_examples/F07ABJE.java rename to simple_examples/int32/F07ABJE.java diff --git a/simple_examples/F07ADJE.java b/simple_examples/int32/F07ADJE.java similarity index 100% rename from simple_examples/F07ADJE.java rename to simple_examples/int32/F07ADJE.java diff --git a/simple_examples/F07AQJE.java b/simple_examples/int32/F07AQJE.java similarity index 100% rename from simple_examples/F07AQJE.java rename to simple_examples/int32/F07AQJE.java diff --git a/simple_examples/F07FAJE.java b/simple_examples/int32/F07FAJE.java similarity index 100% rename from simple_examples/F07FAJE.java rename to simple_examples/int32/F07FAJE.java diff --git a/simple_examples/F07FBJE.java b/simple_examples/int32/F07FBJE.java similarity index 100% rename from simple_examples/F07FBJE.java rename to simple_examples/int32/F07FBJE.java diff --git a/simple_examples/F08BTJE.java b/simple_examples/int32/F08BTJE.java similarity index 100% rename from simple_examples/F08BTJE.java rename to simple_examples/int32/F08BTJE.java diff --git a/simple_examples/F08FAJE.java b/simple_examples/int32/F08FAJE.java similarity index 100% rename from simple_examples/F08FAJE.java rename to simple_examples/int32/F08FAJE.java diff --git a/simple_examples/F08XPJE.java b/simple_examples/int32/F08XPJE.java similarity index 100% rename from simple_examples/F08XPJE.java rename to simple_examples/int32/F08XPJE.java diff --git a/simple_examples/G01ALJE.java b/simple_examples/int32/G01ALJE.java similarity index 100% rename from simple_examples/G01ALJE.java rename to simple_examples/int32/G01ALJE.java diff --git a/simple_examples/G02AKJE.java b/simple_examples/int32/G02AKJE.java similarity index 100% rename from simple_examples/G02AKJE.java rename to simple_examples/int32/G02AKJE.java diff --git a/simple_examples/G02BJJE.java b/simple_examples/int32/G02BJJE.java similarity index 100% rename from simple_examples/G02BJJE.java rename to simple_examples/int32/G02BJJE.java diff --git a/simple_examples/G02BRJE.java b/simple_examples/int32/G02BRJE.java similarity index 100% rename from simple_examples/G02BRJE.java rename to simple_examples/int32/G02BRJE.java diff --git a/simple_examples/G02DAJE.java b/simple_examples/int32/G02DAJE.java similarity index 100% rename from simple_examples/G02DAJE.java rename to simple_examples/int32/G02DAJE.java diff --git a/simple_examples/G02EEJE.java b/simple_examples/int32/G02EEJE.java similarity index 100% rename from simple_examples/G02EEJE.java rename to simple_examples/int32/G02EEJE.java diff --git a/simple_examples/G02MAJE.java b/simple_examples/int32/G02MAJE.java similarity index 100% rename from simple_examples/G02MAJE.java rename to simple_examples/int32/G02MAJE.java diff --git a/simple_examples/G03GAJE.java b/simple_examples/int32/G03GAJE.java similarity index 100% rename from simple_examples/G03GAJE.java rename to simple_examples/int32/G03GAJE.java diff --git a/simple_examples/G05KFJE.java b/simple_examples/int32/G05KFJE.java similarity index 100% rename from simple_examples/G05KFJE.java rename to simple_examples/int32/G05KFJE.java diff --git a/simple_examples/G13AWJE.java b/simple_examples/int32/G13AWJE.java similarity index 100% rename from simple_examples/G13AWJE.java rename to simple_examples/int32/G13AWJE.java diff --git a/simple_examples/G13MEJE.java b/simple_examples/int32/G13MEJE.java similarity index 100% rename from simple_examples/G13MEJE.java rename to simple_examples/int32/G13MEJE.java diff --git a/simple_examples/G13NAJE.java b/simple_examples/int32/G13NAJE.java similarity index 100% rename from simple_examples/G13NAJE.java rename to simple_examples/int32/G13NAJE.java diff --git a/simple_examples/H02BBJE.java b/simple_examples/int32/H02BBJE.java similarity index 100% rename from simple_examples/H02BBJE.java rename to simple_examples/int32/H02BBJE.java diff --git a/simple_examples/H02DAJE.java b/simple_examples/int32/H02DAJE.java similarity index 100% rename from simple_examples/H02DAJE.java rename to simple_examples/int32/H02DAJE.java diff --git a/simple_examples/M01CCJE.java b/simple_examples/int32/M01CCJE.java similarity index 100% rename from simple_examples/M01CCJE.java rename to simple_examples/int32/M01CCJE.java diff --git a/simple_examples/S01BAJE.java b/simple_examples/int32/S01BAJE.java similarity index 100% rename from simple_examples/S01BAJE.java rename to simple_examples/int32/S01BAJE.java diff --git a/simple_examples/S10AAJE.java b/simple_examples/int32/S10AAJE.java similarity index 100% rename from simple_examples/S10AAJE.java rename to simple_examples/int32/S10AAJE.java diff --git a/simple_examples/S10ABJE.java b/simple_examples/int32/S10ABJE.java similarity index 100% rename from simple_examples/S10ABJE.java rename to simple_examples/int32/S10ABJE.java diff --git a/simple_examples/S10ACJE.java b/simple_examples/int32/S10ACJE.java similarity index 100% rename from simple_examples/S10ACJE.java rename to simple_examples/int32/S10ACJE.java diff --git a/simple_examples/S14ABJE.java b/simple_examples/int32/S14ABJE.java similarity index 100% rename from simple_examples/S14ABJE.java rename to simple_examples/int32/S14ABJE.java diff --git a/simple_examples/S14ACJE.java b/simple_examples/int32/S14ACJE.java similarity index 100% rename from simple_examples/S14ACJE.java rename to simple_examples/int32/S14ACJE.java diff --git a/simple_examples/S14AFJE.java b/simple_examples/int32/S14AFJE.java similarity index 100% rename from simple_examples/S14AFJE.java rename to simple_examples/int32/S14AFJE.java diff --git a/simple_examples/S17DCJE.java b/simple_examples/int32/S17DCJE.java similarity index 100% rename from simple_examples/S17DCJE.java rename to simple_examples/int32/S17DCJE.java diff --git a/simple_examples/S17DGJE.java b/simple_examples/int32/S17DGJE.java similarity index 100% rename from simple_examples/S17DGJE.java rename to simple_examples/int32/S17DGJE.java diff --git a/simple_examples/S30AAJE.java b/simple_examples/int32/S30AAJE.java similarity index 100% rename from simple_examples/S30AAJE.java rename to simple_examples/int32/S30AAJE.java diff --git a/simple_examples/S30ACJE.java b/simple_examples/int32/S30ACJE.java similarity index 100% rename from simple_examples/S30ACJE.java rename to simple_examples/int32/S30ACJE.java diff --git a/simple_examples/X03AAJE.java b/simple_examples/int32/X03AAJE.java similarity index 100% rename from simple_examples/X03AAJE.java rename to simple_examples/int32/X03AAJE.java diff --git a/simple_examples/X04CBJE.java b/simple_examples/int32/X04CBJE.java similarity index 100% rename from simple_examples/X04CBJE.java rename to simple_examples/int32/X04CBJE.java diff --git a/simple_examples/X05ABJE.java b/simple_examples/int32/X05ABJE.java similarity index 100% rename from simple_examples/X05ABJE.java rename to simple_examples/int32/X05ABJE.java diff --git a/simple_examples/int64/A00AAJE.java b/simple_examples/int64/A00AAJE.java new file mode 100644 index 0000000..490c163 --- /dev/null +++ b/simple_examples/int64/A00AAJE.java @@ -0,0 +1,14 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AA; +import com.nag.routines.Routine; + +public class A00AAJE { + + public static void main (String[] args) throws NAGBadIntegerException { + Routine.init(); + A00AA a00aa = new A00AA(); + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + } + +} diff --git a/simple_examples/int64/A00ADJE.java b/simple_examples/int64/A00ADJE.java new file mode 100644 index 0000000..8250321 --- /dev/null +++ b/simple_examples/int64/A00ADJE.java @@ -0,0 +1,113 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AD; +import com.nag.routines.Routine; +import java.util.Arrays; + +public class A00ADJE { + + /* Parameters */ + public static final int MSGLEN = 15; + + /** A00ADJ Example Program */ + public static void main (String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + int i; + long mkmaj, mkmin; + boolean licval; + String fcomp = getBlankString(80), hdware = getBlankString(80), + impl = getBlankString(80), opsys = getBlankString(80), + pcode = getBlankString(80), prec = getBlankString(80), + vend = getBlankString(80); + /* Local Arrays */ + int[] itime = new int[7]; + String[] msg = new String[MSGLEN]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); + + Routine.init(); + System.out.println(" A00ADJ Example Program Results\n"); + + A00AD a00ad = new A00AD(); + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + /* Print implementation details */ + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length + * + * @param len the required length of the String + * @returns a String of spaces of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/int64/C05AYJE.java b/simple_examples/int64/C05AYJE.java new file mode 100644 index 0000000..a3bd5f1 --- /dev/null +++ b/simple_examples/int64/C05AYJE.java @@ -0,0 +1,45 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AY; +import com.nag.routines.Routine; + + +public class C05AYJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + long ifail = 0; + long[] iuser = new long[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + Routine.init(); + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch ((int)ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/int64/C05AZJE.java b/simple_examples/int64/C05AZJE.java new file mode 100644 index 0000000..bec1b03 --- /dev/null +++ b/simple_examples/int64/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AZ; +import com.nag.routines.Routine; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class C05AZJE { + + public static void main (String[] args)throws NAGBadIntegerException{ + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + long ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + Routine.init(); + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + + if(ind == 0){ + keepOn = false; + } + else{ + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + } + + + + switch ((int)ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/int64/C05MBJE.java b/simple_examples/int64/C05MBJE.java new file mode 100644 index 0000000..08dd454 --- /dev/null +++ b/simple_examples/int64/C05MBJE.java @@ -0,0 +1,104 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ Example Program Text + * @author joed + * @since 27.0 + */ + /* ** There have been at least 200*(n+1) calls to fcn. + ** Consider restarting the calculation from the point held in x. + ** ABNORMAL EXIT from NAG Library routine + ** NAG soft failure - control returned +*/ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ Example Main Program + */ + public static void main(String[] args) throws NAGBadIntegerException { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + long astart, ifail, m; + int i; + double[] fvec, x; + double[] ruser = new double[1]; + long[] iuser = new long[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Initialise NAG for Java + Routine.init(); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail==0 || ifail==8 || ifail==9) { + if (ifail==0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/int64/C05QBJE.java b/simple_examples/int64/C05QBJE.java new file mode 100644 index 0000000..d7a6435 --- /dev/null +++ b/simple_examples/int64/C05QBJE.java @@ -0,0 +1,178 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; + +/** + * + * @author ludovic + */ +public class C05QBJE { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws NAGBadIntegerException { + try { + Routine.init(); + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + long[] IUSER = new long[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = (int)c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + + break; + } + + } catch (NAGBadIntegerException ex) { + System.err.println("Something went wrong!\n" + ex.getMessage()); + } + + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private long N, IFLAG; + private double[] X, FVEC, RUSER; + private long[] IUSER; + + //@Override + public void setN(long N) { + this.N = N; + } + + //@Override + public long getN() { + return N; + } + + //@Override + public void setX(double[] X) { + this.X = X; + } + + //@Override + public double[] getX() { + return X; + } + + //@Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + //@Override + public double[] getFVEC() { + return FVEC; + } + + //@Override + public void setIUSER(long[] IUSER) { + this.IUSER = IUSER; + } + + //@Override + public long[] getIUSER() { + return IUSER; + } + + //@Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + //@Override + public double[] getRUSER() { + return RUSER; + } + + //@Override + public void setIFLAG(long IFLAG) { + this.IFLAG = IFLAG; + } + + //@Override + public long getIFLAG() { + return IFLAG; + } + + //@Override + public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class D01BDJE_FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + + } + +} diff --git a/simple_examples/int64/D02NEJE.java b/simple_examples/int64/D02NEJE.java new file mode 100644 index 0000000..b32ae64 --- /dev/null +++ b/simple_examples/int64/D02NEJE.java @@ -0,0 +1,393 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; + + +/** + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) throws NAGBadIntegerException { + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + long ifail, itask, maxord, ijac, itol, licom, neq, lcom; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + long ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + * Fortran array definition: + * a(dimX, *) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static long getIdx(long x, long y, long dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + long neq, long ml, long mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + long md, ms, pd_dim1; + + pd_dim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; + pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[(int)getIdx(md, 3, pd_dim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; + pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; + pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + long neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/int64/DTFSMJE.java b/simple_examples/int64/DTFSMJE.java new file mode 100644 index 0000000..d1feabb --- /dev/null +++ b/simple_examples/int64/DTFSMJE.java @@ -0,0 +1,61 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * Adapted from f06wbfe.f90 + * + * @author joed + * + */ +public class DTFSMJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + double alpha = 4.21; + long ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + + // Init NAG Java + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + Routine.init(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[(int)(m*m)]; + for (int i=0; i=i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[((int)(m*(m+1)))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/int64/E01DAJE.java b/simple_examples/int64/E01DAJE.java new file mode 100644 index 0000000..89a89e4 --- /dev/null +++ b/simple_examples/int64/E01DAJE.java @@ -0,0 +1,177 @@ +/* + * E01DA Example Program - NAG Copyright 2016 + */ + import com.nag.exceptions.NAGBadIntegerException; + import com.nag.routines.E01.E01DA; + import com.nag.routines.E02.E02DF; + import com.nag.routines.Routine; + +public class E01DAJE { + + public static void main (String[] args)throws NAGBadIntegerException { + Routine.init(); + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = (int)e01da.getIFAIL(); + switch (ifail) + { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) + { + if (i <= mx) + System.out.printf("%4d %9.4f", i+1, lamda[i]); + else + System.out.printf(" "); + if (i <= my) + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + else + System.out.printf("\n"); + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) + { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) + System.out.printf("\n"); + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = (int)e01da.getPX(); + py = (int)e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px,4*ny+py); + if (4*nx+px>4*ny+py) + liwrk = ny + py - 4; + else + liwrk = nx + px - 4; + double tx[] = new double[nx]; + double ty[] = new double[ny]; + double ff[] = new double[nx*ny]; + wrk = new double[lwrk]; + long iwrk[] = new long[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new long[(int)(datafile.n + datafile.nclin)]; + ax = new double[(int)Math.max(1, datafile.nclin)]; + iwork = new long[(int)liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[(int)(datafile.n + datafile.nclin)]; + work = new double[(int)lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[(int)lcwsav]; + cwsav[0] = " "; + long[] iwsav = new long[(int)liwsav]; + boolean[] lwsav = new boolean[(int)llwsav]; + double[] rwsav = new double[(int)lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + long[] iuser = new long[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + + super.eval(); + + } + + } + + public static class DataFile { + + public String filename; + public long n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } else { + sda = 1; + + } + ldh = n; + + cvec = new double[(int)n]; + a = new double[(int)(lda * sda)]; + bl = new double[(int)(n + nclin)]; + bu = new double[(int)(n + nclin)]; + x = new double[(int)n]; + h = new double[(int)(ldh * n)]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/int64/E04UCJE.java b/simple_examples/int64/E04UCJE.java new file mode 100644 index 0000000..20ad573 --- /dev/null +++ b/simple_examples/int64/E04UCJE.java @@ -0,0 +1,207 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.Routine; +import java.util.Arrays; + +/** + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + double objf; + long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; + long[] istate, iwork; + long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; + boolean[] lwsav = new boolean[(int)LLWSAV]; + String[] cwsav = new String[(int)LCWSAV]; + Arrays.fill(cwsav, " "); + + System.out.println(" E04UCJ Example Program Results"); + Routine.init(); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new long[(int)(n + nclin + ncnln)]; + iwork = new long[(int)liwork]; + c = new double[(int)(Math.max(1, ncnln))]; + cjac = new double[(int)(ldcj * sdcjac)]; + clamda = new double[(int)(n + nclin + ncnln)]; + objgrd = new double[(int)n]; + r = new double[(int)(ldr * n)]; + work = new double[(int)lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[(int)LDCJ] = X[1] + X[1]; + CJAC[(int)(2*LDCJ)] = X[2] + X[2]; + CJAC[(int)(3*LDCJ)] = X[3] + X[3]; + } + + } + + if (NEEDC[1]>0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; + CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; + CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/int64/F02EKJE.java b/simple_examples/int64/F02EKJE.java new file mode 100644 index 0000000..d8f152c --- /dev/null +++ b/simple_examples/int64/F02EKJE.java @@ -0,0 +1,230 @@ +emacimport java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.Routine; +import com.nag.types.*; + + +/** + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) throws NAGBadIntegerException { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + // Initialise wrapper library + Routine.init(); + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval ( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW(){ + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/withdrawn/D02TKJE.java b/simple_examples/withdrawn/D02TKJE.java new file mode 100644 index 0000000..16e9e9b --- /dev/null +++ b/simple_examples/withdrawn/D02TKJE.java @@ -0,0 +1,290 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.D02.D02TK; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import com.nag.routines.Routine; + + +/** + * @author joed + */ +public class D02TKJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) throws NAGBadIntegerException { + D02TK d02tk = new D02TK(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; + double[] mesh, tol, work, y; + int[] icomm, ipmesh; + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02TKJ Example Program Results"); + System.out.println(); + + // Values from d02tkfe.d + ncol = 7; + nmesh = 11; + mxmesh = 51; + + licomm = 23 + NEQ + mxmesh; + lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + work = new double[lrcomm]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + icomm = new int[licomm]; + + // Values from d02tkfe.d + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Initial integrator for given problem. + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, + lrcomm, icomm, licomm, ifail + ); + + // Values from d02tkfe.d + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tk.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, + ifail + ); + ifail = d02tk.getIFAIL(); + if (ifail == 1) break; + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) break; + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) System.out.printf("\n"); + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); + ifail = d02ty.getIFAIL(); + if (ifail != 0) { + System.err.println( + "D02TY failed with error code " + ifail + ); + break; + } + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) break; + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TX failed with error code " + ifail); + } + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + * Fortran array definition: + * a(dimX, 0:*) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + * Fortran array definition: + * a(dimX, dimY, 0:*) + * + * Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TK.Abstract_D02TK_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TK.Abstract_D02TK_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TK.Abstract_D02TK_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} From 351de5296b84c44b48f9a7ef8a6d3339c132f4de Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:11:17 +0000 Subject: [PATCH 118/196] Simple Examples Synced --- simple_examples/baseresults/a00aaje.r | 10 + simple_examples/baseresults/a00acje.r | 3 + simple_examples/baseresults/a00adje.r | 17 + simple_examples/baseresults/c02aaje.r | 19 + simple_examples/baseresults/c02abje.r | 12 + simple_examples/baseresults/c02afje.r | 28 ++ simple_examples/baseresults/c02agje.r | 27 ++ simple_examples/baseresults/c02ahje.r | 6 + simple_examples/baseresults/c02ajje.r | 6 + simple_examples/baseresults/c02akje.r | 8 + simple_examples/baseresults/c02alje.r | 9 + simple_examples/baseresults/c02amje.r | 8 + simple_examples/baseresults/c02anje.r | 9 + simple_examples/baseresults/c05auje.r | 4 + simple_examples/baseresults/c05awje.r | 4 + simple_examples/baseresults/c05ayje.r | 3 + simple_examples/baseresults/c05azje.r | 15 + simple_examples/baseresults/c05bbje.r | 10 + simple_examples/baseresults/c05mbje.r | 8 + simple_examples/baseresults/c05qbje.r | 8 + simple_examples/baseresults/c06baje.r | 15 + simple_examples/baseresults/c06fkje.r | 13 + simple_examples/baseresults/c09aaje.r | 18 + .../baseresults/complexargumentexample.r | 1 + simple_examples/baseresults/d01bdje.r | 9 + simple_examples/baseresults/d02neje.r | 25 ++ simple_examples/baseresults/d02tkje.r | 113 +++++ simple_examples/baseresults/d02tlje.r | 113 +++++ simple_examples/baseresults/d03pcje.r | 28 ++ simple_examples/baseresults/d03raje.r | 409 +++++++++++++++++ simple_examples/baseresults/d03rbje.r | 59 +++ simple_examples/baseresults/d05baje.r | 12 + simple_examples/baseresults/d05beje.r | 46 ++ simple_examples/baseresults/dtfsmje.r | 10 + simple_examples/baseresults/e01daje.r | 25 ++ simple_examples/baseresults/e02alje.r | 24 + simple_examples/baseresults/e04abje.r | 6 + simple_examples/baseresults/e04bbje.r | 7 + simple_examples/baseresults/e04cbje.r | 4 + simple_examples/baseresults/e04fcje.r | 22 + simple_examples/baseresults/e04ffje.r | 73 +++ simple_examples/baseresults/e04gbje.r | 22 + simple_examples/baseresults/e04ggje.r | 44 ++ simple_examples/baseresults/e04mtje.r | 162 +++++++ simple_examples/baseresults/e04mxje.r | 38 ++ simple_examples/baseresults/e04ncje.r | 23 + simple_examples/baseresults/e04nfje.r | 66 +++ simple_examples/baseresults/e04nkje.r | 26 ++ simple_examples/baseresults/e04nqje.r | 6 + simple_examples/baseresults/e04ptje.r | 39 ++ simple_examples/baseresults/e04rpje.r | 105 +++++ simple_examples/baseresults/e04rsje.r | 35 ++ simple_examples/baseresults/e04rtje.r | 35 ++ simple_examples/baseresults/e04saje.r | 33 ++ simple_examples/baseresults/e04taje.r | 39 ++ simple_examples/baseresults/e04tcje.r | 58 +++ simple_examples/baseresults/e04uc_example.r | 95 ++++ simple_examples/baseresults/e04ucje.r | 22 + simple_examples/baseresults/e04yaje.r | 25 ++ simple_examples/baseresults/f01adje.r | 9 + simple_examples/baseresults/f01ckje.r | 5 + simple_examples/baseresults/f01crje.r | 6 + simple_examples/baseresults/f01dgje.r | 8 + simple_examples/baseresults/f01elje.r | 10 + simple_examples/baseresults/f01emje.r | 10 + simple_examples/baseresults/f02ekje.r | 20 + simple_examples/baseresults/f02fkje.r | 14 + simple_examples/baseresults/f02wgje.r | 7 + simple_examples/baseresults/f03baje.r | 14 + simple_examples/baseresults/f04amje.r | 4 + simple_examples/baseresults/f04baje.r | 14 + simple_examples/baseresults/f05aaje.r | 11 + simple_examples/baseresults/f06clje.r | 3 + simple_examples/baseresults/f07aaje.r | 14 + simple_examples/baseresults/f07abje.r | 23 + simple_examples/baseresults/f07adje.r | 10 + simple_examples/baseresults/f07aqje.r | 7 + simple_examples/baseresults/f07faje.r | 11 + simple_examples/baseresults/f07fbje.r | 19 + simple_examples/baseresults/f08btje.r | 16 + simple_examples/baseresults/f08faje.r | 16 + simple_examples/baseresults/f08xpje.r | 8 + simple_examples/baseresults/g01alje.r | 7 + simple_examples/baseresults/g02akje.r | 14 + simple_examples/baseresults/g02bjje.r | 38 ++ simple_examples/baseresults/g02brje.r | 29 ++ simple_examples/baseresults/g02daje.r | 31 ++ simple_examples/baseresults/g02eeje.r | 20 + simple_examples/baseresults/g02maje.r | 23 + simple_examples/baseresults/g03gaje.r | 79 ++++ simple_examples/baseresults/g05kfje.r | 7 + simple_examples/baseresults/g13awje.r | 4 + simple_examples/baseresults/g13meje.r | 39 ++ simple_examples/baseresults/g13naje.r | 11 + simple_examples/baseresults/h02bbje.r | 79 ++++ simple_examples/baseresults/h02daje.r | 14 + simple_examples/baseresults/m01ccje.r | 15 + .../baseresults/nagcomplexexample.r | 60 +++ simple_examples/baseresults/outputexample.r | 10 + simple_examples/baseresults/s01baje.r | 9 + simple_examples/baseresults/s10aaje.r | 7 + simple_examples/baseresults/s10abje.r | 8 + simple_examples/baseresults/s10acje.r | 8 + simple_examples/baseresults/s14abje.r | 12 + simple_examples/baseresults/s14acje.r | 8 + simple_examples/baseresults/s14afje.r | 5 + simple_examples/baseresults/s17dcje.r | 10 + simple_examples/baseresults/s17dgje.r | 9 + simple_examples/baseresults/s30aaje.r | 16 + simple_examples/baseresults/s30acje.r | 9 + .../baseresults/simpleroutineexample.r | 15 + .../baseresults/userdefinedfunctionexample1.r | 1 + .../baseresults/userdefinedfunctionexample2.r | 1 + simple_examples/baseresults/x03aaje.r | 3 + simple_examples/baseresults/x04cbje.r | 21 + simple_examples/baseresults/x05abje.r | 2 + simple_examples/data/c02abje.d | 14 + simple_examples/data/c02afje.d | 19 + simple_examples/data/c02agje.d | 9 + simple_examples/data/c02ahje.d | 2 + simple_examples/data/c02ajje.d | 2 + simple_examples/data/c02akje.d | 2 + simple_examples/data/c02alje.d | 2 + simple_examples/data/c02amje.d | 5 + simple_examples/data/c02anje.d | 6 + simple_examples/data/c05bbje.d | 7 + simple_examples/data/c06fkje.d | 11 + simple_examples/data/c09aaje.d | 11 + simple_examples/data/d03pcje.d | 6 + simple_examples/data/e02alje.d | 23 + simple_examples/data/e04fcje.d | 16 + simple_examples/data/e04mxje.d | 64 +++ simple_examples/data/e04ncje.d | 21 + simple_examples/data/e04nfje.d | 22 + simple_examples/data/e04nqje.d | 67 +++ simple_examples/data/e04rsje.d | 13 + simple_examples/data/e04rtje.d | 8 + simple_examples/data/e04saje.opt | 30 ++ simple_examples/data/e04tcje.d | 22 + simple_examples/data/f03baje.d | 5 + simple_examples/data/f04amje.d | 5 + simple_examples/data/f04baje.d | 13 + simple_examples/data/f05aaje.d | 6 + simple_examples/data/f08btje.d | 15 + simple_examples/data/f08xpje.d | 10 + simple_examples/data/g02bjje.d | 10 + simple_examples/data/g02daje.d | 15 + simple_examples/data/g02eeje.d | 24 + simple_examples/data/g02maje.d | 23 + simple_examples/data/g03gaje.d | 56 +++ simple_examples/data/g05kfje.d | 3 + simple_examples/data/g13naje.d | 14 + simple_examples/data/m01ccje.d | 13 + simple_examples/data/s14abje.d | 10 + simple_examples/data/s14acje.d | 5 + simple_examples/data/s14afje.d | 2 + simple_examples/data/s17dcje.d | 6 + simple_examples/data/s17dgje.d | 6 + simple_examples/data/s30aaje.d | 9 + simple_examples/data/s30acje.d | 9 + simple_examples/data/x03aaje.d | 5 + simple_examples/source/int32/A00AAJE.java | 16 + simple_examples/source/int32/A00ACJE.java | 29 ++ simple_examples/source/int32/A00ADJE.java | 107 +++++ simple_examples/source/int32/C02AAJE.java | 174 ++++++++ simple_examples/source/int32/C02ABJE.java | 217 +++++++++ simple_examples/source/int32/C02AFJE.java | 271 +++++++++++ simple_examples/source/int32/C02AGJE.java | 262 +++++++++++ simple_examples/source/int32/C02AHJE.java | 61 +++ simple_examples/source/int32/C02AJJE.java | 65 +++ simple_examples/source/int32/C02AKJE.java | 62 +++ simple_examples/source/int32/C02ALJE.java | 64 +++ simple_examples/source/int32/C02AMJE.java | 75 ++++ simple_examples/source/int32/C02ANJE.java | 80 ++++ simple_examples/source/int32/C05AUJE.java | 67 +++ simple_examples/source/int32/C05AWJE.java | 59 +++ simple_examples/source/int32/C05AYJE.java | 44 ++ simple_examples/source/int32/C05AZJE.java | 65 +++ simple_examples/source/int32/C05BBJE.java | 89 ++++ simple_examples/source/int32/C05MBJE.java | 95 ++++ simple_examples/source/int32/C05QBJE.java | 167 +++++++ simple_examples/source/int32/C06BAJE.java | 56 +++ simple_examples/source/int32/C06FKJE.java | 91 ++++ simple_examples/source/int32/C09AAJE.java | 158 +++++++ simple_examples/source/int32/D01BDJE.java | 58 +++ simple_examples/source/int32/D01RJJE.java | 184 ++++++++ simple_examples/source/int32/D01RKJE.java | 173 ++++++++ simple_examples/source/int32/D01RLJE.java | 196 ++++++++ simple_examples/source/int32/D01RMJE.java | 163 +++++++ simple_examples/source/int32/D01TCJE.java | 45 ++ simple_examples/source/int32/D02NEJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D02TLJE.java | 290 ++++++++++++ simple_examples/source/int32/D03PCJE.java | 217 +++++++++ simple_examples/source/int32/D03RAJE.java | 307 +++++++++++++ simple_examples/source/int32/D03RBJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D05BAJE.java | 111 +++++ simple_examples/source/int32/D05BEJE.java | 185 ++++++++ simple_examples/source/int32/DTFSMJE.java | 54 +++ simple_examples/source/int32/E01DAJE.java | 182 ++++++++ simple_examples/source/int32/E02ALJE.java | 101 +++++ simple_examples/source/int32/E04ABJE.java | 76 ++++ simple_examples/source/int32/E04BBJE.java | 81 ++++ simple_examples/source/int32/E04CBJE.java | 90 ++++ simple_examples/source/int32/E04FCJE.java | 420 ++++++++++++++++++ simple_examples/source/int32/E04FFJE.java | 140 ++++++ simple_examples/source/int32/E04GBJE.java | 183 ++++++++ simple_examples/source/int32/E04GGJE.java | 219 +++++++++ simple_examples/source/int32/E04MTJE.java | 132 ++++++ simple_examples/source/int32/E04MXJE.java | 292 ++++++++++++ simple_examples/source/int32/E04NCJE.java | 246 ++++++++++ simple_examples/source/int32/E04NFJE.java | 234 ++++++++++ simple_examples/source/int32/E04NKJE.java | 295 ++++++++++++ simple_examples/source/int32/E04NQJE.java | 384 ++++++++++++++++ simple_examples/source/int32/E04PTJE.java | 344 ++++++++++++++ simple_examples/source/int32/E04RPJE.java | 199 +++++++++ simple_examples/source/int32/E04RSJE.java | 229 ++++++++++ simple_examples/source/int32/E04RTJE.java | 225 ++++++++++ simple_examples/source/int32/E04SAJE.java | 104 +++++ simple_examples/source/int32/E04TAJE.java | 188 ++++++++ simple_examples/source/int32/E04TCJE.java | 263 +++++++++++ simple_examples/source/int32/E04UCJE.java | 211 +++++++++ simple_examples/source/int32/E04YAJE.java | 112 +++++ simple_examples/source/int32/F01ADJE.java | 39 ++ simple_examples/source/int32/F01CKJE.java | 60 +++ simple_examples/source/int32/F01CRJE.java | 47 ++ simple_examples/source/int32/F01DGJE.java | 72 +++ simple_examples/source/int32/F01ELJE.java | 89 ++++ simple_examples/source/int32/F01EMJE.java | 106 +++++ simple_examples/source/int32/F02EKJE.java | 227 ++++++++++ simple_examples/source/int32/F02FKJE.java | 230 ++++++++++ simple_examples/source/int32/F02WGJE.java | 132 ++++++ simple_examples/source/int32/F03BAJE.java | 108 +++++ simple_examples/source/int32/F04AMJE.java | 114 +++++ simple_examples/source/int32/F04BAJE.java | 144 ++++++ simple_examples/source/int32/F05AAJE.java | 99 +++++ simple_examples/source/int32/F06CLJE.java | 40 ++ simple_examples/source/int32/F07AAJE.java | 90 ++++ simple_examples/source/int32/F07ABJE.java | 134 ++++++ simple_examples/source/int32/F07ADJE.java | 72 +++ simple_examples/source/int32/F07AQJE.java | 99 +++++ simple_examples/source/int32/F07FAJE.java | 79 ++++ simple_examples/source/int32/F07FBJE.java | 122 +++++ simple_examples/source/int32/F08BTJE.java | 228 ++++++++++ simple_examples/source/int32/F08FAJE.java | 113 +++++ simple_examples/source/int32/F08XPJE.java | 297 +++++++++++++ simple_examples/source/int32/G01ALJE.java | 55 +++ simple_examples/source/int32/G02AKJE.java | 68 +++ simple_examples/source/int32/G02BJJE.java | 303 +++++++++++++ simple_examples/source/int32/G02BRJE.java | 134 ++++++ simple_examples/source/int32/G02DAJE.java | 187 ++++++++ simple_examples/source/int32/G02EEJE.java | 184 ++++++++ simple_examples/source/int32/G02MAJE.java | 130 ++++++ simple_examples/source/int32/G03GAJE.java | 355 +++++++++++++++ simple_examples/source/int32/G05KFJE.java | 105 +++++ simple_examples/source/int32/G13AWJE.java | 31 ++ simple_examples/source/int32/G13MEJE.java | 160 +++++++ simple_examples/source/int32/G13NAJE.java | 123 +++++ simple_examples/source/int32/H02BBJE.java | 92 ++++ simple_examples/source/int32/H02DAJE.java | 228 ++++++++++ simple_examples/source/int32/M01CCJE.java | 42 ++ simple_examples/source/int32/S01BAJE.java | 39 ++ simple_examples/source/int32/S10AAJE.java | 40 ++ simple_examples/source/int32/S10ABJE.java | 41 ++ simple_examples/source/int32/S10ACJE.java | 41 ++ simple_examples/source/int32/S14ABJE.java | 71 +++ simple_examples/source/int32/S14ACJE.java | 68 +++ simple_examples/source/int32/S14AFJE.java | 80 ++++ simple_examples/source/int32/S17DCJE.java | 69 +++ simple_examples/source/int32/S17DGJE.java | 61 +++ simple_examples/source/int32/S30AAJE.java | 109 +++++ simple_examples/source/int32/S30ACJE.java | 129 ++++++ simple_examples/source/int32/X03AAJE.java | 87 ++++ simple_examples/source/int32/X04CBJE.java | 53 +++ simple_examples/source/int32/X05ABJE.java | 25 ++ simple_examples/source/int64/A00AAJE.java | 14 + simple_examples/source/int64/A00ADJE.java | 113 +++++ simple_examples/source/int64/C05AYJE.java | 45 ++ simple_examples/source/int64/C05AZJE.java | 65 +++ simple_examples/source/int64/C05MBJE.java | 104 +++++ simple_examples/source/int64/C05QBJE.java | 178 ++++++++ simple_examples/source/int64/D01BDJE.java | 57 +++ simple_examples/source/int64/D02NEJE.java | 393 ++++++++++++++++ simple_examples/source/int64/DTFSMJE.java | 61 +++ simple_examples/source/int64/E01DAJE.java | 177 ++++++++ simple_examples/source/int64/E04FCJE.java | 415 +++++++++++++++++ simple_examples/source/int64/E04MTJE.java | 134 ++++++ simple_examples/source/int64/E04NFJE.java | 223 ++++++++++ simple_examples/source/int64/E04UCJE.java | 207 +++++++++ simple_examples/source/int64/F02EKJE.java | 230 ++++++++++ simple_examples/source/withdrawn/D02TKJE.java | 290 ++++++++++++ 290 files changed, 22288 insertions(+) create mode 100644 simple_examples/baseresults/a00aaje.r create mode 100644 simple_examples/baseresults/a00acje.r create mode 100644 simple_examples/baseresults/a00adje.r create mode 100644 simple_examples/baseresults/c02aaje.r create mode 100644 simple_examples/baseresults/c02abje.r create mode 100644 simple_examples/baseresults/c02afje.r create mode 100644 simple_examples/baseresults/c02agje.r create mode 100644 simple_examples/baseresults/c02ahje.r create mode 100644 simple_examples/baseresults/c02ajje.r create mode 100644 simple_examples/baseresults/c02akje.r create mode 100644 simple_examples/baseresults/c02alje.r create mode 100644 simple_examples/baseresults/c02amje.r create mode 100644 simple_examples/baseresults/c02anje.r create mode 100644 simple_examples/baseresults/c05auje.r create mode 100644 simple_examples/baseresults/c05awje.r create mode 100644 simple_examples/baseresults/c05ayje.r create mode 100644 simple_examples/baseresults/c05azje.r create mode 100644 simple_examples/baseresults/c05bbje.r create mode 100644 simple_examples/baseresults/c05mbje.r create mode 100644 simple_examples/baseresults/c05qbje.r create mode 100644 simple_examples/baseresults/c06baje.r create mode 100644 simple_examples/baseresults/c06fkje.r create mode 100644 simple_examples/baseresults/c09aaje.r create mode 100644 simple_examples/baseresults/complexargumentexample.r create mode 100644 simple_examples/baseresults/d01bdje.r create mode 100644 simple_examples/baseresults/d02neje.r create mode 100644 simple_examples/baseresults/d02tkje.r create mode 100644 simple_examples/baseresults/d02tlje.r create mode 100644 simple_examples/baseresults/d03pcje.r create mode 100644 simple_examples/baseresults/d03raje.r create mode 100644 simple_examples/baseresults/d03rbje.r create mode 100644 simple_examples/baseresults/d05baje.r create mode 100644 simple_examples/baseresults/d05beje.r create mode 100644 simple_examples/baseresults/dtfsmje.r create mode 100644 simple_examples/baseresults/e01daje.r create mode 100644 simple_examples/baseresults/e02alje.r create mode 100644 simple_examples/baseresults/e04abje.r create mode 100644 simple_examples/baseresults/e04bbje.r create mode 100644 simple_examples/baseresults/e04cbje.r create mode 100644 simple_examples/baseresults/e04fcje.r create mode 100644 simple_examples/baseresults/e04ffje.r create mode 100644 simple_examples/baseresults/e04gbje.r create mode 100644 simple_examples/baseresults/e04ggje.r create mode 100644 simple_examples/baseresults/e04mtje.r create mode 100644 simple_examples/baseresults/e04mxje.r create mode 100644 simple_examples/baseresults/e04ncje.r create mode 100644 simple_examples/baseresults/e04nfje.r create mode 100644 simple_examples/baseresults/e04nkje.r create mode 100644 simple_examples/baseresults/e04nqje.r create mode 100644 simple_examples/baseresults/e04ptje.r create mode 100644 simple_examples/baseresults/e04rpje.r create mode 100644 simple_examples/baseresults/e04rsje.r create mode 100644 simple_examples/baseresults/e04rtje.r create mode 100644 simple_examples/baseresults/e04saje.r create mode 100644 simple_examples/baseresults/e04taje.r create mode 100644 simple_examples/baseresults/e04tcje.r create mode 100644 simple_examples/baseresults/e04uc_example.r create mode 100644 simple_examples/baseresults/e04ucje.r create mode 100644 simple_examples/baseresults/e04yaje.r create mode 100644 simple_examples/baseresults/f01adje.r create mode 100644 simple_examples/baseresults/f01ckje.r create mode 100644 simple_examples/baseresults/f01crje.r create mode 100644 simple_examples/baseresults/f01dgje.r create mode 100644 simple_examples/baseresults/f01elje.r create mode 100644 simple_examples/baseresults/f01emje.r create mode 100644 simple_examples/baseresults/f02ekje.r create mode 100644 simple_examples/baseresults/f02fkje.r create mode 100644 simple_examples/baseresults/f02wgje.r create mode 100644 simple_examples/baseresults/f03baje.r create mode 100644 simple_examples/baseresults/f04amje.r create mode 100644 simple_examples/baseresults/f04baje.r create mode 100644 simple_examples/baseresults/f05aaje.r create mode 100644 simple_examples/baseresults/f06clje.r create mode 100644 simple_examples/baseresults/f07aaje.r create mode 100644 simple_examples/baseresults/f07abje.r create mode 100644 simple_examples/baseresults/f07adje.r create mode 100644 simple_examples/baseresults/f07aqje.r create mode 100644 simple_examples/baseresults/f07faje.r create mode 100644 simple_examples/baseresults/f07fbje.r create mode 100644 simple_examples/baseresults/f08btje.r create mode 100644 simple_examples/baseresults/f08faje.r create mode 100644 simple_examples/baseresults/f08xpje.r create mode 100644 simple_examples/baseresults/g01alje.r create mode 100644 simple_examples/baseresults/g02akje.r create mode 100644 simple_examples/baseresults/g02bjje.r create mode 100644 simple_examples/baseresults/g02brje.r create mode 100644 simple_examples/baseresults/g02daje.r create mode 100644 simple_examples/baseresults/g02eeje.r create mode 100644 simple_examples/baseresults/g02maje.r create mode 100644 simple_examples/baseresults/g03gaje.r create mode 100644 simple_examples/baseresults/g05kfje.r create mode 100644 simple_examples/baseresults/g13awje.r create mode 100644 simple_examples/baseresults/g13meje.r create mode 100644 simple_examples/baseresults/g13naje.r create mode 100644 simple_examples/baseresults/h02bbje.r create mode 100644 simple_examples/baseresults/h02daje.r create mode 100644 simple_examples/baseresults/m01ccje.r create mode 100644 simple_examples/baseresults/nagcomplexexample.r create mode 100644 simple_examples/baseresults/outputexample.r create mode 100644 simple_examples/baseresults/s01baje.r create mode 100644 simple_examples/baseresults/s10aaje.r create mode 100644 simple_examples/baseresults/s10abje.r create mode 100644 simple_examples/baseresults/s10acje.r create mode 100644 simple_examples/baseresults/s14abje.r create mode 100644 simple_examples/baseresults/s14acje.r create mode 100644 simple_examples/baseresults/s14afje.r create mode 100644 simple_examples/baseresults/s17dcje.r create mode 100644 simple_examples/baseresults/s17dgje.r create mode 100644 simple_examples/baseresults/s30aaje.r create mode 100644 simple_examples/baseresults/s30acje.r create mode 100644 simple_examples/baseresults/simpleroutineexample.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample1.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample2.r create mode 100644 simple_examples/baseresults/x03aaje.r create mode 100644 simple_examples/baseresults/x04cbje.r create mode 100644 simple_examples/baseresults/x05abje.r create mode 100644 simple_examples/data/c02abje.d create mode 100644 simple_examples/data/c02afje.d create mode 100644 simple_examples/data/c02agje.d create mode 100644 simple_examples/data/c02ahje.d create mode 100644 simple_examples/data/c02ajje.d create mode 100644 simple_examples/data/c02akje.d create mode 100644 simple_examples/data/c02alje.d create mode 100644 simple_examples/data/c02amje.d create mode 100644 simple_examples/data/c02anje.d create mode 100644 simple_examples/data/c05bbje.d create mode 100644 simple_examples/data/c06fkje.d create mode 100644 simple_examples/data/c09aaje.d create mode 100644 simple_examples/data/d03pcje.d create mode 100644 simple_examples/data/e02alje.d create mode 100644 simple_examples/data/e04fcje.d create mode 100644 simple_examples/data/e04mxje.d create mode 100644 simple_examples/data/e04ncje.d create mode 100644 simple_examples/data/e04nfje.d create mode 100644 simple_examples/data/e04nqje.d create mode 100644 simple_examples/data/e04rsje.d create mode 100644 simple_examples/data/e04rtje.d create mode 100644 simple_examples/data/e04saje.opt create mode 100644 simple_examples/data/e04tcje.d create mode 100644 simple_examples/data/f03baje.d create mode 100644 simple_examples/data/f04amje.d create mode 100644 simple_examples/data/f04baje.d create mode 100644 simple_examples/data/f05aaje.d create mode 100644 simple_examples/data/f08btje.d create mode 100644 simple_examples/data/f08xpje.d create mode 100644 simple_examples/data/g02bjje.d create mode 100644 simple_examples/data/g02daje.d create mode 100644 simple_examples/data/g02eeje.d create mode 100644 simple_examples/data/g02maje.d create mode 100644 simple_examples/data/g03gaje.d create mode 100644 simple_examples/data/g05kfje.d create mode 100644 simple_examples/data/g13naje.d create mode 100644 simple_examples/data/m01ccje.d create mode 100644 simple_examples/data/s14abje.d create mode 100644 simple_examples/data/s14acje.d create mode 100644 simple_examples/data/s14afje.d create mode 100644 simple_examples/data/s17dcje.d create mode 100644 simple_examples/data/s17dgje.d create mode 100644 simple_examples/data/s30aaje.d create mode 100644 simple_examples/data/s30acje.d create mode 100644 simple_examples/data/x03aaje.d create mode 100644 simple_examples/source/int32/A00AAJE.java create mode 100644 simple_examples/source/int32/A00ACJE.java create mode 100644 simple_examples/source/int32/A00ADJE.java create mode 100644 simple_examples/source/int32/C02AAJE.java create mode 100644 simple_examples/source/int32/C02ABJE.java create mode 100644 simple_examples/source/int32/C02AFJE.java create mode 100644 simple_examples/source/int32/C02AGJE.java create mode 100644 simple_examples/source/int32/C02AHJE.java create mode 100644 simple_examples/source/int32/C02AJJE.java create mode 100644 simple_examples/source/int32/C02AKJE.java create mode 100644 simple_examples/source/int32/C02ALJE.java create mode 100644 simple_examples/source/int32/C02AMJE.java create mode 100644 simple_examples/source/int32/C02ANJE.java create mode 100644 simple_examples/source/int32/C05AUJE.java create mode 100644 simple_examples/source/int32/C05AWJE.java create mode 100644 simple_examples/source/int32/C05AYJE.java create mode 100644 simple_examples/source/int32/C05AZJE.java create mode 100644 simple_examples/source/int32/C05BBJE.java create mode 100644 simple_examples/source/int32/C05MBJE.java create mode 100644 simple_examples/source/int32/C05QBJE.java create mode 100644 simple_examples/source/int32/C06BAJE.java create mode 100644 simple_examples/source/int32/C06FKJE.java create mode 100644 simple_examples/source/int32/C09AAJE.java create mode 100644 simple_examples/source/int32/D01BDJE.java create mode 100644 simple_examples/source/int32/D01RJJE.java create mode 100644 simple_examples/source/int32/D01RKJE.java create mode 100644 simple_examples/source/int32/D01RLJE.java create mode 100644 simple_examples/source/int32/D01RMJE.java create mode 100644 simple_examples/source/int32/D01TCJE.java create mode 100644 simple_examples/source/int32/D02NEJE.java create mode 100644 simple_examples/source/int32/D02TLJE.java create mode 100644 simple_examples/source/int32/D03PCJE.java create mode 100644 simple_examples/source/int32/D03RAJE.java create mode 100644 simple_examples/source/int32/D03RBJE.java create mode 100644 simple_examples/source/int32/D05BAJE.java create mode 100644 simple_examples/source/int32/D05BEJE.java create mode 100644 simple_examples/source/int32/DTFSMJE.java create mode 100644 simple_examples/source/int32/E01DAJE.java create mode 100644 simple_examples/source/int32/E02ALJE.java create mode 100644 simple_examples/source/int32/E04ABJE.java create mode 100644 simple_examples/source/int32/E04BBJE.java create mode 100644 simple_examples/source/int32/E04CBJE.java create mode 100644 simple_examples/source/int32/E04FCJE.java create mode 100644 simple_examples/source/int32/E04FFJE.java create mode 100644 simple_examples/source/int32/E04GBJE.java create mode 100644 simple_examples/source/int32/E04GGJE.java create mode 100644 simple_examples/source/int32/E04MTJE.java create mode 100644 simple_examples/source/int32/E04MXJE.java create mode 100644 simple_examples/source/int32/E04NCJE.java create mode 100644 simple_examples/source/int32/E04NFJE.java create mode 100644 simple_examples/source/int32/E04NKJE.java create mode 100644 simple_examples/source/int32/E04NQJE.java create mode 100644 simple_examples/source/int32/E04PTJE.java create mode 100644 simple_examples/source/int32/E04RPJE.java create mode 100644 simple_examples/source/int32/E04RSJE.java create mode 100644 simple_examples/source/int32/E04RTJE.java create mode 100644 simple_examples/source/int32/E04SAJE.java create mode 100644 simple_examples/source/int32/E04TAJE.java create mode 100644 simple_examples/source/int32/E04TCJE.java create mode 100644 simple_examples/source/int32/E04UCJE.java create mode 100644 simple_examples/source/int32/E04YAJE.java create mode 100644 simple_examples/source/int32/F01ADJE.java create mode 100644 simple_examples/source/int32/F01CKJE.java create mode 100644 simple_examples/source/int32/F01CRJE.java create mode 100644 simple_examples/source/int32/F01DGJE.java create mode 100644 simple_examples/source/int32/F01ELJE.java create mode 100644 simple_examples/source/int32/F01EMJE.java create mode 100644 simple_examples/source/int32/F02EKJE.java create mode 100644 simple_examples/source/int32/F02FKJE.java create mode 100644 simple_examples/source/int32/F02WGJE.java create mode 100644 simple_examples/source/int32/F03BAJE.java create mode 100644 simple_examples/source/int32/F04AMJE.java create mode 100644 simple_examples/source/int32/F04BAJE.java create mode 100644 simple_examples/source/int32/F05AAJE.java create mode 100644 simple_examples/source/int32/F06CLJE.java create mode 100644 simple_examples/source/int32/F07AAJE.java create mode 100644 simple_examples/source/int32/F07ABJE.java create mode 100644 simple_examples/source/int32/F07ADJE.java create mode 100644 simple_examples/source/int32/F07AQJE.java create mode 100644 simple_examples/source/int32/F07FAJE.java create mode 100644 simple_examples/source/int32/F07FBJE.java create mode 100644 simple_examples/source/int32/F08BTJE.java create mode 100644 simple_examples/source/int32/F08FAJE.java create mode 100644 simple_examples/source/int32/F08XPJE.java create mode 100644 simple_examples/source/int32/G01ALJE.java create mode 100644 simple_examples/source/int32/G02AKJE.java create mode 100644 simple_examples/source/int32/G02BJJE.java create mode 100644 simple_examples/source/int32/G02BRJE.java create mode 100644 simple_examples/source/int32/G02DAJE.java create mode 100644 simple_examples/source/int32/G02EEJE.java create mode 100644 simple_examples/source/int32/G02MAJE.java create mode 100644 simple_examples/source/int32/G03GAJE.java create mode 100644 simple_examples/source/int32/G05KFJE.java create mode 100644 simple_examples/source/int32/G13AWJE.java create mode 100644 simple_examples/source/int32/G13MEJE.java create mode 100644 simple_examples/source/int32/G13NAJE.java create mode 100644 simple_examples/source/int32/H02BBJE.java create mode 100644 simple_examples/source/int32/H02DAJE.java create mode 100644 simple_examples/source/int32/M01CCJE.java create mode 100644 simple_examples/source/int32/S01BAJE.java create mode 100644 simple_examples/source/int32/S10AAJE.java create mode 100644 simple_examples/source/int32/S10ABJE.java create mode 100644 simple_examples/source/int32/S10ACJE.java create mode 100644 simple_examples/source/int32/S14ABJE.java create mode 100644 simple_examples/source/int32/S14ACJE.java create mode 100644 simple_examples/source/int32/S14AFJE.java create mode 100644 simple_examples/source/int32/S17DCJE.java create mode 100644 simple_examples/source/int32/S17DGJE.java create mode 100644 simple_examples/source/int32/S30AAJE.java create mode 100644 simple_examples/source/int32/S30ACJE.java create mode 100644 simple_examples/source/int32/X03AAJE.java create mode 100644 simple_examples/source/int32/X04CBJE.java create mode 100644 simple_examples/source/int32/X05ABJE.java create mode 100644 simple_examples/source/int64/A00AAJE.java create mode 100644 simple_examples/source/int64/A00ADJE.java create mode 100644 simple_examples/source/int64/C05AYJE.java create mode 100644 simple_examples/source/int64/C05AZJE.java create mode 100644 simple_examples/source/int64/C05MBJE.java create mode 100644 simple_examples/source/int64/C05QBJE.java create mode 100644 simple_examples/source/int64/D01BDJE.java create mode 100644 simple_examples/source/int64/D02NEJE.java create mode 100644 simple_examples/source/int64/DTFSMJE.java create mode 100644 simple_examples/source/int64/E01DAJE.java create mode 100644 simple_examples/source/int64/E04FCJE.java create mode 100644 simple_examples/source/int64/E04MTJE.java create mode 100644 simple_examples/source/int64/E04NFJE.java create mode 100644 simple_examples/source/int64/E04UCJE.java create mode 100644 simple_examples/source/int64/F02EKJE.java create mode 100644 simple_examples/source/withdrawn/D02TKJE.java diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r new file mode 100644 index 0000000..adcba2f --- /dev/null +++ b/simple_examples/baseresults/a00aaje.r @@ -0,0 +1,10 @@ + A00AAJ Example Program Results + + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: double precision + Product Code: CLL6I262CL + Mark: 27.2.0 (self-contained) + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/a00acje.r b/simple_examples/baseresults/a00acje.r new file mode 100644 index 0000000..0012531 --- /dev/null +++ b/simple_examples/baseresults/a00acje.r @@ -0,0 +1,3 @@ + A00ACJ Example Program Results + + A valid licence key is available diff --git a/simple_examples/baseresults/a00adje.r b/simple_examples/baseresults/a00adje.r new file mode 100644 index 0000000..5fb1839 --- /dev/null +++ b/simple_examples/baseresults/a00adje.r @@ -0,0 +1,17 @@ + A00ADJ Example Program Results + +*** Start of NAG Library implementation details *** + +Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: Fortran double precision + Product code: CLL6I262CL + Mark: 26.2 + Vendor Library: None +Applicable to: + hardware: x86_64 + operating system: Linux 2.6.32-696.6.3.el6.x86_64 + Fortran compiler: Intel ifort Version 18.0.1.163 20171018 +and compatible systems. + Licence query: Successful + +*** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/c02aaje.r b/simple_examples/baseresults/c02aaje.r new file mode 100644 index 0000000..fa3083b --- /dev/null +++ b/simple_examples/baseresults/c02aaje.r @@ -0,0 +1,19 @@ + C02AAJ Example Program Results + + Example 1: Basic Problem + + i z conv berr cond + --------------------------------------------------- + 1 6.53E-03, 7.42E-03 3 9.25E-18 4.84E+00 + 2 -6.93E-03, -7.44E-03 2 0.00E+00 4.95E+00 + 3 -2.43E+01, -4.86E+00 3 8.41E-18 1.13E+01 + 4 1.47E+01, -1.66E+01 3 1.07E-17 9.99E+00 + 5 5.25E+00, 2.27E+01 3 2.08E-17 1.06E+01 + + Example 2: Polishing Processes + + polish relerr fwderr + ---------------------------- + 0 3.18E-10 1.15E-04 + 1 6.16E-11 8.49E-06 + 2 1.11E-16 1.11E-16 diff --git a/simple_examples/baseresults/c02abje.r b/simple_examples/baseresults/c02abje.r new file mode 100644 index 0000000..01b29cd --- /dev/null +++ b/simple_examples/baseresults/c02abje.r @@ -0,0 +1,12 @@ + C02ABJ Example Program Results + + Basic Problem + + i z conv berr cond + ----------------------------------------------------- + 1 ( 1.15E+00, 7.36E-01) 3 5.37E-18 1.34E+01 + 2 ( -1.67E+00, 3.25E-01) 3 6.34E-18 2.20E+01 + 3 ( 3.79E-01, -1.25E+00) 3 2.98E-18 1.02E+01 + 4 ( -1.67E+00, -3.25E-01) 3 4.57E-18 2.20E+01 + 5 ( 1.15E+00, -7.36E-01) 3 1.04E-17 1.34E+01 + 6 ( 3.79E-01, 1.25E+00) 2 1.66E-18 1.02E+01 diff --git a/simple_examples/baseresults/c02afje.r b/simple_examples/baseresults/c02afje.r new file mode 100644 index 0000000..386d4fe --- /dev/null +++ b/simple_examples/baseresults/c02afje.r @@ -0,0 +1,28 @@ + C02AFJ Example Program Results + + + Example 1 + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -2.4328E+01 -4.8555E+00*i + z = 5.2487E+00 +2.2736E+01*i + z = 1.4653E+01 -1.6569E+01*i + z = -6.9264E-03 -7.4434E-03*i + z = 6.5264E-03 +7.4232E-03*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -2.4328E+01 -4.8555E+00*i 5.7E-16 + z = 5.2487E+00 +2.2736E+01*i 1.5E-16 + z = 1.4653E+01 -1.6569E+01*i 4.8E-16 + z = -6.9264E-03 -7.4434E-03*i 1.1E-16 + z = 6.5264E-03 +7.4232E-03*i 1.8E-16 diff --git a/simple_examples/baseresults/c02agje.r b/simple_examples/baseresults/c02agje.r new file mode 100644 index 0000000..8e10c18 --- /dev/null +++ b/simple_examples/baseresults/c02agje.r @@ -0,0 +1,27 @@ + C02AGJ Example Program Results + + + Example 1 + + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -1.4918E+00 + z = 5.5169E-01 +/- 1.2533E+00*i + z = -8.0579E-01 +/- 1.2229E+00*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -1.4918E+00 +0.0000E+00*i 7.4E-16 + z = 5.5169E-01 +1.2533E+00*i 1.1E-16 + z = 5.5169E-01 -1.2533E+00*i 1.1E-16 + z = -8.0579E-01 +1.2229E+00*i 3.0E-16 + z = -8.0579E-01 -1.2229E+00*i 3.0E-16 diff --git a/simple_examples/baseresults/c02ahje.r b/simple_examples/baseresults/c02ahje.r new file mode 100644 index 0000000..e3efc97 --- /dev/null +++ b/simple_examples/baseresults/c02ahje.r @@ -0,0 +1,6 @@ + C02AHJ Example Program Results + + Roots of quadratic equation + + z = 1.0000E+00 +2.0000E+00*i + z = 2.0000E+00 -3.0000E+00*i diff --git a/simple_examples/baseresults/c02ajje.r b/simple_examples/baseresults/c02ajje.r new file mode 100644 index 0000000..944fa06 --- /dev/null +++ b/simple_examples/baseresults/c02ajje.r @@ -0,0 +1,6 @@ + C02AJJ Example Program Results + + Roots of quadratic equation + + z = 2.0000E+00 + z = -5.0000E+00 diff --git a/simple_examples/baseresults/c02akje.r b/simple_examples/baseresults/c02akje.r new file mode 100644 index 0000000..34b3e74 --- /dev/null +++ b/simple_examples/baseresults/c02akje.r @@ -0,0 +1,8 @@ + C02AKJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = 1.0000E+00 +0.0000E+00*i 1.0E-15 + z = -2.0000E+00 +3.0000E+00*i 1.0E-15 + z = -2.0000E+00 -3.0000E+00*i 1.0E-15 diff --git a/simple_examples/baseresults/c02alje.r b/simple_examples/baseresults/c02alje.r new file mode 100644 index 0000000..ff49a36 --- /dev/null +++ b/simple_examples/baseresults/c02alje.r @@ -0,0 +1,9 @@ + C02ALJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 2.0000E+00 +0.0000E+00*i 1.2E-15 + z = -2.0000E+00 +0.0000E+00*i 1.1E-15 + z = -1.0000E+00 +3.0000E+00*i 1.1E-15 + z = -1.0000E+00 -3.0000E+00*i 1.1E-15 diff --git a/simple_examples/baseresults/c02amje.r b/simple_examples/baseresults/c02amje.r new file mode 100644 index 0000000..c2c70b4 --- /dev/null +++ b/simple_examples/baseresults/c02amje.r @@ -0,0 +1,8 @@ + C02AMJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = -2.0000E+00 +3.0000E+00*i 1.3E-15 + z = 1.0000E+00 -2.0000E+00*i 2.2E-15 + z = 3.0000E+00 -4.0000E+00*i 2.1E-15 diff --git a/simple_examples/baseresults/c02anje.r b/simple_examples/baseresults/c02anje.r new file mode 100644 index 0000000..4361b7e --- /dev/null +++ b/simple_examples/baseresults/c02anje.r @@ -0,0 +1,9 @@ + C02ANJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 3.0000E+00 -2.0000E+00*i 1.8E-15 + z = 1.0000E+00 -2.0000E+00*i 1.8E-15 + z = -2.0000E+00 +1.0000E+00*i 1.8E-15 + z = -2.0000E+00 +3.0000E+00*i 1.8E-15 diff --git a/simple_examples/baseresults/c05auje.r b/simple_examples/baseresults/c05auje.r new file mode 100644 index 0000000..1c8bb18 --- /dev/null +++ b/simple_examples/baseresults/c05auje.r @@ -0,0 +1,4 @@ +C05AUJ Example Program Results + +Root is : 0.56714 +Interval searched is : [ 0.50000, 0.90000] diff --git a/simple_examples/baseresults/c05awje.r b/simple_examples/baseresults/c05awje.r new file mode 100644 index 0000000..0868382 --- /dev/null +++ b/simple_examples/baseresults/c05awje.r @@ -0,0 +1,4 @@ +C05AWJ Example Program Results + +With eps = 1.00e-03 root = 0.56715 +With eps = 1.00e-04 root = 0.56715 diff --git a/simple_examples/baseresults/c05ayje.r b/simple_examples/baseresults/c05ayje.r new file mode 100644 index 0000000..50a0010 --- /dev/null +++ b/simple_examples/baseresults/c05ayje.r @@ -0,0 +1,3 @@ +C05AYJ Example Program Results + +Zero at x = 0.56714 diff --git a/simple_examples/baseresults/c05azje.r b/simple_examples/baseresults/c05azje.r new file mode 100644 index 0000000..1d3b6bc --- /dev/null +++ b/simple_examples/baseresults/c05azje.r @@ -0,0 +1,15 @@ + C05AZJ Example Program Results + + Iterations + + X = 0.00000 FX = 1.0000E+00 IND = 2 + X = 1.00000 FX = -6.3212E-01 IND = 3 + X = 0.61270 FX = -7.0814E-02 IND = 4 + X = 0.56707 FX = 1.1542E-04 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + X = 0.56713 FX = 1.4727E-05 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/c05bbje.r b/simple_examples/baseresults/c05bbje.r new file mode 100644 index 0000000..a963b94 --- /dev/null +++ b/simple_examples/baseresults/c05bbje.r @@ -0,0 +1,10 @@ +C05BBJ Example Program Results +Branch = 0 +Offset = false + + Z W(Z) RESID IFAIL + +(5.00000e-01, -1.00000e+00) (5.16511e-01, -4.22053e-01) 5.55112e-17 0 +(1.00000e+00, 2.30000e+00) (8.73606e-01, 5.76978e-01) 1.11022e-16 0 +(4.50000e+00, -1.00000e-01) (1.26735e+00, -1.24194e-02) 0.00000e+00 0 +(6.00000e+00, 6.00000e+00) (1.61492e+00, 4.90515e-01) 1.25607e-15 0 diff --git a/simple_examples/baseresults/c05mbje.r b/simple_examples/baseresults/c05mbje.r new file mode 100644 index 0000000..49cdab8 --- /dev/null +++ b/simple_examples/baseresults/c05mbje.r @@ -0,0 +1,8 @@ +C05MBJ Example Program Results + + +Final 2-norm of the residuals = 2.4765e-08 + +Final approximate solution + + 0.7682 0.7862 0.6948 0.6180 diff --git a/simple_examples/baseresults/c05qbje.r b/simple_examples/baseresults/c05qbje.r new file mode 100644 index 0000000..e161a18 --- /dev/null +++ b/simple_examples/baseresults/c05qbje.r @@ -0,0 +1,8 @@ + C05QBJ Example Program Results + + Final 2-norm of the residuals = 1.1926E-08 + + Final approximate solution + -0.5707 -0.6816 -0.7017 + -0.7042 -0.7014 -0.6919 + -0.6658 -0.5960 -0.4164 diff --git a/simple_examples/baseresults/c06baje.r b/simple_examples/baseresults/c06baje.r new file mode 100644 index 0000000..7049ba9 --- /dev/null +++ b/simple_examples/baseresults/c06baje.r @@ -0,0 +1,15 @@ +C06BAJ Example Program Results + + Estimated Actual +I SEQN RESULT abs error error + +1 1.0000 1.0000 - 1.78e-01 +2 0.7500 0.7500 - -7.25e-02 +3 0.8611 0.8269 - 4.46e-03 +4 0.7986 0.8211 2.56e-01 -1.36e-03 +5 0.8386 0.8226 7.84e-02 1.23e-04 +6 0.8108 0.8224 5.97e-03 -3.26e-05 +7 0.8312 0.8225 1.52e-03 3.50e-06 +8 0.8156 0.8225 1.60e-04 -8.51e-07 +9 0.8280 0.8225 3.70e-05 1.01e-07 +10 0.8180 0.8225 4.48e-06 -2.32e-08 \ No newline at end of file diff --git a/simple_examples/baseresults/c06fkje.r b/simple_examples/baseresults/c06fkje.r new file mode 100644 index 0000000..8ef60db --- /dev/null +++ b/simple_examples/baseresults/c06fkje.r @@ -0,0 +1,13 @@ +C06FKJ Example Program Results + + Covolution Correlation + +0 0.50000 2.00000 +1 1.00000 1.50000 +2 1.50000 1.00000 +3 2.00000 0.50000 +4 2.00000 0.00000 +5 1.50000 0.50000 +6 1.00000 1.00000 +7 0.50000 1.50000 +8 0.00000 2.00000 diff --git a/simple_examples/baseresults/c09aaje.r b/simple_examples/baseresults/c09aaje.r new file mode 100644 index 0000000..950c020 --- /dev/null +++ b/simple_examples/baseresults/c09aaje.r @@ -0,0 +1,18 @@ +C09AAJ Example Program Results + +Parameters read from file :: + Wavelet : Haar End mode : Zero N = 8 +Input data X : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 + +Length of wavelet filter : 2 +Number of Levels : 3 +Number of coefficients in each level: + 1 1 2 4 +Total number of wavelength coefficients : 8 + +Wavelet coefficients C: +12.374 4.596 -5.000 5.500 -2.121 -0.707 2.121 -1.414 + +Reconstruction Y : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 \ No newline at end of file diff --git a/simple_examples/baseresults/complexargumentexample.r b/simple_examples/baseresults/complexargumentexample.r new file mode 100644 index 0000000..19fc96c --- /dev/null +++ b/simple_examples/baseresults/complexargumentexample.r @@ -0,0 +1 @@ +(1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/d01bdje.r b/simple_examples/baseresults/d01bdje.r new file mode 100644 index 0000000..23c78d1 --- /dev/null +++ b/simple_examples/baseresults/d01bdje.r @@ -0,0 +1,9 @@ + D01BDJ Example Program Results + + A - lower limit of integration = 0.0000 + B - upper limit of integration = 1.0000 + EPSABS - absolute accuracy requested = 0.00E+00 + EPSREL - relative accuracy requested = 1.00E-04 + + RESULT - approximation to the integral = -0.03183 + ABSERR - estimate to the absolute error = 1.34E-11 diff --git a/simple_examples/baseresults/d02neje.r b/simple_examples/baseresults/d02neje.r new file mode 100644 index 0000000..b735aaf --- /dev/null +++ b/simple_examples/baseresults/d02neje.r @@ -0,0 +1,25 @@ + D02NEJ Example Program Results + + D02NEF Example 1 + + t Y(1) Y(2) Y(3) + 0.0000 1.000000 0.000000 0.000000 + 0.0200 0.999204 0.000036 0.000760 + 0.0400 0.998415 0.000036 0.001549 + 0.0600 0.997631 0.000036 0.002333 + 0.0800 0.996852 0.000036 0.003112 + 0.1000 0.996080 0.000036 0.003884 + + The integrator completed task, ITASK = 3 + + D02NEF Example 2 + + t y(1) + 0.0000 2.000000 + 0.2000 2.038016 + 0.4000 2.078379 + 0.6000 2.121462 + 0.8000 2.167736 + 1.0000 2.217821 + + The integrator completed task, ITASK = 3 diff --git a/simple_examples/baseresults/d02tkje.r b/simple_examples/baseresults/d02tkje.r new file mode 100644 index 0000000..4029a48 --- /dev/null +++ b/simple_examples/baseresults/d02tkje.r @@ -0,0 +1,113 @@ + D02TKJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d02tlje.r b/simple_examples/baseresults/d02tlje.r new file mode 100644 index 0000000..b56a57d --- /dev/null +++ b/simple_examples/baseresults/d02tlje.r @@ -0,0 +1,113 @@ + D02TLJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d03pcje.r b/simple_examples/baseresults/d03pcje.r new file mode 100644 index 0000000..154a2d9 --- /dev/null +++ b/simple_examples/baseresults/d03pcje.r @@ -0,0 +1,28 @@ +D03PCJ Example Program Results +Accuracy requirement = 1.00000e-03 + Parameter ALPHA = 1.000e+00 +T / X 0.0000 0.4000 0.6000 0.8000 0.9000 1.0000 + +0.0001 U(1) 0.0000 0.8008 1.1988 1.5990 1.7958 1.8485 + U(2) 0.9997 0.9995 0.9994 0.9988 0.9663 -0.0000 + + +0.0010 U(1) 0.0000 0.7982 1.1940 1.5841 1.7179 1.6734 + U(2) 0.9969 0.9952 0.9937 0.9484 0.6385 -0.0000 + + +0.0100 U(1) 0.0000 0.7676 1.1239 1.3547 1.3635 1.2830 + U(2) 0.9627 0.9495 0.8754 0.5537 0.2908 -0.0000 + + +0.1000 U(1) 0.0000 0.3908 0.5007 0.5297 0.5120 0.4744 + U(2) 0.5468 0.4299 0.2995 0.1479 0.0724 -0.0000 + + +1.0000 U(1) 0.0000 0.0007 0.0008 0.0008 0.0008 0.0007 + U(2) 0.0010 0.0007 0.0005 0.0002 0.0001 -0.0000 + +Number of Integration steps in time 78 +Number of residual evaluations of resulting ODE system 378 +Number of Jacobian evaluations 25 +Number of iterations of nonlinear solver 190 diff --git a/simple_examples/baseresults/d03raje.r b/simple_examples/baseresults/d03raje.r new file mode 100644 index 0000000..59cf403 --- /dev/null +++ b/simple_examples/baseresults/d03raje.r @@ -0,0 +1,409 @@ + D03RAJ Example Program Results + + Statistics: + Time = 0.2400 + Total number of accepted timesteps = 77 + Total number of rejected timesteps = 0 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 600 80 200 200 + + Maximum number of + Newton iters Lin sys iters + At level + 1 2 3 + + Solution at every 4th grid point in level 2 at time 0.2500: + + x y approx u + + 6.7500E-01 0.000E+00 2.000E+00 + 7.2500E-01 0.000E+00 1.980E+00 + 7.7500E-01 0.000E+00 1.342E+00 + 8.2500E-01 0.000E+00 1.190E+00 + 7.1250E-01 1.250E-02 1.996E+00 + 7.6250E-01 1.250E-02 1.468E+00 + 8.1250E-01 1.250E-02 1.213E+00 + 7.0000E-01 2.500E-02 1.999E+00 + 7.5000E-01 2.500E-02 1.625E+00 + 8.0000E-01 2.500E-02 1.240E+00 + 6.8750E-01 3.750E-02 2.000E+00 + 7.3750E-01 3.750E-02 1.870E+00 + 7.8750E-01 3.750E-02 1.283E+00 + 6.7500E-01 5.000E-02 2.000E+00 + 7.2500E-01 5.000E-02 1.980E+00 + 7.7500E-01 5.000E-02 1.342E+00 + 8.2500E-01 5.000E-02 1.190E+00 + 7.1250E-01 6.250E-02 1.996E+00 + 7.6250E-01 6.250E-02 1.468E+00 + 8.1250E-01 6.250E-02 1.213E+00 + 7.0000E-01 7.500E-02 1.999E+00 + 7.5000E-01 7.500E-02 1.625E+00 + 8.0000E-01 7.500E-02 1.240E+00 + 6.8750E-01 8.750E-02 2.000E+00 + 7.3750E-01 8.750E-02 1.870E+00 + 7.8750E-01 8.750E-02 1.283E+00 + 6.7500E-01 1.000E-01 2.000E+00 + 7.2500E-01 1.000E-01 1.980E+00 + 7.7500E-01 1.000E-01 1.342E+00 + 8.2500E-01 1.000E-01 1.190E+00 + 7.1250E-01 1.125E-01 1.996E+00 + 7.6250E-01 1.125E-01 1.468E+00 + 8.1250E-01 1.125E-01 1.213E+00 + 7.0000E-01 1.250E-01 1.999E+00 + 7.5000E-01 1.250E-01 1.625E+00 + 8.0000E-01 1.250E-01 1.240E+00 + 6.8750E-01 1.375E-01 2.000E+00 + 7.3750E-01 1.375E-01 1.870E+00 + 7.8750E-01 1.375E-01 1.283E+00 + 6.7500E-01 1.500E-01 2.000E+00 + 7.2500E-01 1.500E-01 1.980E+00 + 7.7500E-01 1.500E-01 1.341E+00 + 8.2500E-01 1.500E-01 1.190E+00 + 7.1250E-01 1.625E-01 1.995E+00 + 7.6250E-01 1.625E-01 1.467E+00 + 8.1250E-01 1.625E-01 1.213E+00 + 7.0000E-01 1.750E-01 1.999E+00 + 7.5000E-01 1.750E-01 1.624E+00 + 8.0000E-01 1.750E-01 1.240E+00 + 6.8750E-01 1.875E-01 2.000E+00 + 7.3750E-01 1.875E-01 1.869E+00 + 7.8750E-01 1.875E-01 1.282E+00 + 6.7500E-01 2.000E-01 2.000E+00 + 7.2500E-01 2.000E-01 1.980E+00 + 7.7500E-01 2.000E-01 1.341E+00 + 8.2500E-01 2.000E-01 1.189E+00 + 7.1250E-01 2.125E-01 1.995E+00 + 7.6250E-01 2.125E-01 1.465E+00 + 8.1250E-01 2.125E-01 1.212E+00 + 7.0000E-01 2.250E-01 1.999E+00 + 7.5000E-01 2.250E-01 1.621E+00 + 8.0000E-01 2.250E-01 1.240E+00 + 6.8750E-01 2.375E-01 2.000E+00 + 7.3750E-01 2.375E-01 1.869E+00 + 7.8750E-01 2.375E-01 1.282E+00 + 6.7500E-01 2.500E-01 2.000E+00 + 7.2500E-01 2.500E-01 1.980E+00 + 7.7500E-01 2.500E-01 1.340E+00 + 8.2500E-01 2.500E-01 1.189E+00 + 7.1250E-01 2.625E-01 1.995E+00 + 7.6250E-01 2.625E-01 1.462E+00 + 8.1250E-01 2.625E-01 1.212E+00 + 7.0000E-01 2.750E-01 1.999E+00 + 7.5000E-01 2.750E-01 1.616E+00 + 8.0000E-01 2.750E-01 1.239E+00 + 6.8750E-01 2.875E-01 2.000E+00 + 7.3750E-01 2.875E-01 1.866E+00 + 7.8750E-01 2.875E-01 1.281E+00 + 6.7500E-01 3.000E-01 2.000E+00 + 7.2500E-01 3.000E-01 1.979E+00 + 7.7500E-01 3.000E-01 1.337E+00 + 8.2500E-01 3.000E-01 1.189E+00 + 7.1250E-01 3.125E-01 1.995E+00 + 7.6250E-01 3.125E-01 1.455E+00 + 8.1250E-01 3.125E-01 1.212E+00 + 7.0000E-01 3.250E-01 1.999E+00 + 7.5000E-01 3.250E-01 1.605E+00 + 8.0000E-01 3.250E-01 1.239E+00 + 6.8750E-01 3.375E-01 2.000E+00 + 7.3750E-01 3.375E-01 1.862E+00 + 7.8750E-01 3.375E-01 1.279E+00 + 6.7500E-01 3.500E-01 2.000E+00 + 7.2500E-01 3.500E-01 1.977E+00 + 7.7500E-01 3.500E-01 1.332E+00 + 8.2500E-01 3.500E-01 1.189E+00 + 7.1250E-01 3.625E-01 1.993E+00 + 7.6250E-01 3.625E-01 1.442E+00 + 8.1250E-01 3.625E-01 1.211E+00 + 7.0000E-01 3.750E-01 1.999E+00 + 7.5000E-01 3.750E-01 1.585E+00 + 8.0000E-01 3.750E-01 1.236E+00 + 6.8750E-01 3.875E-01 2.000E+00 + 7.3750E-01 3.875E-01 1.849E+00 + 7.8750E-01 3.875E-01 1.274E+00 + 6.7500E-01 4.000E-01 2.000E+00 + 7.2500E-01 4.000E-01 1.972E+00 + 7.7500E-01 4.000E-01 1.324E+00 + 8.2500E-01 4.000E-01 1.187E+00 + 7.1250E-01 4.125E-01 1.990E+00 + 7.6250E-01 4.125E-01 1.420E+00 + 8.1250E-01 4.125E-01 1.209E+00 + 7.0000E-01 4.250E-01 1.997E+00 + 7.5000E-01 4.250E-01 1.549E+00 + 8.0000E-01 4.250E-01 1.233E+00 + 6.8750E-01 4.375E-01 1.999E+00 + 7.3750E-01 4.375E-01 1.813E+00 + 7.8750E-01 4.375E-01 1.267E+00 + 6.7500E-01 4.500E-01 2.000E+00 + 7.2500E-01 4.500E-01 1.952E+00 + 7.7500E-01 4.500E-01 1.310E+00 + 8.2500E-01 4.500E-01 1.185E+00 + 7.1250E-01 4.625E-01 1.976E+00 + 7.6250E-01 4.625E-01 1.387E+00 + 8.1250E-01 4.625E-01 1.206E+00 + 6.7500E-01 4.750E-01 2.000E+00 + 7.2500E-01 4.750E-01 1.924E+00 + 7.7500E-01 4.750E-01 1.301E+00 + 8.2500E-01 4.750E-01 1.184E+00 + 6.8750E-01 4.875E-01 1.999E+00 + 7.3750E-01 4.875E-01 1.714E+00 + 7.8750E-01 4.875E-01 1.257E+00 + 6.5000E-01 5.000E-01 2.000E+00 + 7.0000E-01 5.000E-01 1.991E+00 + 7.5000E-01 5.000E-01 1.454E+00 + 8.0000E-01 5.000E-01 1.224E+00 + 6.6250E-01 5.125E-01 2.000E+00 + 7.1250E-01 5.125E-01 1.932E+00 + 7.6250E-01 5.125E-01 1.346E+00 + 6.5000E-01 5.250E-01 2.000E+00 + 7.0000E-01 5.250E-01 1.986E+00 + 7.5000E-01 5.250E-01 1.414E+00 + 8.0000E-01 5.250E-01 1.219E+00 + 6.8750E-01 5.375E-01 1.996E+00 + 7.3750E-01 5.375E-01 1.545E+00 + 7.8750E-01 5.375E-01 1.243E+00 + 6.5000E-01 5.500E-01 2.000E+00 + 7.0000E-01 5.500E-01 1.978E+00 + 7.5000E-01 5.500E-01 1.373E+00 + 8.0000E-01 5.500E-01 1.214E+00 + 6.6250E-01 5.625E-01 1.999E+00 + 7.1250E-01 5.625E-01 1.843E+00 + 7.6250E-01 5.625E-01 1.302E+00 + 6.2500E-01 5.750E-01 2.000E+00 + 6.7500E-01 5.750E-01 1.995E+00 + 7.2500E-01 5.750E-01 1.545E+00 + 7.7500E-01 5.750E-01 1.256E+00 + 6.3750E-01 5.875E-01 2.000E+00 + 6.8750E-01 5.875E-01 1.954E+00 + 7.3750E-01 5.875E-01 1.392E+00 + 7.8750E-01 5.875E-01 1.226E+00 + 6.2500E-01 6.000E-01 2.000E+00 + 6.7500E-01 6.000E-01 1.984E+00 + 7.2500E-01 6.000E-01 1.443E+00 + 7.7500E-01 6.000E-01 1.243E+00 + 6.1250E-01 6.125E-01 2.000E+00 + 6.6250E-01 6.125E-01 1.988E+00 + 7.1250E-01 6.125E-01 1.531E+00 + 7.6250E-01 6.125E-01 1.263E+00 + 5.5000E-01 6.250E-01 2.000E+00 + 6.0000E-01 6.250E-01 2.000E+00 + 6.5000E-01 6.250E-01 1.993E+00 + 7.0000E-01 6.250E-01 1.577E+00 + 7.5000E-01 6.250E-01 1.280E+00 + 8.0000E-01 6.250E-01 1.194E+00 + 5.8750E-01 6.375E-01 2.000E+00 + 6.3750E-01 6.375E-01 1.992E+00 + 6.8750E-01 6.375E-01 1.672E+00 + 7.3750E-01 6.375E-01 1.300E+00 + 4.7500E-01 6.500E-01 2.000E+00 + 5.2500E-01 6.500E-01 2.000E+00 + 5.7500E-01 6.500E-01 2.000E+00 + 6.2500E-01 6.500E-01 1.993E+00 + 6.7500E-01 6.500E-01 1.680E+00 + 7.2500E-01 6.500E-01 1.314E+00 + 7.7500E-01 6.500E-01 1.218E+00 + 5.1250E-01 6.625E-01 2.000E+00 + 5.6250E-01 6.625E-01 1.999E+00 + 6.1250E-01 6.625E-01 1.988E+00 + 6.6250E-01 6.625E-01 1.721E+00 + 7.1250E-01 6.625E-01 1.331E+00 + 7.6250E-01 6.625E-01 1.229E+00 + 2.5000E-02 6.750E-01 2.000E+00 + 7.5000E-02 6.750E-01 2.000E+00 + 1.2500E-01 6.750E-01 2.000E+00 + 1.7500E-01 6.750E-01 2.000E+00 + 2.2500E-01 6.750E-01 2.000E+00 + 2.7500E-01 6.750E-01 2.000E+00 + 3.2500E-01 6.750E-01 2.000E+00 + 3.7500E-01 6.750E-01 2.000E+00 + 4.2500E-01 6.750E-01 2.000E+00 + 4.7500E-01 6.750E-01 2.000E+00 + 5.2500E-01 6.750E-01 2.000E+00 + 5.7500E-01 6.750E-01 1.995E+00 + 6.2500E-01 6.750E-01 1.932E+00 + 6.7500E-01 6.750E-01 1.447E+00 + 7.2500E-01 6.750E-01 1.277E+00 + 7.7500E-01 6.750E-01 1.205E+00 + 3.7500E-02 6.875E-01 2.000E+00 + 8.7500E-02 6.875E-01 2.000E+00 + 1.3750E-01 6.875E-01 2.000E+00 + 1.8750E-01 6.875E-01 2.000E+00 + 2.3750E-01 6.875E-01 2.000E+00 + 2.8750E-01 6.875E-01 2.000E+00 + 3.3750E-01 6.875E-01 2.000E+00 + 3.8750E-01 6.875E-01 2.000E+00 + 4.3750E-01 6.875E-01 1.999E+00 + 4.8750E-01 6.875E-01 1.999E+00 + 5.3750E-01 6.875E-01 1.996E+00 + 5.8750E-01 6.875E-01 1.954E+00 + 6.3750E-01 6.875E-01 1.672E+00 + 6.8750E-01 6.875E-01 1.343E+00 + 7.3750E-01 6.875E-01 1.244E+00 + 2.5000E-02 7.000E-01 1.999E+00 + 7.5000E-02 7.000E-01 1.999E+00 + 1.2500E-01 7.000E-01 1.999E+00 + 1.7500E-01 7.000E-01 1.999E+00 + 2.2500E-01 7.000E-01 1.999E+00 + 2.7500E-01 7.000E-01 1.999E+00 + 3.2500E-01 7.000E-01 1.999E+00 + 3.7500E-01 7.000E-01 1.999E+00 + 4.2500E-01 7.000E-01 1.997E+00 + 4.7500E-01 7.000E-01 1.994E+00 + 5.2500E-01 7.000E-01 1.986E+00 + 5.7500E-01 7.000E-01 1.941E+00 + 6.2500E-01 7.000E-01 1.577E+00 + 6.7500E-01 7.000E-01 1.336E+00 + 7.2500E-01 7.000E-01 1.247E+00 + 1.2500E-02 7.125E-01 1.996E+00 + 6.2500E-02 7.125E-01 1.996E+00 + 1.1250E-01 7.125E-01 1.995E+00 + 1.6250E-01 7.125E-01 1.995E+00 + 2.1250E-01 7.125E-01 1.995E+00 + 2.6250E-01 7.125E-01 1.995E+00 + 3.1250E-01 7.125E-01 1.995E+00 + 3.6250E-01 7.125E-01 1.993E+00 + 4.1250E-01 7.125E-01 1.990E+00 + 4.6250E-01 7.125E-01 1.976E+00 + 5.1250E-01 7.125E-01 1.932E+00 + 5.6250E-01 7.125E-01 1.843E+00 + 6.1250E-01 7.125E-01 1.531E+00 + 6.6250E-01 7.125E-01 1.331E+00 + 7.1250E-01 7.125E-01 1.250E+00 + 2.5000E-02 7.250E-01 1.980E+00 + 7.5000E-02 7.250E-01 1.980E+00 + 1.2500E-01 7.250E-01 1.980E+00 + 1.7500E-01 7.250E-01 1.980E+00 + 2.2500E-01 7.250E-01 1.980E+00 + 2.7500E-01 7.250E-01 1.979E+00 + 3.2500E-01 7.250E-01 1.978E+00 + 3.7500E-01 7.250E-01 1.975E+00 + 4.2500E-01 7.250E-01 1.965E+00 + 4.7500E-01 7.250E-01 1.924E+00 + 5.2500E-01 7.250E-01 1.772E+00 + 5.7500E-01 7.250E-01 1.545E+00 + 6.2500E-01 7.250E-01 1.366E+00 + 6.7500E-01 7.250E-01 1.277E+00 + 7.2500E-01 7.250E-01 1.222E+00 + 3.7500E-02 7.375E-01 1.870E+00 + 8.7500E-02 7.375E-01 1.870E+00 + 1.3750E-01 7.375E-01 1.870E+00 + 1.8750E-01 7.375E-01 1.869E+00 + 2.3750E-01 7.375E-01 1.868E+00 + 2.8750E-01 7.375E-01 1.866E+00 + 3.3750E-01 7.375E-01 1.862E+00 + 3.8750E-01 7.375E-01 1.849E+00 + 4.3750E-01 7.375E-01 1.813E+00 + 4.8750E-01 7.375E-01 1.714E+00 + 5.3750E-01 7.375E-01 1.545E+00 + 5.8750E-01 7.375E-01 1.392E+00 + 6.3750E-01 7.375E-01 1.300E+00 + 6.8750E-01 7.375E-01 1.244E+00 + 2.5000E-02 7.500E-01 1.625E+00 + 7.5000E-02 7.500E-01 1.625E+00 + 1.2500E-01 7.500E-01 1.625E+00 + 1.7500E-01 7.500E-01 1.624E+00 + 2.2500E-01 7.500E-01 1.621E+00 + 2.7500E-01 7.500E-01 1.616E+00 + 3.2500E-01 7.500E-01 1.605E+00 + 3.7500E-01 7.500E-01 1.585E+00 + 4.2500E-01 7.500E-01 1.549E+00 + 4.7500E-01 7.500E-01 1.491E+00 + 5.2500E-01 7.500E-01 1.414E+00 + 5.7500E-01 7.500E-01 1.337E+00 + 6.2500E-01 7.500E-01 1.280E+00 + 6.7500E-01 7.500E-01 1.237E+00 + 1.2500E-02 7.625E-01 1.468E+00 + 6.2500E-02 7.625E-01 1.468E+00 + 1.1250E-01 7.625E-01 1.468E+00 + 1.6250E-01 7.625E-01 1.467E+00 + 2.1250E-01 7.625E-01 1.465E+00 + 2.6250E-01 7.625E-01 1.462E+00 + 3.1250E-01 7.625E-01 1.455E+00 + 3.6250E-01 7.625E-01 1.442E+00 + 4.1250E-01 7.625E-01 1.420E+00 + 4.6250E-01 7.625E-01 1.387E+00 + 5.1250E-01 7.625E-01 1.345E+00 + 5.6250E-01 7.625E-01 1.302E+00 + 6.1250E-01 7.625E-01 1.263E+00 + 6.6250E-01 7.625E-01 1.229E+00 + 2.5000E-02 7.750E-01 1.342E+00 + 7.5000E-02 7.750E-01 1.342E+00 + 1.2500E-01 7.750E-01 1.342E+00 + 1.7500E-01 7.750E-01 1.341E+00 + 2.2500E-01 7.750E-01 1.340E+00 + 2.7500E-01 7.750E-01 1.339E+00 + 3.2500E-01 7.750E-01 1.335E+00 + 3.7500E-01 7.750E-01 1.329E+00 + 4.2500E-01 7.750E-01 1.317E+00 + 4.7500E-01 7.750E-01 1.301E+00 + 5.2500E-01 7.750E-01 1.280E+00 + 5.7500E-01 7.750E-01 1.256E+00 + 6.2500E-01 7.750E-01 1.231E+00 + 6.7500E-01 7.750E-01 1.205E+00 + 3.7500E-02 7.875E-01 1.283E+00 + 8.7500E-02 7.875E-01 1.283E+00 + 1.3750E-01 7.875E-01 1.283E+00 + 1.8750E-01 7.875E-01 1.282E+00 + 2.3750E-01 7.875E-01 1.282E+00 + 2.8750E-01 7.875E-01 1.281E+00 + 3.3750E-01 7.875E-01 1.279E+00 + 3.8750E-01 7.875E-01 1.274E+00 + 4.3750E-01 7.875E-01 1.267E+00 + 4.8750E-01 7.875E-01 1.257E+00 + 5.3750E-01 7.875E-01 1.243E+00 + 5.8750E-01 7.875E-01 1.226E+00 + 0.0000E+00 8.000E-01 1.240E+00 + 5.0000E-02 8.000E-01 1.240E+00 + 1.0000E-01 8.000E-01 1.240E+00 + 1.5000E-01 8.000E-01 1.240E+00 + 2.0000E-01 8.000E-01 1.240E+00 + 2.5000E-01 8.000E-01 1.240E+00 + 3.0000E-01 8.000E-01 1.239E+00 + 3.5000E-01 8.000E-01 1.238E+00 + 4.0000E-01 8.000E-01 1.235E+00 + 4.5000E-01 8.000E-01 1.230E+00 + 5.0000E-01 8.000E-01 1.224E+00 + 5.5000E-01 8.000E-01 1.214E+00 + 6.0000E-01 8.000E-01 1.202E+00 + 1.2500E-02 8.125E-01 1.213E+00 + 6.2500E-02 8.125E-01 1.213E+00 + 1.1250E-01 8.125E-01 1.213E+00 + 1.6250E-01 8.125E-01 1.213E+00 + 2.1250E-01 8.125E-01 1.212E+00 + 2.6250E-01 8.125E-01 1.212E+00 + 3.1250E-01 8.125E-01 1.212E+00 + 3.6250E-01 8.125E-01 1.211E+00 + 4.1250E-01 8.125E-01 1.209E+00 + 4.6250E-01 8.125E-01 1.206E+00 + 0.0000E+00 8.250E-01 1.190E+00 + 5.0000E-02 8.250E-01 1.190E+00 + 1.0000E-01 8.250E-01 1.190E+00 + 1.5000E-01 8.250E-01 1.190E+00 + 2.0000E-01 8.250E-01 1.189E+00 + 2.5000E-01 8.250E-01 1.189E+00 + 3.0000E-01 8.250E-01 1.189E+00 + 3.5000E-01 8.250E-01 1.189E+00 + 4.0000E-01 8.250E-01 1.187E+00 + 4.5000E-01 8.250E-01 1.185E+00 + 5.0000E-01 8.250E-01 1.182E+00 + + Statistics: + Time = 0.2500 + Total number of accepted timesteps = 161 + Total number of rejected timesteps = 2 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 1000 200 400 400 + 2 200 20 50 50 + + Maximum number of + Newton iters Lin sys iters + At level + 1 4 3 + 2 4 1 diff --git a/simple_examples/baseresults/d03rbje.r b/simple_examples/baseresults/d03rbje.r new file mode 100644 index 0000000..f49a127 --- /dev/null +++ b/simple_examples/baseresults/d03rbje.r @@ -0,0 +1,59 @@ + D03RBJ Example Program Results + + Solution at every 2nd grid point in level 1 at time 1.0000: + + x y approx u exact u approx v exact v + + 0.00 0.00 0.50 0.50 1.00 1.00 + 0.20 0.00 0.50 0.50 1.00 1.00 + 0.10 0.10 0.50 0.50 1.00 1.00 + 0.30 0.10 0.50 0.50 1.00 1.00 + 0.50 0.10 0.50 0.50 1.00 1.00 + 0.70 0.10 0.50 0.50 1.00 1.00 + 0.90 0.10 0.50 0.50 1.00 1.00 + 0.00 0.20 0.50 0.50 1.00 1.00 + 0.20 0.20 0.50 0.50 1.00 1.00 + 0.40 0.20 0.50 0.50 1.00 1.00 + 0.60 0.20 0.50 0.50 1.00 1.00 + 0.80 0.20 0.50 0.50 1.00 1.00 + 1.00 0.20 0.50 0.50 1.00 1.00 + 0.10 0.30 0.50 0.50 1.00 1.00 + 0.30 0.30 0.50 0.50 1.00 1.00 + 0.50 0.30 0.50 0.50 1.00 1.00 + 0.70 0.30 0.50 0.50 1.00 1.00 + 0.90 0.30 0.50 0.50 1.00 1.00 + 0.00 0.40 0.75 0.75 0.75 0.75 + 0.20 0.40 0.50 0.50 1.00 1.00 + 0.40 0.40 0.50 0.50 1.00 1.00 + 0.80 0.40 0.50 0.50 1.00 1.00 + 1.00 0.40 0.50 0.50 1.00 1.00 + 0.10 0.50 0.75 0.75 0.75 0.75 + 0.30 0.50 0.50 0.50 1.00 1.00 + 0.50 0.50 0.50 0.50 1.00 1.00 + 0.70 0.50 0.50 0.50 1.00 1.00 + 0.90 0.50 0.50 0.50 1.00 1.00 + 0.00 0.60 0.75 0.75 0.75 0.75 + 0.20 0.60 0.75 0.75 0.75 0.75 + 0.40 0.60 0.50 0.50 1.00 1.00 + 0.60 0.60 0.50 0.50 1.00 1.00 + 0.80 0.60 0.50 0.50 1.00 1.00 + 1.00 0.60 0.50 0.50 1.00 1.00 + 0.10 0.70 0.75 0.75 0.75 0.75 + 0.30 0.70 0.75 0.75 0.75 0.75 + 0.50 0.70 0.50 0.50 1.00 1.00 + 0.70 0.70 0.50 0.50 1.00 1.00 + 0.90 0.70 0.50 0.50 1.00 1.00 + 0.00 0.80 0.75 0.75 0.75 0.75 + 0.20 0.80 0.75 0.75 0.75 0.75 + 0.40 0.80 0.75 0.75 0.75 0.75 + 0.60 0.80 0.50 0.50 1.00 1.00 + 0.80 0.80 0.50 0.50 1.00 1.00 + 0.10 0.90 0.75 0.75 0.75 0.75 + 0.30 0.90 0.75 0.75 0.75 0.75 + 0.50 0.90 0.75 0.75 0.75 0.75 + 0.70 0.90 0.50 0.50 1.00 1.00 + 0.00 1.00 0.75 0.75 0.75 0.75 + 0.20 1.00 0.75 0.75 0.75 0.75 + 0.40 1.00 0.75 0.75 0.75 0.75 + 0.60 1.00 0.75 0.75 0.75 0.75 + 0.80 1.00 0.50 0.50 1.00 1.00 diff --git a/simple_examples/baseresults/d05baje.r b/simple_examples/baseresults/d05baje.r new file mode 100644 index 0000000..0833ea2 --- /dev/null +++ b/simple_examples/baseresults/d05baje.r @@ -0,0 +1,12 @@ +D05BAJ Example Program Results + +Size of workplace = 486 +Tolerance = 1.0000e-03 + +T Approx. Sol. True Sol. Est. Error Actual Error +3.33 1.80037 1.80033 8.03776e-05 2.38466e-05 +6.67 2.23916 2.23911 1.77740e-04 2.34772e-05 +10.00 2.54310 2.54304 2.45949e-04 2.24564e-05 +13.33 2.77587 2.77581 3.05737e-04 2.17430e-05 +16.67 2.96456 2.96450 3.61698e-04 2.13821e-05 +20.00 3.12324 3.12317 4.17127e-04 2.13102e-05 diff --git a/simple_examples/baseresults/d05beje.r b/simple_examples/baseresults/d05beje.r new file mode 100644 index 0000000..95731f4 --- /dev/null +++ b/simple_examples/baseresults/d05beje.r @@ -0,0 +1,46 @@ +D05BEJ Example Program Results + +Example 1 + +The stepsize h = 0.1000 + + T Approximate + Solution + + 0.5000 0.1191 + 1.0000 0.0528 + 1.5000 0.0265 + 2.0000 0.0146 + 2.5000 0.0086 + 3.0000 0.0052 + 3.5000 0.0033 + 4.0000 0.0022 + 4.5000 0.0014 + 5.0000 0.0010 + 5.5000 0.0007 + 6.0000 0.0004 + 6.5000 0.0003 + 7.0000 0.0002 + +The maximum absolute error, 2.86e-03, occured at T = 0.1000 with solution 0.0326 + + +Example 2 + +The stepsize h = 0.0714 + + T Approximate + Solution + + 0.5000 0.6667 + 1.0000 0.5000 + 1.5000 0.4000 + 2.0000 0.3333 + 2.5000 0.2857 + 3.0000 0.2500 + 3.5000 0.2222 + 4.0000 0.2000 + 4.5000 0.1818 + 5.0000 0.1667 + +The maximum absolute error, 3.17e-06, occured at T = 0.0714 with solution 0.9333 \ No newline at end of file diff --git a/simple_examples/baseresults/dtfsmje.r b/simple_examples/baseresults/dtfsmje.r new file mode 100644 index 0000000..761a9ed --- /dev/null +++ b/simple_examples/baseresults/dtfsmje.r @@ -0,0 +1,10 @@ + DTFSMJ Example Program Results + + The Solution + 1 2 3 4 + 1 13.5562 5.7677 9.7251 1.2209 + 2 -10.1040 -1.9787 -8.9252 -4.4205 + 3 -0.8280 0.2386 2.0348 2.0769 + 4 2.8488 -7.1745 -3.7925 -2.9505 + 5 -3.9321 0.8652 -1.4082 3.1217 + 6 -2.3127 1.8398 2.0152 1.5198 diff --git a/simple_examples/baseresults/e01daje.r b/simple_examples/baseresults/e01daje.r new file mode 100644 index 0000000..a9c2ddb --- /dev/null +++ b/simple_examples/baseresults/e01daje.r @@ -0,0 +1,25 @@ + E01DAJ Example Program Results + + I Knot LAMDA(I) J Knot MU(j) + 4 1.0000 4 0.0000 + 5 1.3000 5 0.4000 + 6 1.5000 6 0.7000 + 7 1.6000 7 1.0000 + 8 2.0000 + + The B-Spline coefficients: + 1.0000 1.1333 1.3667 1.7000 1.9000 2.0000 1.2000 1.3333 + 1.5667 1.9000 2.1000 2.2000 1.5833 1.7167 1.9500 2.2833 + 2.4833 2.5833 2.1433 2.2767 2.5100 2.8433 3.0433 3.1433 + 2.8667 3.0000 3.2333 3.5667 3.7667 3.8667 3.4667 3.6000 + 3.8333 4.1667 4.3667 4.4667 4.0000 4.1333 4.3667 4.7000 + 4.9000 5.0000 + + Spline evaluated on a regular mesh (X across, Y down): + 1.00 1.20 1.40 1.60 1.80 2.00 + 0.00 1.000 1.440 1.960 2.560 3.240 4.000 + 0.20 1.200 1.640 2.160 2.760 3.440 4.200 + 0.40 1.400 1.840 2.360 2.960 3.640 4.400 + 0.60 1.600 2.040 2.560 3.160 3.840 4.600 + 0.80 1.800 2.240 2.760 3.360 4.040 4.800 + 1.00 2.000 2.440 2.960 3.560 4.240 5.000 diff --git a/simple_examples/baseresults/e02alje.r b/simple_examples/baseresults/e02alje.r new file mode 100644 index 0000000..6dfc758 --- /dev/null +++ b/simple_examples/baseresults/e02alje.r @@ -0,0 +1,24 @@ +E02ALJ Example Program Results + + Polynomial coefficients + 1.0000e+00 + 1.0001e+00 + 4.9909e-01 + 1.7042e-01 + 3.4784e-02 + 1.3909e-02 + + Reference deviation = 1.09e-06 + + X Fit exp(x) Residual + 0.00 1.0000 1.0000 -1.09e-06 + 0.10 1.1052 1.1052 9.74e-07 + 0.20 1.2214 1.2214 -7.44e-07 + 0.30 1.3499 1.3499 -9.18e-07 + 0.40 1.4918 1.4918 2.99e-07 + 0.50 1.6487 1.6487 1.09e-06 + 0.60 1.8221 1.8221 4.59e-07 + 0.70 2.0138 2.0138 -8.16e-07 + 0.80 2.2255 2.2255 -8.42e-07 + 0.90 2.4596 2.4596 8.75e-07 + 1.00 2.7183 2.7183 -1.09e-06 diff --git a/simple_examples/baseresults/e04abje.r b/simple_examples/baseresults/e04abje.r new file mode 100644 index 0000000..18b685b --- /dev/null +++ b/simple_examples/baseresults/e04abje.r @@ -0,0 +1,6 @@ +E04ABJ Example Program Results + +The minimum lies in the interval 4.49340940 to 4.49340951 +Its estimated position is 4.49340945, +where the function value is -0.2172 +10 function evaluations were required diff --git a/simple_examples/baseresults/e04bbje.r b/simple_examples/baseresults/e04bbje.r new file mode 100644 index 0000000..86a41ba --- /dev/null +++ b/simple_examples/baseresults/e04bbje.r @@ -0,0 +1,7 @@ +E04BBJ Example Program Results + +The minimum lies in the interval 4.49340946 to 4.49340952 +Its estimated position is 4.49340946, +where the function value is -0.2172 +and the gradient is -3.8e-16 (machine dependent) +6 function evaluations were required diff --git a/simple_examples/baseresults/e04cbje.r b/simple_examples/baseresults/e04cbje.r new file mode 100644 index 0000000..67cd53d --- /dev/null +++ b/simple_examples/baseresults/e04cbje.r @@ -0,0 +1,4 @@ +E04CBJ Example Program Results + +The final function value is 0.0000 +at the point 0.5000 -0.9999 diff --git a/simple_examples/baseresults/e04fcje.r b/simple_examples/baseresults/e04fcje.r new file mode 100644 index 0000000..bd90f04 --- /dev/null +++ b/simple_examples/baseresults/e04fcje.r @@ -0,0 +1,22 @@ + E04FCJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The estimated gradient is -1.607e-09 -7.436e-11 6.130e-10 + (machine dependent) + and the residuals are + -5.9e-03 + -2.7e-04 + 2.7e-04 + 6.5e-03 + -8.2e-04 + -1.3e-03 + -4.5e-03 + -2.0e-02 + 8.2e-02 + -1.8e-02 + -1.5e-02 + -1.5e-02 + -1.1e-02 + -4.2e-03 + 6.8e-03 diff --git a/simple_examples/baseresults/e04ffje.r b/simple_examples/baseresults/e04ffje.r new file mode 100644 index 0000000..a772ab7 --- /dev/null +++ b/simple_examples/baseresults/e04ffje.r @@ -0,0 +1,73 @@ + E04FFJ Example Program Results + + --------------------------------------------------- + E04F(G|F)), Derivative free solver for data fitting + (nonlinear least-squares problems) + --------------------------------------------------- + + Problem statistics + Number of variables 4 + Number of unconstrained variables 2 + Number of fixed variables 0 + Starting interpolation points 5 + Total interpolation points 5 + Number of residuals 11 + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Print Solution = All * U + Monitoring File = -1 * d + Monitoring Level = 4 * d + Dfo Print Frequency = 1 * d + Dfo Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Dfo Initial Interp Points = Coordinate * d + Dfo Max Objective Calls = 500 * d + Dfo Max Soft Restarts = 5 * d + Dfo Max Unsucc Soft Restarts = 3 * d + Dfo Maximum Slow Steps = 20 * d + Dfo Noise Level = 0.00000E+00 * d + Dfo Noisy Problem = No * d + Dfo Number Initial Points = 0 * d + Dfo Number Interp Points = 0 * d + Dfo Number Soft Restarts Pts = 3 * d + Dfo Random Seed = -1 * d + Dfo Starting Trust Region = 1.00000E-01 * d + Dfo Trust Region Slow Tol = 1.02648E-04 * d + Dfo Trust Region Tolerance = 5.00000E-06 * U + Dfo Version = Latest * d + Dfls Small Residuals Tol = 1.08158E-12 * d + End of Options + ---------------------------------------- + step | obj rho | nf | + ---------------------------------------- + 1 | 1.72E-03 1.00E-01 | 6 | + 2 | 6.41E-04 1.00E-01 | 7 | + 3 | 4.52E-04 1.00E-01 | 8 | + 4 | 4.05E-04 1.00E-02 | 9 | + 5 | 4.04E-04 1.00E-02 | 10 | + 6 | 4.03E-04 1.00E-02 | 14 | + 7 | 4.02E-04 1.00E-02 | 15 | + 8 | 4.02E-04 1.00E-03 | 20 | + 9 | 4.02E-04 7.07E-05 | 21 | + 10 | 4.02E-04 7.07E-05 | 23 | s + ---------------------------------------- + Status: Converged, small trust region size + + Value of the objective 4.02423E-04 + Number of objective function evaluations 27 + Number of steps 10 + + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.81300E-01 inf + 2 2.00000E-01 5.90128E-01 1.00000E+00 + 3 -inf 2.56929E-01 inf + 4 3.00000E-01 3.00000E-01 inf diff --git a/simple_examples/baseresults/e04gbje.r b/simple_examples/baseresults/e04gbje.r new file mode 100644 index 0000000..6e9e25e --- /dev/null +++ b/simple_examples/baseresults/e04gbje.r @@ -0,0 +1,22 @@ + E04GBJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The corresponding gradient is 1.199E-09 -1.865E-11 1.807E-11 + (machine dependent) + and the residuals are + -5.9E-03 + -2.7E-04 + 2.7E-04 + 6.5E-03 + -8.2E-04 + -1.3E-03 + -4.5E-03 + -2.0E-02 + 8.2E-02 + -1.8E-02 + -1.5E-02 + -1.5E-02 + -1.1E-02 + -4.2E-03 + 6.8E-03 diff --git a/simple_examples/baseresults/e04ggje.r b/simple_examples/baseresults/e04ggje.r new file mode 100644 index 0000000..b5dd970 --- /dev/null +++ b/simple_examples/baseresults/e04ggje.r @@ -0,0 +1,44 @@ + E04GGJ Example Program Results + + E04GG, Nonlinear least squares method for bound-constrained problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Bxnl Model = Gauss-newton * U + Bxnl Nlls Method = Galahad * d + Bxnl Glob Method = Reg * U + Bxnl Reg Order = Auto * d + Bxnl Tn Method = Min-1-var * d + Bxnl Basereg Type = None * d + Bxnl Basereg Pow = 2.00000E+00 * d + Bxnl Basereg Term = 1.00000E-02 * d + Bxnl Iteration Limit = 1000 * d + Bxnl Monitor Frequency = 0 * d + Bxnl Print Header = 30 * d + Bxnl Save Covariance Matrix = No * d + Bxnl Stop Abs Tol Fun = 1.05367E-08 * d + Bxnl Stop Abs Tol Grd = 1.05737E-05 * d + Bxnl Stop Rel Tol Fun = 1.05367E-08 * d + Bxnl Stop Rel Tol Grd = 1.05367E-08 * d + Bxnl Stop Step Tol = 2.22045E-16 * d + Bxnl Use Second Derivatives = Yes * U + Bxnl Use Weights = No * d + End of Options + + Status: converged, an optimal solution was found + Value of the objective 2.17328E-06 + Norm of projected gradient 1.51989E-08 + Norm of scaled projected gradient 7.29019E-06 + Norm of step 4.98107E-04 + +Solver stored solution iterate in the handle +X: 4.45E-01 1.87E+00 3.07E+00 4.64E+00 -9.98E-01 4.64E+00 diff --git a/simple_examples/baseresults/e04mtje.r b/simple_examples/baseresults/e04mtje.r new file mode 100644 index 0000000..033d40f --- /dev/null +++ b/simple_examples/baseresults/e04mtje.r @@ -0,0 +1,162 @@ + E04MTJ Example Program Results + +++++++++++ Use the Primal-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | optim | feas | compl | mu | mcc | I + ------------------------------------------------------------------------------ + 0 -7.86591E-02 1.71637E-02 1.27E+00 1.06E+00 8.89E-02 1.5E-01 + 1 5.74135E-03 -2.24369E-02 6.11E-16 1.75E-01 2.25E-02 2.8E-02 0 + 2 1.96803E-02 1.37067E-02 5.06E-16 2.28E-02 2.91E-03 3.4E-03 0 + 3 2.15232E-02 1.96162E-02 7.00E-15 9.24E-03 1.44E-03 1.7E-03 0 + 4 2.30321E-02 2.28676E-02 1.15E-15 2.21E-03 2.97E-04 3.4E-04 0 + 5 2.35658E-02 2.35803E-02 1.32E-15 1.02E-04 8.41E-06 9.6E-06 0 + 6 2.35965E-02 2.35965E-02 1.64E-15 7.02E-08 6.35E-09 7.2E-09 0 +Iteration 7 + monit() reports good approximate solution (tol = 1.20E-08): + 7 2.35965E-02 2.35965E-02 1.35E-15 3.52E-11 3.18E-12 3.6E-12 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 4.168797E-15 + Relative primal infeasibility 1.350467E-15 + Absolute dual infeasibility 5.084353E-11 + Relative dual infeasibility 3.518607E-11 + Absolute complementarity gap 2.685778E-11 + Relative complementarity gap 3.175366E-12 + Iterations 7 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.51391E-11 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 3.42902E-11 inf 0.00000E+00 + 7 -1.00000E-02 8.61040E-12 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 4.00339E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.54305E-08 + 4 -inf 0.00000E+00 -3.70000E-03 3.80136E-10 + 5 -inf 0.00000E+00 -1.20000E-03 4.72629E-11 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 + +++++++++++ Use the Self-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | p.inf | d.inf | d.gap | tau | mcc | I + ------------------------------------------------------------------------------ + 0 -6.39941E-01 4.94000E-02 1.07E+01 2.69E+00 5.54E+00 1.0E+00 + 1 -8.56025E-02 -1.26938E-02 2.07E-01 2.07E-01 2.07E-01 1.7E+00 0 + 2 4.09196E-03 1.24373E-02 4.00E-02 4.00E-02 4.00E-02 2.8E+00 0 + 3 1.92404E-02 2.03658E-02 6.64E-03 6.64E-03 6.64E-03 3.2E+00 1 + 4 1.99631E-02 2.07574E-02 3.23E-03 3.23E-03 3.23E-03 2.3E+00 1 + 5 2.03834E-02 2.11141E-02 1.68E-03 1.68E-03 1.68E-03 1.4E+00 0 + 6 2.22419E-02 2.25057E-02 5.73E-04 5.73E-04 5.73E-04 1.4E+00 1 + 7 2.35051E-02 2.35294E-02 6.58E-05 6.58E-05 6.58E-05 1.4E+00 6 + 8 2.35936E-02 2.35941E-02 1.19E-06 1.19E-06 1.19E-06 1.4E+00 0 +Iteration 9 + monit() reports good approximate solution (tol = 1.20E-08): + 9 2.35965E-02 2.35965E-02 5.37E-10 5.37E-10 5.37E-10 1.4E+00 0 +Iteration 10 + monit() reports good approximate solution (tol = 1.20E-08): + 10 2.35965E-02 2.35965E-02 2.68E-13 2.68E-13 2.68E-13 1.4E+00 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 2.853383E-12 + Relative primal infeasibility 2.677658E-13 + Absolute dual infeasibility 1.485749E-12 + Relative dual infeasibility 2.679654E-13 + Absolute complementarity gap 7.228861E-13 + Relative complementarity gap 2.683908E-13 + Iterations 10 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.66960E-12 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 2.47652E-11 inf 0.00000E+00 + 7 -1.00000E-02 7.82645E-13 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 1.07904E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.14799E-09 + 4 -inf 0.00000E+00 -3.70000E-03 4.09190E-12 + 5 -inf 0.00000E+00 -1.20000E-03 1.52421E-12 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 diff --git a/simple_examples/baseresults/e04mxje.r b/simple_examples/baseresults/e04mxje.r new file mode 100644 index 0000000..1928db4 --- /dev/null +++ b/simple_examples/baseresults/e04mxje.r @@ -0,0 +1,38 @@ + E04MXJ Example Program Results + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Query mode - Ignoring NAME data. + Line 2: Found ROWS indicator line + Query mode - Counting ROWS data. + Line 7: Found COLUMNS indicator line + Query mode - Counting COLUMNS data. + Line 26: Found RHS indicator line + Query mode - Ignoring RHS data. + Line 31: Found RANGES indicator line + Query mode - Ignoring RANGES data. + Line 35: Found BOUNDS indicator line + Query mode - Counting BOUNDS data. + Line 54: Found QUADOBJ indicator line + Query mode - Counting QUADOBJ data. + Query mode - End of QUADOBJ data. Exit + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Line 2: Found ROWS indicator line + Line 7: Found COLUMNS indicator line + Line 26: Found RHS indicator line + Line 31: Found RANGES indicator line + Line 35: Found BOUNDS indicator line + Line 54: Found QUADOBJ indicator line + Line 64: Found ENDATA indicator line + + Problem contains 9 variables and 4 linear constraints + + Final objective value = -8.068E+00 + Optimal X = + 2.00 -0.23 -0.27 -0.30 -0.10 2.00 2.00 -1.78 -0.46 diff --git a/simple_examples/baseresults/e04ncje.r b/simple_examples/baseresults/e04ncje.r new file mode 100644 index 0000000..65a6326 --- /dev/null +++ b/simple_examples/baseresults/e04ncje.r @@ -0,0 +1,23 @@ + E04NCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 0.000E+00 1.572E-01 + V 2 0 4.153E-02 0.000E+00 + V 3 0 5.872E-01 0.000E+00 + V 4 1 0.000E+00 8.782E-01 + V 5 0 9.964E-02 0.000E+00 + V 6 1 0.000E+00 1.473E-01 + V 7 0 4.906E-02 0.000E+00 + V 8 1 0.000E+00 8.603E-01 + V 9 0 3.056E-01 0.000E+00 + + + L Con Istate Value Lagr Mult + + L 1 1 2.000E+00 3.777E-01 + L 2 2 2.000E+00 -5.791E-02 + L 3 1 1.000E+00 1.075E-01 + + + Final objective value = 8.134E-02 diff --git a/simple_examples/baseresults/e04nfje.r b/simple_examples/baseresults/e04nfje.r new file mode 100644 index 0000000..13101d2 --- /dev/null +++ b/simple_examples/baseresults/e04nfje.r @@ -0,0 +1,66 @@ + E04NFJ Example Program Results + + *** e04nf + + Parameters + ---------- + + Problem type........... QP2 + + Linear constraints..... 7 Feasibility tolerance.. 1.05E-08 + Variables.............. 7 Optimality tolerance... 1.05E-08 + Hessian rows........... 7 Rank tolerance......... 1.11E-14 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + + Check frequency........ 50 Expand frequency....... 5 + Minimum sum of infeas.. NO Crash tolerance........ 1.00E-02 + + Max degrees of freedom. 7 Print level............ 10 + Feasibility phase itns. 70 Monitoring file........ -1 + Optimality phase itns. 70 + + Workspace provided is IWORK( 17), WORK( 189). + To solve problem we need IWORK( 17), WORK( 189). + + + Itn Step Ninf Sinf/Objective Norm Gz + 0 0.0E+00 3 1.038000E-01 0.0E+00 + 1 4.1E-02 1 3.000000E-02 0.0E+00 + 2 4.2E-02 0 0.000000E+00 0.0E+00 + Itn 2 -- Feasible point found. + 2 0.0E+00 0 4.580000E-02 0.0E+00 + 3 1.3E-01 0 4.161596E-02 0.0E+00 + 4 1.0E+00 0 3.936227E-02 4.2E-17 + 5 4.1E-01 0 3.758935E-02 1.2E-02 + 6 1.0E+00 0 3.755377E-02 1.0E-17 + 7 1.0E+00 0 3.703165E-02 3.8E-17 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL -1.000000E-02 -1.000000E-02 1.000000E-02 0.4700 . + V 2 FR -6.986465E-02 -0.100000 0.150000 . 3.0135E-02 + V 3 FR 1.825915E-02 -1.000000E-02 3.000000E-02 . 1.1741E-02 + V 4 FR -2.426081E-02 -4.000000E-02 2.000000E-02 . 1.5739E-02 + V 5 FR -6.200564E-02 -0.100000 5.000000E-02 . 3.7994E-02 + V 6 FR 1.380544E-02 -1.000000E-02 None . 2.3805E-02 + V 7 FR 4.066496E-03 -1.000000E-02 None . 1.4066E-02 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 EQ -0.130000 -0.130000 -0.130000 -1.908 -5.5511E-17 + L 2 FR -5.879898E-03 None -4.900000E-03 . 9.7990E-04 + L 3 UL -6.400000E-03 None -6.400000E-03 -0.3144 8.6736E-19 + L 4 FR -4.537323E-03 None -3.700000E-03 . 8.3732E-04 + L 5 FR -2.915996E-03 None -1.200000E-03 . 1.7160E-03 + L 6 LL -9.920000E-02 -9.920000E-02 None 1.955 . + L 7 LL -3.000000E-03 -3.000000E-03 2.000000E-03 1.972 4.3368E-18 + + Exit e04nf - Optimal QP solution. + + Final QP objective value = 0.3703165E-01 + + Exit from QP problem after 7 iterations. diff --git a/simple_examples/baseresults/e04nkje.r b/simple_examples/baseresults/e04nkje.r new file mode 100644 index 0000000..bbfdea9 --- /dev/null +++ b/simple_examples/baseresults/e04nkje.r @@ -0,0 +1,26 @@ +E04NKJ Example Program Results + + Variable Istate Value Lagr Mult + + ...X1... 0 0.00000 2361 + ...X2... 3 349.399 -3.657e-12 + ...X3... 2 648.853 -5.924e-12 + ...X4... 2 172.847 1.949e-12 + ...X5... 3 407.521 0.000 + ...X6... 3 271.356 -3.280e-12 + ...X7... 3 150.023 -1.413e-12 + + + Constrnt Istate Value Lagr Mult + + ..ROW1.. 0 2000.00 -1.290e+04 + ..ROW2.. 3 49.2316 0.000 + ..ROW3.. 1 100.000 -2325 + ..ROW4.. 3 32.0719 0.000 + ..ROW5.. 3 14.5572 0.000 + ..ROW6.. 0 1500.00 1.445e+04 + ..ROW7.. 0 250.000 1.458e+04 + ..COST.. 3 -2.98869e+06 -1.000 + + +Final objetive value = -1847785 diff --git a/simple_examples/baseresults/e04nqje.r b/simple_examples/baseresults/e04nqje.r new file mode 100644 index 0000000..8515ce8 --- /dev/null +++ b/simple_examples/baseresults/e04nqje.r @@ -0,0 +1,6 @@ + E04NQJ Example Program Results + + QP problem contains 7 variables and 8 linear constraints + + Final objective value = -1.848E+06 + Optimal X = 0.00 349.40 648.85 172.85 407.52 271.36 150.02 diff --git a/simple_examples/baseresults/e04ptje.r b/simple_examples/baseresults/e04ptje.r new file mode 100644 index 0000000..24d78ba --- /dev/null +++ b/simple_examples/baseresults/e04ptje.r @@ -0,0 +1,39 @@ +E04PTJ Example Program Results + + + ------------------------------------------------ + E04PT, Interior point method for SOCP problems + ------------------------------------------------ + + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + +monit() reports good approximate solution (tol = 1.00E-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 1 1.174E+00 + 2 -4.257E+00 + 3 9.814E-01 diff --git a/simple_examples/baseresults/e04rpje.r b/simple_examples/baseresults/e04rpje.r new file mode 100644 index 0000000..93e29fb --- /dev/null +++ b/simple_examples/baseresults/e04rpje.r @@ -0,0 +1,105 @@ +E04RPJ Example Program Results + +Passing SDP problem to solver + + Overview + Status: Problem and option settings are editable. + No of variables: 5 + Objective function: linear + Simple bounds: not defined yet + Linear constraints: not defined yet + Nonlinear constraints: not defined yet + Cone constraints: not defined yet + Matrix constraints: 2 + Matrix constraints + IDblk = 1, size = 2 x 2, polynomial of order 2 + IDblk = 2, size = 2 x 2, linear + E04SV, NLP-SDP Solver (Pennon) + ------------------------------ + Number of variables 5 [eliminated 0] + simple linear nonlin + (Standard) inequalities 0 0 0 + (Standard) equalities 0 0 + Matrix inequalities 1 1 [dense 2, sparse 0] + [max dimension 2] + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + + Dimacs Measures = No * S + Hessian Density = Dense * S + Init Value P = 1.00000E+00 * d + Init Value Pmat = 1.00000E+00 * d + Initial P = Automatic * d + Initial U = Automatic * d + Initial X = User * d + Inner Iteration Limit = 100 * d + Inner Stop Criteria = Heuristic * d + Inner Stop Tolerance = 1.00000E-02 * d + Linesearch Mode = Goldstein * S + Outer Iteration Limit = 100 * d + P Min = 1.05367E-08 * d + P Update Speed = 12 * d + Pmat Min = 1.05367E-08 * d + Preference = Speed * d + Presolve Block Detect = Yes * d + Stop Criteria = Soft * d + Stop Tolerance 1 = 1.00000E-06 * d + Stop Tolerance 2 = 1.00000E-07 * d + Stop Tolerance Feasibility = 1.00000E-07 * d + Transform Constraints = No * S + U Update Restriction = 5.00000E-01 * d + Umat Update Restriction = 3.00000E-01 * d + End of Options + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 0 0.00000E+00 1.82E+01 1.00E+00 4.00E+00 2.00E+00 0 + 1 4.11823E+00 3.85E-03 0.00E+00 1.73E+00 2.00E+00 6 + 2 2.58252E+00 5.36E-03 0.00E+00 4.93E-01 9.04E-01 4 + 3 2.06132E+00 1.02E-03 0.00E+00 7.70E-02 4.08E-01 4 + 4 2.00050E+00 3.00E-03 8.91E-03 1.78E-02 1.85E-01 3 + 5 1.99929E+00 1.55E-03 3.16E-03 3.65E-03 8.34E-02 2 + 6 1.99985E+00 1.03E-04 3.16E-04 7.19E-04 3.77E-02 4 + 7 1.99997E+00 7.04E-04 5.76E-05 1.41E-04 1.70E-02 1 + 8 2.00000E+00 1.32E-04 6.52E-06 2.76E-05 7.70E-03 1 + 9 2.00000E+00 8.49E-06 7.86E-07 5.37E-06 3.48E-03 1 + 10 2.00000E+00 5.88E-07 1.06E-07 1.04E-06 1.57E-03 1 + 11 2.00000E+00 5.55E-08 4.87E-08 2.02E-07 7.11E-04 1 + 12 2.00000E+00 5.34E-09 5.37E-09 3.93E-08 3.21E-04 1 + 13 2.00000E+00 5.03E-10 5.45E-09 7.62E-09 1.45E-04 1 + 14 2.00000E+00 4.45E-11 5.55E-09 1.48E-09 6.56E-05 1 + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 15 2.00000E+00 4.36E-12 5.67E-09 2.87E-10 2.96E-05 1 + 16 2.00000E+00 1.61E-11 5.82E-09 5.57E-11 1.34E-05 1 + 17 2.00000E+00 3.13E-11 6.00E-09 1.08E-11 6.06E-06 1 + 18 2.00000E+00 8.65E-11 6.22E-09 2.10E-12 2.74E-06 1 + 19 2.00000E+00 1.31E-10 6.48E-09 4.07E-13 1.24E-06 1 + -------------------------------------------------------------- + Status: converged, an optimal solution found + -------------------------------------------------------------- + Final objective value 2.000000E+00 + Relative precision 8.141636E-16 + Optimality 1.310533E-10 + Feasibility 6.484489E-09 + Complementarity 4.066867E-13 + Iteration counts + Outer iterations 19 + Inner iterations 36 + Linesearch steps 56 + Evaluation counts + Augm. Lagr. values 76 + Augm. Lagr. gradient 56 + Augm. Lagr. hessian 36 + -------------------------------------------------------------- \ No newline at end of file diff --git a/simple_examples/baseresults/e04rsje.r b/simple_examples/baseresults/e04rsje.r new file mode 100644 index 0000000..170a9e9 --- /dev/null +++ b/simple_examples/baseresults/e04rsje.r @@ -0,0 +1,35 @@ + E04RSJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 0 1.174e+00 + 1 -4.257e+00 + 2 9.814e-01 diff --git a/simple_examples/baseresults/e04rtje.r b/simple_examples/baseresults/e04rtje.r new file mode 100644 index 0000000..65ffe25 --- /dev/null +++ b/simple_examples/baseresults/e04rtje.r @@ -0,0 +1,35 @@ + E04RTJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 1.313004E-01 + Final dual objective value 1.313004E-01 + Optimal X: + x_idx Value + 0 1.000e+00 + 1 -9.722e-01 + 2 9.722e-01 diff --git a/simple_examples/baseresults/e04saje.r b/simple_examples/baseresults/e04saje.r new file mode 100644 index 0000000..c10990a --- /dev/null +++ b/simple_examples/baseresults/e04saje.r @@ -0,0 +1,33 @@ + E04SAJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + Status: converged, an optimal solution found + Final primal objective value -1.951817E+01 + Final dual objective value -1.951817E+01 + Optimal X: + x_idx Value + 0 -1.26819e+00 + 1 -4.08429e-01 + 2 1.33234e+00 diff --git a/simple_examples/baseresults/e04taje.r b/simple_examples/baseresults/e04taje.r new file mode 100644 index 0000000..a6cf135 --- /dev/null +++ b/simple_examples/baseresults/e04taje.r @@ -0,0 +1,39 @@ + E04TAJ Example Program Results + + Solve the first LP + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.500000E+02 + Final dual objective value 8.500000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.00000E+02 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + + The new variable has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 9.000000E+02 + Final dual objective value 9.000000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 5.00000E+01 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 + + The new constraint has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.750000E+02 + Final dual objective value 8.750000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 1.50000E+02 inf + 2 0.00000E+00 5.00000E+01 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 diff --git a/simple_examples/baseresults/e04tcje.r b/simple_examples/baseresults/e04tcje.r new file mode 100644 index 0000000..cd501a1 --- /dev/null +++ b/simple_examples/baseresults/e04tcje.r @@ -0,0 +1,58 @@ + E04TCJ Example Program Results + + First solve the problem with the outliers + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 1.05037E+00 + Norm of gradient 8.78014E-06 + Norm of scaled gradient 6.05781E-06 + Norm of step 1.47886E-01 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.61301E-01 inf + 2 -inf 9.10227E-01 inf + 3 -inf 3.42138E-03 inf + 4 -inf -6.08965E+00 inf + 5 -inf 6.24881E-04 inf + -------------------------------------------------------- + + Now remove the outlier residuals from the problem handle + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 5.96811E-02 + Norm of gradient 1.19914E-06 + Norm of scaled gradient 3.47087E-06 + Norm of step 3.49256E-06 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.53888E-01 inf + 2 -inf 1.06575E+00 inf + 3 -inf 1.91383E-03 inf + 4 -inf 2.17299E-01 inf + 5 -inf 5.17660E+00 inf + -------------------------------------------------------- + + Assuming the outliers points are measured again + we can enable the residuals and adjust the values + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 6.51802E-02 + Norm of gradient 2.57338E-07 + Norm of scaled gradient 7.12740E-07 + Norm of step 1.56251E-05 + + Primal variables: + idx Lower bound Value Upper bound + 1 3.00000E-01 3.00000E-01 3.00000E-01 + 2 -inf 1.06039E+00 inf + 3 -inf 2.11765E-02 inf + 4 -inf 2.11749E-01 inf + 5 -inf 5.16415E+00 inf diff --git a/simple_examples/baseresults/e04uc_example.r b/simple_examples/baseresults/e04uc_example.r new file mode 100644 index 0000000..abde1c6 --- /dev/null +++ b/simple_examples/baseresults/e04uc_example.r @@ -0,0 +1,95 @@ + E04UC_Example Example Program Results + + *** e04uc + + Parameters + ---------- + + Linear constraints..... 1 Variables.............. 4 + Nonlinear constraints.. 2 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + Step limit............. 2.00E+00 Hessian................ NO + + Linear feasibility..... 1.05E-08 Crash tolerance........ 1.00E-02 + Nonlinear feasibility.. 1.05E-08 Optimality tolerance... 3.26E-12 + Line search tolerance.. 9.00E-01 Function precision..... 4.37E-15 + + Derivative level....... 3 Monitoring file........ -1 + Verify level........... 0 + + Major iterations limit. 50 Major print level...... 10 + Minor iterations limit. 50 Minor print level...... 0 + + Start point + 1.000000E+00 5.000000E+00 5.000000E+00 1.000000E+00 + + Workspace provided is IWORK( 17), WORK( 185). + To solve problem we need IWORK( 17), WORK( 185). + + + Verification of the constraint gradients. + ----------------------------------------- + + The constraint Jacobian seems to be ok. + + The largest relative error was 2.29E-07 in constraint 2 + + + + Verification of the objective gradients. + ---------------------------------------- + + The objective gradients seem to be ok. + + Directional derivative of the objective 8.15250000E-01 + Difference approximation 8.15249734E-01 + + + Maj Mnr Step Merit Function Norm Gz Violtn Cond Hz + 0 4 0.0E+00 1.738281E+01 7.1E-01 1.2E+01 1.0E+00 + 1 1 1.0E+00 1.703169E+01 4.6E-02 1.9E+00 1.0E+00 + 2 1 1.0E+00 1.701442E+01 2.1E-02 8.8E-02 1.0E+00 + 3 1 1.0E+00 1.701402E+01 3.1E-04 5.4E-04 1.0E+00 + 4 1 1.0E+00 1.701402E+01 7.0E-06 9.9E-08 1.0E+00 + 5 1 1.0E+00 1.701402E+01 1.1E-08 4.6E-11 1.0E+00 + + Exit from NP problem after 5 major iterations, + 9 minor iterations. + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL 1.00000 1.00000 5.00000 1.088 . + V 2 FR 4.74300 1.00000 5.00000 . 0.2570 + V 3 FR 3.82115 1.00000 5.00000 . 1.179 + V 4 FR 1.37941 1.00000 5.00000 . 0.3794 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 FR 10.9436 None 20.0000 . 9.056 + + + N Con State Value Lower Bound Upper Bound Lagr Mult Slack + + N 1 UL 40.0000 None 40.0000 -0.1615 -3.5264E-11 + N 2 LL 25.0000 25.0000 None 0.5523 -2.8791E-11 + + Exit e04uc - Optimal solution found. + + Final objective value = 17.01402 + + Varbl Istate Value Lagr Mult + + V 0 1 1.000000 1.0879 + V 1 0 4.743000 0.0000 + V 2 0 3.821150 0.0000 + V 3 0 1.379408 0.0000 + + L Con Istate Value Lagr Mult + + L 0 0 10.943558 0.0000 + + Final objective value = 17.0140173 diff --git a/simple_examples/baseresults/e04ucje.r b/simple_examples/baseresults/e04ucje.r new file mode 100644 index 0000000..c024cfc --- /dev/null +++ b/simple_examples/baseresults/e04ucje.r @@ -0,0 +1,22 @@ + E04UCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 1.00000 1.088 + V 2 0 4.74300 0.000 + V 3 0 3.82115 0.000 + V 4 0 1.37941 0.000 + + + L Con Istate Value Lagr Mult + + L 1 0 10.9436 0.000 + + + N Con Istate Value Lagr Mult + + N 1 2 40.0000 -0.1615 + N 2 1 25.0000 0.5523 + + + Final objective value = 17.01402 diff --git a/simple_examples/baseresults/e04yaje.r b/simple_examples/baseresults/e04yaje.r new file mode 100644 index 0000000..463bd7f --- /dev/null +++ b/simple_examples/baseresults/e04yaje.r @@ -0,0 +1,25 @@ + E04YAJ Example Program Results + +The test point is + 0.19000 -1.34000 0.88000 + +1st derivatives are consistent with residual values + +At the test point, LSQFUN gives + + Residuals 1st derivatives + -2.029E-03 1.000E+00 -4.061E-02 -2.707E-03 + -1.076E-01 1.000E+00 -9.689E-02 -1.384E-02 + -2.330E-01 1.000E+00 -1.785E-01 -4.120E-02 + -3.785E-01 1.000E+00 -3.043E-01 -1.014E-01 + -5.836E-01 1.000E+00 -5.144E-01 -2.338E-01 + -8.689E-01 1.000E+00 -9.100E-01 -5.460E-01 + -1.346E+00 1.000E+00 -1.810E+00 -1.408E+00 + -2.374E+00 1.000E+00 -4.726E+00 -4.726E+00 + -2.975E+00 1.000E+00 -6.076E+00 -6.076E+00 + -4.013E+00 1.000E+00 -7.876E+00 -7.876E+00 + -5.323E+00 1.000E+00 -1.040E+01 -1.040E+01 + -7.292E+00 1.000E+00 -1.418E+01 -1.418E+01 + -1.057E+01 1.000E+00 -2.048E+01 -2.048E+01 + -1.713E+01 1.000E+00 -3.308E+01 -3.308E+01 + -3.681E+01 1.000E+00 -7.089E+01 -7.089E+01 diff --git a/simple_examples/baseresults/f01adje.r b/simple_examples/baseresults/f01adje.r new file mode 100644 index 0000000..c8570bc --- /dev/null +++ b/simple_examples/baseresults/f01adje.r @@ -0,0 +1,9 @@ + F01ADJ Example Program Results + + Lower triangle of inverse + 1 2 3 4 + 1 + 2 68.0000 + 3 -41.0000 25.0000 + 4 -17.0000 10.0000 5.0000 + 5 10.0000 -6.0000 -3.0000 2.0000 diff --git a/simple_examples/baseresults/f01ckje.r b/simple_examples/baseresults/f01ckje.r new file mode 100644 index 0000000..3264e43 --- /dev/null +++ b/simple_examples/baseresults/f01ckje.r @@ -0,0 +1,5 @@ + F01CKJ Example Program Results + + Matrix A + 5.0 8.0 + 8.0 14.0 diff --git a/simple_examples/baseresults/f01crje.r b/simple_examples/baseresults/f01crje.r new file mode 100644 index 0000000..0b33f3a --- /dev/null +++ b/simple_examples/baseresults/f01crje.r @@ -0,0 +1,6 @@ + F01CRJ Example Program Results + + 1.0 4.0 7.0 10.0 13.0 16.0 19.0 + 2.0 5.0 8.0 11.0 14.0 17.0 20.0 + 3.0 6.0 9.0 12.0 15.0 18.0 21.0 + diff --git a/simple_examples/baseresults/f01dgje.r b/simple_examples/baseresults/f01dgje.r new file mode 100644 index 0000000..85c8df1 --- /dev/null +++ b/simple_examples/baseresults/f01dgje.r @@ -0,0 +1,8 @@ +F01DGJ Example Program Results + + Solution matrix B + 1 2 3 4 + 1 2.1000 1.2600 2.4000 1.2600 + 2 3.2200 9.5480 6.5360 5.3320 + 3 9.3800 17.7240 20.7640 14.5920 + 4 2.6600 20.8600 11.6240 28.5400 diff --git a/simple_examples/baseresults/f01elje.r b/simple_examples/baseresults/f01elje.r new file mode 100644 index 0000000..06a7a20 --- /dev/null +++ b/simple_examples/baseresults/f01elje.r @@ -0,0 +1,10 @@ + F01ELJ Example Program Results + + F(A) = COS(2A) + 1 2 3 4 + 1 -0.1704 -1.1597 -0.1878 -0.7307 + 2 -0.3950 -0.4410 0.7606 0.0655 + 3 -0.0950 -0.0717 0.0619 -0.4351 + 4 -0.1034 0.6424 -1.3964 0.1042 + +Imnorm = 0.0 diff --git a/simple_examples/baseresults/f01emje.r b/simple_examples/baseresults/f01emje.r new file mode 100644 index 0000000..d805f3c --- /dev/null +++ b/simple_examples/baseresults/f01emje.r @@ -0,0 +1,10 @@ +F01EMJ Example Program Results + + F(A) = EXP(2A) + 1 2 3 4 + 1 -12.1880 0.0000 -3.4747 8.3697 + 2 -13.7274 54.5982 -23.9801 82.8593 + 3 -9.7900 0.0000 -25.4527 26.5294 + 4 -18.1597 0.0000 -34.8991 49.2404 + +Imnorm = 0.00 diff --git a/simple_examples/baseresults/f02ekje.r b/simple_examples/baseresults/f02ekje.r new file mode 100644 index 0000000..925d7cb --- /dev/null +++ b/simple_examples/baseresults/f02ekje.r @@ -0,0 +1,20 @@ + F02EKJ Example Program Results + +Iteration Limit= 500 + Arnoldi basis vectors used: 20 + The following Ritz values (mu) are related to the + true eigenvalues (lambda) by lambda = sigma + 1/mu + + Iteration number 1 + Ritz values converged so far ( 2) and their Ritz estimates: + 1 ( 5.69917E-01, 8.80810E-01) 1.30081E-20 + 2 ( 5.69917E-01, -8.80810E-01) 1.30081E-20 + Next (unconverged) Ritz value: + 3 ( 6.07774E-01, 0.00000E+00) + + The 5 Ritz values of closest to 5.50000E+00 are: + 1 ( 6.01781E+00 , -8.00277E-01 ) + 2 ( 6.01781E+00 , 8.00277E-01 ) + 3 ( 4.34309E+00 , -1.94557E+00 ) + 4 ( 4.34309E+00 , 1.94557E+00 ) + 5 ( 7.14535E+00 , 0.00000E+00 ) diff --git a/simple_examples/baseresults/f02fkje.r b/simple_examples/baseresults/f02fkje.r new file mode 100644 index 0000000..8217134 --- /dev/null +++ b/simple_examples/baseresults/f02fkje.r @@ -0,0 +1,14 @@ + F02FKJ Example Program Results + + Iteration Limit= 500 + + Ritz values and residuals + 1 2 + 1 1.9702E+01 5.6583E-13 + 2 4.9036E+01 7.2456E-13 + 3 4.9036E+01 7.0022E-13 + 4 7.8370E+01 8.8089E-13 + 5 9.7197E+01 8.7693E-13 + 6 9.7197E+01 8.7672E-13 + 7 1.2653E+02 6.8423E-13 + 8 1.2653E+02 9.8310E-13 diff --git a/simple_examples/baseresults/f02wgje.r b/simple_examples/baseresults/f02wgje.r new file mode 100644 index 0000000..b4e345c --- /dev/null +++ b/simple_examples/baseresults/f02wgje.r @@ -0,0 +1,7 @@ + F02WGJ Example Program Results + + Singular Value Residual + 0.00830 2.7E-19 + 0.01223 5.9E-18 + 0.02381 1.2E-17 + 0.11274 7.8E-17 diff --git a/simple_examples/baseresults/f03baje.r b/simple_examples/baseresults/f03baje.r new file mode 100644 index 0000000..c4c40d7 --- /dev/null +++ b/simple_examples/baseresults/f03baje.r @@ -0,0 +1,14 @@ +F03BAJ Example Program Results + + Array A after factorization + 1 2 3 + 1 33.0000 16.0000 72.0000 + 2 -0.7273 1.6364 -4.6364 + 3 -0.2424 -0.0741 0.1111 + +Pivots + 1 2 3 + +D = 0.37500 ID = 4 + +Value of determinant = 6.00000e+00 \ No newline at end of file diff --git a/simple_examples/baseresults/f04amje.r b/simple_examples/baseresults/f04amje.r new file mode 100644 index 0000000..86bd893 --- /dev/null +++ b/simple_examples/baseresults/f04amje.r @@ -0,0 +1,4 @@ +F04AMJ Example Program Results +Solution +1.3010 +0.7935 \ No newline at end of file diff --git a/simple_examples/baseresults/f04baje.r b/simple_examples/baseresults/f04baje.r new file mode 100644 index 0000000..eb52050 --- /dev/null +++ b/simple_examples/baseresults/f04baje.r @@ -0,0 +1,14 @@ +F04BAJ Example Program Results + + Solution + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Estimate of condition number +1.5e+02 + +Esttimate of error bound for computed solutions +1.7e-14 \ No newline at end of file diff --git a/simple_examples/baseresults/f05aaje.r b/simple_examples/baseresults/f05aaje.r new file mode 100644 index 0000000..74b6ae6 --- /dev/null +++ b/simple_examples/baseresults/f05aaje.r @@ -0,0 +1,11 @@ +F05AAJ Example Program Results + +N1 = 2 N2 = 4 + +CC = 0.5822 ICOL = 4 + +Final Vectors +-0.6325 0.3310 -0.5404 +0.3162 -0.2483 0.2119 +-0.6325 -0.0000 0.7735 +0.3162 0.9104 0.2543 \ No newline at end of file diff --git a/simple_examples/baseresults/f06clje.r b/simple_examples/baseresults/f06clje.r new file mode 100644 index 0000000..d167816 --- /dev/null +++ b/simple_examples/baseresults/f06clje.r @@ -0,0 +1,3 @@ + F06CLJ Example Program Results + + (1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/f07aaje.r b/simple_examples/baseresults/f07aaje.r new file mode 100644 index 0000000..086448e --- /dev/null +++ b/simple_examples/baseresults/f07aaje.r @@ -0,0 +1,14 @@ + F07AAJ Example Program Results + + Solution + 1.0000 -1.0000 3.0000 -5.0000 + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 + + Pivot indices + 2 2 3 4 diff --git a/simple_examples/baseresults/f07abje.r b/simple_examples/baseresults/f07abje.r new file mode 100644 index 0000000..922ca67 --- /dev/null +++ b/simple_examples/baseresults/f07abje.r @@ -0,0 +1,23 @@ +F07ABJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Backward errors (machine-dependent) + 7.7e-17 5.8e-17 + +Estimated forward error bounds (machine-dependent) + 2.5e-14 3.4e-14 + +A has been row scaled as diag(R)*A + +Reciprocal condition number estimate of scaled matrix + 1.8e-02 + +Estimate of reciprocal pivot growth factor + 7.4e-01 + diff --git a/simple_examples/baseresults/f07adje.r b/simple_examples/baseresults/f07adje.r new file mode 100644 index 0000000..8aa1615 --- /dev/null +++ b/simple_examples/baseresults/f07adje.r @@ -0,0 +1,10 @@ +F07ADJ Example Program Results + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 +IPIV + 2 2 3 4 diff --git a/simple_examples/baseresults/f07aqje.r b/simple_examples/baseresults/f07aqje.r new file mode 100644 index 0000000..11cdfa0 --- /dev/null +++ b/simple_examples/baseresults/f07aqje.r @@ -0,0 +1,7 @@ + F07AQJ Example Program Results + + Solution + ( 1.0000, 1.0000) ( 2.0000,-3.0000) (-4.0000,-5.0000) ( 0.0000, 6.0000) + + Pivot indices + 3 2 3 4 diff --git a/simple_examples/baseresults/f07faje.r b/simple_examples/baseresults/f07faje.r new file mode 100644 index 0000000..381aa43 --- /dev/null +++ b/simple_examples/baseresults/f07faje.r @@ -0,0 +1,11 @@ + F07FAJ Example Program Results + + Solution + 1.0000 -1.0000 2.0000 -3.0000 + + Cholesky factor U + 1 2 3 4 + 1 2.0396 -1.5297 0.2746 -0.0490 + 2 1.6401 -0.2500 0.6737 + 3 0.7887 0.6617 + 4 0.5347 diff --git a/simple_examples/baseresults/f07fbje.r b/simple_examples/baseresults/f07fbje.r new file mode 100644 index 0000000..38b2bb5 --- /dev/null +++ b/simple_examples/baseresults/f07fbje.r @@ -0,0 +1,19 @@ + F07FBJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 4.0000 + 2 -1.0000 3.0000 + 3 2.0000 2.0000 + 4 -3.0000 1.0000 + + Backward errors (machine-dependent) + 6.7e-17 8.2e-17 + + Estimated forward error bounds (machine-dependent) + 2.3e-14 2.4e-14 + + Estimate of reciprocal condition number + 1.0e-02 + + A has not been equilibrated diff --git a/simple_examples/baseresults/f08btje.r b/simple_examples/baseresults/f08btje.r new file mode 100644 index 0000000..b663c71 --- /dev/null +++ b/simple_examples/baseresults/f08btje.r @@ -0,0 +1,16 @@ + F08BTJ Example Program Results + + Tolerance used to estimate the rank of A + 1.00E-02 + Estimated rank of A + 3 + Least squares solution(s) + + 1 2 + 1 ( 0.0000, 0.0000) ( 0.0000, 0.0000) + 2 ( 2.7020, 8.0911) (-2.2682,-2.9884) + 3 ( 2.8888, 2.5012) ( 0.9779, 1.3565) + 4 ( 2.7100, 0.4791) (-1.3734, 0.2212) + + Square root(s) of the residual sum(s) of squares + 2.51E-01 8.10E-02 diff --git a/simple_examples/baseresults/f08faje.r b/simple_examples/baseresults/f08faje.r new file mode 100644 index 0000000..31df0c1 --- /dev/null +++ b/simple_examples/baseresults/f08faje.r @@ -0,0 +1,16 @@ + F08FAJ Example Program Results + + Eigenvalues + -2.0531 -0.5146 -0.2943 12.8621 + Eigenvectors + 1 2 3 4 + 1 0.7003 -0.5144 -0.2767 0.4103 + 2 0.3592 0.4851 0.6634 0.4422 + 3 -0.1569 0.5420 -0.6504 0.5085 + 4 -0.5965 -0.4543 0.2457 0.6144 + + Error estimate for the eigenvalues + 1.4e-15 + + Error estimates for the eigenvectors + 9.3e-16 6.5e-15 6.5e-15 1.1e-16 diff --git a/simple_examples/baseresults/f08xpje.r b/simple_examples/baseresults/f08xpje.r new file mode 100644 index 0000000..96e35e9 --- /dev/null +++ b/simple_examples/baseresults/f08xpje.r @@ -0,0 +1,8 @@ +F08XPJ Example Program Results + +Number of eigenvalues for which SELCTG is true = 2 +(dimension of deflating subspaces) + +Selected generalized eigenvalues + 1 (2.00, -5.00) + 2 (3.00, -1.00) diff --git a/simple_examples/baseresults/g01alje.r b/simple_examples/baseresults/g01alje.r new file mode 100644 index 0000000..3473f35 --- /dev/null +++ b/simple_examples/baseresults/g01alje.r @@ -0,0 +1,7 @@ +G01ALJ Example Program Results + +Maximum 12.0000 +Upper Hinge (75% quantile) 9.5000 +Median (50% quantile) 6.5000 +Lower Hinge (25% quantile) 2.5000 +Minimum 1.0000 diff --git a/simple_examples/baseresults/g02akje.r b/simple_examples/baseresults/g02akje.r new file mode 100644 index 0000000..a4260ce --- /dev/null +++ b/simple_examples/baseresults/g02akje.r @@ -0,0 +1,14 @@ +G02AKJ Example Program Results + + NCM with rank constraint + 1 2 3 4 + 1 1.0000 -0.9021 0.2448 0.1975 + 2 -0.9021 1.0000 -0.6392 0.2448 + 3 0.2448 -0.6392 1.0000 -0.9021 + 4 0.1975 0.2448 -0.9021 1.0000 + +Number of subproblems solved: 4 + +Squared Frobenius norm of difference: 0.3082 + +Rank error: 0.0000 diff --git a/simple_examples/baseresults/g02bjje.r b/simple_examples/baseresults/g02bjje.r new file mode 100644 index 0000000..053b912 --- /dev/null +++ b/simple_examples/baseresults/g02bjje.r @@ -0,0 +1,38 @@ + G02BJJ Example Program Results + + Number of variables (columns) = 4 + Number of cases (rows) = 5 + + Data matrix is:- + 1 2 3 4 + 1 3.0000 3.0000 1.0000 2.0000 + 2 6.0000 4.0000 -1.0000 4.0000 + 3 9.0000 0.0000 5.0000 9.0000 + 4 12.0000 2.0000 0.0000 0.0000 + 5 -1.0000 5.0000 4.0000 12.0000 + + Variable Mean St.dev. + 4 6.7500 4.5735 + 1 7.5000 3.8730 + 2 3.5000 1.2910 + + Sums of squares and cross-products of deviations + 4 1 2 + 4 62.7500 21.0000 10.0000 + 1 21.0000 45.0000 -6.0000 + 2 10.0000 -6.0000 5.0000 + + Correlation coefficients + 4 1 2 + 4 1.0000 0.9707 0.9449 + 1 0.9707 1.0000 -0.6547 + 2 0.9449 -0.6547 1.0000 + + Minimum number of cases used for any pair of variables: 3 + + Numbers used for each pair are: + 4 1 2 + 4 4.0000 3.0000 3.0000 + 1 3.0000 4.0000 3.0000 + 2 3.0000 3.0000 4.0000 + diff --git a/simple_examples/baseresults/g02brje.r b/simple_examples/baseresults/g02brje.r new file mode 100644 index 0000000..7621bb4 --- /dev/null +++ b/simple_examples/baseresults/g02brje.r @@ -0,0 +1,29 @@ +G02BRJ Example Program Results + +Number of variables (columns) = 3 +Number of case (rows) = 9 + +Data matrix is:- + + + 1 2 3 + 1 1.7000 1.0000 0.5000 + 2 2.8000 4.0000 3.0000 + 3 0.6000 6.0000 2.5000 + 4 1.8000 9.0000 6.0000 + 5 0.9900 4.0000 2.5000 + 6 1.4000 2.0000 5.5000 + 7 1.8000 9.0000 7.5000 + 8 2.5000 7.0000 0.0000 + 9 0.9900 5.0000 3.0000 + +Matrix of rank correlation coefficients: +Upper triangle -- Spearman's +Lower triangle -- Kendall's tau + + 1 2 3 + 1 1.0000 0.2941 0.4058 + 2 0.1429 1.0000 0.7537 + 3 0.2760 0.5521 1.0000 + +Number of cases actually used: 6 diff --git a/simple_examples/baseresults/g02daje.r b/simple_examples/baseresults/g02daje.r new file mode 100644 index 0000000..9c6e2f0 --- /dev/null +++ b/simple_examples/baseresults/g02daje.r @@ -0,0 +1,31 @@ +G02DAJ Example Program Results + +Model not of full rank, rank = 4 +Residual sum of squares = 2.2227e+01 +Degrees of freedom = 8 +R-squared = 7.0042e-01 +Adjusted R-squared = 5.8808e-01 +AIC = 1.5397e+01 + +Variable Parameter estimate Standard error + + 1 3.0557e+01 3.8494e-01 + 2 5.4467e+00 8.3896e-01 + 3 6.7433e+00 8.3896e-01 + 4 1.1047e+01 8.3896e-01 + 5 7.3200e+00 8.3896e-01 + + Obs Residuals H + + 1 -2.3733e+00 3.3333e-01 + 2 1.7433e+00 3.3333e-01 + 3 8.8000e-01 3.3333e-01 + 4 -1.4333e-01 3.3333e-01 + 5 1.4333e-01 3.3333e-01 + 6 -1.4700e+00 3.3333e-01 + 7 -1.8867e+00 3.3333e-01 + 8 5.7667e-01 3.3333e-01 + 9 1.3167e+00 3.3333e-01 + 10 1.7967e+00 3.3333e-01 + 11 -1.1733e+00 3.3333e-01 + 12 5.9000e-01 3.3333e-01 diff --git a/simple_examples/baseresults/g02eeje.r b/simple_examples/baseresults/g02eeje.r new file mode 100644 index 0000000..c66f9b6 --- /dev/null +++ b/simple_examples/baseresults/g02eeje.r @@ -0,0 +1,20 @@ + G02EEJ Example Program Results + + Step 1 + Added variable is TS + Change in residual sum of squares = 4.7126E-01 + F Statistic = 7.38 + + Variables in model: COD TS + + Residual sum of squares = 1.0850E+00 + Degrees of freedom = 17 + + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.1175 0.0600 0.2276 + Step 2 + No further variables added maximum F = 1.59 + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.0979 0.0207 0.0217 diff --git a/simple_examples/baseresults/g02maje.r b/simple_examples/baseresults/g02maje.r new file mode 100644 index 0000000..dd042fa --- /dev/null +++ b/simple_examples/baseresults/g02maje.r @@ -0,0 +1,23 @@ +G02MAJ Example Program Results + + Step Parameter Estimate +------------------------------------------------------ + 1 0.000 0.000 3.125 0.000 0.000 0.000 + 2 0.000 0.000 3.792 0.000 0.000 -0.713 + 3 -0.446 0.000 3.998 0.000 0.000 -1.151 + 4 -0.628 -0.295 4.098 0.000 0.000 -1.466 + 5 -1.060 -1.056 4.110 -0.864 0.000 -1.948 + 6 -1.073 -1.132 4.118 -0.935 -0.059 -1.981 + +alpha: -50.037 + + Step Sum RSS df Cp Ck Step Size +--------------------------------------------------------- + 1 72.446 8929.855 3 13.355 123.227 72.446 + 2 103.385 6404.701 7 7.054 50.781 24.841 + 3 126.243 5258.247 51 5.286 30.836 16.225 + 4 145.277 4657.051 25 5.309 19.319 11.587 + 5 198.223 3959.401 126 5.016 12.266 24.520 + 6 203.529 3954.571 5258 7.000 0.910 2.198 + +sigma^2: 304.198 diff --git a/simple_examples/baseresults/g03gaje.r b/simple_examples/baseresults/g03gaje.r new file mode 100644 index 0000000..37ab236 --- /dev/null +++ b/simple_examples/baseresults/g03gaje.r @@ -0,0 +1,79 @@ + G03GAJ Example Program Results + + + Mixing proportions + 1 2 + 1 0.4798 0.5202 + + Group means + 1 2 + 1 4.0041 3.3350 + 2 3.9949 3.4434 + 3 5.5894 4.9870 + 4 5.4432 5.3602 + + Pooled Variance-covariance matrix + 1 2 3 4 + 1 0.4539 0.2891 0.6075 0.3413 + 2 0.2891 0.2048 0.4101 0.2490 + 3 0.6075 0.4101 1.0648 0.6011 + 4 0.3413 0.2490 0.6011 0.3759 + + Densities + 1 2 + 1 2.5836E-01 1.1853E-02 + 2 3.7065E-07 1.1241E-01 + 3 5.3069E-03 1.8080E-06 + 4 4.2461E-01 2.8584E-05 + 5 5.0387E-02 1.1544E+00 + 6 1.1260E+00 7.2224E-02 + 7 2.0911E+00 2.1224E-02 + 8 5.7856E-03 1.3227E+00 + 9 1.1609E+00 2.9411E-02 + 10 8.9826E-02 2.4260E-05 + 11 3.0170E-01 1.0106E+00 + 12 1.2930E+00 3.5422E-01 + 13 2.8644E-02 6.7851E-07 + 14 2.0759E-02 3.1690E+00 + 15 7.6461E-02 1.5231E+00 + 16 3.0279E-04 8.4017E-01 + 17 5.6101E-01 4.6699E-05 + 18 2.6573E-05 6.4442E-01 + 19 2.1250E+00 5.1006E-02 + 20 8.6822E-04 2.7626E+00 + 21 1.9223E-01 2.3971E+00 + 22 1.2469E-02 2.8179E+00 + 23 1.8389E-02 5.3572E-01 + 24 1.2409E+00 9.6489E-03 + 25 2.1037E-05 4.8674E-02 + + Membership probabilities + 1 2 + 1 9.5018E-01 4.9823E-02 + 2 3.3259E-06 1.0000E+00 + 3 9.9961E-01 3.8664E-04 + 4 9.9992E-01 7.9913E-05 + 5 3.8999E-02 9.6100E-01 + 6 9.3270E-01 6.7295E-02 + 7 9.8881E-01 1.1190E-02 + 8 4.1252E-03 9.9587E-01 + 9 9.7252E-01 2.7479E-02 + 10 9.9969E-01 3.0805E-04 + 11 2.1722E-01 7.8278E-01 + 12 7.6938E-01 2.3062E-01 + 13 9.9997E-01 2.6937E-05 + 14 6.1133E-03 9.9389E-01 + 15 4.4189E-02 9.5581E-01 + 16 3.5006E-04 9.9965E-01 + 17 9.9990E-01 9.7029E-05 + 18 4.0270E-05 9.9996E-01 + 19 9.7380E-01 2.6202E-02 + 20 3.0204E-04 9.9970E-01 + 21 6.9471E-02 9.3053E-01 + 22 4.1603E-03 9.9584E-01 + 23 3.0839E-02 9.6916E-01 + 24 9.9116E-01 8.8421E-03 + 25 4.1534E-04 9.9958E-01 + +No. iterations: 14 +Log-likelihood: -29.6831 diff --git a/simple_examples/baseresults/g05kfje.r b/simple_examples/baseresults/g05kfje.r new file mode 100644 index 0000000..830c10a --- /dev/null +++ b/simple_examples/baseresults/g05kfje.r @@ -0,0 +1,7 @@ +G05KFJ Example Program Results + +0.6364 +0.1065 +0.7460 +0.7983 +0.1046 \ No newline at end of file diff --git a/simple_examples/baseresults/g13awje.r b/simple_examples/baseresults/g13awje.r new file mode 100644 index 0000000..25be8b6 --- /dev/null +++ b/simple_examples/baseresults/g13awje.r @@ -0,0 +1,4 @@ + G13AWJ Example Program Results + +Dickey-Fuller test statistic = -2.540 +associated p-value = 0.013 diff --git a/simple_examples/baseresults/g13meje.r b/simple_examples/baseresults/g13meje.r new file mode 100644 index 0000000..07a391e --- /dev/null +++ b/simple_examples/baseresults/g13meje.r @@ -0,0 +1,39 @@ +G13MEJ Example Program Results + + Iterated + Time EMA + +-------------------------------- + 1 7.5 0.531 + 2 8.2 0.544 + 3 18.1 0.754 + 4 22.8 0.406 + 5 25.8 0.232 + + 6 26.8 0.217 + 7 31.1 0.357 + 8 38.4 0.630 + 9 45.9 0.263 + 10 48.2 0.241 + 11 48.9 0.279 + 12 57.9 0.713 + 13 58.5 0.717 + 14 63.9 0.385 + 15 65.2 0.346 + + 16 66.6 0.330 + 17 67.4 0.315 + 18 69.3 0.409 + 19 69.9 0.459 + 20 73.0 0.377 + 21 75.6 0.411 + 22 77.0 0.536 + 23 84.7 0.632 + 24 86.8 0.538 + 25 88.0 0.444 + 26 88.5 0.401 + 27 91.0 0.331 + 28 93.0 0.495 + 29 93.7 0.585 + 30 94.0 0.612 + diff --git a/simple_examples/baseresults/g13naje.r b/simple_examples/baseresults/g13naje.r new file mode 100644 index 0000000..b87dda8 --- /dev/null +++ b/simple_examples/baseresults/g13naje.r @@ -0,0 +1,11 @@ +G13NAJ Example Program Results + + -- Charge Points -- --- Distribution --- + Number Position Parameters +================================================= + 1 12 0.34 1.00 + 2 32 2.57 1.00 + 3 49 1.45 1.00 + 4 52 -0.48 1.00 + 5 70 1.20 1.00 + 6 100 -0.23 1.00 diff --git a/simple_examples/baseresults/h02bbje.r b/simple_examples/baseresults/h02bbje.r new file mode 100644 index 0000000..64136ef --- /dev/null +++ b/simple_examples/baseresults/h02bbje.r @@ -0,0 +1,79 @@ +H02BBJ Example Program Results + + + *** IP solver + + Parameters + ---------- + + Linear constraints...... 3 First integer solution.. OFF + Variables............... 2 Max depth of the tree... 4 + + Feasibility tolerance... 1.05E-08 Print level............. 10 + Infinite bound size..... 1.00E+20 EPS (machine precision). 1.11E-16 + + Integer feasibility tol. 1.00E-05 Iteration limit......... 50 + Max number of nodes..... NONE + + ** Workspace provided with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + ** Workspace required with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + + + *** Optimum LP solution *** -17.50000 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 FR 3.92857 0.00000 None 0.000 3.929 + V 2 FR 1.42857 0.00000 None 0.000 1.429 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 UL 15.0000 None 15.0000 -1.000 0.000 + L 2 UL 5.00000 None 5.00000 -0.5000 -8.8818E-16 + L 3 FR 14.6429 5.00000 None 0.000 9.643 + + + *** Start of tree search *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 2 1 No Feas Soln 1 3.93 4.00 None 4.00 1 + 3 1 -16.2 1 3.93 0.00 3.00 3.00 1 + 4 3 -15.5 2 1.80 2.00 None 2.00 2 + 5 3 -13.0 2 1.80 0.00 1.00 1.00 2 + *** Integer solution *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 6 4 No Feas Soln 1 2.50 3.00 3.00 3.00 3 + 7 4 -14.8 1 2.50 0.00 2.00 2.00 3 + 8 7 -12.0 CO 2 2.20 3.00 None 3.00 4 + 9 7 -14.0 2 2.20 2.00 2.00 2.00 4 + *** Integer solution *** + + *** End of tree search *** + + + Total of 9 nodes investigated. + + Exit IP solver - Optimum IP solution found. + + Final IP objective value = -14.00000 + + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 UL 2.00000 0.00000 2.00000 -3.000 0.000 + V 2 EQ 2.00000 2.00000 2.00000 -4.000 0.000 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 FR 14.0000 None 15.0000 0.000 1.000 + L 2 FR 0.00000 None 5.00000 0.000 5.000 + L 3 FR 10.0000 5.00000 None 0.000 5.000 diff --git a/simple_examples/baseresults/h02daje.r b/simple_examples/baseresults/h02daje.r new file mode 100644 index 0000000..125c5bf --- /dev/null +++ b/simple_examples/baseresults/h02daje.r @@ -0,0 +1,14 @@ +H02DAJ Example Program Results + + Final Esimate: + 1 + 1 0.3750 + 2 0.0000 + 3 0.5250 + 4 0.1000 + 5 1.0000 + 6 0.0000 + 7 1.0000 + 8 1.0000 +Requested accuracy of QP subproblems 1.0000e-10 +Optimised value: 2.925 diff --git a/simple_examples/baseresults/m01ccje.r b/simple_examples/baseresults/m01ccje.r new file mode 100644 index 0000000..33e1712 --- /dev/null +++ b/simple_examples/baseresults/m01ccje.r @@ -0,0 +1,15 @@ + M01CCJ Example Program Results + + Records sorted on columns 7 to 12 + + C05AZF 2181 + C05AUF 1351 + C02AEF 599 + A02ACF 531 + A02ABF 523 + A02AAF 289 + C05AVF 240 + C05AXF 211 + C05AYF 183 + C02ADF 169 + C05AWF 136 diff --git a/simple_examples/baseresults/nagcomplexexample.r b/simple_examples/baseresults/nagcomplexexample.r new file mode 100644 index 0000000..2040ba1 --- /dev/null +++ b/simple_examples/baseresults/nagcomplexexample.r @@ -0,0 +1,60 @@ +Please read the source of NAGComplexExample.java for a better understanding of how to use NAGComplex + +*****BASICS***** + +Constructing z1 and z2; +z1 = (0.0, 0.0) +z2 = (2.0, 3.0) + +Changing z1 values using NAGComplex.setRe() and NAGComplex.setIm(); +z1 = (3.0, 4.0) + +Copying z2 to z3 using NAGComplex.clone(); +z3 = (2.0, 3.0) +Copying z1 to z4 using static method NAGComplex.clone(NAGComplex z) +z4 = (3.0, 4.0) + +Array created using NAGComplex.createArray(5); +(0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) + +The same array updated using NAGComplex[i].setRe() and NAGComplex[i].setIm(); +(1.0, 9.0) (2.0, 8.0) (3.0, 7.0) (4.0, 6.0) (5.0, 5.0) + +*****ARITHMETIC***** + +z1 = (3.0, 4.0) +z2 = (2.0, 3.0) +z3 = (6.0, -2.0) +z4 = (4.0, -5.0) + +z1 + z2 = (5.0, 7.0) +z3 + z4 = (10.0, -7.0) + +z1 - z2 = (1.0, 1.0) +z3 - z4 = (2.0, 3.0) + +z1 * z2 = (-6.0, 17.0) +z3 * z4 = (14.0, -38.0) + +z1 / z2 = (1.3846153846153846, -0.07692307692307696) +z3 / z4 = (0.829268292682927, 0.5365853658536587) + +-(z1) = (-3.0, -4.0) +-(z2) = (-2.0, -3.0) + +conjugate(z1) = (3.0, -4.0) +conjugate(z2) = (2.0, -3.0) + +z3 == z4? - false +z4 = (6.0, -2.0) +z3 == z4? - true +|z1| = 5.0 +|z2| = 3.6055512754639896 + +arg(z1) = 0.9272952180016122 +arg(z2) = 0.982793723247329 + +z5 = (-5.0, 12.0) +z6 = (-9.0, 40.0) +Sqrt(z5) = (2.0, 3.0) +Sqrt(z6) = (4.0, 5.0) \ No newline at end of file diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r new file mode 100644 index 0000000..76fc07e --- /dev/null +++ b/simple_examples/baseresults/outputexample.r @@ -0,0 +1,10 @@ + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran + Precision: double precision + Product Code: NLL6I27DBL + Mark: 27.2.0 (self-contained) + + This is a 64-bit library using 32-bit integers. + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/s01baje.r b/simple_examples/baseresults/s01baje.r new file mode 100644 index 0000000..b3b20dd --- /dev/null +++ b/simple_examples/baseresults/s01baje.r @@ -0,0 +1,9 @@ +S01BAJ Example Program Results + + X Y + 2.5000e+00 1.2528e+00 + 1.2500e-01 1.1778e-01 + -9.0600e-01 -2.3645e+00 + 1.2900e-03 1.2892e-03 + -7.8300e-06 -7.8300e-06 + 1.0000e-09 1.0000e-09 diff --git a/simple_examples/baseresults/s10aaje.r b/simple_examples/baseresults/s10aaje.r new file mode 100644 index 0000000..eac481e --- /dev/null +++ b/simple_examples/baseresults/s10aaje.r @@ -0,0 +1,7 @@ +S10AAJ Example Program Results + + X Y + -2.000e+01 -1.000e+00 + -5.000e+00 -9.999e-01 + 5.000e-01 4.621e-01 + 5.000e+00 9.999e-01 diff --git a/simple_examples/baseresults/s10abje.r b/simple_examples/baseresults/s10abje.r new file mode 100644 index 0000000..54e3b1c --- /dev/null +++ b/simple_examples/baseresults/s10abje.r @@ -0,0 +1,8 @@ +S10ABJ Example Program Results + + X Y + -1.000e+01 -1.101e+04 + -5.000e-01 -5.211e-01 + 0.000e+00 0.000e+00 + 5.000e-01 5.211e-01 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s10acje.r b/simple_examples/baseresults/s10acje.r new file mode 100644 index 0000000..e71c76b --- /dev/null +++ b/simple_examples/baseresults/s10acje.r @@ -0,0 +1,8 @@ +S10ACJ Example Program Results + + X Y + -1.000e+01 1.101e+04 + -5.000e-01 1.128e+00 + 0.000e+00 1.000e+00 + 5.000e-01 1.128e+00 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s14abje.r b/simple_examples/baseresults/s14abje.r new file mode 100644 index 0000000..86c60ea --- /dev/null +++ b/simple_examples/baseresults/s14abje.r @@ -0,0 +1,12 @@ +S14ABJ Example Program Results + + X Y + 1.000e+00 0.000e+00 + 1.250e+00 -9.827e-02 + 1.500e+00 -1.208e-01 + 1.750e+00 -8.440e-02 + 2.000e+00 0.000e+00 + 5.000e+00 3.178e+00 + 1.000e+01 1.280e+01 + 2.000e+01 3.934e+01 + 1.000e+03 5.905e+03 diff --git a/simple_examples/baseresults/s14acje.r b/simple_examples/baseresults/s14acje.r new file mode 100644 index 0000000..cda0185 --- /dev/null +++ b/simple_examples/baseresults/s14acje.r @@ -0,0 +1,8 @@ +S14ACJ Example Program Results + + X psi(X)-log(X) + + 0.1000 -8.1212 + 0.5000 -1.2704 + 3.6000 -0.1453 + 8.0000 -0.0638 diff --git a/simple_examples/baseresults/s14afje.r b/simple_examples/baseresults/s14afje.r new file mode 100644 index 0000000..68a5fd5 --- /dev/null +++ b/simple_examples/baseresults/s14afje.r @@ -0,0 +1,5 @@ +S14AFJ Example Program Results + + Z K (d^K/dz^K)psi(Z) + + (-1.5, 2.5) 1 (-1.9737e-01, -2.4271e-01) diff --git a/simple_examples/baseresults/s17dcje.r b/simple_examples/baseresults/s17dcje.r new file mode 100644 index 0000000..845aae3 --- /dev/null +++ b/simple_examples/baseresults/s17dcje.r @@ -0,0 +1,10 @@ +S17DCF Example Program Results + +Calling with N = 2 + +FNU Z SCAL CY[0] CY[1] NZ +0.0000 (0.3000, 0.4000) U (-0.4983, 0.6700) (-1.0149, 0.9485) 0 +2.3000 (2.0000, 0.0000) U (-0.7398, 0.0000) (-1.4120, 0.0000) 0 +2.1200 (-1.0000, 0.0000) U (-1.7279, 0.8602) (6.5331, -2.6154) 0 +1.5800 (-2.3000, 5.6000) U (36.4755, -1.5521) (-2.6788, 25.9112) 0 +1.5800 (-2.3000, 5.6000) S (0.1349, -0.0057) (-0.0099, 0.0958) 0 diff --git a/simple_examples/baseresults/s17dgje.r b/simple_examples/baseresults/s17dgje.r new file mode 100644 index 0000000..c26ff48 --- /dev/null +++ b/simple_examples/baseresults/s17dgje.r @@ -0,0 +1,9 @@ + S17DGJ Example Program Results + + DERIV Z SCAL AI NZ + + F ( 0.3000, 0.4000) U ( 0.2716, -0.1002) 0 + F ( 0.2000, 0.0000) U ( 0.3037, 0.0000) 0 + F ( 1.1000, -6.6000) U (-43.6632,-47.9030) 0 + F ( 1.1000, -6.6000) S ( 0.1655, 0.0597) 0 + D ( -1.0000, 0.0000) U ( -0.0102, 0.0000) 0 diff --git a/simple_examples/baseresults/s30aaje.r b/simple_examples/baseresults/s30aaje.r new file mode 100644 index 0000000..32fc477 --- /dev/null +++ b/simple_examples/baseresults/s30aaje.r @@ -0,0 +1,16 @@ +S30AAJ Example Program Results + +Black-Scholes-Merton formula +European Call : + Spot = 55.0000 + Volatility = 0.3000 + Rate = 0.1000 + Dividend = 0.0000 + + Strike Expiry Option Price + 58.0000 0.7000 5.9198 + 58.0000 0.8000 6.5506 + 60.0000 0.7000 5.0809 + 60.0000 0.8000 5.6992 + 62.0000 0.7000 4.3389 + 62.0000 0.8000 4.9379 diff --git a/simple_examples/baseresults/s30acje.r b/simple_examples/baseresults/s30acje.r new file mode 100644 index 0000000..134730e --- /dev/null +++ b/simple_examples/baseresults/s30acje.r @@ -0,0 +1,9 @@ + S30ACJ Example Program Results + + SIGMA IVALID + + 7.834E-01 0 + 7.386E-01 0 + 4.096E-01 0 + 4.085E-01 0 + 4.179E-01 0 diff --git a/simple_examples/baseresults/simpleroutineexample.r b/simple_examples/baseresults/simpleroutineexample.r new file mode 100644 index 0000000..e1f6a4e --- /dev/null +++ b/simple_examples/baseresults/simpleroutineexample.r @@ -0,0 +1,15 @@ + C05AZ Example Program results: + + Iterations + + X = 0.00000 FX= 1.0000e+00 IND = 2 + X = 1.00000 FX= -6.3212e-01 IND = 3 + X = 0.61270 FX= -7.0814e-02 IND = 4 + X = 0.56707 FX= 1.1542e-04 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + X = 0.56713 FX= 1.4727e-05 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/userdefinedfunctionexample1.r b/simple_examples/baseresults/userdefinedfunctionexample1.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample1.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/userdefinedfunctionexample2.r b/simple_examples/baseresults/userdefinedfunctionexample2.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample2.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/x03aaje.r b/simple_examples/baseresults/x03aaje.r new file mode 100644 index 0000000..d2b7138 --- /dev/null +++ b/simple_examples/baseresults/x03aaje.r @@ -0,0 +1,3 @@ +X03AAF Example Program Results + +D1 = -5.0 D2 = 0.0 \ No newline at end of file diff --git a/simple_examples/baseresults/x04cbje.r b/simple_examples/baseresults/x04cbje.r new file mode 100644 index 0000000..6b842ef --- /dev/null +++ b/simple_examples/baseresults/x04cbje.r @@ -0,0 +1,21 @@ +X04CBJ Example Program Results + + Example 1 + 1 2 3 4 5 + 1 11.0000 12.0000 13.0000 14.0000 15.0000 + 2 21.0000 22.0000 23.0000 24.0000 25.0000 + 3 31.0000 32.0000 33.0000 34.0000 35.0000 + + Example 2: + Un Deux Trois Quatre Cinq + Uno 11.00 12.00 13.00 14.00 15.00 + Due 22.00 23.00 24.00 25.00 + Tre 33.00 34.00 35.00 + Quattro 44.00 45.00 + Cinque 55.00 + + A = [ + 11.00 0.00 0.00 0.00 0.00; + 21.00 22.00 0.00 0.00 0.00; + 31.00 32.00 33.00 0.00 0.00; + ]; diff --git a/simple_examples/baseresults/x05abje.r b/simple_examples/baseresults/x05abje.r new file mode 100644 index 0000000..f94235c --- /dev/null +++ b/simple_examples/baseresults/x05abje.r @@ -0,0 +1,2 @@ + X05ABJ Example Program Results +Tue 14th Jul 1789 13:11:48.320 diff --git a/simple_examples/data/c02abje.d b/simple_examples/data/c02abje.d new file mode 100644 index 0000000..3f2dfd1 --- /dev/null +++ b/simple_examples/data/c02abje.d @@ -0,0 +1,14 @@ +C02ABJ Example Program Data + +Example 1: Basic Problem + 6 : Degree, n + 3.5 : Coefficients, a + 1.0 + -7.0 + 12.5 + 2.5 + -17.0 + 32.5 + +Example 2: Polishing Processes + 10 : Degree, n diff --git a/simple_examples/data/c02afje.d b/simple_examples/data/c02afje.d new file mode 100644 index 0000000..0e31bab --- /dev/null +++ b/simple_examples/data/c02afje.d @@ -0,0 +1,19 @@ +C02AFJ Example Program Data + +Example 1 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 + +Example 2 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 diff --git a/simple_examples/data/c02agje.d b/simple_examples/data/c02agje.d new file mode 100644 index 0000000..ada6a96 --- /dev/null +++ b/simple_examples/data/c02agje.d @@ -0,0 +1,9 @@ +C02AGJ Example Program Data + +Example 1 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 + +Example 2 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 diff --git a/simple_examples/data/c02ahje.d b/simple_examples/data/c02ahje.d new file mode 100644 index 0000000..0e1a9ea --- /dev/null +++ b/simple_examples/data/c02ahje.d @@ -0,0 +1,2 @@ +C02AHJ Example Program Data + 1.0 0.0 -3.0 1.0 8.0 1.0 :AR AI BR BI CR CI diff --git a/simple_examples/data/c02ajje.d b/simple_examples/data/c02ajje.d new file mode 100644 index 0000000..c24b295 --- /dev/null +++ b/simple_examples/data/c02ajje.d @@ -0,0 +1,2 @@ +C02AJJ Example Program Data + 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/c02akje.d b/simple_examples/data/c02akje.d new file mode 100644 index 0000000..0b71c64 --- /dev/null +++ b/simple_examples/data/c02akje.d @@ -0,0 +1,2 @@ +C02AKJ Example Program Data + 1.0 3.0 9.0 -13.0 : Values of U, R, S and T diff --git a/simple_examples/data/c02alje.d b/simple_examples/data/c02alje.d new file mode 100644 index 0000000..a519a24 --- /dev/null +++ b/simple_examples/data/c02alje.d @@ -0,0 +1,2 @@ +C02ALJ Example Program Data + 1.0 2.0 6.0 -8.0 -40.0 : Values of E, A, B, C and D diff --git a/simple_examples/data/c02amje.d b/simple_examples/data/c02amje.d new file mode 100644 index 0000000..9bff4dc --- /dev/null +++ b/simple_examples/data/c02amje.d @@ -0,0 +1,5 @@ +C02AMJ Example Program Data + ( 1.0, 0.0) + ( -2.0, 3.0) + ( 5.0, 14.0) + (-40.0, -5.0) : Values of U, R, S and T diff --git a/simple_examples/data/c02anje.d b/simple_examples/data/c02anje.d new file mode 100644 index 0000000..c331b10 --- /dev/null +++ b/simple_examples/data/c02anje.d @@ -0,0 +1,6 @@ +C02ANJ Example Program Data + ( 1.0, 0.0) + ( 0.0, 0.0) + ( 0.0, 16.0) + ( -8.0, 8.0) + (-65.0, 0.0) : Values of E, A, B, C and D diff --git a/simple_examples/data/c05bbje.d b/simple_examples/data/c05bbje.d new file mode 100644 index 0000000..6c78ea9 --- /dev/null +++ b/simple_examples/data/c05bbje.d @@ -0,0 +1,7 @@ +C05BBJ Example Program Data +0 : BRANCH +false : OFFSET +0.5 -1.0 +1.0 2.3 +4.5 -0.1 +6.0 6.0 : Z diff --git a/simple_examples/data/c06fkje.d b/simple_examples/data/c06fkje.d new file mode 100644 index 0000000..e042218 --- /dev/null +++ b/simple_examples/data/c06fkje.d @@ -0,0 +1,11 @@ +C06FKJ Example Program Data +9 : n +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 : xa, ya diff --git a/simple_examples/data/c09aaje.d b/simple_examples/data/c09aaje.d new file mode 100644 index 0000000..8313509 --- /dev/null +++ b/simple_examples/data/c09aaje.d @@ -0,0 +1,11 @@ +C09AAF Example Program Data + 8 : n + Haar Zero : wavnam, mode + 2.0 + 5.0 + 8.0 + 9.0 + 7.0 + 4.0 +-1.0 + 1.0 : x(1:n) diff --git a/simple_examples/data/d03pcje.d b/simple_examples/data/d03pcje.d new file mode 100644 index 0000000..9e78e1f --- /dev/null +++ b/simple_examples/data/d03pcje.d @@ -0,0 +1,6 @@ +D03PCJ Example Program Data +6 20 1 : intpts, npts, itype +0.0 0.4 0.6 0.8 0.9 1.0 : xout(1:intpts) +1.0E-3 1.0 : acc, alpha +1 0 : m, itrace +0.0 0.1E-4 : ts, tout diff --git a/simple_examples/data/e02alje.d b/simple_examples/data/e02alje.d new file mode 100644 index 0000000..b1c9d44 --- /dev/null +++ b/simple_examples/data/e02alje.d @@ -0,0 +1,23 @@ +E02ALJ Example Program Data + 21 5 11 : N, M, NEVAL + 0.00 1.0000000000 + 0.05 1.0512710964 + 0.10 1.1051709181 + 0.15 1.1618342427 + 0.20 1.2214027582 + 0.25 1.2840254167 + 0.30 1.3498588076 + 0.35 1.4190675486 + 0.40 1.4918246976 + 0.45 1.5683121855 + 0.50 1.6487212707 + 0.55 1.7332530179 + 0.60 1.8221188004 + 0.65 1.9155408290 + 0.70 2.0137527075 + 0.75 2.1170000166 + 0.80 2.2255409285 + 0.85 2.3396468519 + 0.90 2.4596031112 + 0.95 2.5857096593 + 1.00 2.7182818285 : X, Y diff --git a/simple_examples/data/e04fcje.d b/simple_examples/data/e04fcje.d new file mode 100644 index 0000000..963a616 --- /dev/null +++ b/simple_examples/data/e04fcje.d @@ -0,0 +1,16 @@ +E04FCF Example Program Data + 0.14 1.0 15.0 1.0 + 0.18 2.0 14.0 2.0 + 0.22 3.0 13.0 3.0 + 0.25 4.0 12.0 4.0 + 0.29 5.0 11.0 5.0 + 0.32 6.0 10.0 6.0 + 0.35 7.0 9.0 7.0 + 0.39 8.0 8.0 8.0 + 0.37 9.0 7.0 7.0 + 0.58 10.0 6.0 6.0 + 0.73 11.0 5.0 5.0 + 0.96 12.0 4.0 4.0 + 1.34 13.0 3.0 3.0 + 2.10 14.0 2.0 2.0 + 4.39 15.0 1.0 1.0 diff --git a/simple_examples/data/e04mxje.d b/simple_examples/data/e04mxje.d new file mode 100644 index 0000000..7d45bf8 --- /dev/null +++ b/simple_examples/data/e04mxje.d @@ -0,0 +1,64 @@ +NAME E04MX.EX +ROWS + L ..ROW1.. + L ..ROW2.. + L ..ROW3.. + N ..COST.. +COLUMNS + ...X1... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X1... ..ROW3.. 1.0 ..COST.. -4.0 + ...X2... ..ROW1.. 1.0 ..ROW2.. 2.0 + ...X2... ..ROW3.. -1.0 ..COST.. -1.0 + ...X3... ..ROW1.. 1.0 ..ROW2.. 3.0 + ...X3... ..ROW3.. 1.0 ..COST.. -1.0 + ...X4... ..ROW1.. 1.0 ..ROW2.. 4.0 + ...X4... ..ROW3.. -1.0 ..COST.. -1.0 + ...X5... ..ROW1.. 1.0 ..ROW2.. -2.0 + ...X5... ..ROW3.. 1.0 ..COST.. -1.0 + ...X6... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X6... ..ROW3.. 1.0 ..COST.. -1.0 + ...X7... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X7... ..ROW3.. 1.0 ..COST.. -1.0 + ...X8... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X8... ..ROW3.. 1.0 ..COST.. -0.1 + ...X9... ..ROW1.. 4.0 ..ROW2.. 1.0 + ...X9... ..ROW3.. 1.0 ..COST.. -0.3 +RHS + RHS1 ..ROW1.. 1.5 + RHS1 ..ROW2.. 1.5 + RHS1 ..ROW3.. 4.0 + RHS1 ..COST.. 1000.0 +RANGES + RANGE1 ..ROW1.. 3.5 + RANGE1 ..ROW2.. 3.5 + RANGE1 ..ROW3.. 6.0 +BOUNDS + LO BOUND ...X1... -2.0 + LO BOUND ...X2... -2.0 + LO BOUND ...X3... -2.0 + LO BOUND ...X4... -2.0 + LO BOUND ...X5... -2.0 + LO BOUND ...X6... -2.0 + LO BOUND ...X7... -2.0 + LO BOUND ...X8... -2.0 + LO BOUND ...X9... -2.0 + UP BOUND ...X1... 2.0 + UP BOUND ...X2... 2.0 + UP BOUND ...X3... 2.0 + UP BOUND ...X4... 2.0 + UP BOUND ...X5... 2.0 + UP BOUND ...X6... 2.0 + UP BOUND ...X7... 2.0 + UP BOUND ...X8... 2.0 + UP BOUND ...X9... 2.0 +QUADOBJ + ...X1... ...X1... 2.00000000E0 ...X2... 1.00000000E0 + ...X1... ...X3... 1.00000000E0 ...X4... 1.00000000E0 + ...X1... ...X5... 1.00000000E0 + ...X2... ...X2... 2.00000000E0 ...X3... 1.00000000E0 + ...X2... ...X4... 1.00000000E0 ...X5... 1.00000000E0 + ...X3... ...X3... 2.00000000E0 ...X4... 1.00000000E0 + ...X3... ...X5... 1.00000000E0 + ...X4... ...X4... 2.00000000E0 ...X5... 1.00000000E0 + ...X5... ...X5... 2.00000000E0 +ENDATA diff --git a/simple_examples/data/e04ncje.d b/simple_examples/data/e04ncje.d new file mode 100644 index 0000000..bdf378b --- /dev/null +++ b/simple_examples/data/e04ncje.d @@ -0,0 +1,21 @@ +E04NCA Example Program Data + 10 9 3 :Values of M, N and NCLIN + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 2.0 1.0 1.0 1.0 1.0 2.0 0.0 0.0 + 1.0 1.0 3.0 1.0 1.0 1.0 -1.0 -1.0 -3.0 + 1.0 1.0 1.0 4.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 3.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 -1.0 + 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 0.0 1.0 1.0 1.0 2.0 2.0 3.0 + 1.0 0.0 1.0 1.0 1.0 1.0 0.0 2.0 2.0 :End of matrix A + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 :End of B + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 + 1.0 2.0 3.0 4.0 -2.0 1.0 1.0 1.0 1.0 + 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 :End of matrix C + 0.0 0.0 -1.0E+25 0.0 0.0 0.0 0.0 0.0 0.0 + 2.0 -1.0E+25 1.0 :End of BL + 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 + 1.0E+25 2.0 4.0 :End of BU + 1.0 0.5 0.3333 0.25 0.2 0.1667 0.1428 0.125 0.1111 :End of X diff --git a/simple_examples/data/e04nfje.d b/simple_examples/data/e04nfje.d new file mode 100644 index 0000000..f2c6165 --- /dev/null +++ b/simple_examples/data/e04nfje.d @@ -0,0 +1,22 @@ +E04NFA Example Program Data + 7 7 :Values of N and NCLIN + -0.02 -0.20 -0.20 -0.20 -0.20 0.04 0.04 :End of CVEC + 1.00 1.00 1.00 1.00 1.00 1.00 1.00 + 0.15 0.04 0.02 0.04 0.02 0.01 0.03 + 0.03 0.05 0.08 0.02 0.06 0.01 0.00 + 0.02 0.04 0.01 0.02 0.02 0.00 0.00 + 0.02 0.03 0.00 0.00 0.01 0.00 0.00 + 0.70 0.75 0.80 0.75 0.80 0.97 0.00 + 0.02 0.06 0.08 0.12 0.02 0.01 0.97 :End of matrix A + -0.01 -0.10 -0.01 -0.04 -0.10 -0.01 -0.01 + -0.13 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 -9.92E-02 -3.0E-03 :End of BL + 0.01 0.15 0.03 0.02 0.05 1.0E+25 1.0E+25 + -0.13 -4.9E-03 -6.4E-03 -3.7E-03 -1.2E-03 1.0E+25 2.0E-03 :End of BU + -0.01 -0.03 0.00 -0.01 -0.10 0.02 0.01 :End of X + 2.00 0.00 0.00 0.00 0.00 0.00 0.00 + 0.00 2.00 0.00 0.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 0.00 0.00 2.00 0.00 0.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 :End of matrix H diff --git a/simple_examples/data/e04nqje.d b/simple_examples/data/e04nqje.d new file mode 100644 index 0000000..a1c9039 --- /dev/null +++ b/simple_examples/data/e04nqje.d @@ -0,0 +1,67 @@ +E04NQF Example Program Data + 7 8 : Values of N and M +48 8 7 'C' 15 : Values of NNZ, IOBJ, NCOLH, START and NNAME + +'...X1...' '...X2...' '...X3...' '...X4...' '...X5...' +'...X6...' '...X7...' '..ROW1..' '..ROW2..' '..ROW3..' +'..ROW4..' '..ROW5..' '..ROW6..' '..ROW7..' '..COST..' : End of array NAMES + + 0.02 7 1 : Sparse matrix A, ordered by increasing column index; + 0.02 5 1 : each row contains ACOL(i), INDA(i), ICOL (= column index) + 0.03 3 1 : The row indices may be in any order. In this example + 1.00 1 1 : row 8 defines the linear objective term transpose(C)*X. + 0.70 6 1 + 0.02 4 1 + 0.15 2 1 + -200.00 8 1 + 0.06 7 2 + 0.75 6 2 + 0.03 5 2 + 0.04 4 2 + 0.05 3 2 + 0.04 2 2 + 1.00 1 2 +-2000.00 8 2 + 0.02 2 3 + 1.00 1 3 + 0.01 4 3 + 0.08 3 3 + 0.08 7 3 + 0.80 6 3 +-2000.00 8 3 + 1.00 1 4 + 0.12 7 4 + 0.02 3 4 + 0.02 4 4 + 0.75 6 4 + 0.04 2 4 +-2000.00 8 4 + 0.01 5 5 + 0.80 6 5 + 0.02 7 5 + 1.00 1 5 + 0.02 2 5 + 0.06 3 5 + 0.02 4 5 +-2000.00 8 5 + 1.00 1 6 + 0.01 2 6 + 0.01 3 6 + 0.97 6 6 + 0.01 7 6 + 400.00 8 6 + 0.97 7 7 + 0.03 2 7 + 1.00 1 7 + 400.00 8 7 : End of matrix A + + 0.0 0.0 4.0E+02 1.0E+02 0.0 0.0 + 0.0 2.0E+03 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 + 1.5E+03 2.5E+02 -1.0E+25 : End of lower bounds array BL + + 2.0E+02 2.5E+03 8.0E+02 7.0E+02 1.5E+03 1.0E+25 + 1.0E+25 2.0E+03 6.0E+01 1.0E+02 4.0E+01 3.0E+01 + 1.0E+25 3.0E+02 1.0E+25 : End of upper bounds array BU + + 0 0 0 0 0 0 0 : Initial array HS + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 : Initial vector X diff --git a/simple_examples/data/e04rsje.d b/simple_examples/data/e04rsje.d new file mode 100644 index 0000000..9540ce2 --- /dev/null +++ b/simple_examples/data/e04rsje.d @@ -0,0 +1,13 @@ +E04RSJ Example Program Data + 3 6 6 : n, nnzq1, nnzq2 + 1 1 1 2 2 3 : irowq0 + 1 2 3 2 3 3 : icolq0 + 0.493 0.382 0.270 0.475 0.448 0.515 : q0 + 1 1 1 2 2 3 : irowq1 + 1 2 3 2 3 3 : icolq1 + 0.737 0.453 1.002 0.316 0.635 1.590 : q1 + 1 2 3 : idxr0 + 0.847 0.08 0.505 : r0 + 1 2 3 : idxr1 + 0.065 0.428 0.097 : r1 + 1.276 : s diff --git a/simple_examples/data/e04rtje.d b/simple_examples/data/e04rtje.d new file mode 100644 index 0000000..f6f5896 --- /dev/null +++ b/simple_examples/data/e04rtje.d @@ -0,0 +1,8 @@ +E04RTJ Example Program Data + 3 2 4 : n, m, nnza + 1 1 2 2 : irowa + 1 2 2 3 : icola + 0.493 0.382 0.270 0.475 : a + 0.2 0.4 : b + -1.0 -1.0 -1.0 : xl + 1.0 1.0 1.0 : xu diff --git a/simple_examples/data/e04saje.opt b/simple_examples/data/e04saje.opt new file mode 100644 index 0000000..098dd78 --- /dev/null +++ b/simple_examples/data/e04saje.opt @@ -0,0 +1,30 @@ +NAME E04SAJE +OBJSENSE + MIN +ROWS + N obj + L g1 + G g2 +COLUMNS + x1 obj 10.0 + x1 g1 -0.1 + x1 g2 -0.06 + x2 obj 20.0 + x2 g1 -0.1 + x2 g2 1.0 + x3 obj 1.0 + x3 g1 1.0 + x3 g2 1.0 +RHS + UVEC g1 1.5 + UVEC g2 1.0 +BOUNDS + LO bound x1 -2.0 + UP bound x1 2.0 + LO bound x2 -2.0 + UP bound x2 2.0 +CSECTION k1 0 QUAD + x3 + x1 + x2 +ENDATA diff --git a/simple_examples/data/e04tcje.d b/simple_examples/data/e04tcje.d new file mode 100644 index 0000000..0d7c25f --- /dev/null +++ b/simple_examples/data/e04tcje.d @@ -0,0 +1,22 @@ +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/f03baje.d b/simple_examples/data/f03baje.d new file mode 100644 index 0000000..8c792dc --- /dev/null +++ b/simple_examples/data/f03baje.d @@ -0,0 +1,5 @@ +F03BAF Example Program Data + 3 : N + 33 16 72 + -24 -10 -57 + -8 -4 -17 : A diff --git a/simple_examples/data/f04amje.d b/simple_examples/data/f04amje.d new file mode 100644 index 0000000..dc69386 --- /dev/null +++ b/simple_examples/data/f04amje.d @@ -0,0 +1,5 @@ +F04AMF Example Program Data + 3 2 : m, n + 1.1 0.9 2.2 + 1.2 1.0 2.3 + 1.0 1.0 2.1 : matrices A and B diff --git a/simple_examples/data/f04baje.d b/simple_examples/data/f04baje.d new file mode 100644 index 0000000..b1df19b --- /dev/null +++ b/simple_examples/data/f04baje.d @@ -0,0 +1,13 @@ +F04BAF Example Program Data + + 4 2 : n, nrhs + + 1.80 2.88 2.05 -0.89 + 5.25 -2.95 -0.95 -3.80 + 1.58 -2.69 -2.90 -1.04 + -1.11 -0.66 -0.59 0.80 : matrix A + + 9.52 18.47 + 24.35 2.25 + 0.77 -13.28 + -6.22 -6.21 : matrix B diff --git a/simple_examples/data/f05aaje.d b/simple_examples/data/f05aaje.d new file mode 100644 index 0000000..cafb7ea --- /dev/null +++ b/simple_examples/data/f05aaje.d @@ -0,0 +1,6 @@ +F05AAF Example Program Data + 4 2 4 + 1 -2 3 1 +-2 1 -2 -1 + 3 -2 1 5 + 4 1 5 3 \ No newline at end of file diff --git a/simple_examples/data/f08btje.d b/simple_examples/data/f08btje.d new file mode 100644 index 0000000..bea5bf4 --- /dev/null +++ b/simple_examples/data/f08btje.d @@ -0,0 +1,15 @@ +F08BTF Example Program Data + + 5 4 2 :Values of M, N and NRHS + + ( 0.47,-0.34) (-0.40, 0.54) ( 0.60, 0.01) ( 0.80,-1.02) + (-0.32,-0.23) (-0.05, 0.20) (-0.26,-0.44) (-0.43, 0.17) + ( 0.35,-0.60) (-0.52,-0.34) ( 0.87,-0.11) (-0.34,-0.09) + ( 0.89, 0.71) (-0.45,-0.45) (-0.02,-0.57) ( 1.14,-0.78) + (-0.19, 0.06) ( 0.11,-0.85) ( 1.44, 0.80) ( 0.07, 1.14) :End of matrix A + + (-1.08,-2.59) ( 2.22, 2.35) + (-2.61,-1.49) ( 1.62,-1.48) + ( 3.13,-3.61) ( 1.65, 3.43) + ( 7.33,-8.01) (-0.98, 3.08) + ( 9.12, 7.63) (-2.84, 2.78) :End of matrix B diff --git a/simple_examples/data/f08xpje.d b/simple_examples/data/f08xpje.d new file mode 100644 index 0000000..39b5c87 --- /dev/null +++ b/simple_examples/data/f08xpje.d @@ -0,0 +1,10 @@ +F08XPJ Example Program Data +4 : Value of N +(-21.10,-22.50) ( 53.50,-50.50) (-34.50,127.50) ( 7.50, 0.50) +( -0.46, -7.78) ( -3.50,-37.50) (-15.50, 58.50) (-10.50, -1.50) +( 4.30, -5.50) ( 39.70,-17.10) (-68.50, 12.50) ( -7.50, -3.50) +( 5.50, 4.40) ( 14.40, 43.30) (-32.50,-46.00) (-19.00,-32.50) : End of A +( 1.00, -5.00) ( 1.60, 1.20) ( -3.00, 0.00) ( 0.00, -1.00) +( 0.80, -0.60) ( 3.00, -5.00) ( -4.00, 3.00) ( -2.40, -3.20) +( 1.00, 0.00) ( 2.40, 1.80) ( -4.00, -5.00) ( 0.00, -3.00) +( 0.00, 1.00) ( -1.80, 2.40) ( 0.00, -4.00) ( 4.00, -5.00) : End of B diff --git a/simple_examples/data/g02bjje.d b/simple_examples/data/g02bjje.d new file mode 100644 index 0000000..eaa8921 --- /dev/null +++ b/simple_examples/data/g02bjje.d @@ -0,0 +1,10 @@ +G02BJF Example Program Data +5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 +12.0 2.0 0.0 0.0 +-1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS +-1.0 0.0 0.0 0.0 :: XMISS +4 1 2 :: KVAR diff --git a/simple_examples/data/g02daje.d b/simple_examples/data/g02daje.d new file mode 100644 index 0000000..4e844ac --- /dev/null +++ b/simple_examples/data/g02daje.d @@ -0,0 +1,15 @@ +G02DAJ Example Program Data +12 4 'U' 'M' +1.0 0.0 0.0 0.0 33.63 +0.0 0.0 0.0 1.0 39.62 +0.0 1.0 0.0 0.0 38.18 +0.0 0.0 1.0 0.0 41.46 +0.0 0.0 0.0 1.0 38.02 +0.0 1.0 0.0 0.0 35.83 +0.0 0.0 0.0 1.0 35.99 +1.0 0.0 0.0 0.0 36.58 +0.0 0.0 1.0 0.0 42.92 +1.0 0.0 0.0 0.0 37.80 +0.0 0.0 1.0 0.0 40.43 +0.0 1.0 0.0 0.0 37.89 +1 1 1 1 diff --git a/simple_examples/data/g02eeje.d b/simple_examples/data/g02eeje.d new file mode 100644 index 0000000..b0c03a7 --- /dev/null +++ b/simple_examples/data/g02eeje.d @@ -0,0 +1,24 @@ +G02EEF Example Program Data + 20 6 'M' 'U' 2.0 :: N,M,MEAN,WEIGHT,FIN + 0.0 1125.0 232.0 7160.0 85.9 8905.0 1.5563 + 7.0 920.0 268.0 8804.0 86.5 7388.0 0.8976 + 15.0 835.0 271.0 8108.0 85.2 5348.0 0.7482 + 22.0 1000.0 237.0 6370.0 83.8 8056.0 0.7160 + 29.0 1150.0 192.0 6441.0 82.1 6960.0 0.3010 + 37.0 990.0 202.0 5154.0 79.2 5690.0 0.3617 + 44.0 840.0 184.0 5896.0 81.2 6932.0 0.1139 + 58.0 650.0 200.0 5336.0 80.6 5400.0 0.1139 + 65.0 640.0 180.0 5041.0 78.4 3177.0 -0.2218 + 72.0 583.0 165.0 5012.0 79.3 4461.0 -0.1549 + 80.0 570.0 151.0 4825.0 78.7 3901.0 0.0000 + 86.0 570.0 171.0 4391.0 78.0 5002.0 0.0000 + 93.0 510.0 243.0 4320.0 72.3 4665.0 -0.0969 + 100.0 555.0 147.0 3709.0 74.9 4642.0 -0.2218 + 107.0 460.0 286.0 3969.0 74.4 4840.0 -0.3979 + 122.0 275.0 198.0 3558.0 72.5 4479.0 -0.1549 + 129.0 510.0 196.0 4361.0 57.7 4200.0 -0.2218 + 151.0 165.0 210.0 3301.0 71.8 3410.0 -0.3979 + 171.0 244.0 327.0 2964.0 72.5 3360.0 -0.5229 + 220.0 79.0 334.0 2777.0 71.9 2599.0 -0.0458 :: End of X,Y + 0 1 1 1 1 2 :: ISX + 'DAY' 'BOD' 'TKN' 'TS ' 'TVS' 'COD' :: VNAME diff --git a/simple_examples/data/g02maje.d b/simple_examples/data/g02maje.d new file mode 100644 index 0000000..b21e21c --- /dev/null +++ b/simple_examples/data/g02maje.d @@ -0,0 +1,23 @@ +G02MAJ Example Program Data +20 6 :: N,M +1 3 1 6 0 :: MTYPE,PRED,PREY,MNSTEP,LISX +10.28 1.77 9.69 15.58 8.23 10.44 -46.47 +9.08 8.99 11.53 6.57 15.89 12.58 -35.80 +17.98 13.10 1.04 10.45 10.12 16.68 -129.22 +14.82 13.79 12.23 7.00 8.14 7.79 -42.44 +17.53 9.41 6.24 3.75 13.12 17.08 -73.51 +7.78 10.38 9.83 2.58 10.13 4.25 -26.61 +11.95 21.71 8.83 11.00 12.59 10.52 -63.90 +14.60 10.09 -2.70 9.89 14.67 6.49 -76.73 +3.63 9.07 12.59 14.09 9.06 8.19 -32.64 +6.35 9.79 9.40 12.79 8.38 16.79 -83.29 +4.66 3.55 16.82 13.83 21.39 13.88 -16.31 +8.32 14.04 17.17 7.93 7.39 -1.09 -5.82 +10.86 13.68 5.75 10.44 10.36 10.06 -47.75 +4.76 4.92 17.83 2.90 7.58 11.97 18.38 +5.05 10.41 9.89 9.04 7.90 13.12 -54.71 +5.41 9.32 5.27 15.53 5.06 19.84 -55.62 +9.77 2.37 9.54 20.23 9.33 8.82 -45.28 +14.28 4.34 14.23 14.95 18.16 11.03 -22.76 +10.17 6.80 3.17 8.57 16.07 15.93 -104.32 +5.39 2.67 6.37 13.56 10.68 7.35 -55.94 :: End of D, Y diff --git a/simple_examples/data/g03gaje.d b/simple_examples/data/g03gaje.d new file mode 100644 index 0000000..ca1c97f --- /dev/null +++ b/simple_examples/data/g03gaje.d @@ -0,0 +1,56 @@ +G03GAF Example Program Data +25 4 4 : N M IP +2 : NG +2 : SOPT +2 : POPT +15 : NITER +2.7 3.2 4.5 4.8 +3.9 3.8 5.9 6.2 +4.8 4.1 6.8 5.5 +3.1 3.5 4.3 4.6 +3.4 3.7 5.1 5.6 +3.1 3.4 4.1 4.7 +4.6 4.4 6.6 6.1 +3.1 3.3 4.0 4.9 +3.8 3.7 4.7 4.9 +5.2 4.9 8.2 6.9 +3.9 3.8 5.2 5.4 +4.1 4.0 5.6 5.6 +5.7 5.1 7.0 6.3 +3.0 3.2 4.5 5.0 +2.9 3.3 4.5 5.1 +3.4 3.3 4.4 5.0 +4.0 4.2 5.2 5.4 +3.0 3.0 4.6 5.0 +4.0 4.1 5.9 5.8 +3.0 3.2 4.4 5.1 +3.6 3.6 5.3 5.4 +3.1 3.2 4.6 5.0 +3.2 3.3 5.4 5.3 +3.0 3.4 4.2 4.7 +3.8 4.0 6.9 6.7 : X +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 : P diff --git a/simple_examples/data/g05kfje.d b/simple_examples/data/g05kfje.d new file mode 100644 index 0000000..b55cba0 --- /dev/null +++ b/simple_examples/data/g05kfje.d @@ -0,0 +1,3 @@ +G05KFF Example Program Data +1 1 1762543 :: GENID,SUBID,SEED(1) +5 :: N diff --git a/simple_examples/data/g13naje.d b/simple_examples/data/g13naje.d new file mode 100644 index 0000000..4da5b32 --- /dev/null +++ b/simple_examples/data/g13naje.d @@ -0,0 +1,14 @@ +G13NAJ Example Program Data +100 :: N +0.00 0.78 -0.02 0.17 0.04 -1.23 0.24 1.70 0.77 0.06 +0.67 0.94 1.99 2.64 2.26 3.72 3.14 2.28 3.78 0.83 +2.80 1.66 1.93 2.71 2.97 3.04 2.29 3.71 1.69 2.76 +1.96 3.17 1.04 1.50 1.12 1.11 1.00 1.84 1.78 2.39 +1.85 0.62 2.16 0.78 1.70 0.63 1.79 1.21 2.20 -1.34 +0.04 -0.14 2.78 1.83 0.98 0.19 0.57 -1.41 2.05 1.17 +0.44 2.32 0.67 0.73 1.17 -0.34 2.95 1.08 2.16 2.27 +-0.14 -0.24 0.27 1.71 -0.04 -1.03 -0.12 -0.67 1.15 -1.10 +-1.37 0.59 0.44 0.63 -0.06 -0.62 0.39 -2.63 -1.63 -0.42 +-0.73 0.85 0.26 0.48 -0.26 -1.77 -1.53 -1.39 1.68 0.43 :: End of Y +1 1 4.6 2 :: CTYPE,IPARAM,BETA,MINSS +1.0 :: PARAM(1) diff --git a/simple_examples/data/m01ccje.d b/simple_examples/data/m01ccje.d new file mode 100644 index 0000000..3a946ab --- /dev/null +++ b/simple_examples/data/m01ccje.d @@ -0,0 +1,13 @@ +M01CCF Example Program Data +11 +A02AAF 289 +A02ABF 523 +A02ACF 531 +C02ADF 169 +C02AEF 599 +C05AUF 1351 +C05AVF 240 +C05AWF 136 +C05AXF 211 +C05AYF 183 +C05AZF 2181 diff --git a/simple_examples/data/s14abje.d b/simple_examples/data/s14abje.d new file mode 100644 index 0000000..083a4f4 --- /dev/null +++ b/simple_examples/data/s14abje.d @@ -0,0 +1,10 @@ +S14ABF Example Program Data + 1.0 + 1.25 + 1.5 + 1.75 + 2.0 + 5.0 + 10.0 + 20.0 + 1000.0 diff --git a/simple_examples/data/s14acje.d b/simple_examples/data/s14acje.d new file mode 100644 index 0000000..64a16c9 --- /dev/null +++ b/simple_examples/data/s14acje.d @@ -0,0 +1,5 @@ +S14ACJ Example Program Data +0.1 +0.5 +3.6 +8.0 diff --git a/simple_examples/data/s14afje.d b/simple_examples/data/s14afje.d new file mode 100644 index 0000000..f658cc5 --- /dev/null +++ b/simple_examples/data/s14afje.d @@ -0,0 +1,2 @@ +S14AFJ Example Program Data +-1.5 2.5 1 : Values of Z and K diff --git a/simple_examples/data/s17dcje.d b/simple_examples/data/s17dcje.d new file mode 100644 index 0000000..fa0d57f --- /dev/null +++ b/simple_examples/data/s17dcje.d @@ -0,0 +1,6 @@ +S17DCJ Example Program Data +0.00 0.3 0.4 'U' +2.30 2.0 0.0 'U' +2.12 -1.0 0.0 'U' +1.58 -2.3 5.6 'U' +1.58 -2.3 5.6 'S' diff --git a/simple_examples/data/s17dgje.d b/simple_examples/data/s17dgje.d new file mode 100644 index 0000000..3e62c29 --- /dev/null +++ b/simple_examples/data/s17dgje.d @@ -0,0 +1,6 @@ +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/s30aaje.d b/simple_examples/data/s30aaje.d new file mode 100644 index 0000000..0248da1 --- /dev/null +++ b/simple_examples/data/s30aaje.d @@ -0,0 +1,9 @@ +S30AAJ Example Program Data +'C' : Call = 'C', Put = 'P' +55.0 0.3 0.1 0.0 : S, SIGMA, R, Q +3 2 : M, N +58.0 +60.0 +62.0 : X(I), I = 1,2,...M +0.7 +0.8 : T(I), I = 1,2,...N diff --git a/simple_examples/data/s30acje.d b/simple_examples/data/s30acje.d new file mode 100644 index 0000000..48117a7 --- /dev/null +++ b/simple_examples/data/s30acje.d @@ -0,0 +1,9 @@ +S30ACJ Example Program Data +'C' : Call = 'C', Put = 'P' +5 1 : Values of n and mode + +4.14 3.89 5.39 5.14 5.04 : p +268.0 268.0 268.0 268.5 269.0 : k +267.5 267.5 267.5 267.5 267.5 : s0 +0.00274 0.00274 0.0164 0.0164 0.0164 : t +0.0166 0.0166 0.0166 0.0166 0.0166 : r diff --git a/simple_examples/data/x03aaje.d b/simple_examples/data/x03aaje.d new file mode 100644 index 0000000..1254b78 --- /dev/null +++ b/simple_examples/data/x03aaje.d @@ -0,0 +1,5 @@ +X03AAJ Example Program Data + -2 -3 7 + 2 -5 3 + -9 1 0 + 8 -4 -2 diff --git a/simple_examples/source/int32/A00AAJE.java b/simple_examples/source/int32/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/source/int32/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/source/int32/A00ACJE.java b/simple_examples/source/int32/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/source/int32/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/source/int32/A00ADJE.java b/simple_examples/source/int32/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/source/int32/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int32/C02AAJE.java b/simple_examples/source/int32/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/source/int32/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/source/int32/C02ABJE.java b/simple_examples/source/int32/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/source/int32/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/source/int32/C02AFJE.java b/simple_examples/source/int32/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/source/int32/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AGJE.java b/simple_examples/source/int32/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/source/int32/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AHJE.java b/simple_examples/source/int32/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/source/int32/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/source/int32/C02AJJE.java b/simple_examples/source/int32/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/source/int32/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/source/int32/C02AKJE.java b/simple_examples/source/int32/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/source/int32/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ALJE.java b/simple_examples/source/int32/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/source/int32/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02AMJE.java b/simple_examples/source/int32/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/source/int32/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ANJE.java b/simple_examples/source/int32/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/source/int32/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C05AUJE.java b/simple_examples/source/int32/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/source/int32/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/source/int32/C05AWJE.java b/simple_examples/source/int32/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/source/int32/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/source/int32/C05AYJE.java b/simple_examples/source/int32/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/source/int32/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int32/C05AZJE.java b/simple_examples/source/int32/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/source/int32/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int32/C05BBJE.java b/simple_examples/source/int32/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/source/int32/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C05MBJE.java b/simple_examples/source/int32/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/source/int32/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int32/C05QBJE.java b/simple_examples/source/int32/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/source/int32/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/source/int32/C06BAJE.java b/simple_examples/source/int32/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/source/int32/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/source/int32/C06FKJE.java b/simple_examples/source/int32/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/source/int32/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C09AAJE.java b/simple_examples/source/int32/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/source/int32/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/D01BDJE.java b/simple_examples/source/int32/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/source/int32/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/source/int32/D01RJJE.java b/simple_examples/source/int32/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/source/int32/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RKJE.java b/simple_examples/source/int32/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/source/int32/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RLJE.java b/simple_examples/source/int32/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/source/int32/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RMJE.java b/simple_examples/source/int32/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/source/int32/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01TCJE.java b/simple_examples/source/int32/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/source/int32/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/source/int32/D02NEJE.java b/simple_examples/source/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/source/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int32/D02TLJE.java b/simple_examples/source/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/source/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/source/int32/D03PCJE.java b/simple_examples/source/int32/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/source/int32/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/source/int32/D03RAJE.java b/simple_examples/source/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/source/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/source/int32/D03RBJE.java b/simple_examples/source/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/source/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/D05BAJE.java b/simple_examples/source/int32/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/source/int32/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/source/int32/D05BEJE.java b/simple_examples/source/int32/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/source/int32/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/source/int32/DTFSMJE.java b/simple_examples/source/int32/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/source/int32/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int32/E01DAJE.java b/simple_examples/source/int32/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/source/int32/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/source/int32/E02ALJE.java b/simple_examples/source/int32/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/source/int32/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/source/int32/E04ABJE.java b/simple_examples/source/int32/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/source/int32/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/source/int32/E04BBJE.java b/simple_examples/source/int32/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/source/int32/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/source/int32/E04CBJE.java b/simple_examples/source/int32/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/source/int32/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/source/int32/E04FCJE.java b/simple_examples/source/int32/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/source/int32/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04FFJE.java b/simple_examples/source/int32/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/source/int32/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GBJE.java b/simple_examples/source/int32/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/source/int32/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GGJE.java b/simple_examples/source/int32/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/source/int32/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/source/int32/E04MTJE.java b/simple_examples/source/int32/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/source/int32/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04MXJE.java b/simple_examples/source/int32/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/source/int32/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/source/int32/E04NCJE.java b/simple_examples/source/int32/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/source/int32/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/source/int32/E04NFJE.java b/simple_examples/source/int32/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/source/int32/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int32/E04NKJE.java b/simple_examples/source/int32/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/source/int32/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/source/int32/E04NQJE.java b/simple_examples/source/int32/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/source/int32/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/source/int32/E04PTJE.java b/simple_examples/source/int32/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/source/int32/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/E04RPJE.java b/simple_examples/source/int32/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/source/int32/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/source/int32/E04RSJE.java b/simple_examples/source/int32/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/source/int32/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/source/int32/E04RTJE.java b/simple_examples/source/int32/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/source/int32/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/source/int32/E04SAJE.java b/simple_examples/source/int32/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/source/int32/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TAJE.java b/simple_examples/source/int32/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/source/int32/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TCJE.java b/simple_examples/source/int32/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/source/int32/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04UCJE.java b/simple_examples/source/int32/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/source/int32/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04YAJE.java b/simple_examples/source/int32/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/source/int32/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/F01ADJE.java b/simple_examples/source/int32/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/source/int32/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CKJE.java b/simple_examples/source/int32/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/source/int32/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CRJE.java b/simple_examples/source/int32/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/source/int32/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/source/int32/F01DGJE.java b/simple_examples/source/int32/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/source/int32/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/source/int32/F01ELJE.java b/simple_examples/source/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/source/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F01EMJE.java b/simple_examples/source/int32/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/source/int32/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/source/int32/F02EKJE.java b/simple_examples/source/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/source/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F02FKJE.java b/simple_examples/source/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/source/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/F02WGJE.java b/simple_examples/source/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/source/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/F03BAJE.java b/simple_examples/source/int32/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/source/int32/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/source/int32/F04AMJE.java b/simple_examples/source/int32/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/source/int32/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/source/int32/F04BAJE.java b/simple_examples/source/int32/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/source/int32/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/F05AAJE.java b/simple_examples/source/int32/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/source/int32/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/F06CLJE.java b/simple_examples/source/int32/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/source/int32/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/source/int32/F07AAJE.java b/simple_examples/source/int32/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/source/int32/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/source/int32/F07ABJE.java b/simple_examples/source/int32/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/source/int32/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/source/int32/F07ADJE.java b/simple_examples/source/int32/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/source/int32/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/source/int32/F07AQJE.java b/simple_examples/source/int32/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/source/int32/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/source/int32/F07FAJE.java b/simple_examples/source/int32/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/source/int32/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/source/int32/F07FBJE.java b/simple_examples/source/int32/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/source/int32/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/source/int32/F08BTJE.java b/simple_examples/source/int32/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/source/int32/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/source/int32/F08FAJE.java b/simple_examples/source/int32/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/source/int32/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/source/int32/F08XPJE.java b/simple_examples/source/int32/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/source/int32/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/source/int32/G01ALJE.java b/simple_examples/source/int32/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/source/int32/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/source/int32/G02AKJE.java b/simple_examples/source/int32/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/source/int32/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/source/int32/G02BJJE.java b/simple_examples/source/int32/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/source/int32/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/source/int32/G02BRJE.java b/simple_examples/source/int32/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/source/int32/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/source/int32/G02DAJE.java b/simple_examples/source/int32/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/source/int32/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/source/int32/G02EEJE.java b/simple_examples/source/int32/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/source/int32/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/source/int32/G02MAJE.java b/simple_examples/source/int32/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/source/int32/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/source/int32/G03GAJE.java b/simple_examples/source/int32/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/source/int32/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/G05KFJE.java b/simple_examples/source/int32/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/source/int32/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/G13AWJE.java b/simple_examples/source/int32/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/source/int32/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/source/int32/G13MEJE.java b/simple_examples/source/int32/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/source/int32/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/source/int32/G13NAJE.java b/simple_examples/source/int32/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/source/int32/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/source/int32/H02BBJE.java b/simple_examples/source/int32/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/source/int32/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/source/int32/H02DAJE.java b/simple_examples/source/int32/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/source/int32/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/source/int32/M01CCJE.java b/simple_examples/source/int32/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/source/int32/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/source/int32/S01BAJE.java b/simple_examples/source/int32/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/source/int32/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10AAJE.java b/simple_examples/source/int32/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/source/int32/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ABJE.java b/simple_examples/source/int32/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/source/int32/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ACJE.java b/simple_examples/source/int32/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/source/int32/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S14ABJE.java b/simple_examples/source/int32/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/source/int32/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S14ACJE.java b/simple_examples/source/int32/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/source/int32/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S14AFJE.java b/simple_examples/source/int32/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/source/int32/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S17DCJE.java b/simple_examples/source/int32/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/source/int32/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S17DGJE.java b/simple_examples/source/int32/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/source/int32/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/source/int32/S30AAJE.java b/simple_examples/source/int32/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/source/int32/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/source/int32/S30ACJE.java b/simple_examples/source/int32/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/source/int32/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/source/int32/X03AAJE.java b/simple_examples/source/int32/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/source/int32/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/source/int32/X04CBJE.java b/simple_examples/source/int32/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/source/int32/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/source/int32/X05ABJE.java b/simple_examples/source/int32/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/source/int32/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java new file mode 100644 index 0000000..490c163 --- /dev/null +++ b/simple_examples/source/int64/A00AAJE.java @@ -0,0 +1,14 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AA; +import com.nag.routines.Routine; + +public class A00AAJE { + + public static void main (String[] args) throws NAGBadIntegerException { + Routine.init(); + A00AA a00aa = new A00AA(); + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + } + +} diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java new file mode 100644 index 0000000..8250321 --- /dev/null +++ b/simple_examples/source/int64/A00ADJE.java @@ -0,0 +1,113 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AD; +import com.nag.routines.Routine; +import java.util.Arrays; + +public class A00ADJE { + + /* Parameters */ + public static final int MSGLEN = 15; + + /** A00ADJ Example Program */ + public static void main (String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + int i; + long mkmaj, mkmin; + boolean licval; + String fcomp = getBlankString(80), hdware = getBlankString(80), + impl = getBlankString(80), opsys = getBlankString(80), + pcode = getBlankString(80), prec = getBlankString(80), + vend = getBlankString(80); + /* Local Arrays */ + int[] itime = new int[7]; + String[] msg = new String[MSGLEN]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); + + Routine.init(); + System.out.println(" A00ADJ Example Program Results\n"); + + A00AD a00ad = new A00AD(); + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + /* Print implementation details */ + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length + * + * @param len the required length of the String + * @returns a String of spaces of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java new file mode 100644 index 0000000..a3bd5f1 --- /dev/null +++ b/simple_examples/source/int64/C05AYJE.java @@ -0,0 +1,45 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AY; +import com.nag.routines.Routine; + + +public class C05AYJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + long ifail = 0; + long[] iuser = new long[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + Routine.init(); + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch ((int)ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java new file mode 100644 index 0000000..bec1b03 --- /dev/null +++ b/simple_examples/source/int64/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AZ; +import com.nag.routines.Routine; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class C05AZJE { + + public static void main (String[] args)throws NAGBadIntegerException{ + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + long ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + Routine.init(); + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + + if(ind == 0){ + keepOn = false; + } + else{ + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + } + + + + switch ((int)ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java new file mode 100644 index 0000000..08dd454 --- /dev/null +++ b/simple_examples/source/int64/C05MBJE.java @@ -0,0 +1,104 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ Example Program Text + * @author joed + * @since 27.0 + */ + /* ** There have been at least 200*(n+1) calls to fcn. + ** Consider restarting the calculation from the point held in x. + ** ABNORMAL EXIT from NAG Library routine + ** NAG soft failure - control returned +*/ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ Example Main Program + */ + public static void main(String[] args) throws NAGBadIntegerException { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + long astart, ifail, m; + int i; + double[] fvec, x; + double[] ruser = new double[1]; + long[] iuser = new long[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Initialise NAG for Java + Routine.init(); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail==0 || ifail==8 || ifail==9) { + if (ifail==0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java new file mode 100644 index 0000000..d7a6435 --- /dev/null +++ b/simple_examples/source/int64/C05QBJE.java @@ -0,0 +1,178 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; + +/** + * + * @author ludovic + */ +public class C05QBJE { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws NAGBadIntegerException { + try { + Routine.init(); + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + long[] IUSER = new long[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = (int)c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + + break; + } + + } catch (NAGBadIntegerException ex) { + System.err.println("Something went wrong!\n" + ex.getMessage()); + } + + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private long N, IFLAG; + private double[] X, FVEC, RUSER; + private long[] IUSER; + + //@Override + public void setN(long N) { + this.N = N; + } + + //@Override + public long getN() { + return N; + } + + //@Override + public void setX(double[] X) { + this.X = X; + } + + //@Override + public double[] getX() { + return X; + } + + //@Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + //@Override + public double[] getFVEC() { + return FVEC; + } + + //@Override + public void setIUSER(long[] IUSER) { + this.IUSER = IUSER; + } + + //@Override + public long[] getIUSER() { + return IUSER; + } + + //@Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + //@Override + public double[] getRUSER() { + return RUSER; + } + + //@Override + public void setIFLAG(long IFLAG) { + this.IFLAG = IFLAG; + } + + //@Override + public long getIFLAG() { + return IFLAG; + } + + //@Override + public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class D01BDJE_FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + + } + +} diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java new file mode 100644 index 0000000..b32ae64 --- /dev/null +++ b/simple_examples/source/int64/D02NEJE.java @@ -0,0 +1,393 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; + + +/** + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) throws NAGBadIntegerException { + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + long ifail, itask, maxord, ijac, itol, licom, neq, lcom; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + long ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + * Fortran array definition: + * a(dimX, *) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static long getIdx(long x, long y, long dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + long neq, long ml, long mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + long md, ms, pd_dim1; + + pd_dim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; + pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[(int)getIdx(md, 3, pd_dim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; + pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; + pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + long neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java new file mode 100644 index 0000000..d1feabb --- /dev/null +++ b/simple_examples/source/int64/DTFSMJE.java @@ -0,0 +1,61 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * Adapted from f06wbfe.f90 + * + * @author joed + * + */ +public class DTFSMJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + double alpha = 4.21; + long ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + + // Init NAG Java + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + Routine.init(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[(int)(m*m)]; + for (int i=0; i=i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[((int)(m*(m+1)))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java new file mode 100644 index 0000000..89a89e4 --- /dev/null +++ b/simple_examples/source/int64/E01DAJE.java @@ -0,0 +1,177 @@ +/* + * E01DA Example Program - NAG Copyright 2016 + */ + import com.nag.exceptions.NAGBadIntegerException; + import com.nag.routines.E01.E01DA; + import com.nag.routines.E02.E02DF; + import com.nag.routines.Routine; + +public class E01DAJE { + + public static void main (String[] args)throws NAGBadIntegerException { + Routine.init(); + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = (int)e01da.getIFAIL(); + switch (ifail) + { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) + { + if (i <= mx) + System.out.printf("%4d %9.4f", i+1, lamda[i]); + else + System.out.printf(" "); + if (i <= my) + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + else + System.out.printf("\n"); + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) + { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) + System.out.printf("\n"); + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = (int)e01da.getPX(); + py = (int)e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px,4*ny+py); + if (4*nx+px>4*ny+py) + liwrk = ny + py - 4; + else + liwrk = nx + px - 4; + double tx[] = new double[nx]; + double ty[] = new double[ny]; + double ff[] = new double[nx*ny]; + wrk = new double[lwrk]; + long iwrk[] = new long[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new long[(int)(datafile.n + datafile.nclin)]; + ax = new double[(int)Math.max(1, datafile.nclin)]; + iwork = new long[(int)liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[(int)(datafile.n + datafile.nclin)]; + work = new double[(int)lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[(int)lcwsav]; + cwsav[0] = " "; + long[] iwsav = new long[(int)liwsav]; + boolean[] lwsav = new boolean[(int)llwsav]; + double[] rwsav = new double[(int)lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + long[] iuser = new long[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + + super.eval(); + + } + + } + + public static class DataFile { + + public String filename; + public long n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } else { + sda = 1; + + } + ldh = n; + + cvec = new double[(int)n]; + a = new double[(int)(lda * sda)]; + bl = new double[(int)(n + nclin)]; + bu = new double[(int)(n + nclin)]; + x = new double[(int)n]; + h = new double[(int)(ldh * n)]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java new file mode 100644 index 0000000..20ad573 --- /dev/null +++ b/simple_examples/source/int64/E04UCJE.java @@ -0,0 +1,207 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.Routine; +import java.util.Arrays; + +/** + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + double objf; + long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; + long[] istate, iwork; + long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; + boolean[] lwsav = new boolean[(int)LLWSAV]; + String[] cwsav = new String[(int)LCWSAV]; + Arrays.fill(cwsav, " "); + + System.out.println(" E04UCJ Example Program Results"); + Routine.init(); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new long[(int)(n + nclin + ncnln)]; + iwork = new long[(int)liwork]; + c = new double[(int)(Math.max(1, ncnln))]; + cjac = new double[(int)(ldcj * sdcjac)]; + clamda = new double[(int)(n + nclin + ncnln)]; + objgrd = new double[(int)n]; + r = new double[(int)(ldr * n)]; + work = new double[(int)lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[(int)LDCJ] = X[1] + X[1]; + CJAC[(int)(2*LDCJ)] = X[2] + X[2]; + CJAC[(int)(3*LDCJ)] = X[3] + X[3]; + } + + } + + if (NEEDC[1]>0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; + CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; + CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java new file mode 100644 index 0000000..d8f152c --- /dev/null +++ b/simple_examples/source/int64/F02EKJE.java @@ -0,0 +1,230 @@ +emacimport java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.Routine; +import com.nag.types.*; + + +/** + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) throws NAGBadIntegerException { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + // Initialise wrapper library + Routine.init(); + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval ( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW(){ + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/withdrawn/D02TKJE.java b/simple_examples/source/withdrawn/D02TKJE.java new file mode 100644 index 0000000..16e9e9b --- /dev/null +++ b/simple_examples/source/withdrawn/D02TKJE.java @@ -0,0 +1,290 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.D02.D02TK; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import com.nag.routines.Routine; + + +/** + * @author joed + */ +public class D02TKJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) throws NAGBadIntegerException { + D02TK d02tk = new D02TK(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; + double[] mesh, tol, work, y; + int[] icomm, ipmesh; + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02TKJ Example Program Results"); + System.out.println(); + + // Values from d02tkfe.d + ncol = 7; + nmesh = 11; + mxmesh = 51; + + licomm = 23 + NEQ + mxmesh; + lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + work = new double[lrcomm]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + icomm = new int[licomm]; + + // Values from d02tkfe.d + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Initial integrator for given problem. + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, + lrcomm, icomm, licomm, ifail + ); + + // Values from d02tkfe.d + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tk.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, + ifail + ); + ifail = d02tk.getIFAIL(); + if (ifail == 1) break; + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) break; + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) System.out.printf("\n"); + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); + ifail = d02ty.getIFAIL(); + if (ifail != 0) { + System.err.println( + "D02TY failed with error code " + ifail + ); + break; + } + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) break; + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TX failed with error code " + ifail); + } + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + * Fortran array definition: + * a(dimX, 0:*) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + * Fortran array definition: + * a(dimX, dimY, 0:*) + * + * Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TK.Abstract_D02TK_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TK.Abstract_D02TK_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TK.Abstract_D02TK_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} From 3992f2960f237030fedc8257ac13199055361390 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:13:18 +0000 Subject: [PATCH 119/196] Removed everything from simple_examples --- simple_examples/D02NEJE.java | 388 ---------------- simple_examples/D02TLJE.java | 290 ------------ simple_examples/D03RAJE.java | 307 ------------- simple_examples/D03RBJE.java | 388 ---------------- simple_examples/F01ELJE.java | 89 ---- simple_examples/F02EKJE.java | 227 ---------- simple_examples/F02FKJE.java | 230 ---------- simple_examples/F02WGJE.java | 132 ------ simple_examples/baseresults/a00aaje.r | 10 - simple_examples/baseresults/a00acje.r | 3 - simple_examples/baseresults/a00adje.r | 17 - simple_examples/baseresults/c02aaje.r | 19 - simple_examples/baseresults/c02abje.r | 12 - simple_examples/baseresults/c02afje.r | 28 -- simple_examples/baseresults/c02agje.r | 27 -- simple_examples/baseresults/c02ahje.r | 6 - simple_examples/baseresults/c02ajje.r | 6 - simple_examples/baseresults/c02akje.r | 8 - simple_examples/baseresults/c02alje.r | 9 - simple_examples/baseresults/c02amje.r | 8 - simple_examples/baseresults/c02anje.r | 9 - simple_examples/baseresults/c05auje.r | 4 - simple_examples/baseresults/c05awje.r | 4 - simple_examples/baseresults/c05ayje.r | 3 - simple_examples/baseresults/c05azje.r | 15 - simple_examples/baseresults/c05bbje.r | 10 - simple_examples/baseresults/c05mbje.r | 8 - simple_examples/baseresults/c05qbje.r | 8 - simple_examples/baseresults/c06baje.r | 15 - simple_examples/baseresults/c06fkje.r | 13 - simple_examples/baseresults/c09aaje.r | 18 - .../baseresults/complexargumentexample.r | 1 - simple_examples/baseresults/d01bdje.r | 9 - simple_examples/baseresults/d02neje.r | 25 -- simple_examples/baseresults/d02tkje.r | 113 ----- simple_examples/baseresults/d02tlje.r | 113 ----- simple_examples/baseresults/d03pcje.r | 28 -- simple_examples/baseresults/d03raje.r | 409 ----------------- simple_examples/baseresults/d03rbje.r | 59 --- simple_examples/baseresults/d05baje.r | 12 - simple_examples/baseresults/d05beje.r | 46 -- simple_examples/baseresults/dtfsmje.r | 10 - simple_examples/baseresults/e01daje.r | 25 -- simple_examples/baseresults/e02alje.r | 24 - simple_examples/baseresults/e04abje.r | 6 - simple_examples/baseresults/e04bbje.r | 7 - simple_examples/baseresults/e04cbje.r | 4 - simple_examples/baseresults/e04fcje.r | 22 - simple_examples/baseresults/e04ffje.r | 73 --- simple_examples/baseresults/e04gbje.r | 22 - simple_examples/baseresults/e04ggje.r | 44 -- simple_examples/baseresults/e04mtje.r | 162 ------- simple_examples/baseresults/e04mxje.r | 38 -- simple_examples/baseresults/e04ncje.r | 23 - simple_examples/baseresults/e04nfje.r | 66 --- simple_examples/baseresults/e04nkje.r | 26 -- simple_examples/baseresults/e04nqje.r | 6 - simple_examples/baseresults/e04ptje.r | 39 -- simple_examples/baseresults/e04rpje.r | 105 ----- simple_examples/baseresults/e04rsje.r | 35 -- simple_examples/baseresults/e04rtje.r | 35 -- simple_examples/baseresults/e04saje.r | 33 -- simple_examples/baseresults/e04taje.r | 39 -- simple_examples/baseresults/e04tcje.r | 58 --- simple_examples/baseresults/e04uc_example.r | 95 ---- simple_examples/baseresults/e04ucje.r | 22 - simple_examples/baseresults/e04yaje.r | 25 -- simple_examples/baseresults/f01adje.r | 9 - simple_examples/baseresults/f01ckje.r | 5 - simple_examples/baseresults/f01crje.r | 6 - simple_examples/baseresults/f01dgje.r | 8 - simple_examples/baseresults/f01elje.r | 10 - simple_examples/baseresults/f01emje.r | 10 - simple_examples/baseresults/f02ekje.r | 20 - simple_examples/baseresults/f02fkje.r | 14 - simple_examples/baseresults/f02wgje.r | 7 - simple_examples/baseresults/f03baje.r | 14 - simple_examples/baseresults/f04amje.r | 4 - simple_examples/baseresults/f04baje.r | 14 - simple_examples/baseresults/f05aaje.r | 11 - simple_examples/baseresults/f06clje.r | 3 - simple_examples/baseresults/f07aaje.r | 14 - simple_examples/baseresults/f07abje.r | 23 - simple_examples/baseresults/f07adje.r | 10 - simple_examples/baseresults/f07aqje.r | 7 - simple_examples/baseresults/f07faje.r | 11 - simple_examples/baseresults/f07fbje.r | 19 - simple_examples/baseresults/f08btje.r | 16 - simple_examples/baseresults/f08faje.r | 16 - simple_examples/baseresults/f08xpje.r | 8 - simple_examples/baseresults/g01alje.r | 7 - simple_examples/baseresults/g02akje.r | 14 - simple_examples/baseresults/g02bjje.r | 38 -- simple_examples/baseresults/g02brje.r | 29 -- simple_examples/baseresults/g02daje.r | 31 -- simple_examples/baseresults/g02eeje.r | 20 - simple_examples/baseresults/g02maje.r | 23 - simple_examples/baseresults/g03gaje.r | 79 ---- simple_examples/baseresults/g05kfje.r | 7 - simple_examples/baseresults/g13awje.r | 4 - simple_examples/baseresults/g13meje.r | 39 -- simple_examples/baseresults/g13naje.r | 11 - simple_examples/baseresults/h02bbje.r | 79 ---- simple_examples/baseresults/h02daje.r | 14 - simple_examples/baseresults/m01ccje.r | 15 - .../baseresults/nagcomplexexample.r | 60 --- simple_examples/baseresults/outputexample.r | 10 - simple_examples/baseresults/s01baje.r | 9 - simple_examples/baseresults/s10aaje.r | 7 - simple_examples/baseresults/s10abje.r | 8 - simple_examples/baseresults/s10acje.r | 8 - simple_examples/baseresults/s14abje.r | 12 - simple_examples/baseresults/s14acje.r | 8 - simple_examples/baseresults/s14afje.r | 5 - simple_examples/baseresults/s17dcje.r | 10 - simple_examples/baseresults/s17dgje.r | 9 - simple_examples/baseresults/s30aaje.r | 16 - simple_examples/baseresults/s30acje.r | 9 - .../baseresults/simpleroutineexample.r | 15 - .../baseresults/userdefinedfunctionexample1.r | 1 - .../baseresults/userdefinedfunctionexample2.r | 1 - simple_examples/baseresults/x03aaje.r | 3 - simple_examples/baseresults/x04cbje.r | 21 - simple_examples/baseresults/x05abje.r | 2 - simple_examples/data/c02abje.d | 14 - simple_examples/data/c02afje.d | 19 - simple_examples/data/c02agje.d | 9 - simple_examples/data/c02ahje.d | 2 - simple_examples/data/c02ajje.d | 2 - simple_examples/data/c02akje.d | 2 - simple_examples/data/c02alje.d | 2 - simple_examples/data/c02amje.d | 5 - simple_examples/data/c02anje.d | 6 - simple_examples/data/c05bbje.d | 7 - simple_examples/data/c06fkje.d | 11 - simple_examples/data/c09aaje.d | 11 - simple_examples/data/d03pcje.d | 6 - simple_examples/data/e02alje.d | 23 - simple_examples/data/e04fcje.d | 16 - simple_examples/data/e04mxje.d | 64 --- simple_examples/data/e04ncje.d | 21 - simple_examples/data/e04nfje.d | 22 - simple_examples/data/e04nqje.d | 67 --- simple_examples/data/e04rsje.d | 13 - simple_examples/data/e04rtje.d | 8 - simple_examples/data/e04saje.opt | 30 -- simple_examples/data/e04tcje.d | 22 - simple_examples/data/f03baje.d | 5 - simple_examples/data/f04amje.d | 5 - simple_examples/data/f04baje.d | 13 - simple_examples/data/f05aaje.d | 6 - simple_examples/data/f08btje.d | 15 - simple_examples/data/f08xpje.d | 10 - simple_examples/data/g02bjje.d | 10 - simple_examples/data/g02daje.d | 15 - simple_examples/data/g02eeje.d | 24 - simple_examples/data/g02maje.d | 23 - simple_examples/data/g03gaje.d | 56 --- simple_examples/data/g05kfje.d | 3 - simple_examples/data/g13naje.d | 14 - simple_examples/data/m01ccje.d | 13 - simple_examples/data/s14abje.d | 10 - simple_examples/data/s14acje.d | 5 - simple_examples/data/s14afje.d | 2 - simple_examples/data/s17dcje.d | 6 - simple_examples/data/s17dgje.d | 6 - simple_examples/data/s30aaje.d | 9 - simple_examples/data/s30acje.d | 9 - simple_examples/data/x03aaje.d | 5 - simple_examples/int32/A00AAJE.java | 16 - simple_examples/int32/A00ACJE.java | 29 -- simple_examples/int32/A00ADJE.java | 107 ----- simple_examples/int32/C02AAJE.java | 174 -------- simple_examples/int32/C02ABJE.java | 217 --------- simple_examples/int32/C02AFJE.java | 271 ----------- simple_examples/int32/C02AGJE.java | 262 ----------- simple_examples/int32/C02AHJE.java | 61 --- simple_examples/int32/C02AJJE.java | 65 --- simple_examples/int32/C02AKJE.java | 62 --- simple_examples/int32/C02ALJE.java | 64 --- simple_examples/int32/C02AMJE.java | 75 ---- simple_examples/int32/C02ANJE.java | 80 ---- simple_examples/int32/C05AUJE.java | 67 --- simple_examples/int32/C05AWJE.java | 59 --- simple_examples/int32/C05AYJE.java | 44 -- simple_examples/int32/C05AZJE.java | 65 --- simple_examples/int32/C05BBJE.java | 89 ---- simple_examples/int32/C05MBJE.java | 95 ---- simple_examples/int32/C05QBJE.java | 167 ------- simple_examples/int32/C06BAJE.java | 56 --- simple_examples/int32/C06FKJE.java | 91 ---- simple_examples/int32/C09AAJE.java | 158 ------- simple_examples/int32/D01BDJE.java | 58 --- simple_examples/int32/D01RJJE.java | 184 -------- simple_examples/int32/D01RKJE.java | 173 -------- simple_examples/int32/D01RLJE.java | 196 -------- simple_examples/int32/D01RMJE.java | 163 ------- simple_examples/int32/D01TCJE.java | 45 -- simple_examples/int32/D02NEJE.java | 388 ---------------- simple_examples/int32/D02TLJE.java | 290 ------------ simple_examples/int32/D03PCJE.java | 217 --------- simple_examples/int32/D03RAJE.java | 307 ------------- simple_examples/int32/D03RBJE.java | 388 ---------------- simple_examples/int32/D05BAJE.java | 111 ----- simple_examples/int32/D05BEJE.java | 185 -------- simple_examples/int32/DTFSMJE.java | 54 --- simple_examples/int32/E01DAJE.java | 182 -------- simple_examples/int32/E02ALJE.java | 101 ----- simple_examples/int32/E04ABJE.java | 76 ---- simple_examples/int32/E04BBJE.java | 81 ---- simple_examples/int32/E04CBJE.java | 90 ---- simple_examples/int32/E04FCJE.java | 420 ------------------ simple_examples/int32/E04FFJE.java | 140 ------ simple_examples/int32/E04GBJE.java | 183 -------- simple_examples/int32/E04GGJE.java | 219 --------- simple_examples/int32/E04MTJE.java | 132 ------ simple_examples/int32/E04MXJE.java | 292 ------------ simple_examples/int32/E04NCJE.java | 246 ---------- simple_examples/int32/E04NFJE.java | 234 ---------- simple_examples/int32/E04NKJE.java | 295 ------------ simple_examples/int32/E04NQJE.java | 384 ---------------- simple_examples/int32/E04PTJE.java | 344 -------------- simple_examples/int32/E04RPJE.java | 199 --------- simple_examples/int32/E04RSJE.java | 229 ---------- simple_examples/int32/E04RTJE.java | 225 ---------- simple_examples/int32/E04SAJE.java | 104 ----- simple_examples/int32/E04TAJE.java | 188 -------- simple_examples/int32/E04TCJE.java | 263 ----------- simple_examples/int32/E04UCJE.java | 211 --------- simple_examples/int32/E04YAJE.java | 112 ----- simple_examples/int32/F01ADJE.java | 39 -- simple_examples/int32/F01CKJE.java | 60 --- simple_examples/int32/F01CRJE.java | 47 -- simple_examples/int32/F01DGJE.java | 72 --- simple_examples/int32/F01ELJE.java | 89 ---- simple_examples/int32/F01EMJE.java | 106 ----- simple_examples/int32/F02EKJE.java | 227 ---------- simple_examples/int32/F02FKJE.java | 230 ---------- simple_examples/int32/F02WGJE.java | 132 ------ simple_examples/int32/F03BAJE.java | 108 ----- simple_examples/int32/F04AMJE.java | 114 ----- simple_examples/int32/F04BAJE.java | 144 ------ simple_examples/int32/F05AAJE.java | 99 ----- simple_examples/int32/F06CLJE.java | 40 -- simple_examples/int32/F07AAJE.java | 90 ---- simple_examples/int32/F07ABJE.java | 134 ------ simple_examples/int32/F07ADJE.java | 72 --- simple_examples/int32/F07AQJE.java | 99 ----- simple_examples/int32/F07FAJE.java | 79 ---- simple_examples/int32/F07FBJE.java | 122 ----- simple_examples/int32/F08BTJE.java | 228 ---------- simple_examples/int32/F08FAJE.java | 113 ----- simple_examples/int32/F08XPJE.java | 297 ------------- simple_examples/int32/G01ALJE.java | 55 --- simple_examples/int32/G02AKJE.java | 68 --- simple_examples/int32/G02BJJE.java | 303 ------------- simple_examples/int32/G02BRJE.java | 134 ------ simple_examples/int32/G02DAJE.java | 187 -------- simple_examples/int32/G02EEJE.java | 184 -------- simple_examples/int32/G02MAJE.java | 130 ------ simple_examples/int32/G03GAJE.java | 355 --------------- simple_examples/int32/G05KFJE.java | 105 ----- simple_examples/int32/G13AWJE.java | 31 -- simple_examples/int32/G13MEJE.java | 160 ------- simple_examples/int32/G13NAJE.java | 123 ----- simple_examples/int32/H02BBJE.java | 92 ---- simple_examples/int32/H02DAJE.java | 228 ---------- simple_examples/int32/M01CCJE.java | 42 -- simple_examples/int32/S01BAJE.java | 39 -- simple_examples/int32/S10AAJE.java | 40 -- simple_examples/int32/S10ABJE.java | 41 -- simple_examples/int32/S10ACJE.java | 41 -- simple_examples/int32/S14ABJE.java | 71 --- simple_examples/int32/S14ACJE.java | 68 --- simple_examples/int32/S14AFJE.java | 80 ---- simple_examples/int32/S17DCJE.java | 69 --- simple_examples/int32/S17DGJE.java | 61 --- simple_examples/int32/S30AAJE.java | 109 ----- simple_examples/int32/S30ACJE.java | 129 ------ simple_examples/int32/X03AAJE.java | 87 ---- simple_examples/int32/X04CBJE.java | 53 --- simple_examples/int32/X05ABJE.java | 25 -- simple_examples/int64/A00AAJE.java | 14 - simple_examples/int64/A00ADJE.java | 113 ----- simple_examples/int64/C05AYJE.java | 45 -- simple_examples/int64/C05AZJE.java | 65 --- simple_examples/int64/C05MBJE.java | 104 ----- simple_examples/int64/C05QBJE.java | 178 -------- simple_examples/int64/D01BDJE.java | 57 --- simple_examples/int64/D02NEJE.java | 393 ---------------- simple_examples/int64/DTFSMJE.java | 61 --- simple_examples/int64/E01DAJE.java | 177 -------- simple_examples/int64/E04FCJE.java | 415 ----------------- simple_examples/int64/E04MTJE.java | 134 ------ simple_examples/int64/E04NFJE.java | 223 ---------- simple_examples/int64/E04UCJE.java | 207 --------- simple_examples/int64/F02EKJE.java | 230 ---------- simple_examples/source/int32/A00AAJE.java | 16 - simple_examples/source/int32/A00ACJE.java | 29 -- simple_examples/source/int32/A00ADJE.java | 107 ----- simple_examples/source/int32/C02AAJE.java | 174 -------- simple_examples/source/int32/C02ABJE.java | 217 --------- simple_examples/source/int32/C02AFJE.java | 271 ----------- simple_examples/source/int32/C02AGJE.java | 262 ----------- simple_examples/source/int32/C02AHJE.java | 61 --- simple_examples/source/int32/C02AJJE.java | 65 --- simple_examples/source/int32/C02AKJE.java | 62 --- simple_examples/source/int32/C02ALJE.java | 64 --- simple_examples/source/int32/C02AMJE.java | 75 ---- simple_examples/source/int32/C02ANJE.java | 80 ---- simple_examples/source/int32/C05AUJE.java | 67 --- simple_examples/source/int32/C05AWJE.java | 59 --- simple_examples/source/int32/C05AYJE.java | 44 -- simple_examples/source/int32/C05AZJE.java | 65 --- simple_examples/source/int32/C05BBJE.java | 89 ---- simple_examples/source/int32/C05MBJE.java | 95 ---- simple_examples/source/int32/C05QBJE.java | 167 ------- simple_examples/source/int32/C06BAJE.java | 56 --- simple_examples/source/int32/C06FKJE.java | 91 ---- simple_examples/source/int32/C09AAJE.java | 158 ------- simple_examples/source/int32/D01BDJE.java | 58 --- simple_examples/source/int32/D01RJJE.java | 184 -------- simple_examples/source/int32/D01RKJE.java | 173 -------- simple_examples/source/int32/D01RLJE.java | 196 -------- simple_examples/source/int32/D01RMJE.java | 163 ------- simple_examples/source/int32/D01TCJE.java | 45 -- simple_examples/source/int32/D02NEJE.java | 388 ---------------- simple_examples/source/int32/D02TLJE.java | 290 ------------ simple_examples/source/int32/D03PCJE.java | 217 --------- simple_examples/source/int32/D03RAJE.java | 307 ------------- simple_examples/source/int32/D03RBJE.java | 388 ---------------- simple_examples/source/int32/D05BAJE.java | 111 ----- simple_examples/source/int32/D05BEJE.java | 185 -------- simple_examples/source/int32/DTFSMJE.java | 54 --- simple_examples/source/int32/E01DAJE.java | 182 -------- simple_examples/source/int32/E02ALJE.java | 101 ----- simple_examples/source/int32/E04ABJE.java | 76 ---- simple_examples/source/int32/E04BBJE.java | 81 ---- simple_examples/source/int32/E04CBJE.java | 90 ---- simple_examples/source/int32/E04FCJE.java | 420 ------------------ simple_examples/source/int32/E04FFJE.java | 140 ------ simple_examples/source/int32/E04GBJE.java | 183 -------- simple_examples/source/int32/E04GGJE.java | 219 --------- simple_examples/source/int32/E04MTJE.java | 132 ------ simple_examples/source/int32/E04MXJE.java | 292 ------------ simple_examples/source/int32/E04NCJE.java | 246 ---------- simple_examples/source/int32/E04NFJE.java | 234 ---------- simple_examples/source/int32/E04NKJE.java | 295 ------------ simple_examples/source/int32/E04NQJE.java | 384 ---------------- simple_examples/source/int32/E04PTJE.java | 344 -------------- simple_examples/source/int32/E04RPJE.java | 199 --------- simple_examples/source/int32/E04RSJE.java | 229 ---------- simple_examples/source/int32/E04RTJE.java | 225 ---------- simple_examples/source/int32/E04SAJE.java | 104 ----- simple_examples/source/int32/E04TAJE.java | 188 -------- simple_examples/source/int32/E04TCJE.java | 263 ----------- simple_examples/source/int32/E04UCJE.java | 211 --------- simple_examples/source/int32/E04YAJE.java | 112 ----- simple_examples/source/int32/F01ADJE.java | 39 -- simple_examples/source/int32/F01CKJE.java | 60 --- simple_examples/source/int32/F01CRJE.java | 47 -- simple_examples/source/int32/F01DGJE.java | 72 --- simple_examples/source/int32/F01ELJE.java | 89 ---- simple_examples/source/int32/F01EMJE.java | 106 ----- simple_examples/source/int32/F02EKJE.java | 227 ---------- simple_examples/source/int32/F02FKJE.java | 230 ---------- simple_examples/source/int32/F02WGJE.java | 132 ------ simple_examples/source/int32/F03BAJE.java | 108 ----- simple_examples/source/int32/F04AMJE.java | 114 ----- simple_examples/source/int32/F04BAJE.java | 144 ------ simple_examples/source/int32/F05AAJE.java | 99 ----- simple_examples/source/int32/F06CLJE.java | 40 -- simple_examples/source/int32/F07AAJE.java | 90 ---- simple_examples/source/int32/F07ABJE.java | 134 ------ simple_examples/source/int32/F07ADJE.java | 72 --- simple_examples/source/int32/F07AQJE.java | 99 ----- simple_examples/source/int32/F07FAJE.java | 79 ---- simple_examples/source/int32/F07FBJE.java | 122 ----- simple_examples/source/int32/F08BTJE.java | 228 ---------- simple_examples/source/int32/F08FAJE.java | 113 ----- simple_examples/source/int32/F08XPJE.java | 297 ------------- simple_examples/source/int32/G01ALJE.java | 55 --- simple_examples/source/int32/G02AKJE.java | 68 --- simple_examples/source/int32/G02BJJE.java | 303 ------------- simple_examples/source/int32/G02BRJE.java | 134 ------ simple_examples/source/int32/G02DAJE.java | 187 -------- simple_examples/source/int32/G02EEJE.java | 184 -------- simple_examples/source/int32/G02MAJE.java | 130 ------ simple_examples/source/int32/G03GAJE.java | 355 --------------- simple_examples/source/int32/G05KFJE.java | 105 ----- simple_examples/source/int32/G13AWJE.java | 31 -- simple_examples/source/int32/G13MEJE.java | 160 ------- simple_examples/source/int32/G13NAJE.java | 123 ----- simple_examples/source/int32/H02BBJE.java | 92 ---- simple_examples/source/int32/H02DAJE.java | 228 ---------- simple_examples/source/int32/M01CCJE.java | 42 -- simple_examples/source/int32/S01BAJE.java | 39 -- simple_examples/source/int32/S10AAJE.java | 40 -- simple_examples/source/int32/S10ABJE.java | 41 -- simple_examples/source/int32/S10ACJE.java | 41 -- simple_examples/source/int32/S14ABJE.java | 71 --- simple_examples/source/int32/S14ACJE.java | 68 --- simple_examples/source/int32/S14AFJE.java | 80 ---- simple_examples/source/int32/S17DCJE.java | 69 --- simple_examples/source/int32/S17DGJE.java | 61 --- simple_examples/source/int32/S30AAJE.java | 109 ----- simple_examples/source/int32/S30ACJE.java | 129 ------ simple_examples/source/int32/X03AAJE.java | 87 ---- simple_examples/source/int32/X04CBJE.java | 53 --- simple_examples/source/int32/X05ABJE.java | 25 -- simple_examples/source/int64/A00AAJE.java | 14 - simple_examples/source/int64/A00ADJE.java | 113 ----- simple_examples/source/int64/C05AYJE.java | 45 -- simple_examples/source/int64/C05AZJE.java | 65 --- simple_examples/source/int64/C05MBJE.java | 104 ----- simple_examples/source/int64/C05QBJE.java | 178 -------- simple_examples/source/int64/D01BDJE.java | 57 --- simple_examples/source/int64/D02NEJE.java | 393 ---------------- simple_examples/source/int64/DTFSMJE.java | 61 --- simple_examples/source/int64/E01DAJE.java | 177 -------- simple_examples/source/int64/E04FCJE.java | 415 ----------------- simple_examples/source/int64/E04MTJE.java | 134 ------ simple_examples/source/int64/E04NFJE.java | 223 ---------- simple_examples/source/int64/E04UCJE.java | 207 --------- simple_examples/source/int64/F02EKJE.java | 230 ---------- simple_examples/source/withdrawn/D02TKJE.java | 290 ------------ simple_examples/withdrawn/D02TKJE.java | 290 ------------ 427 files changed, 42979 deletions(-) delete mode 100644 simple_examples/D02NEJE.java delete mode 100644 simple_examples/D02TLJE.java delete mode 100644 simple_examples/D03RAJE.java delete mode 100644 simple_examples/D03RBJE.java delete mode 100644 simple_examples/F01ELJE.java delete mode 100644 simple_examples/F02EKJE.java delete mode 100644 simple_examples/F02FKJE.java delete mode 100644 simple_examples/F02WGJE.java delete mode 100644 simple_examples/baseresults/a00aaje.r delete mode 100644 simple_examples/baseresults/a00acje.r delete mode 100644 simple_examples/baseresults/a00adje.r delete mode 100644 simple_examples/baseresults/c02aaje.r delete mode 100644 simple_examples/baseresults/c02abje.r delete mode 100644 simple_examples/baseresults/c02afje.r delete mode 100644 simple_examples/baseresults/c02agje.r delete mode 100644 simple_examples/baseresults/c02ahje.r delete mode 100644 simple_examples/baseresults/c02ajje.r delete mode 100644 simple_examples/baseresults/c02akje.r delete mode 100644 simple_examples/baseresults/c02alje.r delete mode 100644 simple_examples/baseresults/c02amje.r delete mode 100644 simple_examples/baseresults/c02anje.r delete mode 100644 simple_examples/baseresults/c05auje.r delete mode 100644 simple_examples/baseresults/c05awje.r delete mode 100644 simple_examples/baseresults/c05ayje.r delete mode 100644 simple_examples/baseresults/c05azje.r delete mode 100644 simple_examples/baseresults/c05bbje.r delete mode 100644 simple_examples/baseresults/c05mbje.r delete mode 100644 simple_examples/baseresults/c05qbje.r delete mode 100644 simple_examples/baseresults/c06baje.r delete mode 100644 simple_examples/baseresults/c06fkje.r delete mode 100644 simple_examples/baseresults/c09aaje.r delete mode 100644 simple_examples/baseresults/complexargumentexample.r delete mode 100644 simple_examples/baseresults/d01bdje.r delete mode 100644 simple_examples/baseresults/d02neje.r delete mode 100644 simple_examples/baseresults/d02tkje.r delete mode 100644 simple_examples/baseresults/d02tlje.r delete mode 100644 simple_examples/baseresults/d03pcje.r delete mode 100644 simple_examples/baseresults/d03raje.r delete mode 100644 simple_examples/baseresults/d03rbje.r delete mode 100644 simple_examples/baseresults/d05baje.r delete mode 100644 simple_examples/baseresults/d05beje.r delete mode 100644 simple_examples/baseresults/dtfsmje.r delete mode 100644 simple_examples/baseresults/e01daje.r delete mode 100644 simple_examples/baseresults/e02alje.r delete mode 100644 simple_examples/baseresults/e04abje.r delete mode 100644 simple_examples/baseresults/e04bbje.r delete mode 100644 simple_examples/baseresults/e04cbje.r delete mode 100644 simple_examples/baseresults/e04fcje.r delete mode 100644 simple_examples/baseresults/e04ffje.r delete mode 100644 simple_examples/baseresults/e04gbje.r delete mode 100644 simple_examples/baseresults/e04ggje.r delete mode 100644 simple_examples/baseresults/e04mtje.r delete mode 100644 simple_examples/baseresults/e04mxje.r delete mode 100644 simple_examples/baseresults/e04ncje.r delete mode 100644 simple_examples/baseresults/e04nfje.r delete mode 100644 simple_examples/baseresults/e04nkje.r delete mode 100644 simple_examples/baseresults/e04nqje.r delete mode 100644 simple_examples/baseresults/e04ptje.r delete mode 100644 simple_examples/baseresults/e04rpje.r delete mode 100644 simple_examples/baseresults/e04rsje.r delete mode 100644 simple_examples/baseresults/e04rtje.r delete mode 100644 simple_examples/baseresults/e04saje.r delete mode 100644 simple_examples/baseresults/e04taje.r delete mode 100644 simple_examples/baseresults/e04tcje.r delete mode 100644 simple_examples/baseresults/e04uc_example.r delete mode 100644 simple_examples/baseresults/e04ucje.r delete mode 100644 simple_examples/baseresults/e04yaje.r delete mode 100644 simple_examples/baseresults/f01adje.r delete mode 100644 simple_examples/baseresults/f01ckje.r delete mode 100644 simple_examples/baseresults/f01crje.r delete mode 100644 simple_examples/baseresults/f01dgje.r delete mode 100644 simple_examples/baseresults/f01elje.r delete mode 100644 simple_examples/baseresults/f01emje.r delete mode 100644 simple_examples/baseresults/f02ekje.r delete mode 100644 simple_examples/baseresults/f02fkje.r delete mode 100644 simple_examples/baseresults/f02wgje.r delete mode 100644 simple_examples/baseresults/f03baje.r delete mode 100644 simple_examples/baseresults/f04amje.r delete mode 100644 simple_examples/baseresults/f04baje.r delete mode 100644 simple_examples/baseresults/f05aaje.r delete mode 100644 simple_examples/baseresults/f06clje.r delete mode 100644 simple_examples/baseresults/f07aaje.r delete mode 100644 simple_examples/baseresults/f07abje.r delete mode 100644 simple_examples/baseresults/f07adje.r delete mode 100644 simple_examples/baseresults/f07aqje.r delete mode 100644 simple_examples/baseresults/f07faje.r delete mode 100644 simple_examples/baseresults/f07fbje.r delete mode 100644 simple_examples/baseresults/f08btje.r delete mode 100644 simple_examples/baseresults/f08faje.r delete mode 100644 simple_examples/baseresults/f08xpje.r delete mode 100644 simple_examples/baseresults/g01alje.r delete mode 100644 simple_examples/baseresults/g02akje.r delete mode 100644 simple_examples/baseresults/g02bjje.r delete mode 100644 simple_examples/baseresults/g02brje.r delete mode 100644 simple_examples/baseresults/g02daje.r delete mode 100644 simple_examples/baseresults/g02eeje.r delete mode 100644 simple_examples/baseresults/g02maje.r delete mode 100644 simple_examples/baseresults/g03gaje.r delete mode 100644 simple_examples/baseresults/g05kfje.r delete mode 100644 simple_examples/baseresults/g13awje.r delete mode 100644 simple_examples/baseresults/g13meje.r delete mode 100644 simple_examples/baseresults/g13naje.r delete mode 100644 simple_examples/baseresults/h02bbje.r delete mode 100644 simple_examples/baseresults/h02daje.r delete mode 100644 simple_examples/baseresults/m01ccje.r delete mode 100644 simple_examples/baseresults/nagcomplexexample.r delete mode 100644 simple_examples/baseresults/outputexample.r delete mode 100644 simple_examples/baseresults/s01baje.r delete mode 100644 simple_examples/baseresults/s10aaje.r delete mode 100644 simple_examples/baseresults/s10abje.r delete mode 100644 simple_examples/baseresults/s10acje.r delete mode 100644 simple_examples/baseresults/s14abje.r delete mode 100644 simple_examples/baseresults/s14acje.r delete mode 100644 simple_examples/baseresults/s14afje.r delete mode 100644 simple_examples/baseresults/s17dcje.r delete mode 100644 simple_examples/baseresults/s17dgje.r delete mode 100644 simple_examples/baseresults/s30aaje.r delete mode 100644 simple_examples/baseresults/s30acje.r delete mode 100644 simple_examples/baseresults/simpleroutineexample.r delete mode 100644 simple_examples/baseresults/userdefinedfunctionexample1.r delete mode 100644 simple_examples/baseresults/userdefinedfunctionexample2.r delete mode 100644 simple_examples/baseresults/x03aaje.r delete mode 100644 simple_examples/baseresults/x04cbje.r delete mode 100644 simple_examples/baseresults/x05abje.r delete mode 100644 simple_examples/data/c02abje.d delete mode 100644 simple_examples/data/c02afje.d delete mode 100644 simple_examples/data/c02agje.d delete mode 100644 simple_examples/data/c02ahje.d delete mode 100644 simple_examples/data/c02ajje.d delete mode 100644 simple_examples/data/c02akje.d delete mode 100644 simple_examples/data/c02alje.d delete mode 100644 simple_examples/data/c02amje.d delete mode 100644 simple_examples/data/c02anje.d delete mode 100644 simple_examples/data/c05bbje.d delete mode 100644 simple_examples/data/c06fkje.d delete mode 100644 simple_examples/data/c09aaje.d delete mode 100644 simple_examples/data/d03pcje.d delete mode 100644 simple_examples/data/e02alje.d delete mode 100644 simple_examples/data/e04fcje.d delete mode 100644 simple_examples/data/e04mxje.d delete mode 100644 simple_examples/data/e04ncje.d delete mode 100644 simple_examples/data/e04nfje.d delete mode 100644 simple_examples/data/e04nqje.d delete mode 100644 simple_examples/data/e04rsje.d delete mode 100644 simple_examples/data/e04rtje.d delete mode 100644 simple_examples/data/e04saje.opt delete mode 100644 simple_examples/data/e04tcje.d delete mode 100644 simple_examples/data/f03baje.d delete mode 100644 simple_examples/data/f04amje.d delete mode 100644 simple_examples/data/f04baje.d delete mode 100644 simple_examples/data/f05aaje.d delete mode 100644 simple_examples/data/f08btje.d delete mode 100644 simple_examples/data/f08xpje.d delete mode 100644 simple_examples/data/g02bjje.d delete mode 100644 simple_examples/data/g02daje.d delete mode 100644 simple_examples/data/g02eeje.d delete mode 100644 simple_examples/data/g02maje.d delete mode 100644 simple_examples/data/g03gaje.d delete mode 100644 simple_examples/data/g05kfje.d delete mode 100644 simple_examples/data/g13naje.d delete mode 100644 simple_examples/data/m01ccje.d delete mode 100644 simple_examples/data/s14abje.d delete mode 100644 simple_examples/data/s14acje.d delete mode 100644 simple_examples/data/s14afje.d delete mode 100644 simple_examples/data/s17dcje.d delete mode 100644 simple_examples/data/s17dgje.d delete mode 100644 simple_examples/data/s30aaje.d delete mode 100644 simple_examples/data/s30acje.d delete mode 100644 simple_examples/data/x03aaje.d delete mode 100644 simple_examples/int32/A00AAJE.java delete mode 100644 simple_examples/int32/A00ACJE.java delete mode 100644 simple_examples/int32/A00ADJE.java delete mode 100644 simple_examples/int32/C02AAJE.java delete mode 100644 simple_examples/int32/C02ABJE.java delete mode 100644 simple_examples/int32/C02AFJE.java delete mode 100644 simple_examples/int32/C02AGJE.java delete mode 100644 simple_examples/int32/C02AHJE.java delete mode 100644 simple_examples/int32/C02AJJE.java delete mode 100644 simple_examples/int32/C02AKJE.java delete mode 100644 simple_examples/int32/C02ALJE.java delete mode 100644 simple_examples/int32/C02AMJE.java delete mode 100644 simple_examples/int32/C02ANJE.java delete mode 100644 simple_examples/int32/C05AUJE.java delete mode 100644 simple_examples/int32/C05AWJE.java delete mode 100644 simple_examples/int32/C05AYJE.java delete mode 100644 simple_examples/int32/C05AZJE.java delete mode 100644 simple_examples/int32/C05BBJE.java delete mode 100644 simple_examples/int32/C05MBJE.java delete mode 100644 simple_examples/int32/C05QBJE.java delete mode 100644 simple_examples/int32/C06BAJE.java delete mode 100644 simple_examples/int32/C06FKJE.java delete mode 100644 simple_examples/int32/C09AAJE.java delete mode 100644 simple_examples/int32/D01BDJE.java delete mode 100644 simple_examples/int32/D01RJJE.java delete mode 100644 simple_examples/int32/D01RKJE.java delete mode 100644 simple_examples/int32/D01RLJE.java delete mode 100644 simple_examples/int32/D01RMJE.java delete mode 100644 simple_examples/int32/D01TCJE.java delete mode 100644 simple_examples/int32/D02NEJE.java delete mode 100644 simple_examples/int32/D02TLJE.java delete mode 100644 simple_examples/int32/D03PCJE.java delete mode 100644 simple_examples/int32/D03RAJE.java delete mode 100644 simple_examples/int32/D03RBJE.java delete mode 100644 simple_examples/int32/D05BAJE.java delete mode 100644 simple_examples/int32/D05BEJE.java delete mode 100644 simple_examples/int32/DTFSMJE.java delete mode 100644 simple_examples/int32/E01DAJE.java delete mode 100644 simple_examples/int32/E02ALJE.java delete mode 100644 simple_examples/int32/E04ABJE.java delete mode 100644 simple_examples/int32/E04BBJE.java delete mode 100644 simple_examples/int32/E04CBJE.java delete mode 100644 simple_examples/int32/E04FCJE.java delete mode 100644 simple_examples/int32/E04FFJE.java delete mode 100644 simple_examples/int32/E04GBJE.java delete mode 100644 simple_examples/int32/E04GGJE.java delete mode 100644 simple_examples/int32/E04MTJE.java delete mode 100644 simple_examples/int32/E04MXJE.java delete mode 100644 simple_examples/int32/E04NCJE.java delete mode 100644 simple_examples/int32/E04NFJE.java delete mode 100644 simple_examples/int32/E04NKJE.java delete mode 100644 simple_examples/int32/E04NQJE.java delete mode 100644 simple_examples/int32/E04PTJE.java delete mode 100644 simple_examples/int32/E04RPJE.java delete mode 100644 simple_examples/int32/E04RSJE.java delete mode 100644 simple_examples/int32/E04RTJE.java delete mode 100644 simple_examples/int32/E04SAJE.java delete mode 100644 simple_examples/int32/E04TAJE.java delete mode 100644 simple_examples/int32/E04TCJE.java delete mode 100644 simple_examples/int32/E04UCJE.java delete mode 100644 simple_examples/int32/E04YAJE.java delete mode 100644 simple_examples/int32/F01ADJE.java delete mode 100644 simple_examples/int32/F01CKJE.java delete mode 100644 simple_examples/int32/F01CRJE.java delete mode 100644 simple_examples/int32/F01DGJE.java delete mode 100644 simple_examples/int32/F01ELJE.java delete mode 100644 simple_examples/int32/F01EMJE.java delete mode 100644 simple_examples/int32/F02EKJE.java delete mode 100644 simple_examples/int32/F02FKJE.java delete mode 100644 simple_examples/int32/F02WGJE.java delete mode 100644 simple_examples/int32/F03BAJE.java delete mode 100644 simple_examples/int32/F04AMJE.java delete mode 100644 simple_examples/int32/F04BAJE.java delete mode 100644 simple_examples/int32/F05AAJE.java delete mode 100644 simple_examples/int32/F06CLJE.java delete mode 100644 simple_examples/int32/F07AAJE.java delete mode 100644 simple_examples/int32/F07ABJE.java delete mode 100644 simple_examples/int32/F07ADJE.java delete mode 100644 simple_examples/int32/F07AQJE.java delete mode 100644 simple_examples/int32/F07FAJE.java delete mode 100644 simple_examples/int32/F07FBJE.java delete mode 100644 simple_examples/int32/F08BTJE.java delete mode 100644 simple_examples/int32/F08FAJE.java delete mode 100644 simple_examples/int32/F08XPJE.java delete mode 100644 simple_examples/int32/G01ALJE.java delete mode 100644 simple_examples/int32/G02AKJE.java delete mode 100644 simple_examples/int32/G02BJJE.java delete mode 100644 simple_examples/int32/G02BRJE.java delete mode 100644 simple_examples/int32/G02DAJE.java delete mode 100644 simple_examples/int32/G02EEJE.java delete mode 100644 simple_examples/int32/G02MAJE.java delete mode 100644 simple_examples/int32/G03GAJE.java delete mode 100644 simple_examples/int32/G05KFJE.java delete mode 100644 simple_examples/int32/G13AWJE.java delete mode 100644 simple_examples/int32/G13MEJE.java delete mode 100644 simple_examples/int32/G13NAJE.java delete mode 100644 simple_examples/int32/H02BBJE.java delete mode 100644 simple_examples/int32/H02DAJE.java delete mode 100644 simple_examples/int32/M01CCJE.java delete mode 100644 simple_examples/int32/S01BAJE.java delete mode 100644 simple_examples/int32/S10AAJE.java delete mode 100644 simple_examples/int32/S10ABJE.java delete mode 100644 simple_examples/int32/S10ACJE.java delete mode 100644 simple_examples/int32/S14ABJE.java delete mode 100644 simple_examples/int32/S14ACJE.java delete mode 100644 simple_examples/int32/S14AFJE.java delete mode 100644 simple_examples/int32/S17DCJE.java delete mode 100644 simple_examples/int32/S17DGJE.java delete mode 100644 simple_examples/int32/S30AAJE.java delete mode 100644 simple_examples/int32/S30ACJE.java delete mode 100644 simple_examples/int32/X03AAJE.java delete mode 100644 simple_examples/int32/X04CBJE.java delete mode 100644 simple_examples/int32/X05ABJE.java delete mode 100644 simple_examples/int64/A00AAJE.java delete mode 100644 simple_examples/int64/A00ADJE.java delete mode 100644 simple_examples/int64/C05AYJE.java delete mode 100644 simple_examples/int64/C05AZJE.java delete mode 100644 simple_examples/int64/C05MBJE.java delete mode 100644 simple_examples/int64/C05QBJE.java delete mode 100644 simple_examples/int64/D01BDJE.java delete mode 100644 simple_examples/int64/D02NEJE.java delete mode 100644 simple_examples/int64/DTFSMJE.java delete mode 100644 simple_examples/int64/E01DAJE.java delete mode 100644 simple_examples/int64/E04FCJE.java delete mode 100644 simple_examples/int64/E04MTJE.java delete mode 100644 simple_examples/int64/E04NFJE.java delete mode 100644 simple_examples/int64/E04UCJE.java delete mode 100644 simple_examples/int64/F02EKJE.java delete mode 100644 simple_examples/source/int32/A00AAJE.java delete mode 100644 simple_examples/source/int32/A00ACJE.java delete mode 100644 simple_examples/source/int32/A00ADJE.java delete mode 100644 simple_examples/source/int32/C02AAJE.java delete mode 100644 simple_examples/source/int32/C02ABJE.java delete mode 100644 simple_examples/source/int32/C02AFJE.java delete mode 100644 simple_examples/source/int32/C02AGJE.java delete mode 100644 simple_examples/source/int32/C02AHJE.java delete mode 100644 simple_examples/source/int32/C02AJJE.java delete mode 100644 simple_examples/source/int32/C02AKJE.java delete mode 100644 simple_examples/source/int32/C02ALJE.java delete mode 100644 simple_examples/source/int32/C02AMJE.java delete mode 100644 simple_examples/source/int32/C02ANJE.java delete mode 100644 simple_examples/source/int32/C05AUJE.java delete mode 100644 simple_examples/source/int32/C05AWJE.java delete mode 100644 simple_examples/source/int32/C05AYJE.java delete mode 100644 simple_examples/source/int32/C05AZJE.java delete mode 100644 simple_examples/source/int32/C05BBJE.java delete mode 100644 simple_examples/source/int32/C05MBJE.java delete mode 100644 simple_examples/source/int32/C05QBJE.java delete mode 100644 simple_examples/source/int32/C06BAJE.java delete mode 100644 simple_examples/source/int32/C06FKJE.java delete mode 100644 simple_examples/source/int32/C09AAJE.java delete mode 100644 simple_examples/source/int32/D01BDJE.java delete mode 100644 simple_examples/source/int32/D01RJJE.java delete mode 100644 simple_examples/source/int32/D01RKJE.java delete mode 100644 simple_examples/source/int32/D01RLJE.java delete mode 100644 simple_examples/source/int32/D01RMJE.java delete mode 100644 simple_examples/source/int32/D01TCJE.java delete mode 100644 simple_examples/source/int32/D02NEJE.java delete mode 100644 simple_examples/source/int32/D02TLJE.java delete mode 100644 simple_examples/source/int32/D03PCJE.java delete mode 100644 simple_examples/source/int32/D03RAJE.java delete mode 100644 simple_examples/source/int32/D03RBJE.java delete mode 100644 simple_examples/source/int32/D05BAJE.java delete mode 100644 simple_examples/source/int32/D05BEJE.java delete mode 100644 simple_examples/source/int32/DTFSMJE.java delete mode 100644 simple_examples/source/int32/E01DAJE.java delete mode 100644 simple_examples/source/int32/E02ALJE.java delete mode 100644 simple_examples/source/int32/E04ABJE.java delete mode 100644 simple_examples/source/int32/E04BBJE.java delete mode 100644 simple_examples/source/int32/E04CBJE.java delete mode 100644 simple_examples/source/int32/E04FCJE.java delete mode 100644 simple_examples/source/int32/E04FFJE.java delete mode 100644 simple_examples/source/int32/E04GBJE.java delete mode 100644 simple_examples/source/int32/E04GGJE.java delete mode 100644 simple_examples/source/int32/E04MTJE.java delete mode 100644 simple_examples/source/int32/E04MXJE.java delete mode 100644 simple_examples/source/int32/E04NCJE.java delete mode 100644 simple_examples/source/int32/E04NFJE.java delete mode 100644 simple_examples/source/int32/E04NKJE.java delete mode 100644 simple_examples/source/int32/E04NQJE.java delete mode 100644 simple_examples/source/int32/E04PTJE.java delete mode 100644 simple_examples/source/int32/E04RPJE.java delete mode 100644 simple_examples/source/int32/E04RSJE.java delete mode 100644 simple_examples/source/int32/E04RTJE.java delete mode 100644 simple_examples/source/int32/E04SAJE.java delete mode 100644 simple_examples/source/int32/E04TAJE.java delete mode 100644 simple_examples/source/int32/E04TCJE.java delete mode 100644 simple_examples/source/int32/E04UCJE.java delete mode 100644 simple_examples/source/int32/E04YAJE.java delete mode 100644 simple_examples/source/int32/F01ADJE.java delete mode 100644 simple_examples/source/int32/F01CKJE.java delete mode 100644 simple_examples/source/int32/F01CRJE.java delete mode 100644 simple_examples/source/int32/F01DGJE.java delete mode 100644 simple_examples/source/int32/F01ELJE.java delete mode 100644 simple_examples/source/int32/F01EMJE.java delete mode 100644 simple_examples/source/int32/F02EKJE.java delete mode 100644 simple_examples/source/int32/F02FKJE.java delete mode 100644 simple_examples/source/int32/F02WGJE.java delete mode 100644 simple_examples/source/int32/F03BAJE.java delete mode 100644 simple_examples/source/int32/F04AMJE.java delete mode 100644 simple_examples/source/int32/F04BAJE.java delete mode 100644 simple_examples/source/int32/F05AAJE.java delete mode 100644 simple_examples/source/int32/F06CLJE.java delete mode 100644 simple_examples/source/int32/F07AAJE.java delete mode 100644 simple_examples/source/int32/F07ABJE.java delete mode 100644 simple_examples/source/int32/F07ADJE.java delete mode 100644 simple_examples/source/int32/F07AQJE.java delete mode 100644 simple_examples/source/int32/F07FAJE.java delete mode 100644 simple_examples/source/int32/F07FBJE.java delete mode 100644 simple_examples/source/int32/F08BTJE.java delete mode 100644 simple_examples/source/int32/F08FAJE.java delete mode 100644 simple_examples/source/int32/F08XPJE.java delete mode 100644 simple_examples/source/int32/G01ALJE.java delete mode 100644 simple_examples/source/int32/G02AKJE.java delete mode 100644 simple_examples/source/int32/G02BJJE.java delete mode 100644 simple_examples/source/int32/G02BRJE.java delete mode 100644 simple_examples/source/int32/G02DAJE.java delete mode 100644 simple_examples/source/int32/G02EEJE.java delete mode 100644 simple_examples/source/int32/G02MAJE.java delete mode 100644 simple_examples/source/int32/G03GAJE.java delete mode 100644 simple_examples/source/int32/G05KFJE.java delete mode 100644 simple_examples/source/int32/G13AWJE.java delete mode 100644 simple_examples/source/int32/G13MEJE.java delete mode 100644 simple_examples/source/int32/G13NAJE.java delete mode 100644 simple_examples/source/int32/H02BBJE.java delete mode 100644 simple_examples/source/int32/H02DAJE.java delete mode 100644 simple_examples/source/int32/M01CCJE.java delete mode 100644 simple_examples/source/int32/S01BAJE.java delete mode 100644 simple_examples/source/int32/S10AAJE.java delete mode 100644 simple_examples/source/int32/S10ABJE.java delete mode 100644 simple_examples/source/int32/S10ACJE.java delete mode 100644 simple_examples/source/int32/S14ABJE.java delete mode 100644 simple_examples/source/int32/S14ACJE.java delete mode 100644 simple_examples/source/int32/S14AFJE.java delete mode 100644 simple_examples/source/int32/S17DCJE.java delete mode 100644 simple_examples/source/int32/S17DGJE.java delete mode 100644 simple_examples/source/int32/S30AAJE.java delete mode 100644 simple_examples/source/int32/S30ACJE.java delete mode 100644 simple_examples/source/int32/X03AAJE.java delete mode 100644 simple_examples/source/int32/X04CBJE.java delete mode 100644 simple_examples/source/int32/X05ABJE.java delete mode 100644 simple_examples/source/int64/A00AAJE.java delete mode 100644 simple_examples/source/int64/A00ADJE.java delete mode 100644 simple_examples/source/int64/C05AYJE.java delete mode 100644 simple_examples/source/int64/C05AZJE.java delete mode 100644 simple_examples/source/int64/C05MBJE.java delete mode 100644 simple_examples/source/int64/C05QBJE.java delete mode 100644 simple_examples/source/int64/D01BDJE.java delete mode 100644 simple_examples/source/int64/D02NEJE.java delete mode 100644 simple_examples/source/int64/DTFSMJE.java delete mode 100644 simple_examples/source/int64/E01DAJE.java delete mode 100644 simple_examples/source/int64/E04FCJE.java delete mode 100644 simple_examples/source/int64/E04MTJE.java delete mode 100644 simple_examples/source/int64/E04NFJE.java delete mode 100644 simple_examples/source/int64/E04UCJE.java delete mode 100644 simple_examples/source/int64/F02EKJE.java delete mode 100644 simple_examples/source/withdrawn/D02TKJE.java delete mode 100644 simple_examples/withdrawn/D02TKJE.java diff --git a/simple_examples/D02NEJE.java b/simple_examples/D02NEJE.java deleted file mode 100644 index 34a5b25..0000000 --- a/simple_examples/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/D02TLJE.java b/simple_examples/D02TLJE.java deleted file mode 100644 index 601b3ce..0000000 --- a/simple_examples/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/D03RAJE.java b/simple_examples/D03RAJE.java deleted file mode 100644 index 88d49aa..0000000 --- a/simple_examples/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/D03RBJE.java b/simple_examples/D03RBJE.java deleted file mode 100644 index 9b1b482..0000000 --- a/simple_examples/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/F01ELJE.java b/simple_examples/F01ELJE.java deleted file mode 100644 index 9986c6c..0000000 --- a/simple_examples/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/F02EKJE.java b/simple_examples/F02EKJE.java deleted file mode 100644 index 3737022..0000000 --- a/simple_examples/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/F02FKJE.java b/simple_examples/F02FKJE.java deleted file mode 100644 index 0dd7ab9..0000000 --- a/simple_examples/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/F02WGJE.java b/simple_examples/F02WGJE.java deleted file mode 100644 index 36c26c6..0000000 --- a/simple_examples/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r deleted file mode 100644 index adcba2f..0000000 --- a/simple_examples/baseresults/a00aaje.r +++ /dev/null @@ -1,10 +0,0 @@ - A00AAJ Example Program Results - - *** Start of NAG Library implementation details *** - - Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) - Precision: double precision - Product Code: CLL6I262CL - Mark: 27.2.0 (self-contained) - - *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/a00acje.r b/simple_examples/baseresults/a00acje.r deleted file mode 100644 index 0012531..0000000 --- a/simple_examples/baseresults/a00acje.r +++ /dev/null @@ -1,3 +0,0 @@ - A00ACJ Example Program Results - - A valid licence key is available diff --git a/simple_examples/baseresults/a00adje.r b/simple_examples/baseresults/a00adje.r deleted file mode 100644 index 5fb1839..0000000 --- a/simple_examples/baseresults/a00adje.r +++ /dev/null @@ -1,17 +0,0 @@ - A00ADJ Example Program Results - -*** Start of NAG Library implementation details *** - -Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) - Precision: Fortran double precision - Product code: CLL6I262CL - Mark: 26.2 - Vendor Library: None -Applicable to: - hardware: x86_64 - operating system: Linux 2.6.32-696.6.3.el6.x86_64 - Fortran compiler: Intel ifort Version 18.0.1.163 20171018 -and compatible systems. - Licence query: Successful - -*** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/c02aaje.r b/simple_examples/baseresults/c02aaje.r deleted file mode 100644 index fa3083b..0000000 --- a/simple_examples/baseresults/c02aaje.r +++ /dev/null @@ -1,19 +0,0 @@ - C02AAJ Example Program Results - - Example 1: Basic Problem - - i z conv berr cond - --------------------------------------------------- - 1 6.53E-03, 7.42E-03 3 9.25E-18 4.84E+00 - 2 -6.93E-03, -7.44E-03 2 0.00E+00 4.95E+00 - 3 -2.43E+01, -4.86E+00 3 8.41E-18 1.13E+01 - 4 1.47E+01, -1.66E+01 3 1.07E-17 9.99E+00 - 5 5.25E+00, 2.27E+01 3 2.08E-17 1.06E+01 - - Example 2: Polishing Processes - - polish relerr fwderr - ---------------------------- - 0 3.18E-10 1.15E-04 - 1 6.16E-11 8.49E-06 - 2 1.11E-16 1.11E-16 diff --git a/simple_examples/baseresults/c02abje.r b/simple_examples/baseresults/c02abje.r deleted file mode 100644 index 01b29cd..0000000 --- a/simple_examples/baseresults/c02abje.r +++ /dev/null @@ -1,12 +0,0 @@ - C02ABJ Example Program Results - - Basic Problem - - i z conv berr cond - ----------------------------------------------------- - 1 ( 1.15E+00, 7.36E-01) 3 5.37E-18 1.34E+01 - 2 ( -1.67E+00, 3.25E-01) 3 6.34E-18 2.20E+01 - 3 ( 3.79E-01, -1.25E+00) 3 2.98E-18 1.02E+01 - 4 ( -1.67E+00, -3.25E-01) 3 4.57E-18 2.20E+01 - 5 ( 1.15E+00, -7.36E-01) 3 1.04E-17 1.34E+01 - 6 ( 3.79E-01, 1.25E+00) 2 1.66E-18 1.02E+01 diff --git a/simple_examples/baseresults/c02afje.r b/simple_examples/baseresults/c02afje.r deleted file mode 100644 index 386d4fe..0000000 --- a/simple_examples/baseresults/c02afje.r +++ /dev/null @@ -1,28 +0,0 @@ - C02AFJ Example Program Results - - - Example 1 - - Degree of polynomial = 5 - - Computed roots of polynomial - - z = -2.4328E+01 -4.8555E+00*i - z = 5.2487E+00 +2.2736E+01*i - z = 1.4653E+01 -1.6569E+01*i - z = -6.9264E-03 -7.4434E-03*i - z = 6.5264E-03 +7.4232E-03*i - - - Example 2 - - Degree of polynomial = 5 - - Computed roots of polynomial Error estimates - (machine-dependent) - - z = -2.4328E+01 -4.8555E+00*i 5.7E-16 - z = 5.2487E+00 +2.2736E+01*i 1.5E-16 - z = 1.4653E+01 -1.6569E+01*i 4.8E-16 - z = -6.9264E-03 -7.4434E-03*i 1.1E-16 - z = 6.5264E-03 +7.4232E-03*i 1.8E-16 diff --git a/simple_examples/baseresults/c02agje.r b/simple_examples/baseresults/c02agje.r deleted file mode 100644 index 8e10c18..0000000 --- a/simple_examples/baseresults/c02agje.r +++ /dev/null @@ -1,27 +0,0 @@ - C02AGJ Example Program Results - - - Example 1 - - - Degree of polynomial = 5 - - Computed roots of polynomial - - z = -1.4918E+00 - z = 5.5169E-01 +/- 1.2533E+00*i - z = -8.0579E-01 +/- 1.2229E+00*i - - - Example 2 - - Degree of polynomial = 5 - - Computed roots of polynomial Error estimates - (machine-dependent) - - z = -1.4918E+00 +0.0000E+00*i 7.4E-16 - z = 5.5169E-01 +1.2533E+00*i 1.1E-16 - z = 5.5169E-01 -1.2533E+00*i 1.1E-16 - z = -8.0579E-01 +1.2229E+00*i 3.0E-16 - z = -8.0579E-01 -1.2229E+00*i 3.0E-16 diff --git a/simple_examples/baseresults/c02ahje.r b/simple_examples/baseresults/c02ahje.r deleted file mode 100644 index e3efc97..0000000 --- a/simple_examples/baseresults/c02ahje.r +++ /dev/null @@ -1,6 +0,0 @@ - C02AHJ Example Program Results - - Roots of quadratic equation - - z = 1.0000E+00 +2.0000E+00*i - z = 2.0000E+00 -3.0000E+00*i diff --git a/simple_examples/baseresults/c02ajje.r b/simple_examples/baseresults/c02ajje.r deleted file mode 100644 index 944fa06..0000000 --- a/simple_examples/baseresults/c02ajje.r +++ /dev/null @@ -1,6 +0,0 @@ - C02AJJ Example Program Results - - Roots of quadratic equation - - z = 2.0000E+00 - z = -5.0000E+00 diff --git a/simple_examples/baseresults/c02akje.r b/simple_examples/baseresults/c02akje.r deleted file mode 100644 index 34b3e74..0000000 --- a/simple_examples/baseresults/c02akje.r +++ /dev/null @@ -1,8 +0,0 @@ - C02AKJ Example Program Results - - Roots of cubic equation Error estimates - (machine-dependent) - - z = 1.0000E+00 +0.0000E+00*i 1.0E-15 - z = -2.0000E+00 +3.0000E+00*i 1.0E-15 - z = -2.0000E+00 -3.0000E+00*i 1.0E-15 diff --git a/simple_examples/baseresults/c02alje.r b/simple_examples/baseresults/c02alje.r deleted file mode 100644 index ff49a36..0000000 --- a/simple_examples/baseresults/c02alje.r +++ /dev/null @@ -1,9 +0,0 @@ - C02ALJ Example Program Results - - Roots of quartic equation Error estimates - (machine-dependent) - - z = 2.0000E+00 +0.0000E+00*i 1.2E-15 - z = -2.0000E+00 +0.0000E+00*i 1.1E-15 - z = -1.0000E+00 +3.0000E+00*i 1.1E-15 - z = -1.0000E+00 -3.0000E+00*i 1.1E-15 diff --git a/simple_examples/baseresults/c02amje.r b/simple_examples/baseresults/c02amje.r deleted file mode 100644 index c2c70b4..0000000 --- a/simple_examples/baseresults/c02amje.r +++ /dev/null @@ -1,8 +0,0 @@ - C02AMJ Example Program Results - - Roots of cubic equation Error estimates - (machine-dependent) - - z = -2.0000E+00 +3.0000E+00*i 1.3E-15 - z = 1.0000E+00 -2.0000E+00*i 2.2E-15 - z = 3.0000E+00 -4.0000E+00*i 2.1E-15 diff --git a/simple_examples/baseresults/c02anje.r b/simple_examples/baseresults/c02anje.r deleted file mode 100644 index 4361b7e..0000000 --- a/simple_examples/baseresults/c02anje.r +++ /dev/null @@ -1,9 +0,0 @@ - C02ANJ Example Program Results - - Roots of quartic equation Error estimates - (machine-dependent) - - z = 3.0000E+00 -2.0000E+00*i 1.8E-15 - z = 1.0000E+00 -2.0000E+00*i 1.8E-15 - z = -2.0000E+00 +1.0000E+00*i 1.8E-15 - z = -2.0000E+00 +3.0000E+00*i 1.8E-15 diff --git a/simple_examples/baseresults/c05auje.r b/simple_examples/baseresults/c05auje.r deleted file mode 100644 index 1c8bb18..0000000 --- a/simple_examples/baseresults/c05auje.r +++ /dev/null @@ -1,4 +0,0 @@ -C05AUJ Example Program Results - -Root is : 0.56714 -Interval searched is : [ 0.50000, 0.90000] diff --git a/simple_examples/baseresults/c05awje.r b/simple_examples/baseresults/c05awje.r deleted file mode 100644 index 0868382..0000000 --- a/simple_examples/baseresults/c05awje.r +++ /dev/null @@ -1,4 +0,0 @@ -C05AWJ Example Program Results - -With eps = 1.00e-03 root = 0.56715 -With eps = 1.00e-04 root = 0.56715 diff --git a/simple_examples/baseresults/c05ayje.r b/simple_examples/baseresults/c05ayje.r deleted file mode 100644 index 50a0010..0000000 --- a/simple_examples/baseresults/c05ayje.r +++ /dev/null @@ -1,3 +0,0 @@ -C05AYJ Example Program Results - -Zero at x = 0.56714 diff --git a/simple_examples/baseresults/c05azje.r b/simple_examples/baseresults/c05azje.r deleted file mode 100644 index 1d3b6bc..0000000 --- a/simple_examples/baseresults/c05azje.r +++ /dev/null @@ -1,15 +0,0 @@ - C05AZJ Example Program Results - - Iterations - - X = 0.00000 FX = 1.0000E+00 IND = 2 - X = 1.00000 FX = -6.3212E-01 IND = 3 - X = 0.61270 FX = -7.0814E-02 IND = 4 - X = 0.56707 FX = 1.1542E-04 IND = 4 - X = 0.56714 FX = -9.4481E-07 IND = 4 - X = 0.56713 FX = 1.4727E-05 IND = 4 - X = 0.56714 FX = -9.4481E-07 IND = 4 - - Solution - - X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/c05bbje.r b/simple_examples/baseresults/c05bbje.r deleted file mode 100644 index a963b94..0000000 --- a/simple_examples/baseresults/c05bbje.r +++ /dev/null @@ -1,10 +0,0 @@ -C05BBJ Example Program Results -Branch = 0 -Offset = false - - Z W(Z) RESID IFAIL - -(5.00000e-01, -1.00000e+00) (5.16511e-01, -4.22053e-01) 5.55112e-17 0 -(1.00000e+00, 2.30000e+00) (8.73606e-01, 5.76978e-01) 1.11022e-16 0 -(4.50000e+00, -1.00000e-01) (1.26735e+00, -1.24194e-02) 0.00000e+00 0 -(6.00000e+00, 6.00000e+00) (1.61492e+00, 4.90515e-01) 1.25607e-15 0 diff --git a/simple_examples/baseresults/c05mbje.r b/simple_examples/baseresults/c05mbje.r deleted file mode 100644 index 49cdab8..0000000 --- a/simple_examples/baseresults/c05mbje.r +++ /dev/null @@ -1,8 +0,0 @@ -C05MBJ Example Program Results - - -Final 2-norm of the residuals = 2.4765e-08 - -Final approximate solution - - 0.7682 0.7862 0.6948 0.6180 diff --git a/simple_examples/baseresults/c05qbje.r b/simple_examples/baseresults/c05qbje.r deleted file mode 100644 index e161a18..0000000 --- a/simple_examples/baseresults/c05qbje.r +++ /dev/null @@ -1,8 +0,0 @@ - C05QBJ Example Program Results - - Final 2-norm of the residuals = 1.1926E-08 - - Final approximate solution - -0.5707 -0.6816 -0.7017 - -0.7042 -0.7014 -0.6919 - -0.6658 -0.5960 -0.4164 diff --git a/simple_examples/baseresults/c06baje.r b/simple_examples/baseresults/c06baje.r deleted file mode 100644 index 7049ba9..0000000 --- a/simple_examples/baseresults/c06baje.r +++ /dev/null @@ -1,15 +0,0 @@ -C06BAJ Example Program Results - - Estimated Actual -I SEQN RESULT abs error error - -1 1.0000 1.0000 - 1.78e-01 -2 0.7500 0.7500 - -7.25e-02 -3 0.8611 0.8269 - 4.46e-03 -4 0.7986 0.8211 2.56e-01 -1.36e-03 -5 0.8386 0.8226 7.84e-02 1.23e-04 -6 0.8108 0.8224 5.97e-03 -3.26e-05 -7 0.8312 0.8225 1.52e-03 3.50e-06 -8 0.8156 0.8225 1.60e-04 -8.51e-07 -9 0.8280 0.8225 3.70e-05 1.01e-07 -10 0.8180 0.8225 4.48e-06 -2.32e-08 \ No newline at end of file diff --git a/simple_examples/baseresults/c06fkje.r b/simple_examples/baseresults/c06fkje.r deleted file mode 100644 index 8ef60db..0000000 --- a/simple_examples/baseresults/c06fkje.r +++ /dev/null @@ -1,13 +0,0 @@ -C06FKJ Example Program Results - - Covolution Correlation - -0 0.50000 2.00000 -1 1.00000 1.50000 -2 1.50000 1.00000 -3 2.00000 0.50000 -4 2.00000 0.00000 -5 1.50000 0.50000 -6 1.00000 1.00000 -7 0.50000 1.50000 -8 0.00000 2.00000 diff --git a/simple_examples/baseresults/c09aaje.r b/simple_examples/baseresults/c09aaje.r deleted file mode 100644 index 950c020..0000000 --- a/simple_examples/baseresults/c09aaje.r +++ /dev/null @@ -1,18 +0,0 @@ -C09AAJ Example Program Results - -Parameters read from file :: - Wavelet : Haar End mode : Zero N = 8 -Input data X : -2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 - -Length of wavelet filter : 2 -Number of Levels : 3 -Number of coefficients in each level: - 1 1 2 4 -Total number of wavelength coefficients : 8 - -Wavelet coefficients C: -12.374 4.596 -5.000 5.500 -2.121 -0.707 2.121 -1.414 - -Reconstruction Y : -2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 \ No newline at end of file diff --git a/simple_examples/baseresults/complexargumentexample.r b/simple_examples/baseresults/complexargumentexample.r deleted file mode 100644 index 19fc96c..0000000 --- a/simple_examples/baseresults/complexargumentexample.r +++ /dev/null @@ -1 +0,0 @@ -(1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/d01bdje.r b/simple_examples/baseresults/d01bdje.r deleted file mode 100644 index 23c78d1..0000000 --- a/simple_examples/baseresults/d01bdje.r +++ /dev/null @@ -1,9 +0,0 @@ - D01BDJ Example Program Results - - A - lower limit of integration = 0.0000 - B - upper limit of integration = 1.0000 - EPSABS - absolute accuracy requested = 0.00E+00 - EPSREL - relative accuracy requested = 1.00E-04 - - RESULT - approximation to the integral = -0.03183 - ABSERR - estimate to the absolute error = 1.34E-11 diff --git a/simple_examples/baseresults/d02neje.r b/simple_examples/baseresults/d02neje.r deleted file mode 100644 index b735aaf..0000000 --- a/simple_examples/baseresults/d02neje.r +++ /dev/null @@ -1,25 +0,0 @@ - D02NEJ Example Program Results - - D02NEF Example 1 - - t Y(1) Y(2) Y(3) - 0.0000 1.000000 0.000000 0.000000 - 0.0200 0.999204 0.000036 0.000760 - 0.0400 0.998415 0.000036 0.001549 - 0.0600 0.997631 0.000036 0.002333 - 0.0800 0.996852 0.000036 0.003112 - 0.1000 0.996080 0.000036 0.003884 - - The integrator completed task, ITASK = 3 - - D02NEF Example 2 - - t y(1) - 0.0000 2.000000 - 0.2000 2.038016 - 0.4000 2.078379 - 0.6000 2.121462 - 0.8000 2.167736 - 1.0000 2.217821 - - The integrator completed task, ITASK = 3 diff --git a/simple_examples/baseresults/d02tkje.r b/simple_examples/baseresults/d02tkje.r deleted file mode 100644 index 4029a48..0000000 --- a/simple_examples/baseresults/d02tkje.r +++ /dev/null @@ -1,113 +0,0 @@ - D02TKJ Example Program Results - - - Tolerance = 1.0E-04 R = 1.000E+06 - - Used a mesh of 21 points - Maximum error = 6.16E-10 in interval 20 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 - 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 - 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 - 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 - 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.050 0.0070 0.1805 0.4416 - 0.100 0.0141 0.0977 0.1886 - 0.150 0.0171 0.0252 0.0952 - 0.200 0.0172 -0.0165 0.0595 - 0.250 0.0157 -0.0400 0.0427 - 0.300 0.0133 -0.0540 0.0322 - 0.350 0.0104 -0.0628 0.0236 - 0.400 0.0071 -0.0683 0.0156 - 0.450 0.0036 -0.0714 0.0078 - 0.500 0.0000 -0.0724 0.0000 - 0.550 -0.0036 -0.0714 -0.0078 - 0.600 -0.0071 -0.0683 -0.0156 - 0.650 -0.0104 -0.0628 -0.0236 - 0.700 -0.0133 -0.0540 -0.0322 - 0.750 -0.0157 -0.0400 -0.0427 - 0.800 -0.0172 -0.0165 -0.0595 - 0.850 -0.0171 0.0252 -0.0952 - 0.900 -0.0141 0.0977 -0.1886 - 0.950 -0.0070 0.1805 -0.4416 - 1.000 -0.0000 0.0000 -1.0000 - - Tolerance = 1.0E-04 R = 1.000E+08 - - Used a mesh of 21 points - Maximum error = 4.49E-09 in interval 6 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 - 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 - 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 - 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 - 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.018 0.0025 0.1713 0.3923 - 0.035 0.0047 0.0824 0.1381 - 0.052 0.0056 0.0267 0.0521 - 0.069 0.0058 0.0025 0.0213 - 0.086 0.0057 -0.0073 0.0097 - 0.103 0.0056 -0.0113 0.0053 - 0.135 0.0052 -0.0135 0.0027 - 0.167 0.0047 -0.0140 0.0020 - 0.231 0.0038 -0.0142 0.0015 - 0.294 0.0029 -0.0142 0.0012 - 0.471 0.0004 -0.0143 0.0002 - 0.649 -0.0021 -0.0143 -0.0008 - 0.745 -0.0035 -0.0142 -0.0014 - 0.842 -0.0049 -0.0139 -0.0022 - 0.882 -0.0054 -0.0127 -0.0036 - 0.922 -0.0058 -0.0036 -0.0141 - 0.945 -0.0057 0.0205 -0.0439 - 0.967 -0.0045 0.0937 -0.1592 - 0.984 -0.0023 0.1753 -0.4208 - 1.000 -0.0000 0.0000 -1.0000 - - Tolerance = 1.0E-04 R = 1.000E+10 - - Used a mesh of 21 points - Maximum error = 3.13E-06 in interval 7 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 - 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 - 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 - 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 - 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.006 0.0009 0.1623 0.3422 - 0.013 0.0016 0.0665 0.1021 - 0.019 0.0018 0.0204 0.0318 - 0.025 0.0019 0.0041 0.0099 - 0.031 0.0019 -0.0014 0.0028 - 0.037 0.0019 -0.0031 0.0007 - 0.050 0.0019 -0.0038 -0.0002 - 0.063 0.0018 -0.0038 -0.0003 - 0.094 0.0017 -0.0039 -0.0003 - 0.126 0.0016 -0.0039 -0.0002 - 0.419 0.0004 -0.0041 -0.0001 - 0.712 -0.0008 -0.0042 0.0001 - 0.825 -0.0013 -0.0043 0.0002 - 0.937 -0.0018 -0.0043 0.0003 - 0.954 -0.0019 -0.0042 0.0001 - 0.972 -0.0019 -0.0003 -0.0049 - 0.980 -0.0019 0.0152 -0.0252 - 0.989 -0.0015 0.0809 -0.1279 - 0.994 -0.0008 0.1699 -0.3814 - 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d02tlje.r b/simple_examples/baseresults/d02tlje.r deleted file mode 100644 index b56a57d..0000000 --- a/simple_examples/baseresults/d02tlje.r +++ /dev/null @@ -1,113 +0,0 @@ - D02TLJ Example Program Results - - - Tolerance = 1.0E-04 R = 1.000E+06 - - Used a mesh of 21 points - Maximum error = 6.16E-10 in interval 20 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 - 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 - 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 - 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 - 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.050 0.0070 0.1805 0.4416 - 0.100 0.0141 0.0977 0.1886 - 0.150 0.0171 0.0252 0.0952 - 0.200 0.0172 -0.0165 0.0595 - 0.250 0.0157 -0.0400 0.0427 - 0.300 0.0133 -0.0540 0.0322 - 0.350 0.0104 -0.0628 0.0236 - 0.400 0.0071 -0.0683 0.0156 - 0.450 0.0036 -0.0714 0.0078 - 0.500 0.0000 -0.0724 0.0000 - 0.550 -0.0036 -0.0714 -0.0078 - 0.600 -0.0071 -0.0683 -0.0156 - 0.650 -0.0104 -0.0628 -0.0236 - 0.700 -0.0133 -0.0540 -0.0322 - 0.750 -0.0157 -0.0400 -0.0427 - 0.800 -0.0172 -0.0165 -0.0595 - 0.850 -0.0171 0.0252 -0.0952 - 0.900 -0.0141 0.0977 -0.1886 - 0.950 -0.0070 0.1805 -0.4416 - 1.000 -0.0000 0.0000 -1.0000 - - Tolerance = 1.0E-04 R = 1.000E+08 - - Used a mesh of 21 points - Maximum error = 4.49E-09 in interval 6 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 - 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 - 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 - 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 - 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.018 0.0025 0.1713 0.3923 - 0.035 0.0047 0.0824 0.1381 - 0.052 0.0056 0.0267 0.0521 - 0.069 0.0058 0.0025 0.0213 - 0.086 0.0057 -0.0073 0.0097 - 0.103 0.0056 -0.0113 0.0053 - 0.135 0.0052 -0.0135 0.0027 - 0.167 0.0047 -0.0140 0.0020 - 0.231 0.0038 -0.0142 0.0015 - 0.294 0.0029 -0.0142 0.0012 - 0.471 0.0004 -0.0143 0.0002 - 0.649 -0.0021 -0.0143 -0.0008 - 0.745 -0.0035 -0.0142 -0.0014 - 0.842 -0.0049 -0.0139 -0.0022 - 0.882 -0.0054 -0.0127 -0.0036 - 0.922 -0.0058 -0.0036 -0.0141 - 0.945 -0.0057 0.0205 -0.0439 - 0.967 -0.0045 0.0937 -0.1592 - 0.984 -0.0023 0.1753 -0.4208 - 1.000 -0.0000 0.0000 -1.0000 - - Tolerance = 1.0E-04 R = 1.000E+10 - - Used a mesh of 21 points - Maximum error = 3.13E-06 in interval 7 for component 3 - - - Mesh points: - 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 - 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 - 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 - 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 - 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 - 21(1) 1.000E+00 - - x f f' g - 0.000 0.0000 0.0000 1.0000 - 0.006 0.0009 0.1623 0.3422 - 0.013 0.0016 0.0665 0.1021 - 0.019 0.0018 0.0204 0.0318 - 0.025 0.0019 0.0041 0.0099 - 0.031 0.0019 -0.0014 0.0028 - 0.037 0.0019 -0.0031 0.0007 - 0.050 0.0019 -0.0038 -0.0002 - 0.063 0.0018 -0.0038 -0.0003 - 0.094 0.0017 -0.0039 -0.0003 - 0.126 0.0016 -0.0039 -0.0002 - 0.419 0.0004 -0.0041 -0.0001 - 0.712 -0.0008 -0.0042 0.0001 - 0.825 -0.0013 -0.0043 0.0002 - 0.937 -0.0018 -0.0043 0.0003 - 0.954 -0.0019 -0.0042 0.0001 - 0.972 -0.0019 -0.0003 -0.0049 - 0.980 -0.0019 0.0152 -0.0252 - 0.989 -0.0015 0.0809 -0.1279 - 0.994 -0.0008 0.1699 -0.3814 - 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d03pcje.r b/simple_examples/baseresults/d03pcje.r deleted file mode 100644 index 154a2d9..0000000 --- a/simple_examples/baseresults/d03pcje.r +++ /dev/null @@ -1,28 +0,0 @@ -D03PCJ Example Program Results -Accuracy requirement = 1.00000e-03 - Parameter ALPHA = 1.000e+00 -T / X 0.0000 0.4000 0.6000 0.8000 0.9000 1.0000 - -0.0001 U(1) 0.0000 0.8008 1.1988 1.5990 1.7958 1.8485 - U(2) 0.9997 0.9995 0.9994 0.9988 0.9663 -0.0000 - - -0.0010 U(1) 0.0000 0.7982 1.1940 1.5841 1.7179 1.6734 - U(2) 0.9969 0.9952 0.9937 0.9484 0.6385 -0.0000 - - -0.0100 U(1) 0.0000 0.7676 1.1239 1.3547 1.3635 1.2830 - U(2) 0.9627 0.9495 0.8754 0.5537 0.2908 -0.0000 - - -0.1000 U(1) 0.0000 0.3908 0.5007 0.5297 0.5120 0.4744 - U(2) 0.5468 0.4299 0.2995 0.1479 0.0724 -0.0000 - - -1.0000 U(1) 0.0000 0.0007 0.0008 0.0008 0.0008 0.0007 - U(2) 0.0010 0.0007 0.0005 0.0002 0.0001 -0.0000 - -Number of Integration steps in time 78 -Number of residual evaluations of resulting ODE system 378 -Number of Jacobian evaluations 25 -Number of iterations of nonlinear solver 190 diff --git a/simple_examples/baseresults/d03raje.r b/simple_examples/baseresults/d03raje.r deleted file mode 100644 index 59cf403..0000000 --- a/simple_examples/baseresults/d03raje.r +++ /dev/null @@ -1,409 +0,0 @@ - D03RAJ Example Program Results - - Statistics: - Time = 0.2400 - Total number of accepted timesteps = 77 - Total number of rejected timesteps = 0 - - Total number (rounded) of - Residual Jacobian Newton Lin sys - evals evals iters iters - At level - 1 600 80 200 200 - - Maximum number of - Newton iters Lin sys iters - At level - 1 2 3 - - Solution at every 4th grid point in level 2 at time 0.2500: - - x y approx u - - 6.7500E-01 0.000E+00 2.000E+00 - 7.2500E-01 0.000E+00 1.980E+00 - 7.7500E-01 0.000E+00 1.342E+00 - 8.2500E-01 0.000E+00 1.190E+00 - 7.1250E-01 1.250E-02 1.996E+00 - 7.6250E-01 1.250E-02 1.468E+00 - 8.1250E-01 1.250E-02 1.213E+00 - 7.0000E-01 2.500E-02 1.999E+00 - 7.5000E-01 2.500E-02 1.625E+00 - 8.0000E-01 2.500E-02 1.240E+00 - 6.8750E-01 3.750E-02 2.000E+00 - 7.3750E-01 3.750E-02 1.870E+00 - 7.8750E-01 3.750E-02 1.283E+00 - 6.7500E-01 5.000E-02 2.000E+00 - 7.2500E-01 5.000E-02 1.980E+00 - 7.7500E-01 5.000E-02 1.342E+00 - 8.2500E-01 5.000E-02 1.190E+00 - 7.1250E-01 6.250E-02 1.996E+00 - 7.6250E-01 6.250E-02 1.468E+00 - 8.1250E-01 6.250E-02 1.213E+00 - 7.0000E-01 7.500E-02 1.999E+00 - 7.5000E-01 7.500E-02 1.625E+00 - 8.0000E-01 7.500E-02 1.240E+00 - 6.8750E-01 8.750E-02 2.000E+00 - 7.3750E-01 8.750E-02 1.870E+00 - 7.8750E-01 8.750E-02 1.283E+00 - 6.7500E-01 1.000E-01 2.000E+00 - 7.2500E-01 1.000E-01 1.980E+00 - 7.7500E-01 1.000E-01 1.342E+00 - 8.2500E-01 1.000E-01 1.190E+00 - 7.1250E-01 1.125E-01 1.996E+00 - 7.6250E-01 1.125E-01 1.468E+00 - 8.1250E-01 1.125E-01 1.213E+00 - 7.0000E-01 1.250E-01 1.999E+00 - 7.5000E-01 1.250E-01 1.625E+00 - 8.0000E-01 1.250E-01 1.240E+00 - 6.8750E-01 1.375E-01 2.000E+00 - 7.3750E-01 1.375E-01 1.870E+00 - 7.8750E-01 1.375E-01 1.283E+00 - 6.7500E-01 1.500E-01 2.000E+00 - 7.2500E-01 1.500E-01 1.980E+00 - 7.7500E-01 1.500E-01 1.341E+00 - 8.2500E-01 1.500E-01 1.190E+00 - 7.1250E-01 1.625E-01 1.995E+00 - 7.6250E-01 1.625E-01 1.467E+00 - 8.1250E-01 1.625E-01 1.213E+00 - 7.0000E-01 1.750E-01 1.999E+00 - 7.5000E-01 1.750E-01 1.624E+00 - 8.0000E-01 1.750E-01 1.240E+00 - 6.8750E-01 1.875E-01 2.000E+00 - 7.3750E-01 1.875E-01 1.869E+00 - 7.8750E-01 1.875E-01 1.282E+00 - 6.7500E-01 2.000E-01 2.000E+00 - 7.2500E-01 2.000E-01 1.980E+00 - 7.7500E-01 2.000E-01 1.341E+00 - 8.2500E-01 2.000E-01 1.189E+00 - 7.1250E-01 2.125E-01 1.995E+00 - 7.6250E-01 2.125E-01 1.465E+00 - 8.1250E-01 2.125E-01 1.212E+00 - 7.0000E-01 2.250E-01 1.999E+00 - 7.5000E-01 2.250E-01 1.621E+00 - 8.0000E-01 2.250E-01 1.240E+00 - 6.8750E-01 2.375E-01 2.000E+00 - 7.3750E-01 2.375E-01 1.869E+00 - 7.8750E-01 2.375E-01 1.282E+00 - 6.7500E-01 2.500E-01 2.000E+00 - 7.2500E-01 2.500E-01 1.980E+00 - 7.7500E-01 2.500E-01 1.340E+00 - 8.2500E-01 2.500E-01 1.189E+00 - 7.1250E-01 2.625E-01 1.995E+00 - 7.6250E-01 2.625E-01 1.462E+00 - 8.1250E-01 2.625E-01 1.212E+00 - 7.0000E-01 2.750E-01 1.999E+00 - 7.5000E-01 2.750E-01 1.616E+00 - 8.0000E-01 2.750E-01 1.239E+00 - 6.8750E-01 2.875E-01 2.000E+00 - 7.3750E-01 2.875E-01 1.866E+00 - 7.8750E-01 2.875E-01 1.281E+00 - 6.7500E-01 3.000E-01 2.000E+00 - 7.2500E-01 3.000E-01 1.979E+00 - 7.7500E-01 3.000E-01 1.337E+00 - 8.2500E-01 3.000E-01 1.189E+00 - 7.1250E-01 3.125E-01 1.995E+00 - 7.6250E-01 3.125E-01 1.455E+00 - 8.1250E-01 3.125E-01 1.212E+00 - 7.0000E-01 3.250E-01 1.999E+00 - 7.5000E-01 3.250E-01 1.605E+00 - 8.0000E-01 3.250E-01 1.239E+00 - 6.8750E-01 3.375E-01 2.000E+00 - 7.3750E-01 3.375E-01 1.862E+00 - 7.8750E-01 3.375E-01 1.279E+00 - 6.7500E-01 3.500E-01 2.000E+00 - 7.2500E-01 3.500E-01 1.977E+00 - 7.7500E-01 3.500E-01 1.332E+00 - 8.2500E-01 3.500E-01 1.189E+00 - 7.1250E-01 3.625E-01 1.993E+00 - 7.6250E-01 3.625E-01 1.442E+00 - 8.1250E-01 3.625E-01 1.211E+00 - 7.0000E-01 3.750E-01 1.999E+00 - 7.5000E-01 3.750E-01 1.585E+00 - 8.0000E-01 3.750E-01 1.236E+00 - 6.8750E-01 3.875E-01 2.000E+00 - 7.3750E-01 3.875E-01 1.849E+00 - 7.8750E-01 3.875E-01 1.274E+00 - 6.7500E-01 4.000E-01 2.000E+00 - 7.2500E-01 4.000E-01 1.972E+00 - 7.7500E-01 4.000E-01 1.324E+00 - 8.2500E-01 4.000E-01 1.187E+00 - 7.1250E-01 4.125E-01 1.990E+00 - 7.6250E-01 4.125E-01 1.420E+00 - 8.1250E-01 4.125E-01 1.209E+00 - 7.0000E-01 4.250E-01 1.997E+00 - 7.5000E-01 4.250E-01 1.549E+00 - 8.0000E-01 4.250E-01 1.233E+00 - 6.8750E-01 4.375E-01 1.999E+00 - 7.3750E-01 4.375E-01 1.813E+00 - 7.8750E-01 4.375E-01 1.267E+00 - 6.7500E-01 4.500E-01 2.000E+00 - 7.2500E-01 4.500E-01 1.952E+00 - 7.7500E-01 4.500E-01 1.310E+00 - 8.2500E-01 4.500E-01 1.185E+00 - 7.1250E-01 4.625E-01 1.976E+00 - 7.6250E-01 4.625E-01 1.387E+00 - 8.1250E-01 4.625E-01 1.206E+00 - 6.7500E-01 4.750E-01 2.000E+00 - 7.2500E-01 4.750E-01 1.924E+00 - 7.7500E-01 4.750E-01 1.301E+00 - 8.2500E-01 4.750E-01 1.184E+00 - 6.8750E-01 4.875E-01 1.999E+00 - 7.3750E-01 4.875E-01 1.714E+00 - 7.8750E-01 4.875E-01 1.257E+00 - 6.5000E-01 5.000E-01 2.000E+00 - 7.0000E-01 5.000E-01 1.991E+00 - 7.5000E-01 5.000E-01 1.454E+00 - 8.0000E-01 5.000E-01 1.224E+00 - 6.6250E-01 5.125E-01 2.000E+00 - 7.1250E-01 5.125E-01 1.932E+00 - 7.6250E-01 5.125E-01 1.346E+00 - 6.5000E-01 5.250E-01 2.000E+00 - 7.0000E-01 5.250E-01 1.986E+00 - 7.5000E-01 5.250E-01 1.414E+00 - 8.0000E-01 5.250E-01 1.219E+00 - 6.8750E-01 5.375E-01 1.996E+00 - 7.3750E-01 5.375E-01 1.545E+00 - 7.8750E-01 5.375E-01 1.243E+00 - 6.5000E-01 5.500E-01 2.000E+00 - 7.0000E-01 5.500E-01 1.978E+00 - 7.5000E-01 5.500E-01 1.373E+00 - 8.0000E-01 5.500E-01 1.214E+00 - 6.6250E-01 5.625E-01 1.999E+00 - 7.1250E-01 5.625E-01 1.843E+00 - 7.6250E-01 5.625E-01 1.302E+00 - 6.2500E-01 5.750E-01 2.000E+00 - 6.7500E-01 5.750E-01 1.995E+00 - 7.2500E-01 5.750E-01 1.545E+00 - 7.7500E-01 5.750E-01 1.256E+00 - 6.3750E-01 5.875E-01 2.000E+00 - 6.8750E-01 5.875E-01 1.954E+00 - 7.3750E-01 5.875E-01 1.392E+00 - 7.8750E-01 5.875E-01 1.226E+00 - 6.2500E-01 6.000E-01 2.000E+00 - 6.7500E-01 6.000E-01 1.984E+00 - 7.2500E-01 6.000E-01 1.443E+00 - 7.7500E-01 6.000E-01 1.243E+00 - 6.1250E-01 6.125E-01 2.000E+00 - 6.6250E-01 6.125E-01 1.988E+00 - 7.1250E-01 6.125E-01 1.531E+00 - 7.6250E-01 6.125E-01 1.263E+00 - 5.5000E-01 6.250E-01 2.000E+00 - 6.0000E-01 6.250E-01 2.000E+00 - 6.5000E-01 6.250E-01 1.993E+00 - 7.0000E-01 6.250E-01 1.577E+00 - 7.5000E-01 6.250E-01 1.280E+00 - 8.0000E-01 6.250E-01 1.194E+00 - 5.8750E-01 6.375E-01 2.000E+00 - 6.3750E-01 6.375E-01 1.992E+00 - 6.8750E-01 6.375E-01 1.672E+00 - 7.3750E-01 6.375E-01 1.300E+00 - 4.7500E-01 6.500E-01 2.000E+00 - 5.2500E-01 6.500E-01 2.000E+00 - 5.7500E-01 6.500E-01 2.000E+00 - 6.2500E-01 6.500E-01 1.993E+00 - 6.7500E-01 6.500E-01 1.680E+00 - 7.2500E-01 6.500E-01 1.314E+00 - 7.7500E-01 6.500E-01 1.218E+00 - 5.1250E-01 6.625E-01 2.000E+00 - 5.6250E-01 6.625E-01 1.999E+00 - 6.1250E-01 6.625E-01 1.988E+00 - 6.6250E-01 6.625E-01 1.721E+00 - 7.1250E-01 6.625E-01 1.331E+00 - 7.6250E-01 6.625E-01 1.229E+00 - 2.5000E-02 6.750E-01 2.000E+00 - 7.5000E-02 6.750E-01 2.000E+00 - 1.2500E-01 6.750E-01 2.000E+00 - 1.7500E-01 6.750E-01 2.000E+00 - 2.2500E-01 6.750E-01 2.000E+00 - 2.7500E-01 6.750E-01 2.000E+00 - 3.2500E-01 6.750E-01 2.000E+00 - 3.7500E-01 6.750E-01 2.000E+00 - 4.2500E-01 6.750E-01 2.000E+00 - 4.7500E-01 6.750E-01 2.000E+00 - 5.2500E-01 6.750E-01 2.000E+00 - 5.7500E-01 6.750E-01 1.995E+00 - 6.2500E-01 6.750E-01 1.932E+00 - 6.7500E-01 6.750E-01 1.447E+00 - 7.2500E-01 6.750E-01 1.277E+00 - 7.7500E-01 6.750E-01 1.205E+00 - 3.7500E-02 6.875E-01 2.000E+00 - 8.7500E-02 6.875E-01 2.000E+00 - 1.3750E-01 6.875E-01 2.000E+00 - 1.8750E-01 6.875E-01 2.000E+00 - 2.3750E-01 6.875E-01 2.000E+00 - 2.8750E-01 6.875E-01 2.000E+00 - 3.3750E-01 6.875E-01 2.000E+00 - 3.8750E-01 6.875E-01 2.000E+00 - 4.3750E-01 6.875E-01 1.999E+00 - 4.8750E-01 6.875E-01 1.999E+00 - 5.3750E-01 6.875E-01 1.996E+00 - 5.8750E-01 6.875E-01 1.954E+00 - 6.3750E-01 6.875E-01 1.672E+00 - 6.8750E-01 6.875E-01 1.343E+00 - 7.3750E-01 6.875E-01 1.244E+00 - 2.5000E-02 7.000E-01 1.999E+00 - 7.5000E-02 7.000E-01 1.999E+00 - 1.2500E-01 7.000E-01 1.999E+00 - 1.7500E-01 7.000E-01 1.999E+00 - 2.2500E-01 7.000E-01 1.999E+00 - 2.7500E-01 7.000E-01 1.999E+00 - 3.2500E-01 7.000E-01 1.999E+00 - 3.7500E-01 7.000E-01 1.999E+00 - 4.2500E-01 7.000E-01 1.997E+00 - 4.7500E-01 7.000E-01 1.994E+00 - 5.2500E-01 7.000E-01 1.986E+00 - 5.7500E-01 7.000E-01 1.941E+00 - 6.2500E-01 7.000E-01 1.577E+00 - 6.7500E-01 7.000E-01 1.336E+00 - 7.2500E-01 7.000E-01 1.247E+00 - 1.2500E-02 7.125E-01 1.996E+00 - 6.2500E-02 7.125E-01 1.996E+00 - 1.1250E-01 7.125E-01 1.995E+00 - 1.6250E-01 7.125E-01 1.995E+00 - 2.1250E-01 7.125E-01 1.995E+00 - 2.6250E-01 7.125E-01 1.995E+00 - 3.1250E-01 7.125E-01 1.995E+00 - 3.6250E-01 7.125E-01 1.993E+00 - 4.1250E-01 7.125E-01 1.990E+00 - 4.6250E-01 7.125E-01 1.976E+00 - 5.1250E-01 7.125E-01 1.932E+00 - 5.6250E-01 7.125E-01 1.843E+00 - 6.1250E-01 7.125E-01 1.531E+00 - 6.6250E-01 7.125E-01 1.331E+00 - 7.1250E-01 7.125E-01 1.250E+00 - 2.5000E-02 7.250E-01 1.980E+00 - 7.5000E-02 7.250E-01 1.980E+00 - 1.2500E-01 7.250E-01 1.980E+00 - 1.7500E-01 7.250E-01 1.980E+00 - 2.2500E-01 7.250E-01 1.980E+00 - 2.7500E-01 7.250E-01 1.979E+00 - 3.2500E-01 7.250E-01 1.978E+00 - 3.7500E-01 7.250E-01 1.975E+00 - 4.2500E-01 7.250E-01 1.965E+00 - 4.7500E-01 7.250E-01 1.924E+00 - 5.2500E-01 7.250E-01 1.772E+00 - 5.7500E-01 7.250E-01 1.545E+00 - 6.2500E-01 7.250E-01 1.366E+00 - 6.7500E-01 7.250E-01 1.277E+00 - 7.2500E-01 7.250E-01 1.222E+00 - 3.7500E-02 7.375E-01 1.870E+00 - 8.7500E-02 7.375E-01 1.870E+00 - 1.3750E-01 7.375E-01 1.870E+00 - 1.8750E-01 7.375E-01 1.869E+00 - 2.3750E-01 7.375E-01 1.868E+00 - 2.8750E-01 7.375E-01 1.866E+00 - 3.3750E-01 7.375E-01 1.862E+00 - 3.8750E-01 7.375E-01 1.849E+00 - 4.3750E-01 7.375E-01 1.813E+00 - 4.8750E-01 7.375E-01 1.714E+00 - 5.3750E-01 7.375E-01 1.545E+00 - 5.8750E-01 7.375E-01 1.392E+00 - 6.3750E-01 7.375E-01 1.300E+00 - 6.8750E-01 7.375E-01 1.244E+00 - 2.5000E-02 7.500E-01 1.625E+00 - 7.5000E-02 7.500E-01 1.625E+00 - 1.2500E-01 7.500E-01 1.625E+00 - 1.7500E-01 7.500E-01 1.624E+00 - 2.2500E-01 7.500E-01 1.621E+00 - 2.7500E-01 7.500E-01 1.616E+00 - 3.2500E-01 7.500E-01 1.605E+00 - 3.7500E-01 7.500E-01 1.585E+00 - 4.2500E-01 7.500E-01 1.549E+00 - 4.7500E-01 7.500E-01 1.491E+00 - 5.2500E-01 7.500E-01 1.414E+00 - 5.7500E-01 7.500E-01 1.337E+00 - 6.2500E-01 7.500E-01 1.280E+00 - 6.7500E-01 7.500E-01 1.237E+00 - 1.2500E-02 7.625E-01 1.468E+00 - 6.2500E-02 7.625E-01 1.468E+00 - 1.1250E-01 7.625E-01 1.468E+00 - 1.6250E-01 7.625E-01 1.467E+00 - 2.1250E-01 7.625E-01 1.465E+00 - 2.6250E-01 7.625E-01 1.462E+00 - 3.1250E-01 7.625E-01 1.455E+00 - 3.6250E-01 7.625E-01 1.442E+00 - 4.1250E-01 7.625E-01 1.420E+00 - 4.6250E-01 7.625E-01 1.387E+00 - 5.1250E-01 7.625E-01 1.345E+00 - 5.6250E-01 7.625E-01 1.302E+00 - 6.1250E-01 7.625E-01 1.263E+00 - 6.6250E-01 7.625E-01 1.229E+00 - 2.5000E-02 7.750E-01 1.342E+00 - 7.5000E-02 7.750E-01 1.342E+00 - 1.2500E-01 7.750E-01 1.342E+00 - 1.7500E-01 7.750E-01 1.341E+00 - 2.2500E-01 7.750E-01 1.340E+00 - 2.7500E-01 7.750E-01 1.339E+00 - 3.2500E-01 7.750E-01 1.335E+00 - 3.7500E-01 7.750E-01 1.329E+00 - 4.2500E-01 7.750E-01 1.317E+00 - 4.7500E-01 7.750E-01 1.301E+00 - 5.2500E-01 7.750E-01 1.280E+00 - 5.7500E-01 7.750E-01 1.256E+00 - 6.2500E-01 7.750E-01 1.231E+00 - 6.7500E-01 7.750E-01 1.205E+00 - 3.7500E-02 7.875E-01 1.283E+00 - 8.7500E-02 7.875E-01 1.283E+00 - 1.3750E-01 7.875E-01 1.283E+00 - 1.8750E-01 7.875E-01 1.282E+00 - 2.3750E-01 7.875E-01 1.282E+00 - 2.8750E-01 7.875E-01 1.281E+00 - 3.3750E-01 7.875E-01 1.279E+00 - 3.8750E-01 7.875E-01 1.274E+00 - 4.3750E-01 7.875E-01 1.267E+00 - 4.8750E-01 7.875E-01 1.257E+00 - 5.3750E-01 7.875E-01 1.243E+00 - 5.8750E-01 7.875E-01 1.226E+00 - 0.0000E+00 8.000E-01 1.240E+00 - 5.0000E-02 8.000E-01 1.240E+00 - 1.0000E-01 8.000E-01 1.240E+00 - 1.5000E-01 8.000E-01 1.240E+00 - 2.0000E-01 8.000E-01 1.240E+00 - 2.5000E-01 8.000E-01 1.240E+00 - 3.0000E-01 8.000E-01 1.239E+00 - 3.5000E-01 8.000E-01 1.238E+00 - 4.0000E-01 8.000E-01 1.235E+00 - 4.5000E-01 8.000E-01 1.230E+00 - 5.0000E-01 8.000E-01 1.224E+00 - 5.5000E-01 8.000E-01 1.214E+00 - 6.0000E-01 8.000E-01 1.202E+00 - 1.2500E-02 8.125E-01 1.213E+00 - 6.2500E-02 8.125E-01 1.213E+00 - 1.1250E-01 8.125E-01 1.213E+00 - 1.6250E-01 8.125E-01 1.213E+00 - 2.1250E-01 8.125E-01 1.212E+00 - 2.6250E-01 8.125E-01 1.212E+00 - 3.1250E-01 8.125E-01 1.212E+00 - 3.6250E-01 8.125E-01 1.211E+00 - 4.1250E-01 8.125E-01 1.209E+00 - 4.6250E-01 8.125E-01 1.206E+00 - 0.0000E+00 8.250E-01 1.190E+00 - 5.0000E-02 8.250E-01 1.190E+00 - 1.0000E-01 8.250E-01 1.190E+00 - 1.5000E-01 8.250E-01 1.190E+00 - 2.0000E-01 8.250E-01 1.189E+00 - 2.5000E-01 8.250E-01 1.189E+00 - 3.0000E-01 8.250E-01 1.189E+00 - 3.5000E-01 8.250E-01 1.189E+00 - 4.0000E-01 8.250E-01 1.187E+00 - 4.5000E-01 8.250E-01 1.185E+00 - 5.0000E-01 8.250E-01 1.182E+00 - - Statistics: - Time = 0.2500 - Total number of accepted timesteps = 161 - Total number of rejected timesteps = 2 - - Total number (rounded) of - Residual Jacobian Newton Lin sys - evals evals iters iters - At level - 1 1000 200 400 400 - 2 200 20 50 50 - - Maximum number of - Newton iters Lin sys iters - At level - 1 4 3 - 2 4 1 diff --git a/simple_examples/baseresults/d03rbje.r b/simple_examples/baseresults/d03rbje.r deleted file mode 100644 index f49a127..0000000 --- a/simple_examples/baseresults/d03rbje.r +++ /dev/null @@ -1,59 +0,0 @@ - D03RBJ Example Program Results - - Solution at every 2nd grid point in level 1 at time 1.0000: - - x y approx u exact u approx v exact v - - 0.00 0.00 0.50 0.50 1.00 1.00 - 0.20 0.00 0.50 0.50 1.00 1.00 - 0.10 0.10 0.50 0.50 1.00 1.00 - 0.30 0.10 0.50 0.50 1.00 1.00 - 0.50 0.10 0.50 0.50 1.00 1.00 - 0.70 0.10 0.50 0.50 1.00 1.00 - 0.90 0.10 0.50 0.50 1.00 1.00 - 0.00 0.20 0.50 0.50 1.00 1.00 - 0.20 0.20 0.50 0.50 1.00 1.00 - 0.40 0.20 0.50 0.50 1.00 1.00 - 0.60 0.20 0.50 0.50 1.00 1.00 - 0.80 0.20 0.50 0.50 1.00 1.00 - 1.00 0.20 0.50 0.50 1.00 1.00 - 0.10 0.30 0.50 0.50 1.00 1.00 - 0.30 0.30 0.50 0.50 1.00 1.00 - 0.50 0.30 0.50 0.50 1.00 1.00 - 0.70 0.30 0.50 0.50 1.00 1.00 - 0.90 0.30 0.50 0.50 1.00 1.00 - 0.00 0.40 0.75 0.75 0.75 0.75 - 0.20 0.40 0.50 0.50 1.00 1.00 - 0.40 0.40 0.50 0.50 1.00 1.00 - 0.80 0.40 0.50 0.50 1.00 1.00 - 1.00 0.40 0.50 0.50 1.00 1.00 - 0.10 0.50 0.75 0.75 0.75 0.75 - 0.30 0.50 0.50 0.50 1.00 1.00 - 0.50 0.50 0.50 0.50 1.00 1.00 - 0.70 0.50 0.50 0.50 1.00 1.00 - 0.90 0.50 0.50 0.50 1.00 1.00 - 0.00 0.60 0.75 0.75 0.75 0.75 - 0.20 0.60 0.75 0.75 0.75 0.75 - 0.40 0.60 0.50 0.50 1.00 1.00 - 0.60 0.60 0.50 0.50 1.00 1.00 - 0.80 0.60 0.50 0.50 1.00 1.00 - 1.00 0.60 0.50 0.50 1.00 1.00 - 0.10 0.70 0.75 0.75 0.75 0.75 - 0.30 0.70 0.75 0.75 0.75 0.75 - 0.50 0.70 0.50 0.50 1.00 1.00 - 0.70 0.70 0.50 0.50 1.00 1.00 - 0.90 0.70 0.50 0.50 1.00 1.00 - 0.00 0.80 0.75 0.75 0.75 0.75 - 0.20 0.80 0.75 0.75 0.75 0.75 - 0.40 0.80 0.75 0.75 0.75 0.75 - 0.60 0.80 0.50 0.50 1.00 1.00 - 0.80 0.80 0.50 0.50 1.00 1.00 - 0.10 0.90 0.75 0.75 0.75 0.75 - 0.30 0.90 0.75 0.75 0.75 0.75 - 0.50 0.90 0.75 0.75 0.75 0.75 - 0.70 0.90 0.50 0.50 1.00 1.00 - 0.00 1.00 0.75 0.75 0.75 0.75 - 0.20 1.00 0.75 0.75 0.75 0.75 - 0.40 1.00 0.75 0.75 0.75 0.75 - 0.60 1.00 0.75 0.75 0.75 0.75 - 0.80 1.00 0.50 0.50 1.00 1.00 diff --git a/simple_examples/baseresults/d05baje.r b/simple_examples/baseresults/d05baje.r deleted file mode 100644 index 0833ea2..0000000 --- a/simple_examples/baseresults/d05baje.r +++ /dev/null @@ -1,12 +0,0 @@ -D05BAJ Example Program Results - -Size of workplace = 486 -Tolerance = 1.0000e-03 - -T Approx. Sol. True Sol. Est. Error Actual Error -3.33 1.80037 1.80033 8.03776e-05 2.38466e-05 -6.67 2.23916 2.23911 1.77740e-04 2.34772e-05 -10.00 2.54310 2.54304 2.45949e-04 2.24564e-05 -13.33 2.77587 2.77581 3.05737e-04 2.17430e-05 -16.67 2.96456 2.96450 3.61698e-04 2.13821e-05 -20.00 3.12324 3.12317 4.17127e-04 2.13102e-05 diff --git a/simple_examples/baseresults/d05beje.r b/simple_examples/baseresults/d05beje.r deleted file mode 100644 index 95731f4..0000000 --- a/simple_examples/baseresults/d05beje.r +++ /dev/null @@ -1,46 +0,0 @@ -D05BEJ Example Program Results - -Example 1 - -The stepsize h = 0.1000 - - T Approximate - Solution - - 0.5000 0.1191 - 1.0000 0.0528 - 1.5000 0.0265 - 2.0000 0.0146 - 2.5000 0.0086 - 3.0000 0.0052 - 3.5000 0.0033 - 4.0000 0.0022 - 4.5000 0.0014 - 5.0000 0.0010 - 5.5000 0.0007 - 6.0000 0.0004 - 6.5000 0.0003 - 7.0000 0.0002 - -The maximum absolute error, 2.86e-03, occured at T = 0.1000 with solution 0.0326 - - -Example 2 - -The stepsize h = 0.0714 - - T Approximate - Solution - - 0.5000 0.6667 - 1.0000 0.5000 - 1.5000 0.4000 - 2.0000 0.3333 - 2.5000 0.2857 - 3.0000 0.2500 - 3.5000 0.2222 - 4.0000 0.2000 - 4.5000 0.1818 - 5.0000 0.1667 - -The maximum absolute error, 3.17e-06, occured at T = 0.0714 with solution 0.9333 \ No newline at end of file diff --git a/simple_examples/baseresults/dtfsmje.r b/simple_examples/baseresults/dtfsmje.r deleted file mode 100644 index 761a9ed..0000000 --- a/simple_examples/baseresults/dtfsmje.r +++ /dev/null @@ -1,10 +0,0 @@ - DTFSMJ Example Program Results - - The Solution - 1 2 3 4 - 1 13.5562 5.7677 9.7251 1.2209 - 2 -10.1040 -1.9787 -8.9252 -4.4205 - 3 -0.8280 0.2386 2.0348 2.0769 - 4 2.8488 -7.1745 -3.7925 -2.9505 - 5 -3.9321 0.8652 -1.4082 3.1217 - 6 -2.3127 1.8398 2.0152 1.5198 diff --git a/simple_examples/baseresults/e01daje.r b/simple_examples/baseresults/e01daje.r deleted file mode 100644 index a9c2ddb..0000000 --- a/simple_examples/baseresults/e01daje.r +++ /dev/null @@ -1,25 +0,0 @@ - E01DAJ Example Program Results - - I Knot LAMDA(I) J Knot MU(j) - 4 1.0000 4 0.0000 - 5 1.3000 5 0.4000 - 6 1.5000 6 0.7000 - 7 1.6000 7 1.0000 - 8 2.0000 - - The B-Spline coefficients: - 1.0000 1.1333 1.3667 1.7000 1.9000 2.0000 1.2000 1.3333 - 1.5667 1.9000 2.1000 2.2000 1.5833 1.7167 1.9500 2.2833 - 2.4833 2.5833 2.1433 2.2767 2.5100 2.8433 3.0433 3.1433 - 2.8667 3.0000 3.2333 3.5667 3.7667 3.8667 3.4667 3.6000 - 3.8333 4.1667 4.3667 4.4667 4.0000 4.1333 4.3667 4.7000 - 4.9000 5.0000 - - Spline evaluated on a regular mesh (X across, Y down): - 1.00 1.20 1.40 1.60 1.80 2.00 - 0.00 1.000 1.440 1.960 2.560 3.240 4.000 - 0.20 1.200 1.640 2.160 2.760 3.440 4.200 - 0.40 1.400 1.840 2.360 2.960 3.640 4.400 - 0.60 1.600 2.040 2.560 3.160 3.840 4.600 - 0.80 1.800 2.240 2.760 3.360 4.040 4.800 - 1.00 2.000 2.440 2.960 3.560 4.240 5.000 diff --git a/simple_examples/baseresults/e02alje.r b/simple_examples/baseresults/e02alje.r deleted file mode 100644 index 6dfc758..0000000 --- a/simple_examples/baseresults/e02alje.r +++ /dev/null @@ -1,24 +0,0 @@ -E02ALJ Example Program Results - - Polynomial coefficients - 1.0000e+00 - 1.0001e+00 - 4.9909e-01 - 1.7042e-01 - 3.4784e-02 - 1.3909e-02 - - Reference deviation = 1.09e-06 - - X Fit exp(x) Residual - 0.00 1.0000 1.0000 -1.09e-06 - 0.10 1.1052 1.1052 9.74e-07 - 0.20 1.2214 1.2214 -7.44e-07 - 0.30 1.3499 1.3499 -9.18e-07 - 0.40 1.4918 1.4918 2.99e-07 - 0.50 1.6487 1.6487 1.09e-06 - 0.60 1.8221 1.8221 4.59e-07 - 0.70 2.0138 2.0138 -8.16e-07 - 0.80 2.2255 2.2255 -8.42e-07 - 0.90 2.4596 2.4596 8.75e-07 - 1.00 2.7183 2.7183 -1.09e-06 diff --git a/simple_examples/baseresults/e04abje.r b/simple_examples/baseresults/e04abje.r deleted file mode 100644 index 18b685b..0000000 --- a/simple_examples/baseresults/e04abje.r +++ /dev/null @@ -1,6 +0,0 @@ -E04ABJ Example Program Results - -The minimum lies in the interval 4.49340940 to 4.49340951 -Its estimated position is 4.49340945, -where the function value is -0.2172 -10 function evaluations were required diff --git a/simple_examples/baseresults/e04bbje.r b/simple_examples/baseresults/e04bbje.r deleted file mode 100644 index 86a41ba..0000000 --- a/simple_examples/baseresults/e04bbje.r +++ /dev/null @@ -1,7 +0,0 @@ -E04BBJ Example Program Results - -The minimum lies in the interval 4.49340946 to 4.49340952 -Its estimated position is 4.49340946, -where the function value is -0.2172 -and the gradient is -3.8e-16 (machine dependent) -6 function evaluations were required diff --git a/simple_examples/baseresults/e04cbje.r b/simple_examples/baseresults/e04cbje.r deleted file mode 100644 index 67cd53d..0000000 --- a/simple_examples/baseresults/e04cbje.r +++ /dev/null @@ -1,4 +0,0 @@ -E04CBJ Example Program Results - -The final function value is 0.0000 -at the point 0.5000 -0.9999 diff --git a/simple_examples/baseresults/e04fcje.r b/simple_examples/baseresults/e04fcje.r deleted file mode 100644 index bd90f04..0000000 --- a/simple_examples/baseresults/e04fcje.r +++ /dev/null @@ -1,22 +0,0 @@ - E04FCJ Example Program Results - - On exit, the sum of squares is 0.0082 - at the point 0.0824 1.1330 2.3437 - The estimated gradient is -1.607e-09 -7.436e-11 6.130e-10 - (machine dependent) - and the residuals are - -5.9e-03 - -2.7e-04 - 2.7e-04 - 6.5e-03 - -8.2e-04 - -1.3e-03 - -4.5e-03 - -2.0e-02 - 8.2e-02 - -1.8e-02 - -1.5e-02 - -1.5e-02 - -1.1e-02 - -4.2e-03 - 6.8e-03 diff --git a/simple_examples/baseresults/e04ffje.r b/simple_examples/baseresults/e04ffje.r deleted file mode 100644 index a772ab7..0000000 --- a/simple_examples/baseresults/e04ffje.r +++ /dev/null @@ -1,73 +0,0 @@ - E04FFJ Example Program Results - - --------------------------------------------------- - E04F(G|F)), Derivative free solver for data fitting - (nonlinear least-squares problems) - --------------------------------------------------- - - Problem statistics - Number of variables 4 - Number of unconstrained variables 2 - Number of fixed variables 0 - Starting interpolation points 5 - Total interpolation points 5 - Number of residuals 11 - - Begin of Options - Print File = 6 * d - Print Level = 2 * d - Print Options = Yes * d - Print Solution = All * U - Monitoring File = -1 * d - Monitoring Level = 4 * d - Dfo Print Frequency = 1 * d - Dfo Monitor Frequency = 0 * d - - Infinite Bound Size = 1.00000E+20 * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Dfo Initial Interp Points = Coordinate * d - Dfo Max Objective Calls = 500 * d - Dfo Max Soft Restarts = 5 * d - Dfo Max Unsucc Soft Restarts = 3 * d - Dfo Maximum Slow Steps = 20 * d - Dfo Noise Level = 0.00000E+00 * d - Dfo Noisy Problem = No * d - Dfo Number Initial Points = 0 * d - Dfo Number Interp Points = 0 * d - Dfo Number Soft Restarts Pts = 3 * d - Dfo Random Seed = -1 * d - Dfo Starting Trust Region = 1.00000E-01 * d - Dfo Trust Region Slow Tol = 1.02648E-04 * d - Dfo Trust Region Tolerance = 5.00000E-06 * U - Dfo Version = Latest * d - Dfls Small Residuals Tol = 1.08158E-12 * d - End of Options - ---------------------------------------- - step | obj rho | nf | - ---------------------------------------- - 1 | 1.72E-03 1.00E-01 | 6 | - 2 | 6.41E-04 1.00E-01 | 7 | - 3 | 4.52E-04 1.00E-01 | 8 | - 4 | 4.05E-04 1.00E-02 | 9 | - 5 | 4.04E-04 1.00E-02 | 10 | - 6 | 4.03E-04 1.00E-02 | 14 | - 7 | 4.02E-04 1.00E-02 | 15 | - 8 | 4.02E-04 1.00E-03 | 20 | - 9 | 4.02E-04 7.07E-05 | 21 | - 10 | 4.02E-04 7.07E-05 | 23 | s - ---------------------------------------- - Status: Converged, small trust region size - - Value of the objective 4.02423E-04 - Number of objective function evaluations 27 - Number of steps 10 - - - Primal variables: - idx Lower bound Value Upper bound - 1 -inf 1.81300E-01 inf - 2 2.00000E-01 5.90128E-01 1.00000E+00 - 3 -inf 2.56929E-01 inf - 4 3.00000E-01 3.00000E-01 inf diff --git a/simple_examples/baseresults/e04gbje.r b/simple_examples/baseresults/e04gbje.r deleted file mode 100644 index 6e9e25e..0000000 --- a/simple_examples/baseresults/e04gbje.r +++ /dev/null @@ -1,22 +0,0 @@ - E04GBJ Example Program Results - - On exit, the sum of squares is 0.0082 - at the point 0.0824 1.1330 2.3437 - The corresponding gradient is 1.199E-09 -1.865E-11 1.807E-11 - (machine dependent) - and the residuals are - -5.9E-03 - -2.7E-04 - 2.7E-04 - 6.5E-03 - -8.2E-04 - -1.3E-03 - -4.5E-03 - -2.0E-02 - 8.2E-02 - -1.8E-02 - -1.5E-02 - -1.5E-02 - -1.1E-02 - -4.2E-03 - 6.8E-03 diff --git a/simple_examples/baseresults/e04ggje.r b/simple_examples/baseresults/e04ggje.r deleted file mode 100644 index b5dd970..0000000 --- a/simple_examples/baseresults/e04ggje.r +++ /dev/null @@ -1,44 +0,0 @@ - E04GGJ Example Program Results - - E04GG, Nonlinear least squares method for bound-constrained problems - Begin of Options - Print File = 6 * d - Print Level = 1 * U - Print Options = Yes * d - Print Solution = No * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - - Infinite Bound Size = 1.00000E+20 * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Bxnl Model = Gauss-newton * U - Bxnl Nlls Method = Galahad * d - Bxnl Glob Method = Reg * U - Bxnl Reg Order = Auto * d - Bxnl Tn Method = Min-1-var * d - Bxnl Basereg Type = None * d - Bxnl Basereg Pow = 2.00000E+00 * d - Bxnl Basereg Term = 1.00000E-02 * d - Bxnl Iteration Limit = 1000 * d - Bxnl Monitor Frequency = 0 * d - Bxnl Print Header = 30 * d - Bxnl Save Covariance Matrix = No * d - Bxnl Stop Abs Tol Fun = 1.05367E-08 * d - Bxnl Stop Abs Tol Grd = 1.05737E-05 * d - Bxnl Stop Rel Tol Fun = 1.05367E-08 * d - Bxnl Stop Rel Tol Grd = 1.05367E-08 * d - Bxnl Stop Step Tol = 2.22045E-16 * d - Bxnl Use Second Derivatives = Yes * U - Bxnl Use Weights = No * d - End of Options - - Status: converged, an optimal solution was found - Value of the objective 2.17328E-06 - Norm of projected gradient 1.51989E-08 - Norm of scaled projected gradient 7.29019E-06 - Norm of step 4.98107E-04 - -Solver stored solution iterate in the handle -X: 4.45E-01 1.87E+00 3.07E+00 4.64E+00 -9.98E-01 4.64E+00 diff --git a/simple_examples/baseresults/e04mtje.r b/simple_examples/baseresults/e04mtje.r deleted file mode 100644 index 033d40f..0000000 --- a/simple_examples/baseresults/e04mtje.r +++ /dev/null @@ -1,162 +0,0 @@ - E04MTJ Example Program Results - -++++++++++ Use the Primal-Dual algorithm ++++++++++ - - ---------------------------------------------- - E04MT, Interior point method for LP problems - ---------------------------------------------- - - Original Problem Statistics - - Number of variables 7 - Number of constraints 7 - Free variables 0 - Number of nonzeros 41 - - - Presolved Problem Statistics - - Number of variables 13 - Number of constraints 7 - Free variables 0 - Number of nonzeros 47 - - - ------------------------------------------------------------------------------ - it| pobj | dobj | optim | feas | compl | mu | mcc | I - ------------------------------------------------------------------------------ - 0 -7.86591E-02 1.71637E-02 1.27E+00 1.06E+00 8.89E-02 1.5E-01 - 1 5.74135E-03 -2.24369E-02 6.11E-16 1.75E-01 2.25E-02 2.8E-02 0 - 2 1.96803E-02 1.37067E-02 5.06E-16 2.28E-02 2.91E-03 3.4E-03 0 - 3 2.15232E-02 1.96162E-02 7.00E-15 9.24E-03 1.44E-03 1.7E-03 0 - 4 2.30321E-02 2.28676E-02 1.15E-15 2.21E-03 2.97E-04 3.4E-04 0 - 5 2.35658E-02 2.35803E-02 1.32E-15 1.02E-04 8.41E-06 9.6E-06 0 - 6 2.35965E-02 2.35965E-02 1.64E-15 7.02E-08 6.35E-09 7.2E-09 0 -Iteration 7 - monit() reports good approximate solution (tol = 1.20E-08): - 7 2.35965E-02 2.35965E-02 1.35E-15 3.52E-11 3.18E-12 3.6E-12 0 - ------------------------------------------------------------------------------ - Status: converged, an optimal solution found - ------------------------------------------------------------------------------ - Final primal objective value 2.359648E-02 - Final dual objective value 2.359648E-02 - Absolute primal infeasibility 4.168797E-15 - Relative primal infeasibility 1.350467E-15 - Absolute dual infeasibility 5.084353E-11 - Relative dual infeasibility 3.518607E-11 - Absolute complementarity gap 2.685778E-11 - Relative complementarity gap 3.175366E-12 - Iterations 7 - - Primal variables: - idx Lower bound Value Upper bound - 1 -1.00000E-02 -1.00000E-02 1.00000E-02 - 2 -1.00000E-01 -1.00000E-01 1.50000E-01 - 3 -1.00000E-02 3.00000E-02 3.00000E-02 - 4 -4.00000E-02 2.00000E-02 2.00000E-02 - 5 -1.00000E-01 -6.74853E-02 5.00000E-02 - 6 -1.00000E-02 -2.28013E-03 inf - 7 -1.00000E-02 -2.34528E-04 inf - - Box bounds dual variables: - idx Lower bound Value Upper bound Value - 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 - 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 - 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 - 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 - 5 -1.00000E-01 3.51391E-11 5.00000E-02 0.00000E+00 - 6 -1.00000E-02 3.42902E-11 inf 0.00000E+00 - 7 -1.00000E-02 8.61040E-12 inf 0.00000E+00 - - Constraints dual variables: - idx Lower bound Value Upper bound Value - 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 - 2 -inf 0.00000E+00 -4.90000E-03 4.00339E-10 - 3 -inf 0.00000E+00 -6.40000E-03 1.54305E-08 - 4 -inf 0.00000E+00 -3.70000E-03 3.80136E-10 - 5 -inf 0.00000E+00 -1.20000E-03 4.72629E-11 - 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 - 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 - -++++++++++ Use the Self-Dual algorithm ++++++++++ - - ---------------------------------------------- - E04MT, Interior point method for LP problems - ---------------------------------------------- - - Original Problem Statistics - - Number of variables 7 - Number of constraints 7 - Free variables 0 - Number of nonzeros 41 - - - Presolved Problem Statistics - - Number of variables 13 - Number of constraints 7 - Free variables 0 - Number of nonzeros 47 - - - ------------------------------------------------------------------------------ - it| pobj | dobj | p.inf | d.inf | d.gap | tau | mcc | I - ------------------------------------------------------------------------------ - 0 -6.39941E-01 4.94000E-02 1.07E+01 2.69E+00 5.54E+00 1.0E+00 - 1 -8.56025E-02 -1.26938E-02 2.07E-01 2.07E-01 2.07E-01 1.7E+00 0 - 2 4.09196E-03 1.24373E-02 4.00E-02 4.00E-02 4.00E-02 2.8E+00 0 - 3 1.92404E-02 2.03658E-02 6.64E-03 6.64E-03 6.64E-03 3.2E+00 1 - 4 1.99631E-02 2.07574E-02 3.23E-03 3.23E-03 3.23E-03 2.3E+00 1 - 5 2.03834E-02 2.11141E-02 1.68E-03 1.68E-03 1.68E-03 1.4E+00 0 - 6 2.22419E-02 2.25057E-02 5.73E-04 5.73E-04 5.73E-04 1.4E+00 1 - 7 2.35051E-02 2.35294E-02 6.58E-05 6.58E-05 6.58E-05 1.4E+00 6 - 8 2.35936E-02 2.35941E-02 1.19E-06 1.19E-06 1.19E-06 1.4E+00 0 -Iteration 9 - monit() reports good approximate solution (tol = 1.20E-08): - 9 2.35965E-02 2.35965E-02 5.37E-10 5.37E-10 5.37E-10 1.4E+00 0 -Iteration 10 - monit() reports good approximate solution (tol = 1.20E-08): - 10 2.35965E-02 2.35965E-02 2.68E-13 2.68E-13 2.68E-13 1.4E+00 0 - ------------------------------------------------------------------------------ - Status: converged, an optimal solution found - ------------------------------------------------------------------------------ - Final primal objective value 2.359648E-02 - Final dual objective value 2.359648E-02 - Absolute primal infeasibility 2.853383E-12 - Relative primal infeasibility 2.677658E-13 - Absolute dual infeasibility 1.485749E-12 - Relative dual infeasibility 2.679654E-13 - Absolute complementarity gap 7.228861E-13 - Relative complementarity gap 2.683908E-13 - Iterations 10 - - Primal variables: - idx Lower bound Value Upper bound - 1 -1.00000E-02 -1.00000E-02 1.00000E-02 - 2 -1.00000E-01 -1.00000E-01 1.50000E-01 - 3 -1.00000E-02 3.00000E-02 3.00000E-02 - 4 -4.00000E-02 2.00000E-02 2.00000E-02 - 5 -1.00000E-01 -6.74853E-02 5.00000E-02 - 6 -1.00000E-02 -2.28013E-03 inf - 7 -1.00000E-02 -2.34528E-04 inf - - Box bounds dual variables: - idx Lower bound Value Upper bound Value - 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 - 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 - 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 - 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 - 5 -1.00000E-01 3.66960E-12 5.00000E-02 0.00000E+00 - 6 -1.00000E-02 2.47652E-11 inf 0.00000E+00 - 7 -1.00000E-02 7.82645E-13 inf 0.00000E+00 - - Constraints dual variables: - idx Lower bound Value Upper bound Value - 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 - 2 -inf 0.00000E+00 -4.90000E-03 1.07904E-10 - 3 -inf 0.00000E+00 -6.40000E-03 1.14799E-09 - 4 -inf 0.00000E+00 -3.70000E-03 4.09190E-12 - 5 -inf 0.00000E+00 -1.20000E-03 1.52421E-12 - 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 - 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 diff --git a/simple_examples/baseresults/e04mxje.r b/simple_examples/baseresults/e04mxje.r deleted file mode 100644 index 1928db4..0000000 --- a/simple_examples/baseresults/e04mxje.r +++ /dev/null @@ -1,38 +0,0 @@ - E04MXJ Example Program Results - - MPSX INPUT LISTING - ------------------ - Searching for indicator line - Line 1: Found NAME indicator line - Query mode - Ignoring NAME data. - Line 2: Found ROWS indicator line - Query mode - Counting ROWS data. - Line 7: Found COLUMNS indicator line - Query mode - Counting COLUMNS data. - Line 26: Found RHS indicator line - Query mode - Ignoring RHS data. - Line 31: Found RANGES indicator line - Query mode - Ignoring RANGES data. - Line 35: Found BOUNDS indicator line - Query mode - Counting BOUNDS data. - Line 54: Found QUADOBJ indicator line - Query mode - Counting QUADOBJ data. - Query mode - End of QUADOBJ data. Exit - - MPSX INPUT LISTING - ------------------ - Searching for indicator line - Line 1: Found NAME indicator line - Line 2: Found ROWS indicator line - Line 7: Found COLUMNS indicator line - Line 26: Found RHS indicator line - Line 31: Found RANGES indicator line - Line 35: Found BOUNDS indicator line - Line 54: Found QUADOBJ indicator line - Line 64: Found ENDATA indicator line - - Problem contains 9 variables and 4 linear constraints - - Final objective value = -8.068E+00 - Optimal X = - 2.00 -0.23 -0.27 -0.30 -0.10 2.00 2.00 -1.78 -0.46 diff --git a/simple_examples/baseresults/e04ncje.r b/simple_examples/baseresults/e04ncje.r deleted file mode 100644 index 65a6326..0000000 --- a/simple_examples/baseresults/e04ncje.r +++ /dev/null @@ -1,23 +0,0 @@ - E04NCJ Example Program Results - - Varbl Istate Value Lagr Mult - - V 1 1 0.000E+00 1.572E-01 - V 2 0 4.153E-02 0.000E+00 - V 3 0 5.872E-01 0.000E+00 - V 4 1 0.000E+00 8.782E-01 - V 5 0 9.964E-02 0.000E+00 - V 6 1 0.000E+00 1.473E-01 - V 7 0 4.906E-02 0.000E+00 - V 8 1 0.000E+00 8.603E-01 - V 9 0 3.056E-01 0.000E+00 - - - L Con Istate Value Lagr Mult - - L 1 1 2.000E+00 3.777E-01 - L 2 2 2.000E+00 -5.791E-02 - L 3 1 1.000E+00 1.075E-01 - - - Final objective value = 8.134E-02 diff --git a/simple_examples/baseresults/e04nfje.r b/simple_examples/baseresults/e04nfje.r deleted file mode 100644 index 13101d2..0000000 --- a/simple_examples/baseresults/e04nfje.r +++ /dev/null @@ -1,66 +0,0 @@ - E04NFJ Example Program Results - - *** e04nf - - Parameters - ---------- - - Problem type........... QP2 - - Linear constraints..... 7 Feasibility tolerance.. 1.05E-08 - Variables.............. 7 Optimality tolerance... 1.05E-08 - Hessian rows........... 7 Rank tolerance......... 1.11E-14 - - Infinite bound size.... 1.00E+20 COLD start............. - Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 - - Check frequency........ 50 Expand frequency....... 5 - Minimum sum of infeas.. NO Crash tolerance........ 1.00E-02 - - Max degrees of freedom. 7 Print level............ 10 - Feasibility phase itns. 70 Monitoring file........ -1 - Optimality phase itns. 70 - - Workspace provided is IWORK( 17), WORK( 189). - To solve problem we need IWORK( 17), WORK( 189). - - - Itn Step Ninf Sinf/Objective Norm Gz - 0 0.0E+00 3 1.038000E-01 0.0E+00 - 1 4.1E-02 1 3.000000E-02 0.0E+00 - 2 4.2E-02 0 0.000000E+00 0.0E+00 - Itn 2 -- Feasible point found. - 2 0.0E+00 0 4.580000E-02 0.0E+00 - 3 1.3E-01 0 4.161596E-02 0.0E+00 - 4 1.0E+00 0 3.936227E-02 4.2E-17 - 5 4.1E-01 0 3.758935E-02 1.2E-02 - 6 1.0E+00 0 3.755377E-02 1.0E-17 - 7 1.0E+00 0 3.703165E-02 3.8E-17 - - - Varbl State Value Lower Bound Upper Bound Lagr Mult Slack - - V 1 LL -1.000000E-02 -1.000000E-02 1.000000E-02 0.4700 . - V 2 FR -6.986465E-02 -0.100000 0.150000 . 3.0135E-02 - V 3 FR 1.825915E-02 -1.000000E-02 3.000000E-02 . 1.1741E-02 - V 4 FR -2.426081E-02 -4.000000E-02 2.000000E-02 . 1.5739E-02 - V 5 FR -6.200564E-02 -0.100000 5.000000E-02 . 3.7994E-02 - V 6 FR 1.380544E-02 -1.000000E-02 None . 2.3805E-02 - V 7 FR 4.066496E-03 -1.000000E-02 None . 1.4066E-02 - - - L Con State Value Lower Bound Upper Bound Lagr Mult Slack - - L 1 EQ -0.130000 -0.130000 -0.130000 -1.908 -5.5511E-17 - L 2 FR -5.879898E-03 None -4.900000E-03 . 9.7990E-04 - L 3 UL -6.400000E-03 None -6.400000E-03 -0.3144 8.6736E-19 - L 4 FR -4.537323E-03 None -3.700000E-03 . 8.3732E-04 - L 5 FR -2.915996E-03 None -1.200000E-03 . 1.7160E-03 - L 6 LL -9.920000E-02 -9.920000E-02 None 1.955 . - L 7 LL -3.000000E-03 -3.000000E-03 2.000000E-03 1.972 4.3368E-18 - - Exit e04nf - Optimal QP solution. - - Final QP objective value = 0.3703165E-01 - - Exit from QP problem after 7 iterations. diff --git a/simple_examples/baseresults/e04nkje.r b/simple_examples/baseresults/e04nkje.r deleted file mode 100644 index bbfdea9..0000000 --- a/simple_examples/baseresults/e04nkje.r +++ /dev/null @@ -1,26 +0,0 @@ -E04NKJ Example Program Results - - Variable Istate Value Lagr Mult - - ...X1... 0 0.00000 2361 - ...X2... 3 349.399 -3.657e-12 - ...X3... 2 648.853 -5.924e-12 - ...X4... 2 172.847 1.949e-12 - ...X5... 3 407.521 0.000 - ...X6... 3 271.356 -3.280e-12 - ...X7... 3 150.023 -1.413e-12 - - - Constrnt Istate Value Lagr Mult - - ..ROW1.. 0 2000.00 -1.290e+04 - ..ROW2.. 3 49.2316 0.000 - ..ROW3.. 1 100.000 -2325 - ..ROW4.. 3 32.0719 0.000 - ..ROW5.. 3 14.5572 0.000 - ..ROW6.. 0 1500.00 1.445e+04 - ..ROW7.. 0 250.000 1.458e+04 - ..COST.. 3 -2.98869e+06 -1.000 - - -Final objetive value = -1847785 diff --git a/simple_examples/baseresults/e04nqje.r b/simple_examples/baseresults/e04nqje.r deleted file mode 100644 index 8515ce8..0000000 --- a/simple_examples/baseresults/e04nqje.r +++ /dev/null @@ -1,6 +0,0 @@ - E04NQJ Example Program Results - - QP problem contains 7 variables and 8 linear constraints - - Final objective value = -1.848E+06 - Optimal X = 0.00 349.40 648.85 172.85 407.52 271.36 150.02 diff --git a/simple_examples/baseresults/e04ptje.r b/simple_examples/baseresults/e04ptje.r deleted file mode 100644 index 24d78ba..0000000 --- a/simple_examples/baseresults/e04ptje.r +++ /dev/null @@ -1,39 +0,0 @@ -E04PTJ Example Program Results - - - ------------------------------------------------ - E04PT, Interior point method for SOCP problems - ------------------------------------------------ - - Begin of Options - Print File = 6 * d - Print Level = 1 * U - Print Options = Yes * d - Print Solution = No * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - Socp Monitor Frequency = 1 * U - - Infinite Bound Size = 1.00000E+20 * d - Task = Minimize * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Socp Iteration Limit = 100 * d - Socp Max Iterative Refinement = 9 * d - Socp Presolve = Yes * d - Socp Scaling = None * d - Socp Stop Tolerance = 1.05367E-08 * d - Socp Stop Tolerance 2 = 1.05367E-08 * d - Socp System Formulation = Auto * d - End of Options - -monit() reports good approximate solution (tol = 1.00E-07) - Status: converged, an optimal solution found - Final primal objective value 2.571350E+00 - Final dual objective value 2.571350E+00 - Optimal X: - x_idx Value - 1 1.174E+00 - 2 -4.257E+00 - 3 9.814E-01 diff --git a/simple_examples/baseresults/e04rpje.r b/simple_examples/baseresults/e04rpje.r deleted file mode 100644 index 93e29fb..0000000 --- a/simple_examples/baseresults/e04rpje.r +++ /dev/null @@ -1,105 +0,0 @@ -E04RPJ Example Program Results - -Passing SDP problem to solver - - Overview - Status: Problem and option settings are editable. - No of variables: 5 - Objective function: linear - Simple bounds: not defined yet - Linear constraints: not defined yet - Nonlinear constraints: not defined yet - Cone constraints: not defined yet - Matrix constraints: 2 - Matrix constraints - IDblk = 1, size = 2 x 2, polynomial of order 2 - IDblk = 2, size = 2 x 2, linear - E04SV, NLP-SDP Solver (Pennon) - ------------------------------ - Number of variables 5 [eliminated 0] - simple linear nonlin - (Standard) inequalities 0 0 0 - (Standard) equalities 0 0 - Matrix inequalities 1 1 [dense 2, sparse 0] - [max dimension 2] - - Begin of Options - Print File = 6 * d - Print Level = 2 * d - Print Options = Yes * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - Monitor Frequency = 0 * d - - Infinite Bound Size = 1.00000E+20 * d - Task = Minimize * d - Stats Time = No * d - - Dimacs Measures = No * S - Hessian Density = Dense * S - Init Value P = 1.00000E+00 * d - Init Value Pmat = 1.00000E+00 * d - Initial P = Automatic * d - Initial U = Automatic * d - Initial X = User * d - Inner Iteration Limit = 100 * d - Inner Stop Criteria = Heuristic * d - Inner Stop Tolerance = 1.00000E-02 * d - Linesearch Mode = Goldstein * S - Outer Iteration Limit = 100 * d - P Min = 1.05367E-08 * d - P Update Speed = 12 * d - Pmat Min = 1.05367E-08 * d - Preference = Speed * d - Presolve Block Detect = Yes * d - Stop Criteria = Soft * d - Stop Tolerance 1 = 1.00000E-06 * d - Stop Tolerance 2 = 1.00000E-07 * d - Stop Tolerance Feasibility = 1.00000E-07 * d - Transform Constraints = No * S - U Update Restriction = 5.00000E-01 * d - Umat Update Restriction = 3.00000E-01 * d - End of Options - -------------------------------------------------------------- - it| objective | optim | feas | compl | pen min |inner - -------------------------------------------------------------- - 0 0.00000E+00 1.82E+01 1.00E+00 4.00E+00 2.00E+00 0 - 1 4.11823E+00 3.85E-03 0.00E+00 1.73E+00 2.00E+00 6 - 2 2.58252E+00 5.36E-03 0.00E+00 4.93E-01 9.04E-01 4 - 3 2.06132E+00 1.02E-03 0.00E+00 7.70E-02 4.08E-01 4 - 4 2.00050E+00 3.00E-03 8.91E-03 1.78E-02 1.85E-01 3 - 5 1.99929E+00 1.55E-03 3.16E-03 3.65E-03 8.34E-02 2 - 6 1.99985E+00 1.03E-04 3.16E-04 7.19E-04 3.77E-02 4 - 7 1.99997E+00 7.04E-04 5.76E-05 1.41E-04 1.70E-02 1 - 8 2.00000E+00 1.32E-04 6.52E-06 2.76E-05 7.70E-03 1 - 9 2.00000E+00 8.49E-06 7.86E-07 5.37E-06 3.48E-03 1 - 10 2.00000E+00 5.88E-07 1.06E-07 1.04E-06 1.57E-03 1 - 11 2.00000E+00 5.55E-08 4.87E-08 2.02E-07 7.11E-04 1 - 12 2.00000E+00 5.34E-09 5.37E-09 3.93E-08 3.21E-04 1 - 13 2.00000E+00 5.03E-10 5.45E-09 7.62E-09 1.45E-04 1 - 14 2.00000E+00 4.45E-11 5.55E-09 1.48E-09 6.56E-05 1 - -------------------------------------------------------------- - it| objective | optim | feas | compl | pen min |inner - -------------------------------------------------------------- - 15 2.00000E+00 4.36E-12 5.67E-09 2.87E-10 2.96E-05 1 - 16 2.00000E+00 1.61E-11 5.82E-09 5.57E-11 1.34E-05 1 - 17 2.00000E+00 3.13E-11 6.00E-09 1.08E-11 6.06E-06 1 - 18 2.00000E+00 8.65E-11 6.22E-09 2.10E-12 2.74E-06 1 - 19 2.00000E+00 1.31E-10 6.48E-09 4.07E-13 1.24E-06 1 - -------------------------------------------------------------- - Status: converged, an optimal solution found - -------------------------------------------------------------- - Final objective value 2.000000E+00 - Relative precision 8.141636E-16 - Optimality 1.310533E-10 - Feasibility 6.484489E-09 - Complementarity 4.066867E-13 - Iteration counts - Outer iterations 19 - Inner iterations 36 - Linesearch steps 56 - Evaluation counts - Augm. Lagr. values 76 - Augm. Lagr. gradient 56 - Augm. Lagr. hessian 36 - -------------------------------------------------------------- \ No newline at end of file diff --git a/simple_examples/baseresults/e04rsje.r b/simple_examples/baseresults/e04rsje.r deleted file mode 100644 index 170a9e9..0000000 --- a/simple_examples/baseresults/e04rsje.r +++ /dev/null @@ -1,35 +0,0 @@ - E04RSJ Example Program Results - E04PT, Interior point method for SOCP problems - Begin of Options - Print File = 6 * d - Print Level = 1 * U - Print Options = Yes * d - Print Solution = No * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - Socp Monitor Frequency = 1 * U - - Infinite Bound Size = 1.00000E+20 * d - Task = Minimize * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Socp Iteration Limit = 100 * d - Socp Max Iterative Refinement = 9 * d - Socp Presolve = Yes * d - Socp Scaling = None * d - Socp Stop Tolerance = 1.05367E-08 * d - Socp Stop Tolerance 2 = 1.05367E-08 * d - Socp System Formulation = Auto * d - End of Options - - - monit() reports good approximate solution (tol = 1.00e-07) - Status: converged, an optimal solution found - Final primal objective value 2.571350E+00 - Final dual objective value 2.571350E+00 - Optimal X: - x_idx Value - 0 1.174e+00 - 1 -4.257e+00 - 2 9.814e-01 diff --git a/simple_examples/baseresults/e04rtje.r b/simple_examples/baseresults/e04rtje.r deleted file mode 100644 index 65ffe25..0000000 --- a/simple_examples/baseresults/e04rtje.r +++ /dev/null @@ -1,35 +0,0 @@ - E04RTJ Example Program Results - E04PT, Interior point method for SOCP problems - Begin of Options - Print File = 6 * d - Print Level = 1 * U - Print Options = Yes * d - Print Solution = No * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - Socp Monitor Frequency = 1 * U - - Infinite Bound Size = 1.00000E+20 * d - Task = Minimize * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Socp Iteration Limit = 100 * d - Socp Max Iterative Refinement = 9 * d - Socp Presolve = Yes * d - Socp Scaling = None * d - Socp Stop Tolerance = 1.05367E-08 * d - Socp Stop Tolerance 2 = 1.05367E-08 * d - Socp System Formulation = Auto * d - End of Options - - - monit() reports good approximate solution (tol = 1.00e-07) - Status: converged, an optimal solution found - Final primal objective value 1.313004E-01 - Final dual objective value 1.313004E-01 - Optimal X: - x_idx Value - 0 1.000e+00 - 1 -9.722e-01 - 2 9.722e-01 diff --git a/simple_examples/baseresults/e04saje.r b/simple_examples/baseresults/e04saje.r deleted file mode 100644 index c10990a..0000000 --- a/simple_examples/baseresults/e04saje.r +++ /dev/null @@ -1,33 +0,0 @@ - E04SAJ Example Program Results - E04PT, Interior point method for SOCP problems - Begin of Options - Print File = 6 * d - Print Level = 1 * U - Print Options = Yes * d - Print Solution = No * d - Monitoring File = -1 * d - Monitoring Level = 4 * d - Socp Monitor Frequency = 0 * d - - Infinite Bound Size = 1.00000E+20 * d - Task = Minimize * d - Stats Time = No * d - Time Limit = 1.00000E+06 * d - - Socp Iteration Limit = 100 * d - Socp Max Iterative Refinement = 9 * d - Socp Presolve = Yes * d - Socp Scaling = None * d - Socp Stop Tolerance = 1.05367E-08 * d - Socp Stop Tolerance 2 = 1.05367E-08 * d - Socp System Formulation = Auto * d - End of Options - - Status: converged, an optimal solution found - Final primal objective value -1.951817E+01 - Final dual objective value -1.951817E+01 - Optimal X: - x_idx Value - 0 -1.26819e+00 - 1 -4.08429e-01 - 2 1.33234e+00 diff --git a/simple_examples/baseresults/e04taje.r b/simple_examples/baseresults/e04taje.r deleted file mode 100644 index a6cf135..0000000 --- a/simple_examples/baseresults/e04taje.r +++ /dev/null @@ -1,39 +0,0 @@ - E04TAJ Example Program Results - - Solve the first LP - - E04MT, Interior point method for LP problems - Status: converged, an optimal solution found - Final primal objective value 8.500000E+02 - Final dual objective value 8.500000E+02 - - Primal variables: - idx Lower bound Value Upper bound - 1 0.00000E+00 2.00000E+02 inf - 2 0.00000E+00 1.00000E+02 1.00000E+02 - - The new variable has been added, solve the handle again - - E04MT, Interior point method for LP problems - Status: converged, an optimal solution found - Final primal objective value 9.000000E+02 - Final dual objective value 9.000000E+02 - - Primal variables: - idx Lower bound Value Upper bound - 1 0.00000E+00 5.00000E+01 inf - 2 0.00000E+00 1.00000E+02 1.00000E+02 - 3 0.00000E+00 5.00000E+01 5.00000E+01 - - The new constraint has been added, solve the handle again - - E04MT, Interior point method for LP problems - Status: converged, an optimal solution found - Final primal objective value 8.750000E+02 - Final dual objective value 8.750000E+02 - - Primal variables: - idx Lower bound Value Upper bound - 1 0.00000E+00 1.50000E+02 inf - 2 0.00000E+00 5.00000E+01 1.00000E+02 - 3 0.00000E+00 5.00000E+01 5.00000E+01 diff --git a/simple_examples/baseresults/e04tcje.r b/simple_examples/baseresults/e04tcje.r deleted file mode 100644 index cd501a1..0000000 --- a/simple_examples/baseresults/e04tcje.r +++ /dev/null @@ -1,58 +0,0 @@ - E04TCJ Example Program Results - - First solve the problem with the outliers - - -------------------------------------------------------- - E04GG, Nonlinear least squares method for bound-constrained problems - Status: converged, an optimal solution was found - Value of the objective 1.05037E+00 - Norm of gradient 8.78014E-06 - Norm of scaled gradient 6.05781E-06 - Norm of step 1.47886E-01 - - Primal variables: - idx Lower bound Value Upper bound - 1 -inf 3.61301E-01 inf - 2 -inf 9.10227E-01 inf - 3 -inf 3.42138E-03 inf - 4 -inf -6.08965E+00 inf - 5 -inf 6.24881E-04 inf - -------------------------------------------------------- - - Now remove the outlier residuals from the problem handle - - -------------------------------------------------------- - E04GG, Nonlinear least squares method for bound-constrained problems - Status: converged, an optimal solution was found - Value of the objective 5.96811E-02 - Norm of gradient 1.19914E-06 - Norm of scaled gradient 3.47087E-06 - Norm of step 3.49256E-06 - - Primal variables: - idx Lower bound Value Upper bound - 1 -inf 3.53888E-01 inf - 2 -inf 1.06575E+00 inf - 3 -inf 1.91383E-03 inf - 4 -inf 2.17299E-01 inf - 5 -inf 5.17660E+00 inf - -------------------------------------------------------- - - Assuming the outliers points are measured again - we can enable the residuals and adjust the values - - -------------------------------------------------------- - E04GG, Nonlinear least squares method for bound-constrained problems - Status: converged, an optimal solution was found - Value of the objective 6.51802E-02 - Norm of gradient 2.57338E-07 - Norm of scaled gradient 7.12740E-07 - Norm of step 1.56251E-05 - - Primal variables: - idx Lower bound Value Upper bound - 1 3.00000E-01 3.00000E-01 3.00000E-01 - 2 -inf 1.06039E+00 inf - 3 -inf 2.11765E-02 inf - 4 -inf 2.11749E-01 inf - 5 -inf 5.16415E+00 inf diff --git a/simple_examples/baseresults/e04uc_example.r b/simple_examples/baseresults/e04uc_example.r deleted file mode 100644 index abde1c6..0000000 --- a/simple_examples/baseresults/e04uc_example.r +++ /dev/null @@ -1,95 +0,0 @@ - E04UC_Example Example Program Results - - *** e04uc - - Parameters - ---------- - - Linear constraints..... 1 Variables.............. 4 - Nonlinear constraints.. 2 - - Infinite bound size.... 1.00E+20 COLD start............. - Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 - Step limit............. 2.00E+00 Hessian................ NO - - Linear feasibility..... 1.05E-08 Crash tolerance........ 1.00E-02 - Nonlinear feasibility.. 1.05E-08 Optimality tolerance... 3.26E-12 - Line search tolerance.. 9.00E-01 Function precision..... 4.37E-15 - - Derivative level....... 3 Monitoring file........ -1 - Verify level........... 0 - - Major iterations limit. 50 Major print level...... 10 - Minor iterations limit. 50 Minor print level...... 0 - - Start point - 1.000000E+00 5.000000E+00 5.000000E+00 1.000000E+00 - - Workspace provided is IWORK( 17), WORK( 185). - To solve problem we need IWORK( 17), WORK( 185). - - - Verification of the constraint gradients. - ----------------------------------------- - - The constraint Jacobian seems to be ok. - - The largest relative error was 2.29E-07 in constraint 2 - - - - Verification of the objective gradients. - ---------------------------------------- - - The objective gradients seem to be ok. - - Directional derivative of the objective 8.15250000E-01 - Difference approximation 8.15249734E-01 - - - Maj Mnr Step Merit Function Norm Gz Violtn Cond Hz - 0 4 0.0E+00 1.738281E+01 7.1E-01 1.2E+01 1.0E+00 - 1 1 1.0E+00 1.703169E+01 4.6E-02 1.9E+00 1.0E+00 - 2 1 1.0E+00 1.701442E+01 2.1E-02 8.8E-02 1.0E+00 - 3 1 1.0E+00 1.701402E+01 3.1E-04 5.4E-04 1.0E+00 - 4 1 1.0E+00 1.701402E+01 7.0E-06 9.9E-08 1.0E+00 - 5 1 1.0E+00 1.701402E+01 1.1E-08 4.6E-11 1.0E+00 - - Exit from NP problem after 5 major iterations, - 9 minor iterations. - - - Varbl State Value Lower Bound Upper Bound Lagr Mult Slack - - V 1 LL 1.00000 1.00000 5.00000 1.088 . - V 2 FR 4.74300 1.00000 5.00000 . 0.2570 - V 3 FR 3.82115 1.00000 5.00000 . 1.179 - V 4 FR 1.37941 1.00000 5.00000 . 0.3794 - - - L Con State Value Lower Bound Upper Bound Lagr Mult Slack - - L 1 FR 10.9436 None 20.0000 . 9.056 - - - N Con State Value Lower Bound Upper Bound Lagr Mult Slack - - N 1 UL 40.0000 None 40.0000 -0.1615 -3.5264E-11 - N 2 LL 25.0000 25.0000 None 0.5523 -2.8791E-11 - - Exit e04uc - Optimal solution found. - - Final objective value = 17.01402 - - Varbl Istate Value Lagr Mult - - V 0 1 1.000000 1.0879 - V 1 0 4.743000 0.0000 - V 2 0 3.821150 0.0000 - V 3 0 1.379408 0.0000 - - L Con Istate Value Lagr Mult - - L 0 0 10.943558 0.0000 - - Final objective value = 17.0140173 diff --git a/simple_examples/baseresults/e04ucje.r b/simple_examples/baseresults/e04ucje.r deleted file mode 100644 index c024cfc..0000000 --- a/simple_examples/baseresults/e04ucje.r +++ /dev/null @@ -1,22 +0,0 @@ - E04UCJ Example Program Results - - Varbl Istate Value Lagr Mult - - V 1 1 1.00000 1.088 - V 2 0 4.74300 0.000 - V 3 0 3.82115 0.000 - V 4 0 1.37941 0.000 - - - L Con Istate Value Lagr Mult - - L 1 0 10.9436 0.000 - - - N Con Istate Value Lagr Mult - - N 1 2 40.0000 -0.1615 - N 2 1 25.0000 0.5523 - - - Final objective value = 17.01402 diff --git a/simple_examples/baseresults/e04yaje.r b/simple_examples/baseresults/e04yaje.r deleted file mode 100644 index 463bd7f..0000000 --- a/simple_examples/baseresults/e04yaje.r +++ /dev/null @@ -1,25 +0,0 @@ - E04YAJ Example Program Results - -The test point is - 0.19000 -1.34000 0.88000 - -1st derivatives are consistent with residual values - -At the test point, LSQFUN gives - - Residuals 1st derivatives - -2.029E-03 1.000E+00 -4.061E-02 -2.707E-03 - -1.076E-01 1.000E+00 -9.689E-02 -1.384E-02 - -2.330E-01 1.000E+00 -1.785E-01 -4.120E-02 - -3.785E-01 1.000E+00 -3.043E-01 -1.014E-01 - -5.836E-01 1.000E+00 -5.144E-01 -2.338E-01 - -8.689E-01 1.000E+00 -9.100E-01 -5.460E-01 - -1.346E+00 1.000E+00 -1.810E+00 -1.408E+00 - -2.374E+00 1.000E+00 -4.726E+00 -4.726E+00 - -2.975E+00 1.000E+00 -6.076E+00 -6.076E+00 - -4.013E+00 1.000E+00 -7.876E+00 -7.876E+00 - -5.323E+00 1.000E+00 -1.040E+01 -1.040E+01 - -7.292E+00 1.000E+00 -1.418E+01 -1.418E+01 - -1.057E+01 1.000E+00 -2.048E+01 -2.048E+01 - -1.713E+01 1.000E+00 -3.308E+01 -3.308E+01 - -3.681E+01 1.000E+00 -7.089E+01 -7.089E+01 diff --git a/simple_examples/baseresults/f01adje.r b/simple_examples/baseresults/f01adje.r deleted file mode 100644 index c8570bc..0000000 --- a/simple_examples/baseresults/f01adje.r +++ /dev/null @@ -1,9 +0,0 @@ - F01ADJ Example Program Results - - Lower triangle of inverse - 1 2 3 4 - 1 - 2 68.0000 - 3 -41.0000 25.0000 - 4 -17.0000 10.0000 5.0000 - 5 10.0000 -6.0000 -3.0000 2.0000 diff --git a/simple_examples/baseresults/f01ckje.r b/simple_examples/baseresults/f01ckje.r deleted file mode 100644 index 3264e43..0000000 --- a/simple_examples/baseresults/f01ckje.r +++ /dev/null @@ -1,5 +0,0 @@ - F01CKJ Example Program Results - - Matrix A - 5.0 8.0 - 8.0 14.0 diff --git a/simple_examples/baseresults/f01crje.r b/simple_examples/baseresults/f01crje.r deleted file mode 100644 index 0b33f3a..0000000 --- a/simple_examples/baseresults/f01crje.r +++ /dev/null @@ -1,6 +0,0 @@ - F01CRJ Example Program Results - - 1.0 4.0 7.0 10.0 13.0 16.0 19.0 - 2.0 5.0 8.0 11.0 14.0 17.0 20.0 - 3.0 6.0 9.0 12.0 15.0 18.0 21.0 - diff --git a/simple_examples/baseresults/f01dgje.r b/simple_examples/baseresults/f01dgje.r deleted file mode 100644 index 85c8df1..0000000 --- a/simple_examples/baseresults/f01dgje.r +++ /dev/null @@ -1,8 +0,0 @@ -F01DGJ Example Program Results - - Solution matrix B - 1 2 3 4 - 1 2.1000 1.2600 2.4000 1.2600 - 2 3.2200 9.5480 6.5360 5.3320 - 3 9.3800 17.7240 20.7640 14.5920 - 4 2.6600 20.8600 11.6240 28.5400 diff --git a/simple_examples/baseresults/f01elje.r b/simple_examples/baseresults/f01elje.r deleted file mode 100644 index 06a7a20..0000000 --- a/simple_examples/baseresults/f01elje.r +++ /dev/null @@ -1,10 +0,0 @@ - F01ELJ Example Program Results - - F(A) = COS(2A) - 1 2 3 4 - 1 -0.1704 -1.1597 -0.1878 -0.7307 - 2 -0.3950 -0.4410 0.7606 0.0655 - 3 -0.0950 -0.0717 0.0619 -0.4351 - 4 -0.1034 0.6424 -1.3964 0.1042 - -Imnorm = 0.0 diff --git a/simple_examples/baseresults/f01emje.r b/simple_examples/baseresults/f01emje.r deleted file mode 100644 index d805f3c..0000000 --- a/simple_examples/baseresults/f01emje.r +++ /dev/null @@ -1,10 +0,0 @@ -F01EMJ Example Program Results - - F(A) = EXP(2A) - 1 2 3 4 - 1 -12.1880 0.0000 -3.4747 8.3697 - 2 -13.7274 54.5982 -23.9801 82.8593 - 3 -9.7900 0.0000 -25.4527 26.5294 - 4 -18.1597 0.0000 -34.8991 49.2404 - -Imnorm = 0.00 diff --git a/simple_examples/baseresults/f02ekje.r b/simple_examples/baseresults/f02ekje.r deleted file mode 100644 index 925d7cb..0000000 --- a/simple_examples/baseresults/f02ekje.r +++ /dev/null @@ -1,20 +0,0 @@ - F02EKJ Example Program Results - -Iteration Limit= 500 - Arnoldi basis vectors used: 20 - The following Ritz values (mu) are related to the - true eigenvalues (lambda) by lambda = sigma + 1/mu - - Iteration number 1 - Ritz values converged so far ( 2) and their Ritz estimates: - 1 ( 5.69917E-01, 8.80810E-01) 1.30081E-20 - 2 ( 5.69917E-01, -8.80810E-01) 1.30081E-20 - Next (unconverged) Ritz value: - 3 ( 6.07774E-01, 0.00000E+00) - - The 5 Ritz values of closest to 5.50000E+00 are: - 1 ( 6.01781E+00 , -8.00277E-01 ) - 2 ( 6.01781E+00 , 8.00277E-01 ) - 3 ( 4.34309E+00 , -1.94557E+00 ) - 4 ( 4.34309E+00 , 1.94557E+00 ) - 5 ( 7.14535E+00 , 0.00000E+00 ) diff --git a/simple_examples/baseresults/f02fkje.r b/simple_examples/baseresults/f02fkje.r deleted file mode 100644 index 8217134..0000000 --- a/simple_examples/baseresults/f02fkje.r +++ /dev/null @@ -1,14 +0,0 @@ - F02FKJ Example Program Results - - Iteration Limit= 500 - - Ritz values and residuals - 1 2 - 1 1.9702E+01 5.6583E-13 - 2 4.9036E+01 7.2456E-13 - 3 4.9036E+01 7.0022E-13 - 4 7.8370E+01 8.8089E-13 - 5 9.7197E+01 8.7693E-13 - 6 9.7197E+01 8.7672E-13 - 7 1.2653E+02 6.8423E-13 - 8 1.2653E+02 9.8310E-13 diff --git a/simple_examples/baseresults/f02wgje.r b/simple_examples/baseresults/f02wgje.r deleted file mode 100644 index b4e345c..0000000 --- a/simple_examples/baseresults/f02wgje.r +++ /dev/null @@ -1,7 +0,0 @@ - F02WGJ Example Program Results - - Singular Value Residual - 0.00830 2.7E-19 - 0.01223 5.9E-18 - 0.02381 1.2E-17 - 0.11274 7.8E-17 diff --git a/simple_examples/baseresults/f03baje.r b/simple_examples/baseresults/f03baje.r deleted file mode 100644 index c4c40d7..0000000 --- a/simple_examples/baseresults/f03baje.r +++ /dev/null @@ -1,14 +0,0 @@ -F03BAJ Example Program Results - - Array A after factorization - 1 2 3 - 1 33.0000 16.0000 72.0000 - 2 -0.7273 1.6364 -4.6364 - 3 -0.2424 -0.0741 0.1111 - -Pivots - 1 2 3 - -D = 0.37500 ID = 4 - -Value of determinant = 6.00000e+00 \ No newline at end of file diff --git a/simple_examples/baseresults/f04amje.r b/simple_examples/baseresults/f04amje.r deleted file mode 100644 index 86bd893..0000000 --- a/simple_examples/baseresults/f04amje.r +++ /dev/null @@ -1,4 +0,0 @@ -F04AMJ Example Program Results -Solution -1.3010 -0.7935 \ No newline at end of file diff --git a/simple_examples/baseresults/f04baje.r b/simple_examples/baseresults/f04baje.r deleted file mode 100644 index eb52050..0000000 --- a/simple_examples/baseresults/f04baje.r +++ /dev/null @@ -1,14 +0,0 @@ -F04BAJ Example Program Results - - Solution - 1 2 - 1 1.0000 3.0000 - 2 -1.0000 2.0000 - 3 3.0000 4.0000 - 4 -5.0000 1.0000 - -Estimate of condition number -1.5e+02 - -Esttimate of error bound for computed solutions -1.7e-14 \ No newline at end of file diff --git a/simple_examples/baseresults/f05aaje.r b/simple_examples/baseresults/f05aaje.r deleted file mode 100644 index 74b6ae6..0000000 --- a/simple_examples/baseresults/f05aaje.r +++ /dev/null @@ -1,11 +0,0 @@ -F05AAJ Example Program Results - -N1 = 2 N2 = 4 - -CC = 0.5822 ICOL = 4 - -Final Vectors --0.6325 0.3310 -0.5404 -0.3162 -0.2483 0.2119 --0.6325 -0.0000 0.7735 -0.3162 0.9104 0.2543 \ No newline at end of file diff --git a/simple_examples/baseresults/f06clje.r b/simple_examples/baseresults/f06clje.r deleted file mode 100644 index d167816..0000000 --- a/simple_examples/baseresults/f06clje.r +++ /dev/null @@ -1,3 +0,0 @@ - F06CLJ Example Program Results - - (1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/f07aaje.r b/simple_examples/baseresults/f07aaje.r deleted file mode 100644 index 086448e..0000000 --- a/simple_examples/baseresults/f07aaje.r +++ /dev/null @@ -1,14 +0,0 @@ - F07AAJ Example Program Results - - Solution - 1.0000 -1.0000 3.0000 -5.0000 - - Details of factorization - 1 2 3 4 - 1 5.2500 -2.9500 -0.9500 -3.8000 - 2 0.3429 3.8914 2.3757 0.4129 - 3 0.3010 -0.4631 -1.5139 0.2948 - 4 -0.2114 -0.3299 0.0047 0.1314 - - Pivot indices - 2 2 3 4 diff --git a/simple_examples/baseresults/f07abje.r b/simple_examples/baseresults/f07abje.r deleted file mode 100644 index 922ca67..0000000 --- a/simple_examples/baseresults/f07abje.r +++ /dev/null @@ -1,23 +0,0 @@ -F07ABJ Example Program Results - - Solution(s) - 1 2 - 1 1.0000 3.0000 - 2 -1.0000 2.0000 - 3 3.0000 4.0000 - 4 -5.0000 1.0000 - -Backward errors (machine-dependent) - 7.7e-17 5.8e-17 - -Estimated forward error bounds (machine-dependent) - 2.5e-14 3.4e-14 - -A has been row scaled as diag(R)*A - -Reciprocal condition number estimate of scaled matrix - 1.8e-02 - -Estimate of reciprocal pivot growth factor - 7.4e-01 - diff --git a/simple_examples/baseresults/f07adje.r b/simple_examples/baseresults/f07adje.r deleted file mode 100644 index 8aa1615..0000000 --- a/simple_examples/baseresults/f07adje.r +++ /dev/null @@ -1,10 +0,0 @@ -F07ADJ Example Program Results - - Details of factorization - 1 2 3 4 - 1 5.2500 -2.9500 -0.9500 -3.8000 - 2 0.3429 3.8914 2.3757 0.4129 - 3 0.3010 -0.4631 -1.5139 0.2948 - 4 -0.2114 -0.3299 0.0047 0.1314 -IPIV - 2 2 3 4 diff --git a/simple_examples/baseresults/f07aqje.r b/simple_examples/baseresults/f07aqje.r deleted file mode 100644 index 11cdfa0..0000000 --- a/simple_examples/baseresults/f07aqje.r +++ /dev/null @@ -1,7 +0,0 @@ - F07AQJ Example Program Results - - Solution - ( 1.0000, 1.0000) ( 2.0000,-3.0000) (-4.0000,-5.0000) ( 0.0000, 6.0000) - - Pivot indices - 3 2 3 4 diff --git a/simple_examples/baseresults/f07faje.r b/simple_examples/baseresults/f07faje.r deleted file mode 100644 index 381aa43..0000000 --- a/simple_examples/baseresults/f07faje.r +++ /dev/null @@ -1,11 +0,0 @@ - F07FAJ Example Program Results - - Solution - 1.0000 -1.0000 2.0000 -3.0000 - - Cholesky factor U - 1 2 3 4 - 1 2.0396 -1.5297 0.2746 -0.0490 - 2 1.6401 -0.2500 0.6737 - 3 0.7887 0.6617 - 4 0.5347 diff --git a/simple_examples/baseresults/f07fbje.r b/simple_examples/baseresults/f07fbje.r deleted file mode 100644 index 38b2bb5..0000000 --- a/simple_examples/baseresults/f07fbje.r +++ /dev/null @@ -1,19 +0,0 @@ - F07FBJ Example Program Results - - Solution(s) - 1 2 - 1 1.0000 4.0000 - 2 -1.0000 3.0000 - 3 2.0000 2.0000 - 4 -3.0000 1.0000 - - Backward errors (machine-dependent) - 6.7e-17 8.2e-17 - - Estimated forward error bounds (machine-dependent) - 2.3e-14 2.4e-14 - - Estimate of reciprocal condition number - 1.0e-02 - - A has not been equilibrated diff --git a/simple_examples/baseresults/f08btje.r b/simple_examples/baseresults/f08btje.r deleted file mode 100644 index b663c71..0000000 --- a/simple_examples/baseresults/f08btje.r +++ /dev/null @@ -1,16 +0,0 @@ - F08BTJ Example Program Results - - Tolerance used to estimate the rank of A - 1.00E-02 - Estimated rank of A - 3 - Least squares solution(s) - - 1 2 - 1 ( 0.0000, 0.0000) ( 0.0000, 0.0000) - 2 ( 2.7020, 8.0911) (-2.2682,-2.9884) - 3 ( 2.8888, 2.5012) ( 0.9779, 1.3565) - 4 ( 2.7100, 0.4791) (-1.3734, 0.2212) - - Square root(s) of the residual sum(s) of squares - 2.51E-01 8.10E-02 diff --git a/simple_examples/baseresults/f08faje.r b/simple_examples/baseresults/f08faje.r deleted file mode 100644 index 31df0c1..0000000 --- a/simple_examples/baseresults/f08faje.r +++ /dev/null @@ -1,16 +0,0 @@ - F08FAJ Example Program Results - - Eigenvalues - -2.0531 -0.5146 -0.2943 12.8621 - Eigenvectors - 1 2 3 4 - 1 0.7003 -0.5144 -0.2767 0.4103 - 2 0.3592 0.4851 0.6634 0.4422 - 3 -0.1569 0.5420 -0.6504 0.5085 - 4 -0.5965 -0.4543 0.2457 0.6144 - - Error estimate for the eigenvalues - 1.4e-15 - - Error estimates for the eigenvectors - 9.3e-16 6.5e-15 6.5e-15 1.1e-16 diff --git a/simple_examples/baseresults/f08xpje.r b/simple_examples/baseresults/f08xpje.r deleted file mode 100644 index 96e35e9..0000000 --- a/simple_examples/baseresults/f08xpje.r +++ /dev/null @@ -1,8 +0,0 @@ -F08XPJ Example Program Results - -Number of eigenvalues for which SELCTG is true = 2 -(dimension of deflating subspaces) - -Selected generalized eigenvalues - 1 (2.00, -5.00) - 2 (3.00, -1.00) diff --git a/simple_examples/baseresults/g01alje.r b/simple_examples/baseresults/g01alje.r deleted file mode 100644 index 3473f35..0000000 --- a/simple_examples/baseresults/g01alje.r +++ /dev/null @@ -1,7 +0,0 @@ -G01ALJ Example Program Results - -Maximum 12.0000 -Upper Hinge (75% quantile) 9.5000 -Median (50% quantile) 6.5000 -Lower Hinge (25% quantile) 2.5000 -Minimum 1.0000 diff --git a/simple_examples/baseresults/g02akje.r b/simple_examples/baseresults/g02akje.r deleted file mode 100644 index a4260ce..0000000 --- a/simple_examples/baseresults/g02akje.r +++ /dev/null @@ -1,14 +0,0 @@ -G02AKJ Example Program Results - - NCM with rank constraint - 1 2 3 4 - 1 1.0000 -0.9021 0.2448 0.1975 - 2 -0.9021 1.0000 -0.6392 0.2448 - 3 0.2448 -0.6392 1.0000 -0.9021 - 4 0.1975 0.2448 -0.9021 1.0000 - -Number of subproblems solved: 4 - -Squared Frobenius norm of difference: 0.3082 - -Rank error: 0.0000 diff --git a/simple_examples/baseresults/g02bjje.r b/simple_examples/baseresults/g02bjje.r deleted file mode 100644 index 053b912..0000000 --- a/simple_examples/baseresults/g02bjje.r +++ /dev/null @@ -1,38 +0,0 @@ - G02BJJ Example Program Results - - Number of variables (columns) = 4 - Number of cases (rows) = 5 - - Data matrix is:- - 1 2 3 4 - 1 3.0000 3.0000 1.0000 2.0000 - 2 6.0000 4.0000 -1.0000 4.0000 - 3 9.0000 0.0000 5.0000 9.0000 - 4 12.0000 2.0000 0.0000 0.0000 - 5 -1.0000 5.0000 4.0000 12.0000 - - Variable Mean St.dev. - 4 6.7500 4.5735 - 1 7.5000 3.8730 - 2 3.5000 1.2910 - - Sums of squares and cross-products of deviations - 4 1 2 - 4 62.7500 21.0000 10.0000 - 1 21.0000 45.0000 -6.0000 - 2 10.0000 -6.0000 5.0000 - - Correlation coefficients - 4 1 2 - 4 1.0000 0.9707 0.9449 - 1 0.9707 1.0000 -0.6547 - 2 0.9449 -0.6547 1.0000 - - Minimum number of cases used for any pair of variables: 3 - - Numbers used for each pair are: - 4 1 2 - 4 4.0000 3.0000 3.0000 - 1 3.0000 4.0000 3.0000 - 2 3.0000 3.0000 4.0000 - diff --git a/simple_examples/baseresults/g02brje.r b/simple_examples/baseresults/g02brje.r deleted file mode 100644 index 7621bb4..0000000 --- a/simple_examples/baseresults/g02brje.r +++ /dev/null @@ -1,29 +0,0 @@ -G02BRJ Example Program Results - -Number of variables (columns) = 3 -Number of case (rows) = 9 - -Data matrix is:- - - - 1 2 3 - 1 1.7000 1.0000 0.5000 - 2 2.8000 4.0000 3.0000 - 3 0.6000 6.0000 2.5000 - 4 1.8000 9.0000 6.0000 - 5 0.9900 4.0000 2.5000 - 6 1.4000 2.0000 5.5000 - 7 1.8000 9.0000 7.5000 - 8 2.5000 7.0000 0.0000 - 9 0.9900 5.0000 3.0000 - -Matrix of rank correlation coefficients: -Upper triangle -- Spearman's -Lower triangle -- Kendall's tau - - 1 2 3 - 1 1.0000 0.2941 0.4058 - 2 0.1429 1.0000 0.7537 - 3 0.2760 0.5521 1.0000 - -Number of cases actually used: 6 diff --git a/simple_examples/baseresults/g02daje.r b/simple_examples/baseresults/g02daje.r deleted file mode 100644 index 9c6e2f0..0000000 --- a/simple_examples/baseresults/g02daje.r +++ /dev/null @@ -1,31 +0,0 @@ -G02DAJ Example Program Results - -Model not of full rank, rank = 4 -Residual sum of squares = 2.2227e+01 -Degrees of freedom = 8 -R-squared = 7.0042e-01 -Adjusted R-squared = 5.8808e-01 -AIC = 1.5397e+01 - -Variable Parameter estimate Standard error - - 1 3.0557e+01 3.8494e-01 - 2 5.4467e+00 8.3896e-01 - 3 6.7433e+00 8.3896e-01 - 4 1.1047e+01 8.3896e-01 - 5 7.3200e+00 8.3896e-01 - - Obs Residuals H - - 1 -2.3733e+00 3.3333e-01 - 2 1.7433e+00 3.3333e-01 - 3 8.8000e-01 3.3333e-01 - 4 -1.4333e-01 3.3333e-01 - 5 1.4333e-01 3.3333e-01 - 6 -1.4700e+00 3.3333e-01 - 7 -1.8867e+00 3.3333e-01 - 8 5.7667e-01 3.3333e-01 - 9 1.3167e+00 3.3333e-01 - 10 1.7967e+00 3.3333e-01 - 11 -1.1733e+00 3.3333e-01 - 12 5.9000e-01 3.3333e-01 diff --git a/simple_examples/baseresults/g02eeje.r b/simple_examples/baseresults/g02eeje.r deleted file mode 100644 index c66f9b6..0000000 --- a/simple_examples/baseresults/g02eeje.r +++ /dev/null @@ -1,20 +0,0 @@ - G02EEJ Example Program Results - - Step 1 - Added variable is TS - Change in residual sum of squares = 4.7126E-01 - F Statistic = 7.38 - - Variables in model: COD TS - - Residual sum of squares = 1.0850E+00 - Degrees of freedom = 17 - - Free variables: TKN BOD TVS - Change in residual sums of squares for free variables: - 0.1175 0.0600 0.2276 - Step 2 - No further variables added maximum F = 1.59 - Free variables: TKN BOD TVS - Change in residual sums of squares for free variables: - 0.0979 0.0207 0.0217 diff --git a/simple_examples/baseresults/g02maje.r b/simple_examples/baseresults/g02maje.r deleted file mode 100644 index dd042fa..0000000 --- a/simple_examples/baseresults/g02maje.r +++ /dev/null @@ -1,23 +0,0 @@ -G02MAJ Example Program Results - - Step Parameter Estimate ------------------------------------------------------- - 1 0.000 0.000 3.125 0.000 0.000 0.000 - 2 0.000 0.000 3.792 0.000 0.000 -0.713 - 3 -0.446 0.000 3.998 0.000 0.000 -1.151 - 4 -0.628 -0.295 4.098 0.000 0.000 -1.466 - 5 -1.060 -1.056 4.110 -0.864 0.000 -1.948 - 6 -1.073 -1.132 4.118 -0.935 -0.059 -1.981 - -alpha: -50.037 - - Step Sum RSS df Cp Ck Step Size ---------------------------------------------------------- - 1 72.446 8929.855 3 13.355 123.227 72.446 - 2 103.385 6404.701 7 7.054 50.781 24.841 - 3 126.243 5258.247 51 5.286 30.836 16.225 - 4 145.277 4657.051 25 5.309 19.319 11.587 - 5 198.223 3959.401 126 5.016 12.266 24.520 - 6 203.529 3954.571 5258 7.000 0.910 2.198 - -sigma^2: 304.198 diff --git a/simple_examples/baseresults/g03gaje.r b/simple_examples/baseresults/g03gaje.r deleted file mode 100644 index 37ab236..0000000 --- a/simple_examples/baseresults/g03gaje.r +++ /dev/null @@ -1,79 +0,0 @@ - G03GAJ Example Program Results - - - Mixing proportions - 1 2 - 1 0.4798 0.5202 - - Group means - 1 2 - 1 4.0041 3.3350 - 2 3.9949 3.4434 - 3 5.5894 4.9870 - 4 5.4432 5.3602 - - Pooled Variance-covariance matrix - 1 2 3 4 - 1 0.4539 0.2891 0.6075 0.3413 - 2 0.2891 0.2048 0.4101 0.2490 - 3 0.6075 0.4101 1.0648 0.6011 - 4 0.3413 0.2490 0.6011 0.3759 - - Densities - 1 2 - 1 2.5836E-01 1.1853E-02 - 2 3.7065E-07 1.1241E-01 - 3 5.3069E-03 1.8080E-06 - 4 4.2461E-01 2.8584E-05 - 5 5.0387E-02 1.1544E+00 - 6 1.1260E+00 7.2224E-02 - 7 2.0911E+00 2.1224E-02 - 8 5.7856E-03 1.3227E+00 - 9 1.1609E+00 2.9411E-02 - 10 8.9826E-02 2.4260E-05 - 11 3.0170E-01 1.0106E+00 - 12 1.2930E+00 3.5422E-01 - 13 2.8644E-02 6.7851E-07 - 14 2.0759E-02 3.1690E+00 - 15 7.6461E-02 1.5231E+00 - 16 3.0279E-04 8.4017E-01 - 17 5.6101E-01 4.6699E-05 - 18 2.6573E-05 6.4442E-01 - 19 2.1250E+00 5.1006E-02 - 20 8.6822E-04 2.7626E+00 - 21 1.9223E-01 2.3971E+00 - 22 1.2469E-02 2.8179E+00 - 23 1.8389E-02 5.3572E-01 - 24 1.2409E+00 9.6489E-03 - 25 2.1037E-05 4.8674E-02 - - Membership probabilities - 1 2 - 1 9.5018E-01 4.9823E-02 - 2 3.3259E-06 1.0000E+00 - 3 9.9961E-01 3.8664E-04 - 4 9.9992E-01 7.9913E-05 - 5 3.8999E-02 9.6100E-01 - 6 9.3270E-01 6.7295E-02 - 7 9.8881E-01 1.1190E-02 - 8 4.1252E-03 9.9587E-01 - 9 9.7252E-01 2.7479E-02 - 10 9.9969E-01 3.0805E-04 - 11 2.1722E-01 7.8278E-01 - 12 7.6938E-01 2.3062E-01 - 13 9.9997E-01 2.6937E-05 - 14 6.1133E-03 9.9389E-01 - 15 4.4189E-02 9.5581E-01 - 16 3.5006E-04 9.9965E-01 - 17 9.9990E-01 9.7029E-05 - 18 4.0270E-05 9.9996E-01 - 19 9.7380E-01 2.6202E-02 - 20 3.0204E-04 9.9970E-01 - 21 6.9471E-02 9.3053E-01 - 22 4.1603E-03 9.9584E-01 - 23 3.0839E-02 9.6916E-01 - 24 9.9116E-01 8.8421E-03 - 25 4.1534E-04 9.9958E-01 - -No. iterations: 14 -Log-likelihood: -29.6831 diff --git a/simple_examples/baseresults/g05kfje.r b/simple_examples/baseresults/g05kfje.r deleted file mode 100644 index 830c10a..0000000 --- a/simple_examples/baseresults/g05kfje.r +++ /dev/null @@ -1,7 +0,0 @@ -G05KFJ Example Program Results - -0.6364 -0.1065 -0.7460 -0.7983 -0.1046 \ No newline at end of file diff --git a/simple_examples/baseresults/g13awje.r b/simple_examples/baseresults/g13awje.r deleted file mode 100644 index 25be8b6..0000000 --- a/simple_examples/baseresults/g13awje.r +++ /dev/null @@ -1,4 +0,0 @@ - G13AWJ Example Program Results - -Dickey-Fuller test statistic = -2.540 -associated p-value = 0.013 diff --git a/simple_examples/baseresults/g13meje.r b/simple_examples/baseresults/g13meje.r deleted file mode 100644 index 07a391e..0000000 --- a/simple_examples/baseresults/g13meje.r +++ /dev/null @@ -1,39 +0,0 @@ -G13MEJ Example Program Results - - Iterated - Time EMA - --------------------------------- - 1 7.5 0.531 - 2 8.2 0.544 - 3 18.1 0.754 - 4 22.8 0.406 - 5 25.8 0.232 - - 6 26.8 0.217 - 7 31.1 0.357 - 8 38.4 0.630 - 9 45.9 0.263 - 10 48.2 0.241 - 11 48.9 0.279 - 12 57.9 0.713 - 13 58.5 0.717 - 14 63.9 0.385 - 15 65.2 0.346 - - 16 66.6 0.330 - 17 67.4 0.315 - 18 69.3 0.409 - 19 69.9 0.459 - 20 73.0 0.377 - 21 75.6 0.411 - 22 77.0 0.536 - 23 84.7 0.632 - 24 86.8 0.538 - 25 88.0 0.444 - 26 88.5 0.401 - 27 91.0 0.331 - 28 93.0 0.495 - 29 93.7 0.585 - 30 94.0 0.612 - diff --git a/simple_examples/baseresults/g13naje.r b/simple_examples/baseresults/g13naje.r deleted file mode 100644 index b87dda8..0000000 --- a/simple_examples/baseresults/g13naje.r +++ /dev/null @@ -1,11 +0,0 @@ -G13NAJ Example Program Results - - -- Charge Points -- --- Distribution --- - Number Position Parameters -================================================= - 1 12 0.34 1.00 - 2 32 2.57 1.00 - 3 49 1.45 1.00 - 4 52 -0.48 1.00 - 5 70 1.20 1.00 - 6 100 -0.23 1.00 diff --git a/simple_examples/baseresults/h02bbje.r b/simple_examples/baseresults/h02bbje.r deleted file mode 100644 index 64136ef..0000000 --- a/simple_examples/baseresults/h02bbje.r +++ /dev/null @@ -1,79 +0,0 @@ -H02BBJ Example Program Results - - - *** IP solver - - Parameters - ---------- - - Linear constraints...... 3 First integer solution.. OFF - Variables............... 2 Max depth of the tree... 4 - - Feasibility tolerance... 1.05E-08 Print level............. 10 - Infinite bound size..... 1.00E+20 EPS (machine precision). 1.11E-16 - - Integer feasibility tol. 1.00E-05 Iteration limit......... 50 - Max number of nodes..... NONE - - ** Workspace provided with MAXDPT = 4: LRWORK = 84 LIWORK = 137 - ** Workspace required with MAXDPT = 4: LRWORK = 84 LIWORK = 137 - - - *** Optimum LP solution *** -17.50000 - - - Varbl State Value Lower Bound Upper Bound Lagr Mult Residual - - V 1 FR 3.92857 0.00000 None 0.000 3.929 - V 2 FR 1.42857 0.00000 None 0.000 1.429 - - - L Con State Value Lower Bound Upper Bound Lagr Mult Residual - - L 1 UL 15.0000 None 15.0000 -1.000 0.000 - L 2 UL 5.00000 None 5.00000 -0.5000 -8.8818E-16 - L 3 FR 14.6429 5.00000 None 0.000 9.643 - - - *** Start of tree search *** - - - Node Parent Obj Varbl Value Lower Upper Value Depth - No Node Value Chosen Before Bound Bound After - 2 1 No Feas Soln 1 3.93 4.00 None 4.00 1 - 3 1 -16.2 1 3.93 0.00 3.00 3.00 1 - 4 3 -15.5 2 1.80 2.00 None 2.00 2 - 5 3 -13.0 2 1.80 0.00 1.00 1.00 2 - *** Integer solution *** - - - Node Parent Obj Varbl Value Lower Upper Value Depth - No Node Value Chosen Before Bound Bound After - 6 4 No Feas Soln 1 2.50 3.00 3.00 3.00 3 - 7 4 -14.8 1 2.50 0.00 2.00 2.00 3 - 8 7 -12.0 CO 2 2.20 3.00 None 3.00 4 - 9 7 -14.0 2 2.20 2.00 2.00 2.00 4 - *** Integer solution *** - - *** End of tree search *** - - - Total of 9 nodes investigated. - - Exit IP solver - Optimum IP solution found. - - Final IP objective value = -14.00000 - - - - Varbl State Value Lower Bound Upper Bound Lagr Mult Residual - - V 1 UL 2.00000 0.00000 2.00000 -3.000 0.000 - V 2 EQ 2.00000 2.00000 2.00000 -4.000 0.000 - - - L Con State Value Lower Bound Upper Bound Lagr Mult Residual - - L 1 FR 14.0000 None 15.0000 0.000 1.000 - L 2 FR 0.00000 None 5.00000 0.000 5.000 - L 3 FR 10.0000 5.00000 None 0.000 5.000 diff --git a/simple_examples/baseresults/h02daje.r b/simple_examples/baseresults/h02daje.r deleted file mode 100644 index 125c5bf..0000000 --- a/simple_examples/baseresults/h02daje.r +++ /dev/null @@ -1,14 +0,0 @@ -H02DAJ Example Program Results - - Final Esimate: - 1 - 1 0.3750 - 2 0.0000 - 3 0.5250 - 4 0.1000 - 5 1.0000 - 6 0.0000 - 7 1.0000 - 8 1.0000 -Requested accuracy of QP subproblems 1.0000e-10 -Optimised value: 2.925 diff --git a/simple_examples/baseresults/m01ccje.r b/simple_examples/baseresults/m01ccje.r deleted file mode 100644 index 33e1712..0000000 --- a/simple_examples/baseresults/m01ccje.r +++ /dev/null @@ -1,15 +0,0 @@ - M01CCJ Example Program Results - - Records sorted on columns 7 to 12 - - C05AZF 2181 - C05AUF 1351 - C02AEF 599 - A02ACF 531 - A02ABF 523 - A02AAF 289 - C05AVF 240 - C05AXF 211 - C05AYF 183 - C02ADF 169 - C05AWF 136 diff --git a/simple_examples/baseresults/nagcomplexexample.r b/simple_examples/baseresults/nagcomplexexample.r deleted file mode 100644 index 2040ba1..0000000 --- a/simple_examples/baseresults/nagcomplexexample.r +++ /dev/null @@ -1,60 +0,0 @@ -Please read the source of NAGComplexExample.java for a better understanding of how to use NAGComplex - -*****BASICS***** - -Constructing z1 and z2; -z1 = (0.0, 0.0) -z2 = (2.0, 3.0) - -Changing z1 values using NAGComplex.setRe() and NAGComplex.setIm(); -z1 = (3.0, 4.0) - -Copying z2 to z3 using NAGComplex.clone(); -z3 = (2.0, 3.0) -Copying z1 to z4 using static method NAGComplex.clone(NAGComplex z) -z4 = (3.0, 4.0) - -Array created using NAGComplex.createArray(5); -(0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) - -The same array updated using NAGComplex[i].setRe() and NAGComplex[i].setIm(); -(1.0, 9.0) (2.0, 8.0) (3.0, 7.0) (4.0, 6.0) (5.0, 5.0) - -*****ARITHMETIC***** - -z1 = (3.0, 4.0) -z2 = (2.0, 3.0) -z3 = (6.0, -2.0) -z4 = (4.0, -5.0) - -z1 + z2 = (5.0, 7.0) -z3 + z4 = (10.0, -7.0) - -z1 - z2 = (1.0, 1.0) -z3 - z4 = (2.0, 3.0) - -z1 * z2 = (-6.0, 17.0) -z3 * z4 = (14.0, -38.0) - -z1 / z2 = (1.3846153846153846, -0.07692307692307696) -z3 / z4 = (0.829268292682927, 0.5365853658536587) - --(z1) = (-3.0, -4.0) --(z2) = (-2.0, -3.0) - -conjugate(z1) = (3.0, -4.0) -conjugate(z2) = (2.0, -3.0) - -z3 == z4? - false -z4 = (6.0, -2.0) -z3 == z4? - true -|z1| = 5.0 -|z2| = 3.6055512754639896 - -arg(z1) = 0.9272952180016122 -arg(z2) = 0.982793723247329 - -z5 = (-5.0, 12.0) -z6 = (-9.0, 40.0) -Sqrt(z5) = (2.0, 3.0) -Sqrt(z6) = (4.0, 5.0) \ No newline at end of file diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r deleted file mode 100644 index 76fc07e..0000000 --- a/simple_examples/baseresults/outputexample.r +++ /dev/null @@ -1,10 +0,0 @@ - *** Start of NAG Library implementation details *** - - Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran - Precision: double precision - Product Code: NLL6I27DBL - Mark: 27.2.0 (self-contained) - - This is a 64-bit library using 32-bit integers. - - *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/s01baje.r b/simple_examples/baseresults/s01baje.r deleted file mode 100644 index b3b20dd..0000000 --- a/simple_examples/baseresults/s01baje.r +++ /dev/null @@ -1,9 +0,0 @@ -S01BAJ Example Program Results - - X Y - 2.5000e+00 1.2528e+00 - 1.2500e-01 1.1778e-01 - -9.0600e-01 -2.3645e+00 - 1.2900e-03 1.2892e-03 - -7.8300e-06 -7.8300e-06 - 1.0000e-09 1.0000e-09 diff --git a/simple_examples/baseresults/s10aaje.r b/simple_examples/baseresults/s10aaje.r deleted file mode 100644 index eac481e..0000000 --- a/simple_examples/baseresults/s10aaje.r +++ /dev/null @@ -1,7 +0,0 @@ -S10AAJ Example Program Results - - X Y - -2.000e+01 -1.000e+00 - -5.000e+00 -9.999e-01 - 5.000e-01 4.621e-01 - 5.000e+00 9.999e-01 diff --git a/simple_examples/baseresults/s10abje.r b/simple_examples/baseresults/s10abje.r deleted file mode 100644 index 54e3b1c..0000000 --- a/simple_examples/baseresults/s10abje.r +++ /dev/null @@ -1,8 +0,0 @@ -S10ABJ Example Program Results - - X Y - -1.000e+01 -1.101e+04 - -5.000e-01 -5.211e-01 - 0.000e+00 0.000e+00 - 5.000e-01 5.211e-01 - 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s10acje.r b/simple_examples/baseresults/s10acje.r deleted file mode 100644 index e71c76b..0000000 --- a/simple_examples/baseresults/s10acje.r +++ /dev/null @@ -1,8 +0,0 @@ -S10ACJ Example Program Results - - X Y - -1.000e+01 1.101e+04 - -5.000e-01 1.128e+00 - 0.000e+00 1.000e+00 - 5.000e-01 1.128e+00 - 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s14abje.r b/simple_examples/baseresults/s14abje.r deleted file mode 100644 index 86c60ea..0000000 --- a/simple_examples/baseresults/s14abje.r +++ /dev/null @@ -1,12 +0,0 @@ -S14ABJ Example Program Results - - X Y - 1.000e+00 0.000e+00 - 1.250e+00 -9.827e-02 - 1.500e+00 -1.208e-01 - 1.750e+00 -8.440e-02 - 2.000e+00 0.000e+00 - 5.000e+00 3.178e+00 - 1.000e+01 1.280e+01 - 2.000e+01 3.934e+01 - 1.000e+03 5.905e+03 diff --git a/simple_examples/baseresults/s14acje.r b/simple_examples/baseresults/s14acje.r deleted file mode 100644 index cda0185..0000000 --- a/simple_examples/baseresults/s14acje.r +++ /dev/null @@ -1,8 +0,0 @@ -S14ACJ Example Program Results - - X psi(X)-log(X) - - 0.1000 -8.1212 - 0.5000 -1.2704 - 3.6000 -0.1453 - 8.0000 -0.0638 diff --git a/simple_examples/baseresults/s14afje.r b/simple_examples/baseresults/s14afje.r deleted file mode 100644 index 68a5fd5..0000000 --- a/simple_examples/baseresults/s14afje.r +++ /dev/null @@ -1,5 +0,0 @@ -S14AFJ Example Program Results - - Z K (d^K/dz^K)psi(Z) - - (-1.5, 2.5) 1 (-1.9737e-01, -2.4271e-01) diff --git a/simple_examples/baseresults/s17dcje.r b/simple_examples/baseresults/s17dcje.r deleted file mode 100644 index 845aae3..0000000 --- a/simple_examples/baseresults/s17dcje.r +++ /dev/null @@ -1,10 +0,0 @@ -S17DCF Example Program Results - -Calling with N = 2 - -FNU Z SCAL CY[0] CY[1] NZ -0.0000 (0.3000, 0.4000) U (-0.4983, 0.6700) (-1.0149, 0.9485) 0 -2.3000 (2.0000, 0.0000) U (-0.7398, 0.0000) (-1.4120, 0.0000) 0 -2.1200 (-1.0000, 0.0000) U (-1.7279, 0.8602) (6.5331, -2.6154) 0 -1.5800 (-2.3000, 5.6000) U (36.4755, -1.5521) (-2.6788, 25.9112) 0 -1.5800 (-2.3000, 5.6000) S (0.1349, -0.0057) (-0.0099, 0.0958) 0 diff --git a/simple_examples/baseresults/s17dgje.r b/simple_examples/baseresults/s17dgje.r deleted file mode 100644 index c26ff48..0000000 --- a/simple_examples/baseresults/s17dgje.r +++ /dev/null @@ -1,9 +0,0 @@ - S17DGJ Example Program Results - - DERIV Z SCAL AI NZ - - F ( 0.3000, 0.4000) U ( 0.2716, -0.1002) 0 - F ( 0.2000, 0.0000) U ( 0.3037, 0.0000) 0 - F ( 1.1000, -6.6000) U (-43.6632,-47.9030) 0 - F ( 1.1000, -6.6000) S ( 0.1655, 0.0597) 0 - D ( -1.0000, 0.0000) U ( -0.0102, 0.0000) 0 diff --git a/simple_examples/baseresults/s30aaje.r b/simple_examples/baseresults/s30aaje.r deleted file mode 100644 index 32fc477..0000000 --- a/simple_examples/baseresults/s30aaje.r +++ /dev/null @@ -1,16 +0,0 @@ -S30AAJ Example Program Results - -Black-Scholes-Merton formula -European Call : - Spot = 55.0000 - Volatility = 0.3000 - Rate = 0.1000 - Dividend = 0.0000 - - Strike Expiry Option Price - 58.0000 0.7000 5.9198 - 58.0000 0.8000 6.5506 - 60.0000 0.7000 5.0809 - 60.0000 0.8000 5.6992 - 62.0000 0.7000 4.3389 - 62.0000 0.8000 4.9379 diff --git a/simple_examples/baseresults/s30acje.r b/simple_examples/baseresults/s30acje.r deleted file mode 100644 index 134730e..0000000 --- a/simple_examples/baseresults/s30acje.r +++ /dev/null @@ -1,9 +0,0 @@ - S30ACJ Example Program Results - - SIGMA IVALID - - 7.834E-01 0 - 7.386E-01 0 - 4.096E-01 0 - 4.085E-01 0 - 4.179E-01 0 diff --git a/simple_examples/baseresults/simpleroutineexample.r b/simple_examples/baseresults/simpleroutineexample.r deleted file mode 100644 index e1f6a4e..0000000 --- a/simple_examples/baseresults/simpleroutineexample.r +++ /dev/null @@ -1,15 +0,0 @@ - C05AZ Example Program results: - - Iterations - - X = 0.00000 FX= 1.0000e+00 IND = 2 - X = 1.00000 FX= -6.3212e-01 IND = 3 - X = 0.61270 FX= -7.0814e-02 IND = 4 - X = 0.56707 FX= 1.1542e-04 IND = 4 - X = 0.56714 FX= -9.4481e-07 IND = 4 - X = 0.56713 FX= 1.4727e-05 IND = 4 - X = 0.56714 FX= -9.4481e-07 IND = 4 - - Solution - - X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/userdefinedfunctionexample1.r b/simple_examples/baseresults/userdefinedfunctionexample1.r deleted file mode 100644 index c2fd510..0000000 --- a/simple_examples/baseresults/userdefinedfunctionexample1.r +++ /dev/null @@ -1 +0,0 @@ -The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/userdefinedfunctionexample2.r b/simple_examples/baseresults/userdefinedfunctionexample2.r deleted file mode 100644 index c2fd510..0000000 --- a/simple_examples/baseresults/userdefinedfunctionexample2.r +++ /dev/null @@ -1 +0,0 @@ -The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/x03aaje.r b/simple_examples/baseresults/x03aaje.r deleted file mode 100644 index d2b7138..0000000 --- a/simple_examples/baseresults/x03aaje.r +++ /dev/null @@ -1,3 +0,0 @@ -X03AAF Example Program Results - -D1 = -5.0 D2 = 0.0 \ No newline at end of file diff --git a/simple_examples/baseresults/x04cbje.r b/simple_examples/baseresults/x04cbje.r deleted file mode 100644 index 6b842ef..0000000 --- a/simple_examples/baseresults/x04cbje.r +++ /dev/null @@ -1,21 +0,0 @@ -X04CBJ Example Program Results - - Example 1 - 1 2 3 4 5 - 1 11.0000 12.0000 13.0000 14.0000 15.0000 - 2 21.0000 22.0000 23.0000 24.0000 25.0000 - 3 31.0000 32.0000 33.0000 34.0000 35.0000 - - Example 2: - Un Deux Trois Quatre Cinq - Uno 11.00 12.00 13.00 14.00 15.00 - Due 22.00 23.00 24.00 25.00 - Tre 33.00 34.00 35.00 - Quattro 44.00 45.00 - Cinque 55.00 - - A = [ - 11.00 0.00 0.00 0.00 0.00; - 21.00 22.00 0.00 0.00 0.00; - 31.00 32.00 33.00 0.00 0.00; - ]; diff --git a/simple_examples/baseresults/x05abje.r b/simple_examples/baseresults/x05abje.r deleted file mode 100644 index f94235c..0000000 --- a/simple_examples/baseresults/x05abje.r +++ /dev/null @@ -1,2 +0,0 @@ - X05ABJ Example Program Results -Tue 14th Jul 1789 13:11:48.320 diff --git a/simple_examples/data/c02abje.d b/simple_examples/data/c02abje.d deleted file mode 100644 index 3f2dfd1..0000000 --- a/simple_examples/data/c02abje.d +++ /dev/null @@ -1,14 +0,0 @@ -C02ABJ Example Program Data - -Example 1: Basic Problem - 6 : Degree, n - 3.5 : Coefficients, a - 1.0 - -7.0 - 12.5 - 2.5 - -17.0 - 32.5 - -Example 2: Polishing Processes - 10 : Degree, n diff --git a/simple_examples/data/c02afje.d b/simple_examples/data/c02afje.d deleted file mode 100644 index 0e31bab..0000000 --- a/simple_examples/data/c02afje.d +++ /dev/null @@ -1,19 +0,0 @@ -C02AFJ Example Program Data - -Example 1 - 5 - 5.0 6.0 - 30.0 20.0 - -0.2 -6.0 - 50.0 100000.0 - -2.0 40.0 - 10.0 1.0 - -Example 2 - 5 - 5.0 6.0 - 30.0 20.0 - -0.2 -6.0 - 50.0 100000.0 - -2.0 40.0 - 10.0 1.0 diff --git a/simple_examples/data/c02agje.d b/simple_examples/data/c02agje.d deleted file mode 100644 index ada6a96..0000000 --- a/simple_examples/data/c02agje.d +++ /dev/null @@ -1,9 +0,0 @@ -C02AGJ Example Program Data - -Example 1 - 5 - 1.0 2.0 3.0 4.0 5.0 6.0 - -Example 2 - 5 - 1.0 2.0 3.0 4.0 5.0 6.0 diff --git a/simple_examples/data/c02ahje.d b/simple_examples/data/c02ahje.d deleted file mode 100644 index 0e1a9ea..0000000 --- a/simple_examples/data/c02ahje.d +++ /dev/null @@ -1,2 +0,0 @@ -C02AHJ Example Program Data - 1.0 0.0 -3.0 1.0 8.0 1.0 :AR AI BR BI CR CI diff --git a/simple_examples/data/c02ajje.d b/simple_examples/data/c02ajje.d deleted file mode 100644 index c24b295..0000000 --- a/simple_examples/data/c02ajje.d +++ /dev/null @@ -1,2 +0,0 @@ -C02AJJ Example Program Data - 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/c02akje.d b/simple_examples/data/c02akje.d deleted file mode 100644 index 0b71c64..0000000 --- a/simple_examples/data/c02akje.d +++ /dev/null @@ -1,2 +0,0 @@ -C02AKJ Example Program Data - 1.0 3.0 9.0 -13.0 : Values of U, R, S and T diff --git a/simple_examples/data/c02alje.d b/simple_examples/data/c02alje.d deleted file mode 100644 index a519a24..0000000 --- a/simple_examples/data/c02alje.d +++ /dev/null @@ -1,2 +0,0 @@ -C02ALJ Example Program Data - 1.0 2.0 6.0 -8.0 -40.0 : Values of E, A, B, C and D diff --git a/simple_examples/data/c02amje.d b/simple_examples/data/c02amje.d deleted file mode 100644 index 9bff4dc..0000000 --- a/simple_examples/data/c02amje.d +++ /dev/null @@ -1,5 +0,0 @@ -C02AMJ Example Program Data - ( 1.0, 0.0) - ( -2.0, 3.0) - ( 5.0, 14.0) - (-40.0, -5.0) : Values of U, R, S and T diff --git a/simple_examples/data/c02anje.d b/simple_examples/data/c02anje.d deleted file mode 100644 index c331b10..0000000 --- a/simple_examples/data/c02anje.d +++ /dev/null @@ -1,6 +0,0 @@ -C02ANJ Example Program Data - ( 1.0, 0.0) - ( 0.0, 0.0) - ( 0.0, 16.0) - ( -8.0, 8.0) - (-65.0, 0.0) : Values of E, A, B, C and D diff --git a/simple_examples/data/c05bbje.d b/simple_examples/data/c05bbje.d deleted file mode 100644 index 6c78ea9..0000000 --- a/simple_examples/data/c05bbje.d +++ /dev/null @@ -1,7 +0,0 @@ -C05BBJ Example Program Data -0 : BRANCH -false : OFFSET -0.5 -1.0 -1.0 2.3 -4.5 -0.1 -6.0 6.0 : Z diff --git a/simple_examples/data/c06fkje.d b/simple_examples/data/c06fkje.d deleted file mode 100644 index e042218..0000000 --- a/simple_examples/data/c06fkje.d +++ /dev/null @@ -1,11 +0,0 @@ -C06FKJ Example Program Data -9 : n -1.00 0.50 -1.00 0.50 -1.00 0.50 -1.00 0.50 -1.00 0.00 -0.00 0.00 -0.00 0.00 -0.00 0.00 -0.00 0.00 : xa, ya diff --git a/simple_examples/data/c09aaje.d b/simple_examples/data/c09aaje.d deleted file mode 100644 index 8313509..0000000 --- a/simple_examples/data/c09aaje.d +++ /dev/null @@ -1,11 +0,0 @@ -C09AAF Example Program Data - 8 : n - Haar Zero : wavnam, mode - 2.0 - 5.0 - 8.0 - 9.0 - 7.0 - 4.0 --1.0 - 1.0 : x(1:n) diff --git a/simple_examples/data/d03pcje.d b/simple_examples/data/d03pcje.d deleted file mode 100644 index 9e78e1f..0000000 --- a/simple_examples/data/d03pcje.d +++ /dev/null @@ -1,6 +0,0 @@ -D03PCJ Example Program Data -6 20 1 : intpts, npts, itype -0.0 0.4 0.6 0.8 0.9 1.0 : xout(1:intpts) -1.0E-3 1.0 : acc, alpha -1 0 : m, itrace -0.0 0.1E-4 : ts, tout diff --git a/simple_examples/data/e02alje.d b/simple_examples/data/e02alje.d deleted file mode 100644 index b1c9d44..0000000 --- a/simple_examples/data/e02alje.d +++ /dev/null @@ -1,23 +0,0 @@ -E02ALJ Example Program Data - 21 5 11 : N, M, NEVAL - 0.00 1.0000000000 - 0.05 1.0512710964 - 0.10 1.1051709181 - 0.15 1.1618342427 - 0.20 1.2214027582 - 0.25 1.2840254167 - 0.30 1.3498588076 - 0.35 1.4190675486 - 0.40 1.4918246976 - 0.45 1.5683121855 - 0.50 1.6487212707 - 0.55 1.7332530179 - 0.60 1.8221188004 - 0.65 1.9155408290 - 0.70 2.0137527075 - 0.75 2.1170000166 - 0.80 2.2255409285 - 0.85 2.3396468519 - 0.90 2.4596031112 - 0.95 2.5857096593 - 1.00 2.7182818285 : X, Y diff --git a/simple_examples/data/e04fcje.d b/simple_examples/data/e04fcje.d deleted file mode 100644 index 963a616..0000000 --- a/simple_examples/data/e04fcje.d +++ /dev/null @@ -1,16 +0,0 @@ -E04FCF Example Program Data - 0.14 1.0 15.0 1.0 - 0.18 2.0 14.0 2.0 - 0.22 3.0 13.0 3.0 - 0.25 4.0 12.0 4.0 - 0.29 5.0 11.0 5.0 - 0.32 6.0 10.0 6.0 - 0.35 7.0 9.0 7.0 - 0.39 8.0 8.0 8.0 - 0.37 9.0 7.0 7.0 - 0.58 10.0 6.0 6.0 - 0.73 11.0 5.0 5.0 - 0.96 12.0 4.0 4.0 - 1.34 13.0 3.0 3.0 - 2.10 14.0 2.0 2.0 - 4.39 15.0 1.0 1.0 diff --git a/simple_examples/data/e04mxje.d b/simple_examples/data/e04mxje.d deleted file mode 100644 index 7d45bf8..0000000 --- a/simple_examples/data/e04mxje.d +++ /dev/null @@ -1,64 +0,0 @@ -NAME E04MX.EX -ROWS - L ..ROW1.. - L ..ROW2.. - L ..ROW3.. - N ..COST.. -COLUMNS - ...X1... ..ROW1.. 1.0 ..ROW2.. 1.0 - ...X1... ..ROW3.. 1.0 ..COST.. -4.0 - ...X2... ..ROW1.. 1.0 ..ROW2.. 2.0 - ...X2... ..ROW3.. -1.0 ..COST.. -1.0 - ...X3... ..ROW1.. 1.0 ..ROW2.. 3.0 - ...X3... ..ROW3.. 1.0 ..COST.. -1.0 - ...X4... ..ROW1.. 1.0 ..ROW2.. 4.0 - ...X4... ..ROW3.. -1.0 ..COST.. -1.0 - ...X5... ..ROW1.. 1.0 ..ROW2.. -2.0 - ...X5... ..ROW3.. 1.0 ..COST.. -1.0 - ...X6... ..ROW1.. 1.0 ..ROW2.. 1.0 - ...X6... ..ROW3.. 1.0 ..COST.. -1.0 - ...X7... ..ROW1.. 1.0 ..ROW2.. 1.0 - ...X7... ..ROW3.. 1.0 ..COST.. -1.0 - ...X8... ..ROW1.. 1.0 ..ROW2.. 1.0 - ...X8... ..ROW3.. 1.0 ..COST.. -0.1 - ...X9... ..ROW1.. 4.0 ..ROW2.. 1.0 - ...X9... ..ROW3.. 1.0 ..COST.. -0.3 -RHS - RHS1 ..ROW1.. 1.5 - RHS1 ..ROW2.. 1.5 - RHS1 ..ROW3.. 4.0 - RHS1 ..COST.. 1000.0 -RANGES - RANGE1 ..ROW1.. 3.5 - RANGE1 ..ROW2.. 3.5 - RANGE1 ..ROW3.. 6.0 -BOUNDS - LO BOUND ...X1... -2.0 - LO BOUND ...X2... -2.0 - LO BOUND ...X3... -2.0 - LO BOUND ...X4... -2.0 - LO BOUND ...X5... -2.0 - LO BOUND ...X6... -2.0 - LO BOUND ...X7... -2.0 - LO BOUND ...X8... -2.0 - LO BOUND ...X9... -2.0 - UP BOUND ...X1... 2.0 - UP BOUND ...X2... 2.0 - UP BOUND ...X3... 2.0 - UP BOUND ...X4... 2.0 - UP BOUND ...X5... 2.0 - UP BOUND ...X6... 2.0 - UP BOUND ...X7... 2.0 - UP BOUND ...X8... 2.0 - UP BOUND ...X9... 2.0 -QUADOBJ - ...X1... ...X1... 2.00000000E0 ...X2... 1.00000000E0 - ...X1... ...X3... 1.00000000E0 ...X4... 1.00000000E0 - ...X1... ...X5... 1.00000000E0 - ...X2... ...X2... 2.00000000E0 ...X3... 1.00000000E0 - ...X2... ...X4... 1.00000000E0 ...X5... 1.00000000E0 - ...X3... ...X3... 2.00000000E0 ...X4... 1.00000000E0 - ...X3... ...X5... 1.00000000E0 - ...X4... ...X4... 2.00000000E0 ...X5... 1.00000000E0 - ...X5... ...X5... 2.00000000E0 -ENDATA diff --git a/simple_examples/data/e04ncje.d b/simple_examples/data/e04ncje.d deleted file mode 100644 index bdf378b..0000000 --- a/simple_examples/data/e04ncje.d +++ /dev/null @@ -1,21 +0,0 @@ -E04NCA Example Program Data - 10 9 3 :Values of M, N and NCLIN - 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 - 1.0 2.0 1.0 1.0 1.0 1.0 2.0 0.0 0.0 - 1.0 1.0 3.0 1.0 1.0 1.0 -1.0 -1.0 -3.0 - 1.0 1.0 1.0 4.0 1.0 1.0 1.0 1.0 1.0 - 1.0 1.0 1.0 3.0 1.0 1.0 1.0 1.0 1.0 - 1.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 -1.0 - 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 - 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 - 1.0 1.0 0.0 1.0 1.0 1.0 2.0 2.0 3.0 - 1.0 0.0 1.0 1.0 1.0 1.0 0.0 2.0 2.0 :End of matrix A - 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 :End of B - 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 - 1.0 2.0 3.0 4.0 -2.0 1.0 1.0 1.0 1.0 - 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 :End of matrix C - 0.0 0.0 -1.0E+25 0.0 0.0 0.0 0.0 0.0 0.0 - 2.0 -1.0E+25 1.0 :End of BL - 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 - 1.0E+25 2.0 4.0 :End of BU - 1.0 0.5 0.3333 0.25 0.2 0.1667 0.1428 0.125 0.1111 :End of X diff --git a/simple_examples/data/e04nfje.d b/simple_examples/data/e04nfje.d deleted file mode 100644 index f2c6165..0000000 --- a/simple_examples/data/e04nfje.d +++ /dev/null @@ -1,22 +0,0 @@ -E04NFA Example Program Data - 7 7 :Values of N and NCLIN - -0.02 -0.20 -0.20 -0.20 -0.20 0.04 0.04 :End of CVEC - 1.00 1.00 1.00 1.00 1.00 1.00 1.00 - 0.15 0.04 0.02 0.04 0.02 0.01 0.03 - 0.03 0.05 0.08 0.02 0.06 0.01 0.00 - 0.02 0.04 0.01 0.02 0.02 0.00 0.00 - 0.02 0.03 0.00 0.00 0.01 0.00 0.00 - 0.70 0.75 0.80 0.75 0.80 0.97 0.00 - 0.02 0.06 0.08 0.12 0.02 0.01 0.97 :End of matrix A - -0.01 -0.10 -0.01 -0.04 -0.10 -0.01 -0.01 - -0.13 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 -9.92E-02 -3.0E-03 :End of BL - 0.01 0.15 0.03 0.02 0.05 1.0E+25 1.0E+25 - -0.13 -4.9E-03 -6.4E-03 -3.7E-03 -1.2E-03 1.0E+25 2.0E-03 :End of BU - -0.01 -0.03 0.00 -0.01 -0.10 0.02 0.01 :End of X - 2.00 0.00 0.00 0.00 0.00 0.00 0.00 - 0.00 2.00 0.00 0.00 0.00 0.00 0.00 - 0.00 0.00 2.00 2.00 0.00 0.00 0.00 - 0.00 0.00 2.00 2.00 0.00 0.00 0.00 - 0.00 0.00 0.00 0.00 2.00 0.00 0.00 - 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 - 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 :End of matrix H diff --git a/simple_examples/data/e04nqje.d b/simple_examples/data/e04nqje.d deleted file mode 100644 index a1c9039..0000000 --- a/simple_examples/data/e04nqje.d +++ /dev/null @@ -1,67 +0,0 @@ -E04NQF Example Program Data - 7 8 : Values of N and M -48 8 7 'C' 15 : Values of NNZ, IOBJ, NCOLH, START and NNAME - -'...X1...' '...X2...' '...X3...' '...X4...' '...X5...' -'...X6...' '...X7...' '..ROW1..' '..ROW2..' '..ROW3..' -'..ROW4..' '..ROW5..' '..ROW6..' '..ROW7..' '..COST..' : End of array NAMES - - 0.02 7 1 : Sparse matrix A, ordered by increasing column index; - 0.02 5 1 : each row contains ACOL(i), INDA(i), ICOL (= column index) - 0.03 3 1 : The row indices may be in any order. In this example - 1.00 1 1 : row 8 defines the linear objective term transpose(C)*X. - 0.70 6 1 - 0.02 4 1 - 0.15 2 1 - -200.00 8 1 - 0.06 7 2 - 0.75 6 2 - 0.03 5 2 - 0.04 4 2 - 0.05 3 2 - 0.04 2 2 - 1.00 1 2 --2000.00 8 2 - 0.02 2 3 - 1.00 1 3 - 0.01 4 3 - 0.08 3 3 - 0.08 7 3 - 0.80 6 3 --2000.00 8 3 - 1.00 1 4 - 0.12 7 4 - 0.02 3 4 - 0.02 4 4 - 0.75 6 4 - 0.04 2 4 --2000.00 8 4 - 0.01 5 5 - 0.80 6 5 - 0.02 7 5 - 1.00 1 5 - 0.02 2 5 - 0.06 3 5 - 0.02 4 5 --2000.00 8 5 - 1.00 1 6 - 0.01 2 6 - 0.01 3 6 - 0.97 6 6 - 0.01 7 6 - 400.00 8 6 - 0.97 7 7 - 0.03 2 7 - 1.00 1 7 - 400.00 8 7 : End of matrix A - - 0.0 0.0 4.0E+02 1.0E+02 0.0 0.0 - 0.0 2.0E+03 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 - 1.5E+03 2.5E+02 -1.0E+25 : End of lower bounds array BL - - 2.0E+02 2.5E+03 8.0E+02 7.0E+02 1.5E+03 1.0E+25 - 1.0E+25 2.0E+03 6.0E+01 1.0E+02 4.0E+01 3.0E+01 - 1.0E+25 3.0E+02 1.0E+25 : End of upper bounds array BU - - 0 0 0 0 0 0 0 : Initial array HS - 0.0 0.0 0.0 0.0 0.0 0.0 0.0 : Initial vector X diff --git a/simple_examples/data/e04rsje.d b/simple_examples/data/e04rsje.d deleted file mode 100644 index 9540ce2..0000000 --- a/simple_examples/data/e04rsje.d +++ /dev/null @@ -1,13 +0,0 @@ -E04RSJ Example Program Data - 3 6 6 : n, nnzq1, nnzq2 - 1 1 1 2 2 3 : irowq0 - 1 2 3 2 3 3 : icolq0 - 0.493 0.382 0.270 0.475 0.448 0.515 : q0 - 1 1 1 2 2 3 : irowq1 - 1 2 3 2 3 3 : icolq1 - 0.737 0.453 1.002 0.316 0.635 1.590 : q1 - 1 2 3 : idxr0 - 0.847 0.08 0.505 : r0 - 1 2 3 : idxr1 - 0.065 0.428 0.097 : r1 - 1.276 : s diff --git a/simple_examples/data/e04rtje.d b/simple_examples/data/e04rtje.d deleted file mode 100644 index f6f5896..0000000 --- a/simple_examples/data/e04rtje.d +++ /dev/null @@ -1,8 +0,0 @@ -E04RTJ Example Program Data - 3 2 4 : n, m, nnza - 1 1 2 2 : irowa - 1 2 2 3 : icola - 0.493 0.382 0.270 0.475 : a - 0.2 0.4 : b - -1.0 -1.0 -1.0 : xl - 1.0 1.0 1.0 : xu diff --git a/simple_examples/data/e04saje.opt b/simple_examples/data/e04saje.opt deleted file mode 100644 index 098dd78..0000000 --- a/simple_examples/data/e04saje.opt +++ /dev/null @@ -1,30 +0,0 @@ -NAME E04SAJE -OBJSENSE - MIN -ROWS - N obj - L g1 - G g2 -COLUMNS - x1 obj 10.0 - x1 g1 -0.1 - x1 g2 -0.06 - x2 obj 20.0 - x2 g1 -0.1 - x2 g2 1.0 - x3 obj 1.0 - x3 g1 1.0 - x3 g2 1.0 -RHS - UVEC g1 1.5 - UVEC g2 1.0 -BOUNDS - LO bound x1 -2.0 - UP bound x1 2.0 - LO bound x2 -2.0 - UP bound x2 2.0 -CSECTION k1 0 QUAD - x3 - x1 - x2 -ENDATA diff --git a/simple_examples/data/e04tcje.d b/simple_examples/data/e04tcje.d deleted file mode 100644 index 0d7c25f..0000000 --- a/simple_examples/data/e04tcje.d +++ /dev/null @@ -1,22 +0,0 @@ -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/f03baje.d b/simple_examples/data/f03baje.d deleted file mode 100644 index 8c792dc..0000000 --- a/simple_examples/data/f03baje.d +++ /dev/null @@ -1,5 +0,0 @@ -F03BAF Example Program Data - 3 : N - 33 16 72 - -24 -10 -57 - -8 -4 -17 : A diff --git a/simple_examples/data/f04amje.d b/simple_examples/data/f04amje.d deleted file mode 100644 index dc69386..0000000 --- a/simple_examples/data/f04amje.d +++ /dev/null @@ -1,5 +0,0 @@ -F04AMF Example Program Data - 3 2 : m, n - 1.1 0.9 2.2 - 1.2 1.0 2.3 - 1.0 1.0 2.1 : matrices A and B diff --git a/simple_examples/data/f04baje.d b/simple_examples/data/f04baje.d deleted file mode 100644 index b1df19b..0000000 --- a/simple_examples/data/f04baje.d +++ /dev/null @@ -1,13 +0,0 @@ -F04BAF Example Program Data - - 4 2 : n, nrhs - - 1.80 2.88 2.05 -0.89 - 5.25 -2.95 -0.95 -3.80 - 1.58 -2.69 -2.90 -1.04 - -1.11 -0.66 -0.59 0.80 : matrix A - - 9.52 18.47 - 24.35 2.25 - 0.77 -13.28 - -6.22 -6.21 : matrix B diff --git a/simple_examples/data/f05aaje.d b/simple_examples/data/f05aaje.d deleted file mode 100644 index cafb7ea..0000000 --- a/simple_examples/data/f05aaje.d +++ /dev/null @@ -1,6 +0,0 @@ -F05AAF Example Program Data - 4 2 4 - 1 -2 3 1 --2 1 -2 -1 - 3 -2 1 5 - 4 1 5 3 \ No newline at end of file diff --git a/simple_examples/data/f08btje.d b/simple_examples/data/f08btje.d deleted file mode 100644 index bea5bf4..0000000 --- a/simple_examples/data/f08btje.d +++ /dev/null @@ -1,15 +0,0 @@ -F08BTF Example Program Data - - 5 4 2 :Values of M, N and NRHS - - ( 0.47,-0.34) (-0.40, 0.54) ( 0.60, 0.01) ( 0.80,-1.02) - (-0.32,-0.23) (-0.05, 0.20) (-0.26,-0.44) (-0.43, 0.17) - ( 0.35,-0.60) (-0.52,-0.34) ( 0.87,-0.11) (-0.34,-0.09) - ( 0.89, 0.71) (-0.45,-0.45) (-0.02,-0.57) ( 1.14,-0.78) - (-0.19, 0.06) ( 0.11,-0.85) ( 1.44, 0.80) ( 0.07, 1.14) :End of matrix A - - (-1.08,-2.59) ( 2.22, 2.35) - (-2.61,-1.49) ( 1.62,-1.48) - ( 3.13,-3.61) ( 1.65, 3.43) - ( 7.33,-8.01) (-0.98, 3.08) - ( 9.12, 7.63) (-2.84, 2.78) :End of matrix B diff --git a/simple_examples/data/f08xpje.d b/simple_examples/data/f08xpje.d deleted file mode 100644 index 39b5c87..0000000 --- a/simple_examples/data/f08xpje.d +++ /dev/null @@ -1,10 +0,0 @@ -F08XPJ Example Program Data -4 : Value of N -(-21.10,-22.50) ( 53.50,-50.50) (-34.50,127.50) ( 7.50, 0.50) -( -0.46, -7.78) ( -3.50,-37.50) (-15.50, 58.50) (-10.50, -1.50) -( 4.30, -5.50) ( 39.70,-17.10) (-68.50, 12.50) ( -7.50, -3.50) -( 5.50, 4.40) ( 14.40, 43.30) (-32.50,-46.00) (-19.00,-32.50) : End of A -( 1.00, -5.00) ( 1.60, 1.20) ( -3.00, 0.00) ( 0.00, -1.00) -( 0.80, -0.60) ( 3.00, -5.00) ( -4.00, 3.00) ( -2.40, -3.20) -( 1.00, 0.00) ( 2.40, 1.80) ( -4.00, -5.00) ( 0.00, -3.00) -( 0.00, 1.00) ( -1.80, 2.40) ( 0.00, -4.00) ( 4.00, -5.00) : End of B diff --git a/simple_examples/data/g02bjje.d b/simple_examples/data/g02bjje.d deleted file mode 100644 index eaa8921..0000000 --- a/simple_examples/data/g02bjje.d +++ /dev/null @@ -1,10 +0,0 @@ -G02BJF Example Program Data -5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 -12.0 2.0 0.0 0.0 --1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS --1.0 0.0 0.0 0.0 :: XMISS -4 1 2 :: KVAR diff --git a/simple_examples/data/g02daje.d b/simple_examples/data/g02daje.d deleted file mode 100644 index 4e844ac..0000000 --- a/simple_examples/data/g02daje.d +++ /dev/null @@ -1,15 +0,0 @@ -G02DAJ Example Program Data -12 4 'U' 'M' -1.0 0.0 0.0 0.0 33.63 -0.0 0.0 0.0 1.0 39.62 -0.0 1.0 0.0 0.0 38.18 -0.0 0.0 1.0 0.0 41.46 -0.0 0.0 0.0 1.0 38.02 -0.0 1.0 0.0 0.0 35.83 -0.0 0.0 0.0 1.0 35.99 -1.0 0.0 0.0 0.0 36.58 -0.0 0.0 1.0 0.0 42.92 -1.0 0.0 0.0 0.0 37.80 -0.0 0.0 1.0 0.0 40.43 -0.0 1.0 0.0 0.0 37.89 -1 1 1 1 diff --git a/simple_examples/data/g02eeje.d b/simple_examples/data/g02eeje.d deleted file mode 100644 index b0c03a7..0000000 --- a/simple_examples/data/g02eeje.d +++ /dev/null @@ -1,24 +0,0 @@ -G02EEF Example Program Data - 20 6 'M' 'U' 2.0 :: N,M,MEAN,WEIGHT,FIN - 0.0 1125.0 232.0 7160.0 85.9 8905.0 1.5563 - 7.0 920.0 268.0 8804.0 86.5 7388.0 0.8976 - 15.0 835.0 271.0 8108.0 85.2 5348.0 0.7482 - 22.0 1000.0 237.0 6370.0 83.8 8056.0 0.7160 - 29.0 1150.0 192.0 6441.0 82.1 6960.0 0.3010 - 37.0 990.0 202.0 5154.0 79.2 5690.0 0.3617 - 44.0 840.0 184.0 5896.0 81.2 6932.0 0.1139 - 58.0 650.0 200.0 5336.0 80.6 5400.0 0.1139 - 65.0 640.0 180.0 5041.0 78.4 3177.0 -0.2218 - 72.0 583.0 165.0 5012.0 79.3 4461.0 -0.1549 - 80.0 570.0 151.0 4825.0 78.7 3901.0 0.0000 - 86.0 570.0 171.0 4391.0 78.0 5002.0 0.0000 - 93.0 510.0 243.0 4320.0 72.3 4665.0 -0.0969 - 100.0 555.0 147.0 3709.0 74.9 4642.0 -0.2218 - 107.0 460.0 286.0 3969.0 74.4 4840.0 -0.3979 - 122.0 275.0 198.0 3558.0 72.5 4479.0 -0.1549 - 129.0 510.0 196.0 4361.0 57.7 4200.0 -0.2218 - 151.0 165.0 210.0 3301.0 71.8 3410.0 -0.3979 - 171.0 244.0 327.0 2964.0 72.5 3360.0 -0.5229 - 220.0 79.0 334.0 2777.0 71.9 2599.0 -0.0458 :: End of X,Y - 0 1 1 1 1 2 :: ISX - 'DAY' 'BOD' 'TKN' 'TS ' 'TVS' 'COD' :: VNAME diff --git a/simple_examples/data/g02maje.d b/simple_examples/data/g02maje.d deleted file mode 100644 index b21e21c..0000000 --- a/simple_examples/data/g02maje.d +++ /dev/null @@ -1,23 +0,0 @@ -G02MAJ Example Program Data -20 6 :: N,M -1 3 1 6 0 :: MTYPE,PRED,PREY,MNSTEP,LISX -10.28 1.77 9.69 15.58 8.23 10.44 -46.47 -9.08 8.99 11.53 6.57 15.89 12.58 -35.80 -17.98 13.10 1.04 10.45 10.12 16.68 -129.22 -14.82 13.79 12.23 7.00 8.14 7.79 -42.44 -17.53 9.41 6.24 3.75 13.12 17.08 -73.51 -7.78 10.38 9.83 2.58 10.13 4.25 -26.61 -11.95 21.71 8.83 11.00 12.59 10.52 -63.90 -14.60 10.09 -2.70 9.89 14.67 6.49 -76.73 -3.63 9.07 12.59 14.09 9.06 8.19 -32.64 -6.35 9.79 9.40 12.79 8.38 16.79 -83.29 -4.66 3.55 16.82 13.83 21.39 13.88 -16.31 -8.32 14.04 17.17 7.93 7.39 -1.09 -5.82 -10.86 13.68 5.75 10.44 10.36 10.06 -47.75 -4.76 4.92 17.83 2.90 7.58 11.97 18.38 -5.05 10.41 9.89 9.04 7.90 13.12 -54.71 -5.41 9.32 5.27 15.53 5.06 19.84 -55.62 -9.77 2.37 9.54 20.23 9.33 8.82 -45.28 -14.28 4.34 14.23 14.95 18.16 11.03 -22.76 -10.17 6.80 3.17 8.57 16.07 15.93 -104.32 -5.39 2.67 6.37 13.56 10.68 7.35 -55.94 :: End of D, Y diff --git a/simple_examples/data/g03gaje.d b/simple_examples/data/g03gaje.d deleted file mode 100644 index ca1c97f..0000000 --- a/simple_examples/data/g03gaje.d +++ /dev/null @@ -1,56 +0,0 @@ -G03GAF Example Program Data -25 4 4 : N M IP -2 : NG -2 : SOPT -2 : POPT -15 : NITER -2.7 3.2 4.5 4.8 -3.9 3.8 5.9 6.2 -4.8 4.1 6.8 5.5 -3.1 3.5 4.3 4.6 -3.4 3.7 5.1 5.6 -3.1 3.4 4.1 4.7 -4.6 4.4 6.6 6.1 -3.1 3.3 4.0 4.9 -3.8 3.7 4.7 4.9 -5.2 4.9 8.2 6.9 -3.9 3.8 5.2 5.4 -4.1 4.0 5.6 5.6 -5.7 5.1 7.0 6.3 -3.0 3.2 4.5 5.0 -2.9 3.3 4.5 5.1 -3.4 3.3 4.4 5.0 -4.0 4.2 5.2 5.4 -3.0 3.0 4.6 5.0 -4.0 4.1 5.9 5.8 -3.0 3.2 4.4 5.1 -3.6 3.6 5.3 5.4 -3.1 3.2 4.6 5.0 -3.2 3.3 5.4 5.3 -3.0 3.4 4.2 4.7 -3.8 4.0 6.9 6.7 : X -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 -0.0 1.0 : P diff --git a/simple_examples/data/g05kfje.d b/simple_examples/data/g05kfje.d deleted file mode 100644 index b55cba0..0000000 --- a/simple_examples/data/g05kfje.d +++ /dev/null @@ -1,3 +0,0 @@ -G05KFF Example Program Data -1 1 1762543 :: GENID,SUBID,SEED(1) -5 :: N diff --git a/simple_examples/data/g13naje.d b/simple_examples/data/g13naje.d deleted file mode 100644 index 4da5b32..0000000 --- a/simple_examples/data/g13naje.d +++ /dev/null @@ -1,14 +0,0 @@ -G13NAJ Example Program Data -100 :: N -0.00 0.78 -0.02 0.17 0.04 -1.23 0.24 1.70 0.77 0.06 -0.67 0.94 1.99 2.64 2.26 3.72 3.14 2.28 3.78 0.83 -2.80 1.66 1.93 2.71 2.97 3.04 2.29 3.71 1.69 2.76 -1.96 3.17 1.04 1.50 1.12 1.11 1.00 1.84 1.78 2.39 -1.85 0.62 2.16 0.78 1.70 0.63 1.79 1.21 2.20 -1.34 -0.04 -0.14 2.78 1.83 0.98 0.19 0.57 -1.41 2.05 1.17 -0.44 2.32 0.67 0.73 1.17 -0.34 2.95 1.08 2.16 2.27 --0.14 -0.24 0.27 1.71 -0.04 -1.03 -0.12 -0.67 1.15 -1.10 --1.37 0.59 0.44 0.63 -0.06 -0.62 0.39 -2.63 -1.63 -0.42 --0.73 0.85 0.26 0.48 -0.26 -1.77 -1.53 -1.39 1.68 0.43 :: End of Y -1 1 4.6 2 :: CTYPE,IPARAM,BETA,MINSS -1.0 :: PARAM(1) diff --git a/simple_examples/data/m01ccje.d b/simple_examples/data/m01ccje.d deleted file mode 100644 index 3a946ab..0000000 --- a/simple_examples/data/m01ccje.d +++ /dev/null @@ -1,13 +0,0 @@ -M01CCF Example Program Data -11 -A02AAF 289 -A02ABF 523 -A02ACF 531 -C02ADF 169 -C02AEF 599 -C05AUF 1351 -C05AVF 240 -C05AWF 136 -C05AXF 211 -C05AYF 183 -C05AZF 2181 diff --git a/simple_examples/data/s14abje.d b/simple_examples/data/s14abje.d deleted file mode 100644 index 083a4f4..0000000 --- a/simple_examples/data/s14abje.d +++ /dev/null @@ -1,10 +0,0 @@ -S14ABF Example Program Data - 1.0 - 1.25 - 1.5 - 1.75 - 2.0 - 5.0 - 10.0 - 20.0 - 1000.0 diff --git a/simple_examples/data/s14acje.d b/simple_examples/data/s14acje.d deleted file mode 100644 index 64a16c9..0000000 --- a/simple_examples/data/s14acje.d +++ /dev/null @@ -1,5 +0,0 @@ -S14ACJ Example Program Data -0.1 -0.5 -3.6 -8.0 diff --git a/simple_examples/data/s14afje.d b/simple_examples/data/s14afje.d deleted file mode 100644 index f658cc5..0000000 --- a/simple_examples/data/s14afje.d +++ /dev/null @@ -1,2 +0,0 @@ -S14AFJ Example Program Data --1.5 2.5 1 : Values of Z and K diff --git a/simple_examples/data/s17dcje.d b/simple_examples/data/s17dcje.d deleted file mode 100644 index fa0d57f..0000000 --- a/simple_examples/data/s17dcje.d +++ /dev/null @@ -1,6 +0,0 @@ -S17DCJ Example Program Data -0.00 0.3 0.4 'U' -2.30 2.0 0.0 'U' -2.12 -1.0 0.0 'U' -1.58 -2.3 5.6 'U' -1.58 -2.3 5.6 'S' diff --git a/simple_examples/data/s17dgje.d b/simple_examples/data/s17dgje.d deleted file mode 100644 index 3e62c29..0000000 --- a/simple_examples/data/s17dgje.d +++ /dev/null @@ -1,6 +0,0 @@ -S17DGF Example Program Data - 'F' ( 0.3, 0.4) 'U' - 'F' ( 0.2, 0.0) 'U' - 'F' ( 1.1, -6.6) 'U' - 'F' ( 1.1, -6.6) 'S' - 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/s30aaje.d b/simple_examples/data/s30aaje.d deleted file mode 100644 index 0248da1..0000000 --- a/simple_examples/data/s30aaje.d +++ /dev/null @@ -1,9 +0,0 @@ -S30AAJ Example Program Data -'C' : Call = 'C', Put = 'P' -55.0 0.3 0.1 0.0 : S, SIGMA, R, Q -3 2 : M, N -58.0 -60.0 -62.0 : X(I), I = 1,2,...M -0.7 -0.8 : T(I), I = 1,2,...N diff --git a/simple_examples/data/s30acje.d b/simple_examples/data/s30acje.d deleted file mode 100644 index 48117a7..0000000 --- a/simple_examples/data/s30acje.d +++ /dev/null @@ -1,9 +0,0 @@ -S30ACJ Example Program Data -'C' : Call = 'C', Put = 'P' -5 1 : Values of n and mode - -4.14 3.89 5.39 5.14 5.04 : p -268.0 268.0 268.0 268.5 269.0 : k -267.5 267.5 267.5 267.5 267.5 : s0 -0.00274 0.00274 0.0164 0.0164 0.0164 : t -0.0166 0.0166 0.0166 0.0166 0.0166 : r diff --git a/simple_examples/data/x03aaje.d b/simple_examples/data/x03aaje.d deleted file mode 100644 index 1254b78..0000000 --- a/simple_examples/data/x03aaje.d +++ /dev/null @@ -1,5 +0,0 @@ -X03AAJ Example Program Data - -2 -3 7 - 2 -5 3 - -9 1 0 - 8 -4 -2 diff --git a/simple_examples/int32/A00AAJE.java b/simple_examples/int32/A00AAJE.java deleted file mode 100644 index 65b6c18..0000000 --- a/simple_examples/int32/A00AAJE.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.nag.routines.A00.A00AA; - -/** - * A00AA example program text. - */ -public class A00AAJE { - - public static void main(String[] args) { - A00AA a00aa = new A00AA(); - - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - - } - -} diff --git a/simple_examples/int32/A00ACJE.java b/simple_examples/int32/A00ACJE.java deleted file mode 100644 index 7f44ba3..0000000 --- a/simple_examples/int32/A00ACJE.java +++ /dev/null @@ -1,29 +0,0 @@ -import com.nag.routines.A00.A00AC; - -/** - * A00AC example program text. - * @author Mo - */ -public class A00ACJE { - - public static void main(String[] args) { - A00AC a00ac = new A00AC(); - boolean lmok; - - System.out.println(" A00ACJ Example Program Results\n"); - System.out.println(); - - a00ac.eval(); - - lmok = a00ac.eval(); - - if (lmok) { - System.out.println("A valid licence key is available"); - } - else { - System.out.println("No valid licence key was found"); - } - - } - -} diff --git a/simple_examples/int32/A00ADJE.java b/simple_examples/int32/A00ADJE.java deleted file mode 100644 index 139c8b9..0000000 --- a/simple_examples/int32/A00ADJE.java +++ /dev/null @@ -1,107 +0,0 @@ -import com.nag.routines.A00.A00AD; -import com.nag.routines.X05.X05AA; -import java.util.Arrays; - -/** - * A00AD example program text. - */ -public class A00ADJE { - - public static void main(String[] args) { - - A00AD a00ad = new A00AD(); - X05AA x05aa = new X05AA(); - int i, mkmaj, mkmin; - boolean licval; - String fcomp, hdware, impl, opsys, pcode, prec, vend; - int[] itime = new int[7]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - - System.out.println(" A00ADJ Example Program Results\n"); - - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - - // Output scalars must be retrieved manually - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - // Print implementation details - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/int32/C02AAJE.java b/simple_examples/int32/C02AAJE.java deleted file mode 100644 index 1abc528..0000000 --- a/simple_examples/int32/C02AAJE.java +++ /dev/null @@ -1,174 +0,0 @@ -import com.nag.routines.C02.C02AA; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.types.NAGComplex; -import java.util.Arrays; - -/** - * C02AA example program text. - * @author joed - * @since 27.1.0.0 - */ -public class C02AAJE { - - public static void main(String[] args) { - - System.out.println(" C02AAJ Example Program Results"); - - Routine.setComplex(new NAGComplex()); - exampleBasic(); - examplePolishing(); - - System.out.println(); - - } - - /** Demonstrate a basic problem. */ - public static void exampleBasic() { - - C02AA c02aa = new C02AA(); - int ifail, itmax, n, polish; - NAGComplex[] a, z; - double[] berr, cond; - int[] conv; - - System.out.println(); - System.out.println("Example 1: Basic Problem"); - System.out.println(); - - // Set polynomial degree and instantiate arrays - n = 5; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Set polynomial coefficients - a[0] = new NAGComplex(5.0, 6.0); - a[1] = new NAGComplex(30.0, 20.0); - a[2] = new NAGComplex(-0.2, -6.0); - a[3] = new NAGComplex(50.0, 100000.0); - a[4] = new NAGComplex(-2.0, 40.0); - a[5] = new NAGComplex(10.0, 1.0); - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond "); - System.out.println(" ---------------------------------------------------"); - for (int i = 0; i < n; i++) { - System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, - z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - - } - - /** Compare polishing processes on a Wilkinson-style polynomial. */ - public static void examplePolishing() { - - C02AA c02aa = new C02AA(); - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - NAGComplex pz; - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int ifail, itmax, k, n, polish; - NAGComplex[] a, z, zact; - double[] berr, cond; - int[] conv; - boolean[] matched; - - System.out.println(); - System.out.println("Example 2: Polishing Processes"); - System.out.println(); - - // Set polynomial degree and instantiate - n = 10; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = new NAGComplex[n]; - zact = new NAGComplex[n]; - - // Set known roots and (instantiate z) - for (int i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) i+1, 0.0); - z[i] = new NAGComplex(); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (int i = 0; i < n; i++) { - a[i] = new NAGComplex(); - } - a[n] = new NAGComplex(1.0, 0.0); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - a[j] = a[j+1].subtract(a[j].multiply(zact[i])); - } - a[n] = a[n].negate().multiply(zact[i]); - } - - System.out.println(" polish relerr fwderr "); - System.out.println(" ----------------------------"); - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - for (polish = 0; polish <= 2; polish++) { - - // Find roots - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - /* Calculate the maximum relative errors of the roots, and the maximum - * forward error evaluating the polynomial at those roots. Errors are - * capped at machine precision. */ - maxrelerr = maxfwderr = eps; - Arrays.fill(matched, false); - - for (int i = 0; i < n; i++) { - - // Evaluate polynomial at this root - pz = a[0].clone(); - for (int j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(a[j]); - } - - // Match to an expected root - k = 0; - err = rmax; - for (int j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - - } - -} diff --git a/simple_examples/int32/C02ABJE.java b/simple_examples/int32/C02ABJE.java deleted file mode 100644 index fad5ebb..0000000 --- a/simple_examples/int32/C02ABJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.C02.C02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AB - */ -public class C02ABJE { - - public static void main(String[] args) { - - final boolean polish_example = false; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" C02ABJ Example Program Results"); - - ex1_basic(args); - if (polish_example) { - ex2_polishing(args); - } - } - - public static void ex1_basic(String[] args) { - - int i, ifail, itmax, n = 0, polish; - - NAGComplex[] z = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - - System.out.println("\n Basic Problem\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - String line = reader.readLine(); - line = reader.readLine(); - line = reader.readLine(); - - // Read polynomial degree and allocate - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Read polynomial coefficients - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[i] = Double.parseDouble(sVal[0]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond"); - System.out.println(" -----------------------------------------------------"); - for (i = 0; i < n; i++) { - System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - } - - public static void ex2_polishing(String[] args) { - NAGComplex pz = new NAGComplex(); - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int i, ifail, itmax, j, k, n = 0, polish; - - NAGComplex[] z = null, zact = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - boolean[] matched = null; - - System.out.println("\n Polishing Processes\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i <= 12; i++) { - reader.readLine(); - } - - // Read polynomial degree and allocate - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = NAGComplex.createArray(n); - zact = NAGComplex.createArray(n); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Set known roots - for (i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) (i + 1), 0.0); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (i = 0; i < n; i++) { - a[i] = 0.0; - } - a[n] = 1.0; - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - a[j] = a[j + 1] - a[j] * zact[i].getRe(); - } - a[n] = -a[n] * zact[i].getRe(); - } - - System.out.println(" polish relerr fwderr"); - System.out.println(" ----------------------------"); - - // Use different polish modes - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - for (polish = 0; polish <= 2; polish++) { - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - // Find roots - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); - - // Calculate the maximum relative errors of the roots, and the maximum - // forward error evaluating the polynomial at those roots. Errors are - // capped at machine precision. - maxrelerr = eps; - maxfwderr = eps; - Arrays.fill(matched, false); - - for (i = 0; i < n; i++) { - // Evaluate polynomial at this root - pz = new NAGComplex(a[0], 0.0); - for (j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); - } - - // Match to an expected root - k = 0; - err = rmax; - for (j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - } -} diff --git a/simple_examples/int32/C02AFJE.java b/simple_examples/int32/C02AFJE.java deleted file mode 100644 index 6043be7..0000000 --- a/simple_examples/int32/C02AFJE.java +++ /dev/null @@ -1,271 +0,0 @@ -import com.nag.routines.C02.C02AF; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AF - */ -public class C02AFJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AFJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - - int i, ifail, n = 0; - - double[][] a = null, z = null; - double[] w = null; - - System.out.println("\n\n Example 1"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[2][n + 1]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); - } - - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[][] a = null, abar = null, z = null, zbar = null; - double[] r = null, w = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 12; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[2][n + 1]; - abar = new double[2][n + 1]; - r = new double[n]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar = 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[0][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[0][i] = f * a[0][i]; - - if (a[1][i] != 0.0E0) { - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - - } else { - - if (a[1][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] abar1d = convert2DTo1D(abar); - double[] zbar1d = convert2DTo1D(zbar); - c02af.eval(abar1d, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][j], zbar[1][j]); - deltac = Math.abs(r1 - r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0E0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j*n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AGJE.java b/simple_examples/int32/C02AGJE.java deleted file mode 100644 index c58e524..0000000 --- a/simple_examples/int32/C02AGJE.java +++ /dev/null @@ -1,262 +0,0 @@ -import com.nag.routines.C02.C02AG; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AG - */ -public class C02AGJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AGJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - double zi, zr; - int i, ifail, n = 0, nroot; - - double[] a = null, w = null; - double[][] z = null; - - System.out.println("\n\n Example 1\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - w = new double[2 * (n + 1)]; - z = new double[2][n]; - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - nroot = 0; - - while (nroot < n) { - zr = z[0][nroot]; - zi = z[1][nroot]; - if (zi == 0.0E0) { - System.out.printf(" z = %12.4E\n", zr); - nroot += 1; - } else { - System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); - nroot += 2; - } - } - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[] a = null, abar = null, r = null, w = null; - double[][] z = null, zbar = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 7; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n+1]; - abar = new double[n+1]; - r = new double[n]; - w = new double[2 * (n+1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d ,w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar= 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[i] != 0.0) { - f = 1.0 + epsbar; - epsbar = -epsbar; - abar[i] = f * a[i]; - } else { - abar[i] = 0.0E0; - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] zbar1d = convert2DTo1D(zbar); - c02ag.eval(abar, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][i], zbar[1][i]); - deltac = Math.abs(r1-r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j * n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j * n]; - } - } - - return b; - } -} diff --git a/simple_examples/int32/C02AHJE.java b/simple_examples/int32/C02AHJE.java deleted file mode 100644 index b1e12cd..0000000 --- a/simple_examples/int32/C02AHJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.C02.C02AH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AH - */ -public class C02AHJE { - - public static void main(String[] args) { - - double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AHJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - ar = Double.parseDouble(sVal[0]); - ai = Double.parseDouble(sVal[1]); - br = Double.parseDouble(sVal[2]); - bi = Double.parseDouble(sVal[3]); - cr = Double.parseDouble(sVal[4]); - ci = Double.parseDouble(sVal[5]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AH c02ah = new C02AH(); - c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); - ifail = c02ah.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); - System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); - } - } -} diff --git a/simple_examples/int32/C02AJJE.java b/simple_examples/int32/C02AJJE.java deleted file mode 100644 index 64e3a5e..0000000 --- a/simple_examples/int32/C02AJJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C02.C02AJ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AJ - */ -public class C02AJJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AJJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - a = Double.parseDouble(sVal[0]); - b = Double.parseDouble(sVal[1]); - c = Double.parseDouble(sVal[2]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AJ c02aj = new C02AJ(); - c02aj.eval(a, b, c, zsm, zlg, ifail); - ifail = c02aj.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - - if (zsm[1] == 0.0E0) { - // 2 real roots. - System.out.printf(" z = %12.4E\n", zsm[0]); - System.out.printf(" z = %12.4E\n", zlg[0]); - } else { - // 2 complex roots. - System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); - } - } - } -} diff --git a/simple_examples/int32/C02AKJE.java b/simple_examples/int32/C02AKJE.java deleted file mode 100644 index 4a0579f..0000000 --- a/simple_examples/int32/C02AKJE.java +++ /dev/null @@ -1,62 +0,0 @@ -import com.nag.routines.C02.C02AK; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AK - */ -public class C02AKJE { - - public static void main(String[] args) { - - double r = 0, s = 0, t = 0, u = 0; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AKJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - u = Double.parseDouble(sVal[0]); - r = Double.parseDouble(sVal[1]); - s = Double.parseDouble(sVal[2]); - t = Double.parseDouble(sVal[3]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AK c02ak = new C02AK(); - c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ALJE.java b/simple_examples/int32/C02ALJE.java deleted file mode 100644 index 4f9eac9..0000000 --- a/simple_examples/int32/C02ALJE.java +++ /dev/null @@ -1,64 +0,0 @@ -import com.nag.routines.C02.C02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AL - */ -public class C02ALJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0, d = 0, e = 0; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ALJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - e = Double.parseDouble(sVal[0]); - a = Double.parseDouble(sVal[1]); - b = Double.parseDouble(sVal[2]); - c = Double.parseDouble(sVal[3]); - d = Double.parseDouble(sVal[4]); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AL c02al = new C02AL(); - c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02al.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02AMJE.java b/simple_examples/int32/C02AMJE.java deleted file mode 100644 index f1fffa4..0000000 --- a/simple_examples/int32/C02AMJE.java +++ /dev/null @@ -1,75 +0,0 @@ -import com.nag.routines.C02.C02AM; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AM - */ -public class C02AMJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex r = null, s = null, t = null, u = null; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AMJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AM c02am = new C02AM(); - c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C02ANJE.java b/simple_examples/int32/C02ANJE.java deleted file mode 100644 index dc865e2..0000000 --- a/simple_examples/int32/C02ANJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.C02.C02AN; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AN - */ -public class C02ANJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex a = null, b = null, c = null, d = null, e = null; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ANJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AN c02an = new C02AN(); - c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02an.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/int32/C05AUJE.java b/simple_examples/int32/C05AUJE.java deleted file mode 100644 index d2b09b1..0000000 --- a/simple_examples/int32/C05AUJE.java +++ /dev/null @@ -1,67 +0,0 @@ -import com.nag.routines.C05.C05AU; - -/** - * C05AUJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05AUJE{ - - /** - * C05AUJ main program - */ - public static void main(String[] args){ - double a = 0, b = 0, eps, eta, h, x; //placeholders - int ifail; - double[] ruser; - int[] iuser; - - ruser = new double[1]; //need to initialise before passing to wrapper - iuser = new int[1]; - - System.out.println("C05AUJ Example Program Results"); - - x = 1; - h = 0.1; - eps = 0.00001; - eta = 0; - - //Instance of class f to pass to wrapper - f f1 = new f(); - - ifail = -1; - C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); - c05au.eval(); - - //update values - x = c05au.getX(); - a = c05au.getA(); - b = c05au.getB(); - ifail = c05au.getIFAIL(); - - System.out.println(); - - switch(ifail){ - case 0: - System.out.printf("Root is : \t%.5f\n", x); - System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); - break; - case 3: - case 4: - System.out.printf("Final value = %.5f\n", x); - break; - } - } - - /** - * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. - * eval() must be implemented by the user. - * @return x - e^x - */ - public static class f extends C05AU.Abstract_C05AU_F{ - public double eval(){ - return(this.X - Math.exp(-this.X)); - } - } -} - diff --git a/simple_examples/int32/C05AWJE.java b/simple_examples/int32/C05AWJE.java deleted file mode 100644 index 6ea3c9f..0000000 --- a/simple_examples/int32/C05AWJE.java +++ /dev/null @@ -1,59 +0,0 @@ -import com.nag.routines.C05.C05AW; - -public class C05AWJE{ - - public static void main(String[] args){ - double eps, eta, x; - int ifail, nfmax; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("C05AWJ Example Program Results"); - System.out.println(); - - boolean finished = false; - for(int i = 3; i <= 4; i++){ - eps = Math.pow(10, -i); - x = 1; - eta = 0; - nfmax = 200; - - ifail = -1; - f f1 = new f(); - C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); - c05aw.eval(); - - ifail = c05aw.getIFAIL(); - x = c05aw.getX(); - eps = c05aw.getEPS(); - - switch(ifail){ - case(0): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - case(-1): - //exit loop - finished = true; - break; - case(3): - case(4): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - } - if(finished){ - break; - } - } - } - - public static class f extends C05AW.Abstract_C05AW_F{ - public double eval(){ - return(Math.exp(-X) - X); - } - } -} - - diff --git a/simple_examples/int32/C05AYJE.java b/simple_examples/int32/C05AYJE.java deleted file mode 100644 index c9ee43b..0000000 --- a/simple_examples/int32/C05AYJE.java +++ /dev/null @@ -1,44 +0,0 @@ -import com.nag.routines.C05.C05AY; - -/** - * C05AY example program text. - */ -public class C05AYJE { - - public static void main(String[] args) { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - int ifail = 0; - int[] iuser = new int[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch (ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/int32/C05AZJE.java b/simple_examples/int32/C05AZJE.java deleted file mode 100644 index 7c3e27e..0000000 --- a/simple_examples/int32/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C05.C05AZ; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * C05AZ example program text. - */ -public class C05AZJE { - - public static void main(String[] args) { - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - int ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - if (ind == 0) { - keepOn = false; - } - else { - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - - } - - switch (ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/int32/C05BBJE.java b/simple_examples/int32/C05BBJE.java deleted file mode 100644 index 4723773..0000000 --- a/simple_examples/int32/C05BBJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.C05.C05BB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C05BBJ Example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05BBJE{ - - /** - * C05BBJE main program text - */ - public static void main(String[] args){ - NAGComplex w, z; - double resid = 0; - int branch = 0, ifail = 0; //placeholder - boolean offset = false; //placeholder - - //need to initialise first - z = new NAGComplex(); - w = new NAGComplex(); - - System.out.println("C05BBJ Example Program Results"); - - if(args.length != 1){ - System.out.println("Please specify path to data file as input"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - branch = Integer.parseInt(sVal[0]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - offset = Boolean.parseBoolean(sVal[0]); - - System.out.printf("Branch = %d\n", branch); - System.out.printf("Offset = %b\n", offset); - - System.out.println(); - System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - sVal = line.split("\\s+"); - - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - - ifail = -1; - C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); - c05bb.eval(); - - z = (NAGComplex) c05bb.getZ(); - w = (NAGComplex) c05bb.getW(); - resid = c05bb.getRESID(); - ifail = c05bb.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C05MBJE.java b/simple_examples/int32/C05MBJE.java deleted file mode 100644 index 9b46ff5..0000000 --- a/simple_examples/int32/C05MBJE.java +++ /dev/null @@ -1,95 +0,0 @@ -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ example program text. - * - * @author joed - * @since 27.0.0.0 - * - */ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ example main program. - */ - public static void main(String[] args) { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - int astart, i, ifail, m; - double[] fvec, x; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail == 0 || ifail == 8 || ifail == 9) { - if (ifail == 0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/int32/C05QBJE.java b/simple_examples/int32/C05QBJE.java deleted file mode 100644 index 4b93405..0000000 --- a/simple_examples/int32/C05QBJE.java +++ /dev/null @@ -1,167 +0,0 @@ -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05QB example program text. - * @author ludovic - */ -public class C05QBJE { - - public static void main(String[] args) { - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - int[] IUSER = new int[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - } - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private int N, IFLAG; - private double[] X, FVEC, RUSER; - private int[] IUSER; - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { - - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for (int i = 1; i < N; ++i) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - for (int i = 0; i < N-1; ++i) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - } - - } - - } - -} diff --git a/simple_examples/int32/C06BAJE.java b/simple_examples/int32/C06BAJE.java deleted file mode 100644 index 541d4d3..0000000 --- a/simple_examples/int32/C06BAJE.java +++ /dev/null @@ -1,56 +0,0 @@ -import com.nag.routines.C06.C06BA; -import com.nag.routines.X01.X01AA; - -/** - * C06BAJ example program text. - * @author willa - */ -public class C06BAJE{ - - public static void main(String[] args){ - int lwork = 16, nout = 6; - int ifail, ncall; - double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; - double[] work; - - C06BA c06ba = new C06BA(); - work = new double[lwork]; - - System.out.println("C06BAJ Example Program Results"); - System.out.println(); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - - ans = Math.pow(pi, 2)/12.0; - ncall = 0; - sig = 1.0; - seqn = 0.0; - System.out.println("\t\t\t Estimated\t Actual"); - System.out.println("I\t SEQN \t RESULT\t abs error\t error"); - System.out.println(); - - for(int i = 0; i < 10; i++){ - r = (double) i + 1; - seqn = seqn + sig/Math.pow(r, 2); - - ifail = 0; - c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); - - //update variables - ncall = c06ba.getNCALL(); - result = c06ba.getRESULT(); - abserr = c06ba.getABSERR(); - - error = result - ans; - sig = -sig; - - if(i <= 2){ - System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); - } - else{ - System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); - } - } - } -} diff --git a/simple_examples/int32/C06FKJE.java b/simple_examples/int32/C06FKJE.java deleted file mode 100644 index 58db62f..0000000 --- a/simple_examples/int32/C06FKJE.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.nag.routines.C06.C06FK; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C06FKJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class C06FKJE{ - - /** - * C06FKJE main program - */ - public static void main(String[] args){ - int ifail = 0, n = 0; //placeholder - double[] work, xa, xb, ya, yb; - - work = new double[0]; - xa = new double[0]; - xb = new double[0]; - ya = new double[0]; - yb = new double[0]; //placeholders - - System.out.println("C06FKJ Example Program Results"); - System.out.println(); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - //Break when the end of the file is reached - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - work = new double[n]; - xa = new double[n]; - xb = new double[n]; - ya = new double[n]; - yb = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - xa[i] = Double.parseDouble(sVal[0]); - xb[i] = xa[i]; - ya[i] = Double.parseDouble(sVal[1]); - yb[i] = ya[i]; - } - - ifail = 0; - - C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); - c06fk1.eval(); - xa = c06fk1.getX(); - C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); - c06fk2.eval(); - xb = c06fk2.getX(); - - System.out.printf("\tCovolution \tCorrelation\n"); - System.out.println(); - - for(int i = 0; i < n; i++){ - System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/C09AAJE.java b/simple_examples/int32/C09AAJE.java deleted file mode 100644 index 48c38b6..0000000 --- a/simple_examples/int32/C09AAJE.java +++ /dev/null @@ -1,158 +0,0 @@ -import com.nag.routines.C09.C09AA; -import com.nag.routines.C09.C09CC; -import com.nag.routines.C09.C09CD; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C09AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C09AAJE{ - - /** - * C09AAJ example main program - */ - public static void main(String[] args){ - int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders - String mode = "", wavnam = "", wtrans; //placeholders - int[] dwtlev, icomm; - double[] c, x, y; - - x = new double[0]; y = new double[0]; //placeholders - - //print error message if no data file given - if(args.length != 1){ - C09AAJE.usage(); - } - - icomm = new int[100]; - - System.out.println("C09AAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - wavnam = sVal[1]; - mode = sVal[2]; - - x = new double[n]; - y = new double[n]; - - System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); - - System.out.println("Input data \tX : "); - for(int i = 0; i < n; i++){ - line = reader.readLine(); - //Avoid errors with data file format and negative numbers - line = " " + line; - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - System.out.printf("%.3f\t", x[i]); - } - System.out.printf("\n"); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //Query wavelet filter dimensions - //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' - wtrans = "Multilevel"; - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); - c09aa.eval(); - - nwc = c09aa.getNWC(); - nwlmax = c09aa.getNWLMAX(); - lenc = nwc; - c = new double[lenc]; - dwtlev = new int[nwlmax + 1]; - - icomm = c09aa.getICOMM(); - ifail = 0; - //Perform discrete wavelet transform - C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); - c09cc.eval(); - - nf = c09aa.getNF(); - nwlmax = c09cc.getNWL(); - dwtlev = c09cc.getDWTLEV(); - c = c09cc.getC(); - - System.out.println(); - System.out.printf("Length of wavelet filter : \t%d\n", nf); - System.out.printf("Number of Levels : \t%d\n", nwlmax); - System.out.printf("Number of coefficients in each level: \n\t\t"); - for(int i = 0; i <= nwlmax; i++){ - System.out.printf("%d\t ", dwtlev[i]); - } - System.out.printf("\n"); - System.out.printf("Total number of wavelength coefficients : %d\n", nwc); - nnz = arraySum(dwtlev); - System.out.println(); - System.out.println("Wavelet coefficients C:"); - for(int i = 0; i < nnz; i++){ - System.out.printf("%.3f ", c[i]); - } - System.out.printf("\n"); - - //Reconstruct original data - ny = n; - - ifail = 0; - lenc = c09cc.getLENC(); - icomm = c09cc.getICOMM(); - C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); - c09cd.eval(); - - y = c09cd.getY(); - System.out.println(); - System.out.printf("Reconstruction \tY : \n"); - for(int i = 0; i < ny; i++){ - System.out.printf("%.3f ", y[i]); - } - System.out.printf("\n"); - } - - /** - * Finds the sum of all integers in an array - * @param a - * Array to sum - * @return total - */ - private static int arraySum(int[] a){ - int tot = 0; - for(int i = 0; i < a.length; i++){ - tot += a[i]; - } - return tot; - } - - /** - * No arguments supplied when exmaple runs - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/D01BDJE.java b/simple_examples/int32/D01BDJE.java deleted file mode 100644 index 8659cc4..0000000 --- a/simple_examples/int32/D01BDJE.java +++ /dev/null @@ -1,58 +0,0 @@ -import com.nag.routines.D01.D01BD; - -/** - * D01BD example program text. - */ -public class D01BDJE { - - public static void main(String[] args) { - - double a = 0.0, b = 1.0; - double epsabs = 0.0, epsrel = 0.0001; - double result = Double.NaN; - double abserr = Double.NaN; - FUN fun = new FUN(); - D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); - - d01bd.eval(); - result = d01bd.getRESULT(); - abserr = d01bd.getABSERR(); - - System.out.println(" D01BDJ Example Program Results"); - - System.out.println(); - System.out.printf(" A - lower limit of integration = %10.4f\n",a); - System.out.printf(" B - upper limit of integration = %10.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.println(); - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.println(); - - if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - } - -} diff --git a/simple_examples/int32/D01RJJE.java b/simple_examples/int32/D01RJJE.java deleted file mode 100644 index 9eee98a..0000000 --- a/simple_examples/int32/D01RJJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.D01.D01RJ; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RJ example program text. - * @author Mo - */ -public class D01RJJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RJJ Example Program Results"); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - /* pass constant to f through ruser */ - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RJ d01rj = new D01RJ(); - ifail = -1; - d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rj.getRESULT(); - abserr = d01rj.getABSERR(); - ifail = d01rj.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); - System.out.println(); - } - - } - - } - - public static class F implements D01RJ.D01RJ_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int i = 0; i < NX; i++) { - if (X[i] == 1.0) { - /* An undefined result will be generated. */ - /* Set iflag to force an immediate exit */ - IFLAG = -1; - /* Store chosen value of iflag in iuser */ - IUSER[0] = IFLAG; - } - } - if (IFLAG != -1) { - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j])/ - Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RKJE.java b/simple_examples/int32/D01RKJE.java deleted file mode 100644 index 20c0501..0000000 --- a/simple_examples/int32/D01RKJE.java +++ /dev/null @@ -1,173 +0,0 @@ -import com.nag.routines.D01.D01RK; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RK example program text. - * @author Mo - */ -public class D01RKJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, key, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RKJ Example Program Results"); - - key = 6; - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RK d01rk = new D01RK(); - ifail = -1; - d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rk.getRESULT(); - abserr = d01rk.getABSERR(); - ifail = d01rk.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RK.D01RK_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RLJE.java b/simple_examples/int32/D01RLJE.java deleted file mode 100644 index c8a6d0e..0000000 --- a/simple_examples/int32/D01RLJE.java +++ /dev/null @@ -1,196 +0,0 @@ -import com.nag.routines.D01.D01RL; -import java.util.Arrays; - -/** - * D01RL example program text. - * @author Mo - */ -public class D01RLJE { - - public static void main(String[] args) { - - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] points, rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub, npts; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RLJ Example Program Results"); - - epsabs = 0.0; - epsrel = 0.0001; - a = 0.0; - b = 1.0; - npts = 1; - maxsub = 20; - liinfo = 2*Math.max(maxsub,npts) + npts + 4; - lrinfo = 4*Math.max(maxsub,npts) + npts + 6; - - points = new double[npts]; - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[21]; - - points[0] = 1.0/7.0; - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RL d01rl = new D01RL(); - ifail = -1; - d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - points = d01rl.getPOINTS(); - result = d01rl.getRESULT(); - abserr = d01rl.getABSERR(); - ifail = d01rl.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F"); - System.out.println(); - } - - } - - } - - public static class F implements D01RL.D01RL_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - /*for (int i = 0; i < NX; i++) {*/ - /*FV[i] = 0.0;*/ - /*}*/ - - for (int i = 0; i < NX; i++) { - FV[i] = Math.abs(X[i] - 1.0/7.0); - } - - for (int i = 0; i < NX; i++) { - if (FV[i] == 0.0) { - /* A singular point will be hit. */ - /* Record offending abscissae and abort computation. */ - IFLAG = 0; - for (int k = 0; k < NX; k++) { - if (FV[k] == 0.0) { - IFLAG = IFLAG + 1; - RUSER[IFLAG-1] = X[k]; - } - } - /* Store value of iflag in iuser */ - IUSER[0] = IFLAG; - /* signal abort by setting iflag<0 */ - IFLAG = -IFLAG; - } - } - if (IFLAG == 0) { - /* Safe to evaluate. */ - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/Math.sqrt(FV[j]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01RMJE.java b/simple_examples/int32/D01RMJE.java deleted file mode 100644 index 6e80b2b..0000000 --- a/simple_examples/int32/D01RMJE.java +++ /dev/null @@ -1,163 +0,0 @@ -import com.nag.routines.D01.D01RM; -import java.util.Arrays; - -/** - * D01RM example program text. - * @author Mo - */ -public class D01RMJE { - - public static void main(String[] args) { - - double bound, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, inf, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RMJ Example Program Results"); - - bound = 0.0; - inf = 1; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RM d01rm = new D01RM(); - ifail = -1; - d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rm.getRESULT(); - abserr = d01rm.getABSERR(); - ifail = d01rm.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",bound); - System.out.println(" B - upper limit of integration = infinity\n"); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RM.D01RM_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); - } - return; - - } - - } - -} diff --git a/simple_examples/int32/D01TCJE.java b/simple_examples/int32/D01TCJE.java deleted file mode 100644 index cde8428..0000000 --- a/simple_examples/int32/D01TCJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.routines.D01.D01TC; -import java.util.Arrays; - -/** - * D01TC example program text. - * @author Mo - */ -public class D01TCJE { - - public static void main(String[] args) { - - double a, b, c, d; - double[] abscis, weight; - int n, ifail, itype; - - /* Header */ - System.out.println(" D01TCJ Example Program Results"); - - n = 7; - a = 0.0; - b = 1.0; - c = 0.0; - d = 0.0; - itype = -3; - - abscis = new double[n]; - weight = new double[n]; - - D01TC d01tc = new D01TC(); - ifail = 0; - d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); - abscis= d01tc.getABSCIS(); - weight = d01tc.getWEIGHT(); - - System.out.println(); - System.out.printf(" Laguerre formula, %2d points\n",n); - System.out.println(); - System.out.println(" Abscissae Weights\n"); - for (int j = 0; j < n; j++) { - System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); - } - - } - -} diff --git a/simple_examples/int32/D02NEJE.java b/simple_examples/int32/D02NEJE.java deleted file mode 100644 index 34a5b25..0000000 --- a/simple_examples/int32/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/int32/D02TLJE.java b/simple_examples/int32/D02TLJE.java deleted file mode 100644 index 601b3ce..0000000 --- a/simple_examples/int32/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/int32/D03PCJE.java b/simple_examples/int32/D03PCJE.java deleted file mode 100644 index 4901e2e..0000000 --- a/simple_examples/int32/D03PCJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.D03.D03PC; -import com.nag.routines.D03.D03PZ; -import com.nag.routines.X01.X01AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.StringBuilder; - -/** - * D03PCJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D03PCJE{ - - /** - * D03PCJE main program - */ - public static void main(String[] args){ - int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; - double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; - int[] isave, iuser, iwsav; - double[] rsave, u, uout, x, xout, ruser, rwsav; - boolean[] lwsav; - String[] cwsav; - - xout = new double[0]; // placeholders - ruser = new double[1]; - rwsav = new double[1100]; - iuser = new int[1]; - iwsav = new int[505]; - lwsav = new boolean[100]; - cwsav = new String[10]; - - System.out.println("D03PCJ Example Program Results"); - - //Specify path to data file - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - intpts = Integer.parseInt(sVal[0]); - npts = Integer.parseInt(sVal[1]); - itype = Integer.parseInt(sVal[2]); - - xout = new double[intpts]; - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < intpts; i++){ - xout[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.split("\\s+"); - acc = Double.parseDouble(sVal[0]); - alpha = Double.parseDouble(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - itrace = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - ts = Double.parseDouble(sVal[0]); - tout = Double.parseDouble(sVal[1]); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - neqn = npde * npts; - lisave = neqn + 24; - nwk = (10 + (6 * npde)) * neqn; - lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; - - rsave = new double[lrsave]; - u = new double[npde * npts]; - uout = new double[npde * intpts * itype]; - x = new double[npts]; - isave = new int[lisave]; - ruser[0] = alpha; - ind = 0; - itask = 1; - - X01AA x01aa = new X01AA(); - pi = x01aa.eval(); - piby2 = 0.5 * pi; - hx = piby2/(double)(npts - 1); - x[0] = 0.0; - x[npts - 1] = 1.0; - for(int i = 1; i < (npts - 1); i++){ - x[i] = Math.sin(hx * (double)(i)); - } - - u = uinit(x, npts, iuser, ruser); - - //Character (80) :: cwsav(10) - //Surely a better way of doing this? - for(int i = 0; i < 10; i++){ - StringBuilder builder = new StringBuilder(""); - for(int j = 0; j < 80; j++){ - builder.append(" "); - } - cwsav[i] = builder.toString(); - } - - for(int i = 0; i <5; i++){ - tout = 10 * tout; - - ifail = 0; - pdedef pdedef1 = new pdedef(); - bndary bndary1 = new bndary(); - D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, - isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, - rwsav, ifail); - d03pc.eval(); - - //update ind - ind = d03pc.getIND(); - - if(i == 0){ - System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); - System.out.printf("T / X "); - for(int j = 0; j < xout.length; j++){ - System.out.printf("\t%.4f", xout[j]); - } - System.out.printf("\n"); - } - System.out.println(); - - //Interpolate at required spatial points - ifail = 0; - - D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); - d03pz.eval(); - - System.out.printf("%.4f \tU(1)", tout); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2]); - } - System.out.printf("\n"); - System.out.printf("\tU(2)"); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2 + 1]); - } - System.out.printf("\n"); - System.out.println(); - } - - System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); - System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); - System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); - System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); - } - - /** - * PDE initial condition - */ - public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ - double alpha = ruser[0]; - double[] u = new double[2 * npts]; - for(int i = 0; i < npts; i++){ - u[2 * i] = 2 * alpha * x[i]; - u[(2 * i) + 1] = 1; - } - return u; - } - - public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ - public void eval(){ - double alpha = this.RUSER[0]; - this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); - this.Q[1] = 0; - this.R[0] = this.X * this.UX[0]; - this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); - this.P[0] = 0; - this.P[1] = 0; - this.P[2] = 0; - this.P[3] = 1 - (this.X * this.X); - } - } - - public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ - public void eval(){ - if(this.IBND == 0){ - this.BETA[0] = 0; - this.BETA[1] = 1; - this.GAMMA[0] = this.U[0]; - this.GAMMA[1] = -this.U[0] * this.U[1]; - } - else{ - this.BETA[0] = 1; - this.BETA[1] = 0; - this.GAMMA[0] = -this.U[0]; - this.GAMMA[1] = this.U[1]; - } - } - } - -} - - - diff --git a/simple_examples/int32/D03RAJE.java b/simple_examples/int32/D03RAJE.java deleted file mode 100644 index 88d49aa..0000000 --- a/simple_examples/int32/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/int32/D03RBJE.java b/simple_examples/int32/D03RBJE.java deleted file mode 100644 index 9b1b482..0000000 --- a/simple_examples/int32/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/D05BAJE.java b/simple_examples/int32/D05BAJE.java deleted file mode 100644 index 7a8caf7..0000000 --- a/simple_examples/int32/D05BAJE.java +++ /dev/null @@ -1,111 +0,0 @@ -import com.nag.routines.D05.D05BA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BAJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D05BAJE{ - - /** - * D05BAJE main program - */ - public static void main(String[] args){ - double alim, h, hi, si, thresh, tlim, tol; - int ifail, iorder, lwk, nmesh = 6; - String method; - double[] errest, yn, work; - - errest = new double[nmesh]; - yn = new double[nmesh]; - - System.out.println("D05BAJ Example Program Results"); - - method = "A"; - iorder = 6; - alim = 0; - tlim = 20; - h = (tlim - alim) / (double) nmesh; - tol = 0.001; - X02AJ x02aj = new X02AJ(); - thresh = x02aj.eval(); - lwk = 10 * nmesh + 6; - work = new double[lwk]; - - //Loop until the supplied workspace is big enough - //breakflag used to exit loop - boolean breakflag = false; - while(true){ - ifail = 1; - - ck ck1 = new ck(); - cf cf1 = new cf(); - cg cg1 = new cg(); - - D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, - tol, thresh, work, lwk, ifail); - d05ba.eval(); - - //update - ifail = d05ba.getIFAIL(); - lwk = d05ba.getLWK(); - work = d05ba.getWORK(); - - switch(ifail){ - case 5: - lwk = (int) work[0]; - work = new double[lwk]; - break; - case 6: - lwk = (int) work[0]; - work = new double[lwk]; - break; - default: - breakflag = true; - } - - if(breakflag == true){ - break; - } - } - - if(ifail != 0){ - System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); - } - - System.out.println(); - System.out.printf("Size of workplace = %d\n", lwk); - System.out.printf("Tolerance = %.4e\n", tol); - System.out.println(); - System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); - for(int i = 0; i < nmesh; i++){ - hi = (double) (i + 1) * h; - si = sol(hi); - System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); - } - } - - private static double sol(double t){ - return Math.log(t + Math.exp(1)); - } - - public static class ck extends D05BA.Abstract_D05BA_CK{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cf extends D05BA.Abstract_D05BA_CF{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cg extends D05BA.Abstract_D05BA_CG{ - public double eval(){ - return (this.Y + Math.exp(-this.Y)); - } - } -} - diff --git a/simple_examples/int32/D05BEJE.java b/simple_examples/int32/D05BEJE.java deleted file mode 100644 index f98bea3..0000000 --- a/simple_examples/int32/D05BEJE.java +++ /dev/null @@ -1,185 +0,0 @@ -import com.nag.routines.D05.D05BE; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BEJ example program text. - * @author willa - */ -public class D05BEJE{ - - private static final int iorder = 4; - private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); - private static final int nout = 6; - private static final int lct = nmesh / 32 + 1; - private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; - - public static void main(String[] args){ - double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; - int ifail; - double[] work, yn; - int[] nct; - - work = new double[lwk]; - yn = new double[nmesh]; - nct = new int[lct]; - - System.out.println("D05BEJ Example Program Results"); - - X02AJ x02aj = new X02AJ(); - tlim = 7; - tolnl = Math.sqrt(x02aj.eval()); - h = tlim /(double) (nmesh - 1); - yn[0] = 0; - - ifail = 0; - - D05BE d05be = new D05BE(); - ck1 k1 = new ck1(); - cf1 f1 = new cf1(); - cg1 g1 = new cg1(); - d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 1"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 1; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol1(hi1)); - - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 4) && (i % 5 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - System.out.println(); - - tlim = 5; - h = tlim /(double) (nmesh - 1); - yn[0] = 1; - - ifail = 0; - - ck2 k2 = new ck2(); - cf2 f2 = new cf2(); - cg2 g2 = new cg2(); - d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 2"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 0; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol2(hi1)); - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 6) && (i % 7 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - } - - private static double sol1(double t){ - double c, pi, t1, x = 0; - - //x is dummy variable - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + t; - c = 1 / Math.sqrt(2 * pi); - - return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); - } - - private static double sol2(double t){ - return (1 / (1 + t)); - } - - private static class ck1 extends D05BE.Abstract_D05BE_CK{ - public double eval(){ - return (Math.exp(-0.5 * this.T)); - } - } - - private static class ck2 extends D05BE.Abstract_D05BE_CK{ - double pi, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - return Math.sqrt(pi); - } - } - - private static class cf1 extends D05BE.Abstract_D05BE_CF{ - double a, pi, t1, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + this.T; - a = 1 / Math.sqrt(pi * this.T); - return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); - } - } - - private static class cf2 extends D05BE.Abstract_D05BE_CF{ - double st1; - - public double eval(){ - st1 = Math.sqrt(1 + this.T); - return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); - } - } - - private static class cg1 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } - - private static class cg2 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } -} diff --git a/simple_examples/int32/DTFSMJE.java b/simple_examples/int32/DTFSMJE.java deleted file mode 100644 index a88b114..0000000 --- a/simple_examples/int32/DTFSMJE.java +++ /dev/null @@ -1,54 +0,0 @@ -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; - -/** - * DTFSM example program text. Adapted from f06wbfe.f90 - * @author joed - */ -public class DTFSMJE { - - public static void main(String[] args) { - - double alpha = 4.21; - int ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[m*m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - a[i*m+j] = (j >= i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[(m*(m+1))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/int32/E01DAJE.java b/simple_examples/int32/E01DAJE.java deleted file mode 100644 index 10c008f..0000000 --- a/simple_examples/int32/E01DAJE.java +++ /dev/null @@ -1,182 +0,0 @@ -import com.nag.routines.E01.E01DA; -import com.nag.routines.E02.E02DF; - -/** - * E01DA example program text. - */ -public class E01DAJE { - - public static void main(String[] args) { - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = e01da.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) { - if (i <= mx) { - System.out.printf("%4d %9.4f", i+1, lamda[i]); - } - else { - System.out.printf(" "); - } - if (i <= my) { - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - } - else { - System.out.printf("\n"); - } - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = e01da.getPX(); - py = e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px, 4*ny+py); - if (4*nx+px > 4*ny+py) { - liwrk = ny + py - 4; - } - else { - liwrk = nx + px - 4; - } - double[] tx = new double[nx]; - double[] ty = new double[ny]; - double[] ff = new double[nx*ny]; - wrk = new double[lwrk]; - int[] iwrk = new int[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i < nx-1; i++) { - tx[i] = tx[i-1] + step; - } - tx[nx-1] = xhi; - - step = (yhi-ylo)/(ny-1); - ty[0] = ylo; - for (int i = 1; i < ny-1; i++) { - ty[i] = ty[i-1] + step; - } - ty[ny-1] = yhi; - - /* Evaluate the spline. */ - E02DF e02df = new E02DF(); - ifail = 0; - e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); - - ifail = e02df.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); - System.out.printf(" "); - for (int i = 0; i < nx; ++i) { - System.out.printf(" %5.2f ", tx[i]); - } - System.out.printf("\n"); - for (int i = 0; i < ny; ++i) { - System.out.printf(" %5.2f ", ty[i]); - for (int j = 0; j < nx; ++j) { - System.out.printf(" %8.3f", ff[ny*j+i]); - } - System.out.printf("\n"); - } - break; - default: - System.out.printf("\n Error detected by E02DF: %d\n", ifail); - } - - } - -} diff --git a/simple_examples/int32/E02ALJE.java b/simple_examples/int32/E02ALJE.java deleted file mode 100644 index 372f125..0000000 --- a/simple_examples/int32/E02ALJE.java +++ /dev/null @@ -1,101 +0,0 @@ -import com.nag.routines.E02.E02AL; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E02ALJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E02ALJE{ - - /** - * E02ALJ Example main program - */ - public static void main(String[] args){ - double dxx, ref = 0, s, t, xx; - int ifail, n = 0, m = 0, neval = 0; //placeholders - double[] a, x, y; - - a = new double[0]; - x = new double[0]; - y = new double[0]; //placeholders - - System.out.println("E02ALJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - m = Integer.parseInt(sVal[2]); - neval = Integer.parseInt(sVal[3]); - - a = new double[m + 1]; - x = new double[n]; - y = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - y[i] = Double.parseDouble(sVal[2]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - ifail = 0; - E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); - e02al.eval(); - - //update - ref = e02al.getREF(); - x = e02al.getX(); - y = e02al.getY(); - - - System.out.println(); - System.out.printf(" Polynomial coefficients\n"); - for(int i = 0; i <= m; i++){ - System.out.printf("\t%.4e\n", a[i]); - } - System.out.println(); - System.out.printf(" Reference deviation = %.2e\n", ref); - System.out.println(); - System.out.printf("\tX\tFit\texp(x)\tResidual\n"); - - dxx = 1/(double)(neval - 1); - - for(int j = 0; j < neval; j++){ - xx = (double) j * dxx; - - s = a[m]; - - for(int i = m - 1; i >=0; i--){ - s = s * xx + a[i]; - } - - t = Math.exp(xx); - System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); - } - } -} - diff --git a/simple_examples/int32/E04ABJE.java b/simple_examples/int32/E04ABJE.java deleted file mode 100644 index 773f1ff..0000000 --- a/simple_examples/int32/E04ABJE.java +++ /dev/null @@ -1,76 +0,0 @@ -import com.nag.routines.E04.E04AB; - -/** - * E04ABJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04ABJE{ - - /** - * E04ABJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04ABJ Example Program Results"); - - //e1 and e2 are set to zero so that E04ABA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); - e04ab.eval(); - - //update - ifail = e04ab.getIFAIL(); - a = e04ab.getA(); - b = e04ab.getB(); - x = e04ab.getX(); - f = e04ab.getF(); - maxcal = e04ab.getMAXCAL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04AB.Abstract_E04AB_FUNCT{ - public void eval(){ - FC = Math.sin(this.XC) / this.XC; - } - } -} diff --git a/simple_examples/int32/E04BBJE.java b/simple_examples/int32/E04BBJE.java deleted file mode 100644 index d7032f5..0000000 --- a/simple_examples/int32/E04BBJE.java +++ /dev/null @@ -1,81 +0,0 @@ -import com.nag.routines.E04.E04BB; - -/** - * E04BBJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04BBJE{ - - /** - * E04BBJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04BBJ Example Program Results"); - - //e1 and e2 are set to zero so that E04BBA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); - e04bb.eval(); - - //update - a = e04bb.getA(); - b = e04bb.getB(); - maxcal = e04bb.getMAXCAL(); - x = e04bb.getX(); - f = e04bb.getF(); - g = e04bb.getG(); - ifail = e04bb.getIFAIL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04BB.Abstract_E04BB_FUNCT{ - public void eval(){ - this.FC = Math.sin(this.XC) / this.XC; - this.GC = (Math.cos(this.XC) - this.FC)/this.XC; - } - } -} - diff --git a/simple_examples/int32/E04CBJE.java b/simple_examples/int32/E04CBJE.java deleted file mode 100644 index fbde674..0000000 --- a/simple_examples/int32/E04CBJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.E04.E04CB; -import com.nag.routines.E04.E04CBK; -import com.nag.routines.X02.X02AJ; - -/** - * E04CBJ Example Program text - * @author willa - * @since 27.1.0.0 - */ -public class E04CBJE{ - - /** - * E04CBJE main program - */ - public static void main(String[] args){ - int n = 2, ifail, maxcal; - double f = 0, tolf, tolx; //placeholders - boolean monitoring; - int[] iuser; - double[] ruser, x; - - iuser = new int[1]; - ruser = new double[1]; - x = new double[n]; - - System.out.println("E04CBJ Example Program Results"); - - //Set monitoring to true to obtain monitoring information - monitoring = false; - - x[0] = -1.0; - x[1] = 1.0; - X02AJ x02aj = new X02AJ(); - tolf = Math.sqrt(x02aj.eval()); - tolx = Math.sqrt(tolf); - maxcal = 100; - - ifail = 0; - - funct funct1 = new funct(); - if(!monitoring){ - defMonit monit = new defMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - else{ - myMonit monit = new myMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - - System.out.println(); - System.out.printf("The final function value is \t%.4f\n", f); - System.out.printf("at the point\t"); - for(int i = 0; i < n; i++){ - System.out.printf("%.4f\t", x[i]); - } - System.out.printf("\n"); - } - - public static class funct extends E04CB.Abstract_E04CB_FUNCT{ - public void eval(){ - this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); - } - } - - public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ - public void eval(){ - System.out.println(); - System.out.printf("There have been %d function calls\n", this.NCALL); - System.out.printf("The smallest function value is %.4f\n", this.FMIN); - System.out.printf("The simplex is\n"); - for(int i = 0; i <= this.N; i++){ - for(int j = 0; j < this.N; j++){ - System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); - } - System.out.printf("\n"); - } - System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); - System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); - } - } - - //This is how to use NAG supplied function as argument - public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ - public void eval(){ - super.eval(); - } - } -} diff --git a/simple_examples/int32/E04FCJE.java b/simple_examples/int32/E04FCJE.java deleted file mode 100644 index 939f68d..0000000 --- a/simple_examples/int32/E04FCJE.java +++ /dev/null @@ -1,420 +0,0 @@ -import com.nag.routines.E04.E04FC; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04FC example program text. - * @author ludovic - */ -public class E04FCJE { - - public static void main(String[] args) { - - BufferedReader dataIn = null; - - try { - E04FC e04fc = new E04FC(); - System.out.println(" E04FCJ Example Program Results"); - dataIn = new BufferedReader(new FileReader(args[0])); - //skip header - dataIn.readLine(); - - int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, - lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; - String trans = "T"; - - double eta, fsumsq, stepmx, xtol; - eta = fsumsq = stepmx = xtol = Double.NaN; - int ifail, iprint, maxcal, nf, niter; - ifail = iprint = maxcal = nf = niter = 0; - double[] fjac = new double[m * n], - fvec = new double[m], - g = new double[n], - s = new double[n], - v = new double[ldv * n], - w = new double[lw], - x = new double[n], - y = new double[m], - t = new double[m * nt]; - - - int[] iw = new int[liw]; - - for (int i = 0; i < m; ++i) { - String[] line = dataIn.readLine().trim().split("\\s+"); - if (line.length != nt + 1) { - System.err.println("Error in data file - only " + line.length - + " records at line " + (i + 2) + " while expecting " + (nt + 1) - + " elements"); - System.exit(1); - } - y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format - for (int j = 1; j <= nt; ++j) { - t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); - } - } - - // Set IPRINT to 1 to obtain output from LSQMON at each iteration - iprint = -1; - - maxcal = 400 * n; - eta = 0.5; - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - - // We estimate that the minimum will be within 10 units of the starting point - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - - LSQFUN lsqfun = new LSQFUN(); - lsqfun.t = t; - lsqfun.y = y; - LSQMON lsqmon = new LSQMON(); - - e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, - fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); - - ifail = e04fc.getIFAIL(); - - - switch (ifail) { - case (1): - System.err.println("Unexpected ifail = " + ifail); - break; - default: - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); - System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); - lsqgrd(m, n, fvec, fjac, ldfjac, g); - System.out.print(" The estimated gradient is "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.3e\t", g[i]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int i = 0; i < m; ++i) { - System.out.printf(" %9.1e\n", fvec[i]); - } - } - - - - } - catch (Exception ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - finally { - try { - dataIn.close(); - } - catch (IOException ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - } - - - } - - public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); - dgemv.eval(); - for (int i = 0; i < g.length; ++i) { - g[i] = 2.0 * g[i]; - } - } - - public static class LSQFUN implements E04FC.E04FC_LSQFUN { - - public double[] t, y; - int IFLAG, M, N, LW, LIW; - double[] XC, FVEC, W; - int[] IW; - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, - int[] IW, int LIW, double[] W, int LW) { - for (int i = 0; i < M; ++i) { - FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; - } - } - - } - - public static class LSQMON implements E04FC.E04FC_LSQMON { - - int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; - int[] IW; - double[] XC, FVEC, FJAC, S, W; - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setFJAC(double[] FJAC) { - this.FJAC = FJAC; - } - - @Override - public double[] getFJAC() { - return FJAC; - } - - @Override - public void setLDFJAC(int LDFJAC) { - this.LDFJAC = LDFJAC; - } - - @Override - public int getLDFJAC() { - return LDFJAC; - } - - @Override - public void setS(double[] S) { - this.S = S; - } - - @Override - public double[] getS() { - return S; - } - - @Override - public void setIGRADE(int IGRADE) { - this.IGRADE = IGRADE; - } - - @Override - public int getIGRADE() { - return IGRADE; - } - - @Override - public void setNITER(int NITER) { - this.NITER = NITER; - } - - @Override - public int getNITER() { - return NITER; - } - - @Override - public void setNF(int NF) { - this.NF = NF; - } - - @Override - public int getNF() { - return NF; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, - int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, - int LIW, double[] W, int LW) { - - int ndec = 3; - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); - fsumsq = ddot.eval(); - - lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); - - gtg = ddot.eval(N, g, 1, g, 1); - // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", - NITER, NF, fsumsq, gtg, IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < N; ++j) { - System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); - } - - } - - } - -} diff --git a/simple_examples/int32/E04FFJE.java b/simple_examples/int32/E04FFJE.java deleted file mode 100644 index ad81e32..0000000 --- a/simple_examples/int32/E04FFJE.java +++ /dev/null @@ -1,140 +0,0 @@ -import com.nag.routines.E04.E04FF; -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.util.Arrays; - -/** - * E04FF example program text. - * @author joed - */ -public class E04FFJE { - - public static void main(String[] args) { - double infbnd = 1.0e20; - double[] lx, rx, ux, x, ruser, pdy, pdz; - double[] rinfo = new double[100], stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; - int[] iuser; - int[] icolrd = new int[1], irowrd = new int[1]; - long cpuser, handle; // c_ptr - MONIT monit = new MONIT(); - OBJFUN objfun = new OBJFUN(); - - /* Header */ - System.out.printf(" E04FFJ Example Program Results\n\n"); - - /* Fill problem data structure */ - pdny = 11; - pdnz = 11; - pdy = new double[] { - 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, - 8.33e-2, 7.14e-2, 6.25e-2 - }; - pdz = new double[] { - 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, - 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 - }; - nvar = 4; - nres = 11; - - /* Initialize handle */ - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define residuals structure */ - E04RM e04rm = new E04RM(); - isparse = 0; // Dense => irowrd and icolrd are not accessed - nnzrd = 1; - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set options */ - E04ZM e04zm = new E04ZM(); - ifail = 0; - e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - - /* Define starting point */ - x = new double[] {0.25, 0.39, 0.415, 0.39}; - rx = new double[nres]; - - /* Define bounds for the second and the fourth variable */ - E04RH e04rh = new E04RH(); - lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; - ux = new double[] {infbnd, 1.0, infbnd, infbnd}; - ifail = 0; - e04rh.eval(handle, nvar, lx, ux, ifail); - - /* Call the solver */ - E04FF e04ff = new E04FF(); - ifail = -1; - iuser = new int[] {pdny, pdnz}; - ruser = new double[2 * nres]; - cpuser = 0L; - for (int i = 0; i < nres; i++) { - ruser[i] = pdy[i]; - ruser[nres + i] = pdz[i]; - } - e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, - iuser, ruser, cpuser, ifail); - - /* Free handle memory */ - E04RZ e04rz = new E04RZ(); - ifail = 0; - e04rz.eval(handle, ifail); - - } - - public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { - - public void eval() { - int pdny, pdnz; - double r1, r2; - double[] pdy, pdz; - - /* Interrupt solver if the dimensions are incorrect */ - if (this.NRES != 11 || this.NVAR != 4) { - this.INFORM = -1; - return; - } - - /* Extract the problem data structure from the workspaces */ - pdny = this.IUSER[0]; - pdnz = this.IUSER[1]; - if (pdny != this.NRES || pdnz != this.NRES) { - this.INFORM = -1; - return; - } - pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); - pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); - - for (int i = 0; i < this.NRES; i++) { - r1 = pdy[i] * (pdy[i] + this.X[1]); - r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; - this.RX[i] = pdz[i] - (this.X[0] * r1/r2); - } - - } - - } - - public static class MONIT extends E04FF.Abstract_E04FF_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04GBJE.java b/simple_examples/int32/E04GBJE.java deleted file mode 100644 index 7becf21..0000000 --- a/simple_examples/int32/E04GBJE.java +++ /dev/null @@ -1,183 +0,0 @@ -import com.nag.routines.A00.A00AA; -import com.nag.routines.E04.E04GB; -import com.nag.routines.E04.E04HEV; -import com.nag.routines.E04.E04YA; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.F06PA; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04GB example program text. - */ -public class E04GBJE { - - public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; - public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; - public static final String trans = "T"; - public static double[] y; - public static double[] t; - - public static void main(String[] args) { - - double eta, fsumq = 0.0, stepmx, xtol; - int ifail, iprint, maxcal, nf = 0, niter = 0; - double[] fjac = new double[ldfjac * n]; - double[] fvec = new double[m]; - double[] g = new double[n]; - double[] s = new double[n]; - double[] v = new double[ldv * n]; - double[] w = new double[lw * n]; - double[] x = new double[n]; - int[] iw = new int[liw]; - - System.out.println(" E04GBJ Example Program Results"); - - // Data - y = new double[] { - 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, - 0.96, 1.34, 2.10, 4.39 - }; - - t = new double[m * nt]; - for (int i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - // Check LSQFUN by calling E04YA at an arbitrary point - E04YA e04ya = new E04YA(); - LSQFUN lsqfun = new LSQFUN(); - x[0] = 0.19; - x[1] = -.34; - x[2] = 0.88; - ifail = 0; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); - - // Continue setting parameters for E04GB - E04GB e04gb = new E04GB(); - LSQMON lsqmon = new LSQMON(); - LSQLIN lsqlin = new LSQLIN(); - iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration - maxcal = 50 * n; - eta = 0.09; // Since E04HEV is being used as LSQLIN - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, - stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, - liw, w, lw, ifail); - fsumq = e04gb.getFSUMSQ(); - x = e04gb.getX(); - ifail = e04gb.getIFAIL(); - - if (ifail == 0 || ifail >= 2) { - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); - System.out.printf(" at the point "); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.4f", x[ii]); - } - System.out.println(); - - lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); - - System.out.print(" The corresponding gradient is"); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.3E", g[ii]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int ii = 0; ii < m; ++ii) { - System.out.printf(" %9.1E\n", fvec[ii]); - } - System.out.println(); - } - - } - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - - for (int i = 0; i < m; i++) { - denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; - this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; - - if (this.IFLAG != 0) { - this.FJAC[i] = 1.0; - dummy = -1.0 / (denom * denom); - this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; - this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; - } - } - - } - - } - - public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { - - public static final int ndec = 3; - - /** Monitoring routine. */ - public void eval() { - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(); - - fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); - this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); - gtg = ddot.eval(this.N, g, inc1, g, inc1); - - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", - this.NITER, this.NF, fsumsq, gtg, this.IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < n; j++) { - System.out.printf(" %13.5E %9.1E %9.1E\n", - this.XC[j], g[j], this.S[j]); - } - - } - - /** Routine to evaluate gradient of the sum of squares. */ - public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); - f06pa.eval(); - - for (int i = 0; i < n; ++i) { - g[i] = 2.0 * g[i]; - } - - } - - } - - /** Using E04HEV as LSQLIN. */ - private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { - - public void eval() { - super.eval(); - } - - } - -} diff --git a/simple_examples/int32/E04GGJE.java b/simple_examples/int32/E04GGJE.java deleted file mode 100644 index 8a18c6a..0000000 --- a/simple_examples/int32/E04GGJE.java +++ /dev/null @@ -1,219 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RX; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; - -/** - * E04GG example program text. - */ -public class E04GGJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser = 0, handle = 0; - int ifail, isparse, nnzrd, nres, nvar; - - double[] blx, bux, ruser, rx, x, z; - double[] rinfo = new double[100], stats = new double[100]; - int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; - - /* Header */ - System.out.println(" E04GGJ Example Program Results\n"); - - nvar = 6; - nres = 24; - // ruser = new double[2*nres]; - // Data from Lanczos 3 Problem - ruser = new double[] { - // t(:) = - 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, - 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, - 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, - // y(:) = - 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, - 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, - 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 - }; - - iuser[0] = 0; - - // Initialize handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define residuals structure, isparse=0 means the residual structure is - // dense => irowrd and icolrd are not accessed - isparse = 0; - nnzrd = 0; - E04RM e04rm = new E04RM(); - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); - e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); - e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); - // Change printed output verbosity - e04zm.eval(handle, "Print Level = 1",ifail); - - // Define starting point - rx = new double[nres]; - z = new double[nvar]; - // x = new double[nvar]; - x = new double[] { - 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 - }; - - // Define bounds - blx = new double[nvar]; - bux = new double[nvar]; - blx[0] = 0.0; - bux[0] = 1.0; - blx[1] = -1.0; - bux[1] = infbnd; - blx[2] = -1.0; - bux[2] = infbnd; - blx[3] = -1.0; - bux[3] = infbnd; - blx[4] = -1.0; - bux[4] = 1.0; - blx[5] = -1.0; - bux[5] = 10.0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, blx, bux, ifail); - - // Call the solver - ifail = -1; - E04GG e04gg = new E04GG(); - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); - ifail = e04gg.getIFAIL(); - - // Recover latest iterate from handle if available - if (ifail == 0) { - ifail = -1; - E04RX e04rx = new E04RX(); - e04rx.eval(handle,"X",1,nvar,z,ifail); - ifail = e04rx.getIFAIL(); - if (ifail == 0) { - System.out.println("\nSolver stored solution iterate in the handle"); - System.out.print("X: "); - for (int i = 0; i < nvar; i++){ - System.out.printf("%8.2E ", z[i]); - } - System.out.println(); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - - this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int i; - - for (i = 0; i < this.RDX.length; i++) { - this.RDX[i] = 0; - } - - for (i = 0; i < this.NRES; i++) { - this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); - this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - for (int i = 0; i < this.NVAR * this.NVAR; i++) { - this.HX[i] = 0.0; - } - - double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; - - for (int i = 0; i < this.NRES; i++){ - sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); - sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); - sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); - sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); - sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); - sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); - } - - this.HX[(2-1) + (1-1) * this.NVAR] = sum21; - this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; - this.HX[(2-1) + (2-1) * this.NVAR] = sum22; - this.HX[(4-1) + (3-1) * this.NVAR] = sum43; - this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; - this.HX[(4-1) + (4-1) * this.NVAR] = sum44; - this.HX[(6-1) + (5-1) * this.NVAR] = sum65; - this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; - this.HX[(6-1) + (6-1) * this.NVAR] = sum66; - - this.INFORM = 0; - } - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - } - -} diff --git a/simple_examples/int32/E04MTJE.java b/simple_examples/int32/E04MTJE.java deleted file mode 100644 index 6272e91..0000000 --- a/simple_examples/int32/E04MTJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RF; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04MT example program text. - */ -public class E04MTJE { - - public static void main(String[] args) throws IOException { - - System.out.println(" E04MTJ Example Program Results"); - int m = 7; - int n = 7; - int nnza = 41; - int nnzc = 7; - int nnzu = 2*n + 2*m; - - int[] cindex = {1,2,3,4,5,6,7}; - double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; - int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, - 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; - int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, - 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; - double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, - 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, - 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, - 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, - 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, - 0.12, 0.02, 0.01, 0.97}; - double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, - -0.0992,-0.003}; - double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, - 1.0e20, 0.002}; - double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; - double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; - double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; - - long handle = 0; - int ifail = 0; - E04RA e04ra = new E04RA(handle,n,ifail); - e04ra.eval(); - - handle = e04ra.getHANDLE(); - - int[] icolh = new int[1]; - int[] irowh = new int[1]; - double[] h = new double[1]; - E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); - e04rf.eval(); - handle = e04ra.getHANDLE(); - - E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); - e04rh.eval(); - handle = e04rh.getHANDLE(); - - int idlc = 0; - E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); - e04rj.eval(); - handle = e04rj.getHANDLE(); - - E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); - e04zm.eval(); - e04zm.setOPTSTR("Print Solution = YES"); - e04zm.eval(); - e04zm.setOPTSTR("Print Options = NO"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); - e04zm.eval(); - handle = e04zm.getHANDLE(); - - long cpuser = 2; - int[] iuser = {1}; - double[] ruser = new double[1]; - ifail = -1; - MONIT monit = new MONIT(); - double[] x = new double[n], u = new double[nnzu]; - double[] rinfo = new double[100], stats = new double[100]; - System.out.println(); - System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); - E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, - monit,iuser,ruser,cpuser,ifail); - e04mt.eval(); - System.out.println(); - System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); - e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); - e04zm.eval(); - iuser[0] = 2; - e04mt.setIFAIL(-1); - e04mt.setHANDLE(e04zm.getHANDLE()); - e04mt.setIUSER(iuser); - e04mt.eval(); - - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - - double tol = 1.2e-8; - - if (IUSER[0] == 1) { - if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - else { - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - - } - - } - -} diff --git a/simple_examples/int32/E04MXJE.java b/simple_examples/int32/E04MXJE.java deleted file mode 100644 index 642a933..0000000 --- a/simple_examples/int32/E04MXJE.java +++ /dev/null @@ -1,292 +0,0 @@ -import com.nag.routines.E04.E04MX; -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NS; -import com.nag.routines.E04.E04NT; -import com.nag.routines.X04.X04AC; -import com.nag.routines.X04.X04AD; -import java.util.Arrays; - -/** - * E04MX example program text. - */ -public class E04MXJE { - - public static void main(String[] args) { - - /* Parameters */ - int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; - boolean readints = false; - String fname = args[0]; - /* Local Scalars */ - double obj, objadd, sinf; - int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, - maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; - boolean verboseOutput; - String start; - /* Local Arrays */ - double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; - int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; - String[] crname, cw; - String[] cuser = new String[1], pnames = new String[5]; - cuser[0] = " "; - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - - System.out.println(" E04MXJ Example Program Results"); - - // Initialize - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - maxm = 0; - maxn = 0; - maxnnz = 0; - maxnnzh = 0; - maxncolh = 0; - maxlintvar = 0; - - // Open the data file for reading - X04AC x04ac = new X04AC(); - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Prep call to E04MX in query mode - E04MX e04mx = new E04MX(); - a = new double[1]; - irowa = new int[1]; - iccola = new int[1]; - bl = new double[1]; - bu = new double[1]; - crname = new String[]{" "}; - h = new double[1]; - irowh = new int[1]; - iccolh = new int[1]; - intvar = new int[1]; - ifail = 0; - - // Placeholders for output only scalars - n = 0; - m = 0; - nnz = 0; - ncolh = 0; - nnzh = 0; - lintvar = 0; - iobj = 0; - nname = 0; - minmax = 0; - - // Make call to E04MX - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - - // Get output scalar values - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close file - X04AD x04ad = new X04AD(); - ifail = 0; - x04ad.eval(nin, ifail); - - // Set maxm, maxn and maxnnz - maxm = m; - maxn = n; - maxnnz = nnz; - maxnnzh = nnzh; - maxncolh = ncolh; - maxlintvar = (readints) ? lintvar : 1; - - // Allocate memory - irowa = new int[maxnnz]; - iccola = new int[maxn + 1]; - a = new double[maxnnz]; - bl = new double[maxn + maxm]; - bu = new double[maxn + maxm]; - crname = new String[maxn + maxm]; - for (int j = 0; j < (maxn + maxm); j++) { - crname[j] = " "; - } - irowh = new int[maxnnzh]; - iccolh = new int[maxncolh + 1]; - h = new double[maxnnzh]; - intvar = new int[maxlintvar]; - - // Open the data file for reading - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Call E04MX to read the problem - ifail = 0; - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close the data file - ifail = 0; - x04ad.eval(nin, ifail); - - /* Data has been read. Set up and run the solver */ - - iw = new int[leniw]; - rw = new double[lenrw]; - cw = new String[lencw]; - for (int j = 0; j < lencw; j++) { - cw[j] = " "; - } - - // Call E04NP to initialize workspace - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); - - // Call option setter E04NS to change the direction of optimization. - // Minimization is assumed by default. - E04NS e04ns = new E04NS(); - if (minmax == 1) { - ifail = 0; - e04ns.eval("Maximize", cw, iw, rw, ifail); - } - else if (minmax == 0) { - ifail = 0; - e04ns.eval("Feasible Point", cw, iw, rw, ifail); - } - - // Set this to TRUE to cause E04NQ to produce intermediate progress output - verboseOutput = false; - - if (verboseOutput) { - // By default E04NQ does not print monitoring information. Set the print - // file unit or the summary file unit to get information. - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", nout, cw, iw, rw, ifail); - } - else { - System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); - } - - // We have no explicit objective vector so set LENC = 0; the objective vector - // is stored in row IOBJ of ACOL. - lenc = 0; - objadd = 0.0; - start = "C"; - - c = new double[Math.max(1, lenc)]; - helast = new int[n + m]; - x = new double[n + m]; - pi = new double[m]; - rc = new double[n + m]; - hs = new int[n + m]; - iuser = new int[ncolh + 1 + nnzh]; - ruser = new double[nnzh]; - - if (ncolh > 0) { - // Store the non zeros of H in ruser for use by qphx - for (int j = 0; j < nnzh; j++) { - ruser[j] = h[j]; - } - // Store iccolh and irowh in iuser for use by qphx - for (int j = 0; j < ncolh + 1; j++) { - iuser[j] = iccolh[j]; - } - for (int j = 0; j < nnzh; j++) { - iuser[j + ncolh + 1] = irowh[j]; - } - - } - - // Call E04NQ to solve the problem - E04NQ e04nq = new E04NQ(); - QPHX qphx = new QPHX(); - ns = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - ifail = 0; - e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, - pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, - x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, - lenrw,cuser,iuser,ruser,ifail); - ns = e04nq.getNS(); - ninf = e04nq.getNINF(); - sinf = e04nq.getSINF(); - obj = e04nq.getOBJ(); - ifail = e04nq.getIFAIL(); - - if (!verboseOutput) { - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n", obj); - System.out.printf(" Optimal X = \n"); - System.out.printf(" "); - for (int j = 0; j < n; j++) { - System.out.printf("%9.2f", x[j]); - } - System.out.printf("\n"); - } - - } - - public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { - - /** - * Subroutine to compute H*x. - * Note: IUSER and RUSER contain the following data: - * RUSER(1:NNZH) = H(1:NNZH) - * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) - * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) - */ - public void eval() { - /* Local Scalars */ - int end, icol, idx, irow, start; - - Arrays.fill(HX, 0.0); - - for (icol = 0; icol < this.NCOLH + 1; ++icol) { - - start = this.IUSER[icol] - 1; - end = IUSER[icol+1] - 2; - - for (idx = start; idx < end + 1; ++idx) { - - irow = this.IUSER[this.NCOLH + 1 + idx] - 1; - this.HX[irow] += this.X[icol] * this.RUSER[idx]; - - if (irow != icol) { - this.HX[icol] += this.X[irow] * this.RUSER[idx]; - } - - } - - } - - } - - } - - -} diff --git a/simple_examples/int32/E04NCJE.java b/simple_examples/int32/E04NCJE.java deleted file mode 100644 index d6c3010..0000000 --- a/simple_examples/int32/E04NCJE.java +++ /dev/null @@ -1,246 +0,0 @@ -import static java.lang.Math.max; - -import com.nag.routines.E04.E04NC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NC example program text. - * @author ludovic - */ -public class E04NCJE { - - public static void main(String[] args) { - - double one = 1.0; - double zero = 0.0; - int inc1 = 1, lcwsav = 1, liwsav = 610, - llwsav = 120, lrwsav = 475, nin = 5, - nout = 6; - double obj; - int i, ifail, iter, lda, ldc, liwork, - lwork, m, n, nclin, sdc; - double[] a, b, bl, bu, c, - clamda, cvec, work, x; - double[] rwsav = new double[lrwsav]; - int[] istate, iwork, kx; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - String[] cwsav = new String[lcwsav]; - - System.out.println(" E04NCJ Example Program Results"); - try { - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - m = Integer.parseInt(data[0]); - n = Integer.parseInt(data[1]); - nclin = Integer.parseInt(data[2]); - - liwork = n; - ldc = max(1,nclin); - lda = max(1,m); - - if (nclin > 0) { - sdc = n; - } - else { - sdc = 1; - } - - /* This particular example problem is of type LS1, so we allocate - * A(LDA,N), CVEC(1), B(M) and define LWORK as below - */ - if (nclin > 0) { - lwork = 2*n*n + 9*n + 6*nclin; - } - else { - lwork = 9*n; - } - - /* - * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column - * ie: - * 1 1 1 - * 2 2 2 - * 3 3 3 - * - * is stored [1,2,3,1,2,3,1,2,3] - */ - istate = new int[n+nclin]; - kx = new int[n]; - iwork = new int[liwork]; - c = new double[ldc*sdc]; - bl = new double[n+nclin]; - bu = new double[n+nclin]; - cvec = new double[1]; - x = new double[n]; - a = new double[lda * n]; - b = new double[m]; - clamda = new double[n+nclin]; - work = new double[lwork]; - - /* - * Extra arrays to initialize: - */ - for (int ii = 0; ii < cwsav.length; ++ii) { - // 80 characters long... - cwsav[ii] - = " "; - } - - for (int ii = 0; ii < lda; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < n; ++jj) { - a[lda*jj+ii] = Double.parseDouble(data[jj]); - } - } - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - - for (int ii = 0; ii < m; ++ii) { - b[ii] = Double.parseDouble(data[ii]); - } - - for (int ii = 0; ii < ldc; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < sdc; ++jj) { - c[ldc*jj+ii] = Double.parseDouble(data[jj]); - } - } - - //bl and bu to complicated to read properly -> hardcoded - line = br.readLine(); - line = br.readLine(); - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = -1.0E+25; - bl[3] = 0.0; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 0.0; - bl[8] = 0.0; - bl[9] = 2.0; - bl[10] = -1.0E+25; - bl[11] = 1.0; - - line = br.readLine(); - line = br.readLine(); - bu[0] = 2.0; - bu[1] = 2.0; - bu[2] = 2.0; - bu[3] = 2.0; - bu[4] = 2.0; - bu[5] = 2.0; - bu[6] = 2.0; - bu[7] = 2.0; - bu[8] = 2.0; - bu[9] = 1.0E+25; - bu[10] = 2.0; - bu[11] = 4.0; - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int ii = 0; ii < n; ++ii) { - x[ii] = Double.parseDouble(data[ii]); - } - - // CALL TO E04WBF - ifail = 0; - String routname = "E04NCA"; - E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, - lrwsav, ifail); - e04wb.eval(); - cwsav = e04wb.getCWSAV(); - iwsav = e04wb.getIWSAV(); - lwsav = e04wb.getLWSAV(); - rwsav = e04wb.getRWSAV(); - - // CALL TO E04NCF - ifail = -1; - - /* Java needs these to be initialized, so set it to an impossible value - * to trap possible error later */ - iter = Integer.MIN_VALUE; - obj = Double.NaN; - - E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, - clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); - e04nc.eval(); - - // Getting ifail's value back - ifail = e04nc.getIFAIL(); - - switch (ifail) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 7: - System.out.println("\n Varbl Istate Value Lagr Mult\n"); - - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println("\n\n L Con Istate Value Lagr Mult\n"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); - break; - default: - if (ifail > 7) { - System.out.println(" Varbl Istate Value Lagr Mult"); - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println(" L Con Istate Value Lagr Mult"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); - } - else { - System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); - } - } - } - catch (Exception ex) { - Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - -} diff --git a/simple_examples/int32/E04NFJE.java b/simple_examples/int32/E04NFJE.java deleted file mode 100644 index e341f9f..0000000 --- a/simple_examples/int32/E04NFJE.java +++ /dev/null @@ -1,234 +0,0 @@ -import com.nag.routines.E04.E04NF; -import com.nag.routines.E04.E04NH; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E54NFU; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NF example program text. - */ -public class E04NFJE { - - public static void main(String[] args) { - - /* Local Scalars */ - double obj; - int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; - /* Local Arrays */ - double[] a, ax, bl, bu, clamda, cvec, h, work, x; - int[] istate, iwork; - - try { - - System.out.println(" E04NFJ Example Program Results"); - - if (args.length == 0) { - System.err.println("You need to provide the path to the data file e04nfae.d"); - System.exit(-1); - } - - // Read data from file - DataFile datafile = new DataFile(args[0]); - datafile.read(); - - liwork = 2 * datafile.n + 3; - lda = Math.max(1, datafile.nclin); - - sda = (datafile.nclin > 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new int[datafile.n + datafile.nclin]; - ax = new double[Math.max(1, datafile.nclin)]; - iwork = new int[liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[datafile.n + datafile.nclin]; - work = new double[lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[lcwsav]; - cwsav[0] - = " "; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - double[] rwsav = new double[lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - int[] iuser = new int[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } - catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default. */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - super.eval(); - } - - } - - public static class DataFile { - - public String filename; - public int n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file" - + " - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } - else { - sda = 1; - } - ldh = n; - - cvec = new double[n]; - a = new double[lda * sda]; - bl = new double[n + nclin]; - bu = new double[n + nclin]; - x = new double[n]; - h = new double[ldh * n]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/int32/E04NKJE.java b/simple_examples/int32/E04NKJE.java deleted file mode 100644 index 604ee66..0000000 --- a/simple_examples/int32/E04NKJE.java +++ /dev/null @@ -1,295 +0,0 @@ -import com.nag.routines.E04.E04NK; -import com.nag.routines.E04.E04WB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NKJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class E04NKJE{ - private static int lcwsav = 1; - private static int liwsav = 380; - private static int llwsav = 20; - private static int lrwsav = 285; - - /** - * E04NKJ Example main program. - */ - public static void main(String[] args){ - double obj, sinf; - int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; - String start; - double[] a, bl, bu, clamda, xs, z, ruser, rwsav; - int[] ha, istate, iz, ka, iuser, iwsav; - boolean[] lwsav; - String[] crname, cwsav, names; - - System.out.println("E04NKJ Example Program Results"); - - ruser = new double[1]; - rwsav = new double[lrwsav]; - iuser = new int[1]; - iwsav = new int[liwsav]; - - cwsav = new String[lcwsav]; - //equivalent to ```Character (80) :: cwsav(lcwsav)``` - for(i = 0; i < lcwsav; i++){ - char[] chars = new char[80]; - Arrays.fill(chars, ' '); - cwsav[i] = new String(chars); - } - names = new String[5]; - //names all blank anyway this time - for(i = 0; i < 5; i++){ - char[] chars = new char[8]; - Arrays.fill(chars, ' '); - names[i] = new String(chars); - } - - //dummy arrays - crname = new String[0]; - - n = 7; - m = 8; - nnz = 48; - iobj = 8; - ncolh = 7; - start = "C"; - nname = 15; - - ha = new int[nnz]; - ka = new int[n + 1]; - istate = new int[n + m]; - a = new double[nnz]; - bl = new double[n + m]; - bu = new double[n + m]; - xs = new double[n + m]; - clamda = new double[n + m]; - crname = new String[nname]; - lwsav = new boolean[llwsav]; - - names[0] = " "; - names[1] = " "; - names[2] = " "; - names[3] = " "; - names[4] = " "; - - crname[0] = "...X1..."; - crname[1] = "...X2..."; - crname[2] = "...X3..."; - crname[3] = "...X4..."; - crname[4] = "...X5..."; - crname[5] = "...X6..."; - crname[6] = "...X7..."; - crname[7] = "..ROW1.."; - crname[8] = "..ROW2.."; - crname[9] = "..ROW3.."; - crname[10] = "..ROW4.."; - crname[11] = "..ROW5.."; - crname[12] = "..ROW6.."; - crname[13] = "..ROW7.."; - crname[14] = "..COST.."; - - //Matrix A. Set up KA - jcol = 1; - ka[0] = 1; - - a[0] = 0.02; ha[0] = 7; - a[1] = 0.02; ha[1] = 5; - a[2] = 0.03; ha[2] = 3; - a[3] = 1.00; ha[3] = 1; - a[4] = 0.70; ha[4] = 6; - a[5] = 0.02; ha[5] = 4; - a[6] = 0.15; ha[6] = 2; - a[7] = -200.00; ha[7] = 8; - a[8] = 0.06; ha[8] = 7; - a[9] = 0.75; ha[9] = 6; - a[10] = 0.03; ha[10] = 5; - a[11] = 0.04; ha[11] = 4; - a[12] = 0.05; ha[12] = 3; - a[13] = 0.04; ha[13] = 2; - a[14] = 1.00; ha[14] = 1; - a[15] = -2000.00; ha[15] = 8; - a[16] = 0.02; ha[16] = 2; - a[17] = 1.00; ha[17] = 1; - a[18] = 0.01; ha[18] = 4; - a[19] = 0.08; ha[19] = 3; - a[20] = 0.08; ha[20] = 7; - a[21] = 0.80; ha[21] = 6; - a[22] = -2000.00; ha[22] = 8; - a[23] = 1.00; ha[23] = 1; - a[24] = 0.12; ha[24] = 7; - a[25] = 0.02; ha[25] = 3; - a[26] = 0.02; ha[26] = 4; - a[27] = 0.75; ha[27] = 6; - a[28] = 0.04; ha[28] = 2; - a[29] = -2000.00; ha[29] = 8; - a[30] = 0.01; ha[30] = 5; - a[31] = 0.80; ha[31] = 6; - a[32] = 0.02; ha[32] = 7; - a[33] = 1.00; ha[33] = 1; - a[34] = 0.02; ha[34] = 2; - a[35] = 0.06; ha[35] = 3; - a[36] = 0.02; ha[36] = 4; - a[37] = -2000.00; ha[37] = 8; - a[38] = 1.00; ha[38] = 1; - a[39] = 0.01; ha[39] = 2; - a[40] = 0.01; ha[40] = 3; - a[41] = 0.97; ha[41] = 6; - a[42] = 0.01; ha[42] = 7; - a[43] = 400.00; ha[43] = 8; - a[44] = 0.97; ha[44] = 7; - a[45] = 0.03; ha[45] = 2; - a[46] = 1.00; ha[46] = 1; - a[47] = 400.00; ha[47] = 8; - - ka[1] = 9; - ka[2] = 17; - ka[3] = 24; - ka[4] = 31; - ka[5] = 39; - ka[6] = 45; - ka[7] = 49; - - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = 4.0e2; - bl[3] = 1.0e2; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 2.0e3; - bl[8] = -1.0e25; - bl[9] = -1.0e25; - bl[10] = -1.0e25; - bl[11] = -1.0e25; - bl[12] = 1.5e3; - bl[13] = 2.5e2; - bl[14] = -1.0e25; - - bu[0] = 2.0e2; - bu[1] = 2.5e3; - bu[2] = 8.0e2; - bu[3] = 7.0e2; - bu[4] = 1.5e3; - bu[5] = 1.0e25; - bu[6] = 1.0e25; - bu[7] = 2.0e3; - bu[8] = 6.0e1; - bu[9] = 1.0e2; - bu[10] = 4.0e1; - bu[11] = 3.0e1; - bu[12] = 1.0e25; - bu[13] = 3.0e2; - bu[14] = 1.0e25; - - istate[0] = 0; - istate[1] = 0; - istate[2] = 0; - istate[3] = 0; - istate[4] = 0; - istate[5] = 0; - istate[6] = 0; - istate[7] = 0; - - xs[0] = 0.0; - xs[1] = 0.0; - xs[2] = 0.0; - xs[3] = 0.0; - xs[4] = 0.0; - xs[5] = 0.0; - xs[6] = 0.0; - xs[7] = 0.0; - - ifail = 0; - E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, - lrwsav,ifail); - e04wb.eval(); - - leniz = 1; - lenz = 1; - iz = new int[leniz]; - z = new double[lenz]; - - QPHX qphx = new QPHX(); - - ifail = 1; - - //placeholders - ns = 0; - miniz = 0; - minz = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - - E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, - crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, - leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); - e04nk.eval(); - ifail = e04nk.getIFAIL(); - - minz = e04nk.getMINZ(); - miniz = e04nk.getMINIZ(); - - lenz = minz; - leniz = miniz; - - iz = new int[leniz]; - z = new double[lenz]; - - ifail = -1; - - e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, - istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, - lwsav,iwsav,rwsav,ifail); - - //update - ifail = e04nk.getIFAIL(); - obj = e04nk.getOBJ(); - - if(ifail == 0){ - System.out.println(); - System.out.println("\tVariable Istate Value Lagr Mult"); - System.out.println(); - - for(i = 0; i < n; i++){ - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - if(m > 0){ - System.out.println(); - System.out.println(); - System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); - System.out.println(); - - for(i = n; i < n + m - 1; i++){ - System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - System.out.println(); - System.out.println(); - System.out.printf("Final objetive value = %15.7g\n", obj); - } - - } - - public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ - public void eval(){ - this.HX[0] = 2 * this.X[0]; - this.HX[1] = 2 * this.X[1]; - this.HX[2] = 2 * (this.X[2] + this.X[3]); - this.HX[3] = this.HX[2]; - this.HX[4] = 2 * this.X[4]; - this.HX[5] = 2 * (this.X[5] + this.X[6]); - this.HX[6] = this.HX[5]; - } - } -} diff --git a/simple_examples/int32/E04NQJE.java b/simple_examples/int32/E04NQJE.java deleted file mode 100644 index 6cf84fe..0000000 --- a/simple_examples/int32/E04NQJE.java +++ /dev/null @@ -1,384 +0,0 @@ -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NT; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NQ example program text. - */ -public class E04NQJE { - - public static final int LENCW = 600; - public static final int LENIW = 600; - public static final int LENRW = 600; - public static final int NIN = 5; - public static final int NOUT = 6; - - public static void main(String[] args) throws IOException { - - /* Local Scalars */ - double obj, objadd, sinf; - int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; - boolean verboseOutput; - String prob; // Length = 8 - String start; // Length = 1 - /* Local Arrays */ - double[] acol, bl, bu, c, pi, rc, x; - double[] ruser = new double[1], rw = new double[LENRW]; - int[] helast, hs, inda, loca; - int[] iuser = new int[1], iw = new int[LENIW]; - String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 - String[] names; // Length = 8 - /* Init String arrays with same length*/ - Arrays.fill(cuser, " "); - Arrays.fill(cw, " "); - - System.out.println(" E04NQJ Example Program Results"); - - /* Read data file */ - - if (args.length != 1) { - usage(); - } - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - String line; - - // Skip heading in data file - line = dataIn.readLine(); - - // Read n, m - line = dataIn.readLine(); - String[] data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 2) { - System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" - + line + "\n"+Arrays.toString(data)); - System.exit(1); - } - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - - // Read ne, iobj, ncolh, start, nname - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 5) { - System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); - System.exit(1); - } - ne = Integer.parseInt(data[0]); - iobj = Integer.parseInt(data[1]); - ncolh = Integer.parseInt(data[2]); - start = data[3].replaceAll("'",""); - nname = Integer.parseInt(data[4]); - - // Allocate - inda = new int[ne]; - loca = new int[n+1]; - helast = new int[n+m]; - hs = new int[n+m]; - acol = new double[ne]; - bl = new double[n+m]; - bu = new double[n+m]; - x = new double[n+m]; - pi = new double[m]; - rc = new double[n+m]; - names = new String[nname]; - - // Read names - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - int nameIndex = 0; - int dataIndex = 0; - while (nameIndex < nname) { - names[nameIndex] = data[dataIndex].replaceAll("'", ""); - ++nameIndex; - ++dataIndex; - if (nameIndex < nname && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read matrix - line = dataIn.readLine(); // skipping blank line - int locaIndex = 0; - int currentCol = 0; - for (i = 0; i < ne; ++i) { - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 3) { - System.out.println("The line is not well formatted for input of A:\n\t"+line); - System.exit(1); - } - acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); - inda[i] = Integer.parseInt(data[1]); - if (i == 0) { - loca[locaIndex] = 1;//storing for Fortran use: 1-based - ++locaIndex; - ++currentCol; - } - else { - int tmp = Integer.parseInt(data[2]); - if (tmp != currentCol) { - loca[locaIndex] = i+1; - ++currentCol; - ++locaIndex; - } - } - } - loca[n] = ne + 1; - - // Read bl - line = dataIn.readLine(); // skipping blank line - int blindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (blindex < bl.length) { - bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++blindex; - ++dataIndex; - if (blindex < bl.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read bu - line = dataIn.readLine(); // skipping blank line - int buindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (buindex < bu.length) { - bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++buindex; - ++dataIndex; - if (buindex < bu.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read hs - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (start.equalsIgnoreCase("C")) { - if (data.length != n) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - else { - if (data.length != n+m) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - for (i = 0; i < data.length; ++i) { - hs[i] = Integer.parseInt(data[i]); - } - - // Read x - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != n) { - System.out.println("Wrong format for X data."); - System.exit(1); - } - for (i = 0; i < data.length; ++i) { - x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); - } - - /* Done reading data file */ - - System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); - - /* Call E04NP to initialize E04NQ. */ - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); - - /* Set this to .True. to cause e04nqf to produce intermediate - * progress output. */ - verboseOutput = true; - - if (verboseOutput) { - /* By default e04nqf does not print monitoring - * information. Set the print file unit or the summary - * file unit to get information. */ - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); - } - - /* We have no explicit objective vector so set LENC = 0; the - * objective vector is stored in row IOBJ of ACOL. */ - lenc = 0; - c = new double[Math.max(1,lenc)]; - objadd = 0.0; - sinf = 0.0; - obj = Double.NaN; - prob = " "; - - /* Do not allow any elastic variables (i.e. they cannot be - * infeasible). If we'd set optional argument "Elastic mode" to 0, - * we wouldn't need to set the individual elements of array HELAST. */ - - for (int j = 0; j < (n+m); j++) { - helast[j] = 0; - } - - /* Solve the QP problem. */ - - E04NQ e04nq = new E04NQ(); - ifail = 0; - ns = 0; - ninf = 0; - e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, - inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, - iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); - - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); - System.out.print(" Optimal X = "); - for (i = 0; i < n; ++i) { - System.out.printf("%9.2f ", x[i]); - } - System.out.println(); - - } - - private static void usage() { - System.out.println("Usage:\n" - + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator - + ". E04NQJE " + File.separator + "e04nqfe.d"); - System.exit(1); - } - - public static class QPHX implements E04NQ.E04NQ_QPHX { - - private int NCOLHREF; - - public QPHX(int NCOLHREF) { - this.NCOLHREF = NCOLHREF; - } - - // @Override - public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, - String[] CUSER, int[] IUSER, double[] RUSER) { - - if (NCOLH != NCOLHREF) { - System.out.println("NCOLH value is wrong!"); - System.out.println("TEST FAILED"); - System.exit(1); - } - HX[0] = 2.0*X[0]; - HX[1] = 2.0*X[1]; - HX[2] = 2.0*(X[2]+X[3]); - HX[3] = HX[2]; - HX[4] = 2.0*X[4]; - HX[5] = 2.0*(X[5]+X[6]); - HX[6] = HX[5]; - - } - - private String[] CUSER; - private double[] HX,RUSER,X; - private int[] IUSER; - private int NCOLH, NSTATE; - - // @Override - public String[] getCUSER() { - return CUSER; - } - - // @Override - public double[] getHX() { - return HX; - } - - // @Override - public int[] getIUSER() { - return IUSER; - } - - // @Override - public int getNCOLH() { - return NCOLH; - } - - // @Override - public int getNSTATE() { - return NSTATE; - } - - // @Override - public double[] getRUSER() { - return RUSER; - } - - // @Override - public double[] getX() { - return X; - } - - // @Override - public void setCUSER(String[] arg0) { - CUSER = arg0; - - } - - // @Override - public void setHX(double[] arg0) { - HX = arg0; - - } - - // @Override - public void setIUSER(int[] arg0) { - IUSER = arg0; - - } - - // @Override - public void setNCOLH(int arg0) { - NCOLH = arg0; - - } - - // @Override - public void setNSTATE(int arg0) { - NSTATE = arg0; - - } - - // @Override - public void setRUSER(double[] arg0) { - RUSER = arg0; - - } - - // @Override - public void setX(double[] arg0) { - X = arg0; - - } - - } - - - - -} diff --git a/simple_examples/int32/E04PTJE.java b/simple_examples/int32/E04PTJE.java deleted file mode 100644 index 75303ac..0000000 --- a/simple_examples/int32/E04PTJE.java +++ /dev/null @@ -1,344 +0,0 @@ -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RB; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.F08.DSYEVD; -import java.util.Arrays; - -/** - * E04PTJ example program text. - * @author joed - * @since 27.0.0.0 - */ -public class E04PTJE { - - - /** - * Monitoring function can be used to monitor the progress - * or, for example, to implement bespoke stopping criteria. - */ - private static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - - double tol = RUSER[0]; - int tolReached = IUSER[1]; - - // If x is close to the solution, print a message - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - if (tolReached == 0) { - System.out.println(); - System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); - IUSER[1] = 1; - } - } - - } - - } - - - /** - * E04PTJ example main program. - */ - public static void main(String[] args) { - - DSYEVD dsyevd = new DSYEVD(); - E04PT e04pt = new E04PT(); - E04RA e04ra = new E04RA(); - E04RB e04rb = new E04RB(); - E04RE e04re = new E04RE(); - E04RH e04rh = new E04RH(); - E04RJ e04rj = new E04RJ(); - E04RZ e04rz = new E04RZ(); - E04ZM e04zm = new E04ZM(); - MONIT monit = new MONIT(); - - final int nqc = 1; - long cpuser, handle; - double r1; - int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, - nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; - boolean verboseOutput; - String ctype1, ctype2; // Length must be 8 - double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, - work, x, xl, xu; - double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; - int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; - int[] iuser = new int[2]; - - System.out.println("E04PTJ Example Program Results\n"); - - // Dimensions of the problem - n = 3; - nnzp0 = 6; - nnzp1 = 6; - - // Initialize size of linear constraints in SOCP - m = nqc; - na = n + nqc + 1; - nnza = nqc + n; - - // Initialize size of cone constraints - nvarc1 = 2; - nvarc2 = 2; - - // Set problem data - lwork = Math.max(2*n*n+6*n+1, 120+9*n); - liwork = 5*n + 3; - irowp0 = new int[]{1, 2, 3, 2, 3, 3}; - icolp0 = new int[]{1, 1, 1, 2, 2, 3}; - p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; - irowp1 = new int[]{1, 2, 3, 2, 3, 3}; - icolp1 = new int[]{1, 1, 1, 2, 2, 3}; - p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; - q0 = new double[]{0.847, 0.08, 0.505}; - q1 = new double[]{0.065, 0.428, 0.097}; - r1 = 1.276; - f0 = new double[n*n]; - f1 = new double[n*n]; - lambda0 = new double[n]; - lambda1 = new double[n]; - work = new double[lwork]; - iwork = new int[liwork]; - - // Store full P0 and P1 in F0 and F1 - Arrays.fill(f0, 0.0); - for (i = 0; i < nnzp0; i++) { - f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; - } - Arrays.fill(f1, 0.0); - for (i = 0; i < nnzp1; i++) { - f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; - } - - // Factorize P0 and P1 via eigenvalue decomposition - ifail = 0; - dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); - dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); - - // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 - nu = 0; - nv = 0; - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - for (j = 1; j <= n; j++) { - f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); - } - m++; - nu++; - nnza += n; - } - if (lambda1[i-1] > 0) { - for (j = 1; j <= n; j++) { - f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); - } - m++; - nv++; - nnza += n; - } - } - nnza += nu + nv; - na += nu+ nv; - nvarc1 += nu; - nvarc2 += nv; - - // Add two fixed variable for two rotated quadratic cones - na += 2; - m += 2; - nnza += 2; - - // Compute size of multipliers - nnzu = 2*na + 2*m; - nnzuc = nvarc1 + nvarc2; - - // Initialize arrays to build SOCP - icola = new int[nnza]; - irowa = new int[nnza]; - a = new double[nnza]; - bla = new double[m]; - bua = new double[m]; - xl = new double[na]; - xu = new double[na]; - c = new double[na]; - x = new double[na]; - u = new double[nnzu]; - uc = new double[nnzuc]; - idxc1 = new int[nvarc1]; - idxc2 = new int[nvarc2]; - - // Build objective function parameter c - // [x, t1, u, v, y1, y2, t0] - Arrays.fill(c, 0.0); - for (j = 0; j < n; j++) { - c[j] = q0[j]; - } - c[na-1] = 1.0; - - // Build linear constraints parameter A - idxa = 0; - rptr = 0; - // q1 in First row - rptr++; - Arrays.fill(irowa, 0, n, rptr); - for (j = 0; j < n; j++) { - icola[j] = j+1; - a[j] = q1[j]; - } - idxa += n; - - // F0 in F0*x-u=0 row - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f0[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // F1 in F1*x-v=0 row - for (i = 1; i <= n; i++) { - if (lambda1[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f1[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // Rest of A, a diagonal matrix - for (j = 0; j < m; j++) { - irowa[idxa+j] = j+1; - icola[idxa+j] = n+j+1; - a[idxa+j] = 1.0; - } - for (j = 1; j < (nu+nv+1); j++) { - a[idxa+j] = -1.0; - } - // RHS in linear constraints - Arrays.fill(bla, 0.0); - Arrays.fill(bua, 0.0); - bla[0] = -r1; - bua[0] = -r1; - for (j = (m-nqc); j <= m; j++) { - bla[j-1] = 1.0; - bua[j-1] = 1.0; - } - - // Box constraints, all variables are free - Arrays.fill(xl, -1E+20); - Arrays.fill(xu, 1E+20); - - // Cone constraints - // First cone - idxc1[0] = na; - idxc1[1] = n + 1 + nu + nv + 1; - for (j = 2; j < nvarc1; j++) { - idxc1[j] = n + j; - } - ctype1 = "RQUAD "; - // Second cone - idxc2[0] = n + 1; - idxc2[1] = n + 1 + nu + nv + 2; - for (j = 2; j < nvarc2; j++) { - idxc2[j] = n + nu + j; - } - ctype2 = "RQUAD "; - - // Create the problem handle - handle = 0; - ifail = 0; - e04ra.eval(handle, na, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - ifail = 0; - e04re.eval(handle, na, c, ifail); - - // Set box constraints - ifail = 0; - e04rh.eval(handle, na, xl, xu, ifail); - - // Set linear constraints - ifail = 0; - idlc = 0; - e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); - idlc = e04rj.getIDLC(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Turn on monitoring - ifail = 0; - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - /* Set this to true to cause e04pt to produce intermediate - * progress output */ - verboseOutput = false; - - if (verboseOutput) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } - else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = 0; // unused in this example - iuser[1] = 0; - ruser[0] = 1.0E-7; - ifail = -1; - e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, - ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if (ifail == 0 || ifail == 50) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (xIdx = 1; xIdx <= n; xIdx++) { - System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); - } - } - - // Free the handle memory - ifail = 0; - e04rz.eval(handle, ifail); - - } - - - /** - * Convert from 2D Fortran index to 1D-column major Java index. - * @param x 1-based row index for a 2D array - * @param y 1-based column index for a 2D array - * @return the corresponding 0-based index for a 1D column-major array - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/E04RPJE.java b/simple_examples/int32/E04RPJE.java deleted file mode 100644 index d22d3d1..0000000 --- a/simple_examples/int32/E04RPJE.java +++ /dev/null @@ -1,199 +0,0 @@ -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RN; -import com.nag.routines.E04.E04RP; -import com.nag.routines.E04.E04RY; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04SV; - -/** - * E04RPJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ - -public class E04RPJE{ - - /** - * E04RPJ Example main program - */ - public static void main(String[] args){ - int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, - nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; - double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; - int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, - nnzq, qi, qj, idummy; - long cpuser, handle; - - rdummy = new double[1]; - rinfo = new double[32]; - stats = new double[32]; - idummy = new int[1]; - - System.out.println("E04RPJ Example Program Results"); - System.out.println(); - - //Problem size - nvar = 5; - nnzh = 0; - nclin = 0; - nnzb = 0; - nblk = 2; - - //Initialize handle to an empty problem - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - //Linear part of the objective function - cvec = new double[nvar]; - cvec[0] = 1; - cvec[1] = 0; - cvec[2] = 1; - cvec[3] = 0; - cvec[4] = 0; - - //Add the linear objetive function to the problem formulation - ifail = 0; - E04RE e04re = new E04RE(handle, nvar, cvec, ifail); - e04re.eval(); - - //Matrix inequalities - //block 1 - dimaq = 2; - nnzasum = 9; nnzqsum = 8; - idblk = 0; - - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 2; - nnza[2] = 3; - nnza[3] = 2; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 2.0; irowa[2] = 1; icola[2] = 1; - a[3] = -2.0; irowa[3] = 1; icola[3] = 2; - a[4] = 6.0; irowa[4] = 1; icola[4] = 1; - a[5] = 5.0; irowa[5] = 1; icola[5] = 2; - a[6] = -4.0; irowa[6] = 2; icola[6] = 2; - a[7] = 3.0; irowa[7] = 1; icola[7] = 2; - a[8] = 8.0; irowa[8] = 2; icola[8] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - //update - idblk = e04rn.getIDBLK(); - - nq = 6; - - qi = new int[nq]; - qj = new int[nq]; - nnzq = new int[nq]; - irowq = new int[nnzqsum]; - icolq = new int[nnzqsum]; - q = new double[nnzqsum]; - - qi[0] = 1; qj[0] = 4; - qi[1] = 2; qj[1] = 4; - qi[2] = 3; qj[2] = 4; - qi[3] = 1; qj[3] = 5; - qi[4] = 2; qj[4] = 5; - qi[5] = 3; qj[5] = 5; - - nnzq[0] = 1; - nnzq[1] = 2; - nnzq[2] = 1; - nnzq[3] = 1; - nnzq[4] = 2; - nnzq[5] = 1; - - q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; - q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; - q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; - q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; - q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; - q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; - q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; - q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; - - ifail = 0; - //Expand the existing linear matrix inequality with bilnear term - E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, - q,idblk,ifail); - e04rp.eval(); - - //block 2 - dimaq = 2; - nnzasum = 5; - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 1; - nnza[2] = 1; - nnza[3] = 1; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 1.0; irowa[2] = 1; icola[2] = 1; - a[3] = 1.0; irowa[3] = 1; icola[3] = 2; - a[4] = 1.0; irowa[4] = 2; icola[4] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - - System.out.println("Passing SDP problem to solver"); - System.out.println(); - - ifail = 0; - //Print overview of handle - //nout = 6 is default output for fortran - E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); - e04ry.eval(); - - //Allocate memory for the solver - x = new double[nvar]; - nnzu = 0; - nnzuc = 0; - nnzua = 0; - inform = 0; - for(int i = 0; i < nvar; i++){ - x[i] = 0.0; - } - - ifail = 0; - E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, - rinfo,stats,inform,ifail); - e04sv.eval(); - - //Destroy handle - ifail = 0; - E04RZ e04rz = new E04RZ(handle,ifail); - e04rz.eval(); - } - -} - - - diff --git a/simple_examples/int32/E04RSJE.java b/simple_examples/int32/E04RSJE.java deleted file mode 100644 index d614fbb..0000000 --- a/simple_examples/int32/E04RSJE.java +++ /dev/null @@ -1,229 +0,0 @@ -import com.nag.routines.E04.E04RS; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RS - */ -public class E04RSJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - double s = 0.0; - int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; - int[] iuser = new int[2]; - - System.out.println(" E04RSJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - nnzq0 = Integer.parseInt(sVal[1]); - nnzq1 = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - irowq0 = new int[nnzq0]; - icolq0 = new int[nnzq0]; - q0 = new double[nnzq0]; - irowq1 = new int[nnzq1]; - icolq1 = new int[nnzq1]; - q1 = new double[nnzq1]; - idxr0 = new int[n]; - r0 = new double[n]; - idxr1 = new int[n]; - r1 = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - irowq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - icolq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - q0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - irowq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - icolq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - q1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - s = Double.parseDouble(sVal[0]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute size of multipliers - // One quadratic constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - idqc = -1; - ifail = 0; - E04RS e04rs = new E04RS(); - e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); - - // Set quadratic constraint - idqc = 0; - ifail = 0; - e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } -} diff --git a/simple_examples/int32/E04RTJE.java b/simple_examples/int32/E04RTJE.java deleted file mode 100644 index dd4bce8..0000000 --- a/simple_examples/int32/E04RTJE.java +++ /dev/null @@ -1,225 +0,0 @@ -import com.nag.routines.E04.E04RT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RT example program text. - */ -public class E04RTJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; - double[] lc = new double[3]; - double[] lc_rhs = new double[1]; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icola = null, idxr0 = null, irowa = null; - int[] icollc = new int[3]; - int[] irowlc = new int[3]; - int[] iuser = new int[2]; - - System.out.println(" E04RTJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - m = Integer.parseInt(sVal[1]); - nnza = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - a = new double[nnza]; - icola = new int[nnza]; - irowa = new int[nnza]; - idxr0 = new int[n]; - r0 = new double[n]; - b = new double[m]; - xl = new double[n]; - xu = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - irowa[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - icola[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < m; i++) { - b[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xl[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xu[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute -2*b'A as linear term in quadratic function - for (j = 0; j < n; j++) { - r0[j] = 0.0; - idxr0[j] = j + 1; - } - for (i = 0; i < nnza; i++) { - r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; - } - - // Compute size of multipliers - // One linear constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2 * n + 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set quadratic objective function - idqc = -1; - ifail = 0; - E04RT e04rt = new E04RT(); - e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); - - // Set box constraints - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, n, xl, xu, ifail); - - // Set linear constraint: x1 + x2 + x3 = 1 - for (j = 0; j < n; j++) { - irowlc[j] = 1; - icollc[j] = j + 1; - lc[j] = 1.0; - } - lc_rhs[0] = 1.0; - ifail = 0; - idlc = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } - } diff --git a/simple_examples/int32/E04SAJE.java b/simple_examples/int32/E04SAJE.java deleted file mode 100644 index 325267b..0000000 --- a/simple_examples/int32/E04SAJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.routines.E04.E04RC; -import com.nag.routines.E04.E04SA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04PTU; - -/** - * E04SA example program text. - */ -public class E04SAJE { - - public static final String fname = "e04saje.opt"; - public static void main(String[] args) { - - long cpuser, handle = 0; - int ifail, n, nnzu, nnzuc, x_idx; - boolean verbose_output; - String ftype; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u, uc, x; - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04SAJ Example Program Results"); - - // Read mps file to a handle - ifail = 0; - ftype = "mps"; - E04SA e04sa = new E04SA(); - e04sa.eval(handle, fname, ftype, pinfo, ifail); - handle = e04sa.getHANDLE(); - - // Get problem size from pinfo - pinfo = e04sa.getPINFO(); - n = pinfo[0]; - nnzu = pinfo[10]; - nnzuc = pinfo[11]; - - // Set all variables as continuous - ifail = 0; - E04RC e04rc = new E04RC(); - - int[] x_idx_Arr = new int[n]; - for (x_idx = 1; x_idx <= n; x_idx++) { - x_idx_Arr[x_idx - 1] = x_idx; - } - - e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); - - // Allocate memory - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Set this to .True. to cause e04ptf to produce intermediate progress output - verbose_output = false; - - E04ZM e04zm = new E04ZM(); - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx " + " Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - E04PTU e04ptu = new E04PTU(); - e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); - this.INFORM = e04ptu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TAJE.java b/simple_examples/int32/E04TAJE.java deleted file mode 100644 index 97cebe2..0000000 --- a/simple_examples/int32/E04TAJE.java +++ /dev/null @@ -1,188 +0,0 @@ -import com.nag.routines.E04.E04TA; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04MTU; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04TE; -import com.nag.routines.E04.E04TJ; -import com.nag.routines.E04.E04RW; -import com.nag.routines.E04.E04RZ; - -import java.util.Arrays; - -/** - * E04TA - */ -public class E04TAJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser, handle; - int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; - - double[] a, bla, bua, cvec, ulag, x, xl, xu; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u = new double[1]; - - int[] icola, irowa; - - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04TAJ Example Program Results\n"); - System.out.println(" Solve the first LP\n"); - - handle = 0; - cpuser = 0; - - // Initialize the handle - nvar = 2; - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define the objective function - cvec = new double[nvar]; - cvec[0] = 2.0; - cvec[1] = 4.5; - ifail = 0; - E04RE e04re = new E04RE(); - e04re.eval(handle, nvar, cvec, ifail); - - // Box constraints - xl = new double[nvar]; - xu = new double[nvar]; - Arrays.fill(xl, 0.0); - xu[0] = infbnd; - xu[1] = 100.0; - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, xl, xu, ifail); - - // Set the linear constraints - idlc = 0; - nclin = 3; - nnza = 6; - bla = new double[nclin]; - bua = new double[nclin]; - irowa = new int[nnza]; - icola = new int[nnza]; - a = new double[nnza]; - Arrays.fill(bla, -infbnd); - bua = new double[] { - 1500.0, 6000.0, 16000.0 - }; - irowa = new int[] { - 1, 1, 2, 2, 3, 3 - }; - icola = new int[] { - 1, 2, 1, 2, 1, 2 - }; - a = new double[] { - 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 - }; - ifail = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); - - // Optional parameters - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Task = Max", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - - // Call the LP solver - x = new double[nvar + 1]; - nnzu = 0; - ifail = -1; - E04MT e04mt = new E04MT(); - MONIT monit = new MONIT(); - e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a variable - ifail = 0; - E04TA e04ta = new E04TA(); - e04ta.eval(handle, 1, nvar, ifail); - nvar = e04ta.getNVAR(); - - // Box constraint on the new variable - ifail = 0; - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); - - // Add the linear objective component - ifail = 0; - E04TE e04te = new E04TE(); - e04te.eval(handle, 3, 7.0, ifail); - - // Add linear constraints coefficients - E04TJ e04tj = new E04TJ(); - ifail = 0; - e04tj.eval(handle, 1, 3, 5.0, ifail); - ifail = 0; - e04tj.eval(handle, 2, 3, 12.0, ifail); - ifail = 0; - e04tj.eval(handle, 3, 3, 120.0, ifail); - - System.out.println("\n The new variable has been added, solve the handle again\n"); - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a linear constraint - nclin = 1; - bla[0] = -infbnd; - bua[0] = 100.0; - nnza = 2; - irowa[0] = 1; - irowa[1] = 1; - icola[0] = 2; - icola[1] = 3; - a[0] = 1.0; - a[1] = 1.0; - idlc = 0; - e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); - - System.out.println("\n The new constraint has been added, solve the handle again\n"); - - // Query the problem sizes to request the Lagrangian multipliers for the - // last solve - ioflag = 1; - liarr = 100; - E04RW e04rw = new E04RW(); - e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); - nnzu = pinfo[10]; - ulag = new double[nnzu]; - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Free the memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - E04MTU e04mtu = new E04MTU(); - e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, - this.CPUSER, this.INFORM); - this.INFORM = e04mtu.getINFORM(); - } - } -} diff --git a/simple_examples/int32/E04TCJE.java b/simple_examples/int32/E04TCJE.java deleted file mode 100644 index d28d78b..0000000 --- a/simple_examples/int32/E04TCJE.java +++ /dev/null @@ -1,263 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGU; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04TB; -import com.nag.routines.E04.E04TC; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Arrays; - -/** - * E04TC example program text. - * @author Mo - */ -public class E04TCJE { - - public static void main(String[] args) { - double[] rx, x, udt, udy; - double[] rinfo = new double[100], ruser = new double[0], - stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, udnres; - int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; - int[] idx; - long cpuser, handle; // c_ptr - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - /* Header */ - System.out.printf(" E04TCJ Example Program Results\n\n"); - try { - - handle = 0L; - cpuser = 0L; - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - - /* Read number of residuals */ - nres = Integer.parseInt(data[0]); - - udnres = nres; - - /* Allocate memory */ - udt = new double[nres]; - udy = new double[nres]; - - /* Read observations */ - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udt[ii+jj] = Double.parseDouble(data[jj]); - } - } - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udy[ii+jj] = Double.parseDouble(data[jj]); - } - } - - /* try to fit the model */ - /* f(t) = at^2 + bt + c + d sin(omega t) */ - /* To the data {(t_i, y_i)} */ - nvar = 5; - - /* Initialize the NAG optimization handle */ - E04RA e04ra = new E04RA(); - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define a dense nonlinear least-squares objective function */ - /* (isparse = 0 => the sparsity pattern of the Jacobian */ - /* doesn't need to be defined) */ - E04RM e04rm = new E04RM(); - isparse = 0; - nnzrd = 1; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set some optional parameters to control the output of the solver */ - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - - System.out.println("First solve the problem with the outliers"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Call the solver */ - E04GG e04gg = new E04GG(); - x = new double[nvar]; - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - rx = new double[nres]; - iuser = new int[] {udnres}; - ruser = new double[2 * udnres];; - for (int ii = 0; ii < udnres; ii++) { - ruser[ii] = udt[ii]; - ruser[udnres + ii] = udy[ii]; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Now remove the outlier residuals from the problem handle"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Disable the two outlier residuals */ - E04TC e04tc = new E04TC(); - idx = new int[] {10, 20}; - e04tc.eval(handle, "NLS", 2, idx, ifail); - - /* Solve the problem again */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Assuming the outliers points are measured again"); - System.out.println("we can enable the residuals and adjust the values"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Fix the first variable to its known value of 0.3 */ - /* enable the residuals and adjust the values in the data */ - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); - E04TB e04tb = new E04TB(); - e04tb.eval(handle, "NLS", 2, idx, ifail); - udy[9] = -0.515629; - udy[19] = 0.54920; - - /* Solve the problem */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - } - catch (Exception ex) { - Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + - this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - - udy[i]; - } - - this.INFORM = 0; - - } - - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 1; i <= this.NRES; i++) { - this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); - this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; - this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; - this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); - this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * - Math.cos(this.X[4] * udt[i-1]); - - } - - this.INFORM = 0; - - } - - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - E04GGU e04ggu = new E04GGU(); - e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggu.getINFORM(); - } - - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/int32/E04UCJE.java b/simple_examples/int32/E04UCJE.java deleted file mode 100644 index e43d457..0000000 --- a/simple_examples/int32/E04UCJE.java +++ /dev/null @@ -1,211 +0,0 @@ -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E04UE; -import com.nag.routines.F06.DGEMV; -import java.util.Arrays; - -/** - * E04UC example program text. - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) { - - /* Local Scalars */ - double objf; - int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[LRWSAV]; - int[] istate, iwork; - int[] iuser = new int[1], iwsav = new int[LIWSAV]; - boolean[] lwsav = new boolean[LLWSAV]; - String[] cwsav = new String[LCWSAV]; - Arrays.fill(cwsav, - " "); - - System.out.println(" E04UCJ Example Program Results"); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new int[n + nclin + ncnln]; - iwork = new int[liwork]; - c = new double[Math.max(1, ncnln)]; - cjac = new double[ldcj * sdcjac]; - clamda = new double[n + nclin + ncnln]; - objgrd = new double[n]; - r = new double[ldr * n]; - work = new double[lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - E04UE e04ue = new E04UE(); - inform = 0; - e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives. */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[LDCJ] = X[1] + X[1]; - CJAC[2*LDCJ] = X[2] + X[2]; - CJAC[3*LDCJ] = X[3] + X[3]; - } - - } - - if (NEEDC[1] > 0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[1+LDCJ] = X[0]*X[2]*X[3]; - CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; - CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/int32/E04YAJE.java b/simple_examples/int32/E04YAJE.java deleted file mode 100644 index 72d80da..0000000 --- a/simple_examples/int32/E04YAJE.java +++ /dev/null @@ -1,112 +0,0 @@ -import com.nag.routines.E04.E04YA; - - -/** - * E04YA example program text. - * @author joed - */ -public class E04YAJE { - - public static LSQFUN lsqfun = new LSQFUN(); - public static final int LIW = 1, MDEC = 15, NDEC = 3; - public static final int LDFJAC = MDEC; - public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; - public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - int i; - - for (i = 0; i < M; i++) { - denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); - - if (IFLAG != 1) { - FVEC[i] = XC[0] + (t[i]/denom) - y[i]; - } - - if (IFLAG != 0) { - FJAC[i] = 1.0; - dummy = -1.0/(denom*denom); - FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; - FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; - } - - } - } - - } - - public static void main(String[] args) { - int i, ifail, m, n; - double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], - w = new double[LW], x = new double[NDEC]; - int[] iw = new int[LIW]; - - System.out.println(" E04YAJ Example Program Results"); - - n = NDEC; - m = MDEC; - - /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) - * (I = 1, 2, ..., m) */ - - y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, - 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; - for (i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - /* Set up an arbitrary point at which to check the 1st derivatives */ - - x[0] = 0.19; - x[1] = -1.34; - x[2] = 0.88; - - System.out.println(); - System.out.println("The test point is"); - System.out.printf(" "); - for (i = 0; i < n; i++) { - System.out.printf("%10.5f", x[i]); - } - System.out.printf("\n"); - - E04YA e04ya = new E04YA(); - ifail = -1; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); - ifail = e04ya.getIFAIL(); - - if (ifail >= 0 && ifail != 1) { - - switch (ifail) { - case 0: - System.out.println(); - System.out.println("1st derivatives are consistent with residual values"); - break; - case 2: - System.out.println(); - System.out.println("Probable error in calculation of 1st derivatives"); - break; - default: - } - - System.out.println(); - System.out.println("At the test point, LSQFUN gives"); - System.out.println(); - System.out.println(" Residuals 1st derivatives"); - for (i = 0; i < m; i++) { - System.out.printf(" %15.3E", fvec[i]); - System.out.printf("%15.3E", fjac[i]); - System.out.printf("%15.3E", fjac[LDFJAC + i]); - System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); - } - - } - - } - -} diff --git a/simple_examples/int32/F01ADJE.java b/simple_examples/int32/F01ADJE.java deleted file mode 100644 index 4167f71..0000000 --- a/simple_examples/int32/F01ADJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.F01.F01AD; -import com.nag.routines.X04.X04CA; - - -/** - * F01AD example program text. - * @author joed - */ -public class F01ADJE { - - public static void main(String[] args) { - - int i, ifail, lda, n; - double[] a; - - System.out.println(" F01ADJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n + 1; - a = new double[] { - 5.0, 7.0, 6.0, 5.0, 0.0, - 7.0, 10.0, 8.0, 7.0, 0.0, - 6.0, 8.0, 10.0, 9.0, 0.0, - 5.0, 7.0, 9.0, 10.0, 0.0 - }; - - F01AD f01ad = new F01AD(); - ifail = -1; - f01ad.eval(n, a, lda, ifail); - ifail = f01ad.getIFAIL(); - - /* Print the result matrix A */ - X04CA x04ca = new X04CA(); - x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); - - } - -} diff --git a/simple_examples/int32/F01CKJE.java b/simple_examples/int32/F01CKJE.java deleted file mode 100644 index ed3ffa2..0000000 --- a/simple_examples/int32/F01CKJE.java +++ /dev/null @@ -1,60 +0,0 @@ -import com.nag.routines.F01.F01CK; -import com.nag.routines.X04.X04CB; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CK example program text. - * @author ludovic - */ -public class F01CKJE { - - public static void main(String[] args) { - - double[] a, b, c, z; - int n, p, m, iz, opt; - int ifail; - - m = 3; - n = p = 2; - iz = 1; - opt = 1; - a = new double[n * p]; - b = new double[n * m]; - c = new double[m * p]; - z = new double[iz]; - ifail = 0; - - System.out.println(" F01CKJ Example Program Results"); - - // Initialising b and c - - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - b[j+i*n] = (double) (i+j); - } - for (int j = 0; j < p; ++j) { - c[i+j*m] = (double) (i+j); - } - } - - F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); - f01ck.eval(); - ifail = f01ck.getIFAIL(); - String title = "Matrix A"; - System.out.println(); - System.out.flush(); - ifail = 0; - - String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; - String[] dummy = {" "}; - int ncols = 80; - int indent = 0; - - (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, - dummy,ncols,indent, ifail); - - } - -} diff --git a/simple_examples/int32/F01CRJE.java b/simple_examples/int32/F01CRJE.java deleted file mode 100644 index c10b284..0000000 --- a/simple_examples/int32/F01CRJE.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.nag.routines.F01.F01CR; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CR example program text. - * @author ludovic - */ -public class F01CRJE { - - public static void main(String[] args) { - System.out.println(" F01CRJ Example Program Results"); - double[] a; - int m,n,mn,lmove; - int[] move; - int ifail; - n = 7; - m = 3; - mn = m*n; - lmove = (m + n)/2; - a = new double[mn]; - move = new int[lmove]; - ifail = 1; - - for (int i = 0; i < mn; i++) { - a[i] = i+1.0; - } - - F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); - f01cr.eval(); - - System.out.println(); - int index = 0; - for (int i = 0; i < mn; ++i) { - System.out.printf(" %7.1f",a[i]); - ++index; - if (index == 7) { - System.out.println(); - index = 0; - } - } - System.out.println(); - - } - -} diff --git a/simple_examples/int32/F01DGJE.java b/simple_examples/int32/F01DGJE.java deleted file mode 100644 index 107137f..0000000 --- a/simple_examples/int32/F01DGJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F01.F01DG; -import com.nag.routines.X04.X04CA; - -/** - * F01DG example program text. - * @author joed - * @since 27.0.0.0 - */ -public class F01DGJE { - - /** - * F01DG example main program. - */ - public static void main(String[] args) { - - F01DG f01dg = new F01DG(); - X04CA x04ca = new X04CA(); - double alpha; - int i, ifail, lda, ldb, n; - String side, transa, uplo; // Length 1 - double[] a, b; - - System.out.println("F01DGJ Example Program Results\n"); - - // Values for side, uplo and transa - side = "L"; - uplo = "U"; - transa = "T"; - - // Order of square matrices - n = 4; - lda = n; - ldb = n; - - // Scaling constant alpha - alpha = 0.4; - - // Set input matrices (column-major order) - a = new double[]{ - 1.5, 0.0, 0.0, 0.0, - 2.3, 3.4, 0.0, 0.0, - 6.7, 5.4, 8.1, 0.0, - 1.9, 8.6, 2.0, 5.9 - }; - b = new double[]{ - 3.5, 0.0, 0.0, 0.0, - 2.1, 5.6, 0.0, 0.0, - 4.0, 2.1, 1.7, 0.0, - 2.1, 2.5, 1.1, 7.4 - }; - - /* ifail: behaviour on error exit - * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ - ifail = 0; - - // Find B=alpha*A*B - f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); - ifail = f01dg.getIFAIL(); - - // Print the solution - if (ifail == 0) { - if (transa.equals("N")) { - x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); - } - else { - x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); - } - } - - } - -} diff --git a/simple_examples/int32/F01ELJE.java b/simple_examples/int32/F01ELJE.java deleted file mode 100644 index 9986c6c..0000000 --- a/simple_examples/int32/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/int32/F01EMJE.java b/simple_examples/int32/F01EMJE.java deleted file mode 100644 index 716a7b5..0000000 --- a/simple_examples/int32/F01EMJE.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.nag.routines.F01.F01EM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F01EMJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F01EMJE{ - - /** - * F01EMJ Example main program - */ - public static void main(String[] args){ - double imnorm = 0; - int ifail, iflag = 0, lda, n; //placeholders - double[] a, ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("F01EMJ Example Program Results"); - System.out.println(); - - //Tell wrapper what type of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //Problem size - n = 4; - lda = n; - - //Allocate - a = new double[lda * n]; - - //Data - //A = ( 1, 0,-2, 1) - // (-1, 2, 0, 1) - // ( 2, 0, 1, 0) - // ( 1, 0,-2, 2) - a[0] = 1; - a[1] = -1; - a[2] = 2; - a[3] = 1; - a[4] = 0; - a[5] = 2; - a[6] = 0; - a[7] = 0; - a[8] = -2; - a[9] = 0; - a[10] = 1; - a[11] = -1; - a[12] = 1; - a[13] = 1; - a[14] = 0; - a[15] = 2; - - //Find f(A) - ifail = 0; - //Create fexp2 object to pass to wrapper - fexp2 f = new fexp2(); - F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); - f01em.eval(); - - //Print solution - ifail = 0; - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); - x04ca.eval(); - - //Print the norm oof the imaginary part to check if it small - System.out.println(); - System.out.printf("Imnorm = %.2f\n", imnorm); - } - - /** - * fexp2 class representing f routine argument - */ - public static class fexp2 extends F01EM.Abstract_F01EM_F{ - public void eval(){ - NAGComplex two = new NAGComplex(2, 0); - NAGComplex twoPowM = new NAGComplex(2, 0); - - twoPowM.setRe(Math.pow(2, this.M)); - - for(int i = 0; i < this.NZ; i++){ - this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); - } - - //Set iflag nonzero to terminate exectuion for any reason - this.IFLAG = 0; - } - - //Raises e ^ z where z is a complex number - //Uses eulers formula; - //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) - public NAGComplex complexExp(NAGComplex x){ - NAGComplex tmp = new NAGComplex(); - tmp.setRe(Math.cos(x.getIm())); - tmp.setIm(Math.sin(x.getIm())); - NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); - return ans; - } - } -} diff --git a/simple_examples/int32/F02EKJE.java b/simple_examples/int32/F02EKJE.java deleted file mode 100644 index 3737022..0000000 --- a/simple_examples/int32/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/int32/F02FKJE.java b/simple_examples/int32/F02FKJE.java deleted file mode 100644 index 0dd7ab9..0000000 --- a/simple_examples/int32/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/int32/F02WGJE.java b/simple_examples/int32/F02WGJE.java deleted file mode 100644 index 36c26c6..0000000 --- a/simple_examples/int32/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/int32/F03BAJE.java b/simple_examples/int32/F03BAJE.java deleted file mode 100644 index 673ddec..0000000 --- a/simple_examples/int32/F03BAJE.java +++ /dev/null @@ -1,108 +0,0 @@ -import com.nag.routines.F03.F03BA; -import com.nag.routines.F07.F07AD; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F03BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F03BAJE{ - - /** - * F03BAJ example main program. - */ - public static void main(String[] args){ - double d = 0; - int id = 0, ifail, info = 0, lda = 0, n = 0; - double[] a; - int[] ipiv; - - //Should initialise values so java doesn't give any errors because of try/catch - a = new double[n]; - ipiv = new int[n]; - - System.out.println("F03BAJ Example Program Results"); - - //If file name not given print usage info - if(args.length != 1){ - F03BAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - lda = n; - - //reallocate with values from data file - a = new double[n * lda]; - ipiv = new int[n]; - - //read in matrix - for(int i = 0; i < n; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); - f07ad.eval(); - - ifail = 0; - - //Print out matrix - System.out.println(); - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivots"); - for(int i = 0; i < n; i++){ - System.out.printf("\t%d ", ipiv[i]); - } - System.out.printf("\n"); - System.out.println(); - - ifail = 0; - - F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); - f03ba.eval(); - d = f03ba.getD(); - id = f03ba.getID(); - - System.out.printf("D = \t%.5f ID = \t%d\n", d, id); - System.out.println(); - System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); - - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - -} - diff --git a/simple_examples/int32/F04AMJE.java b/simple_examples/int32/F04AMJE.java deleted file mode 100644 index a498b2b..0000000 --- a/simple_examples/int32/F04AMJE.java +++ /dev/null @@ -1,114 +0,0 @@ -import com.nag.routines.F04.F04AM; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04AMJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04AMJE{ - - /** - * F04AMJ example main program. - */ - public static void main(String[] args){ - int m = 0, n = 0; - int ifail, ir, lda, ldb, ldqr, ldx; - double eps; - double[] a, b, alpha, e, qr, r, x, y, z; - int[] ipiv; - - System.out.println("F04AMJ Example Program Results"); - - if(args.length != 1){ - F04AMJE.usage(); - } - - //declare so try/catch works - a = new double[0]; - b = new double[0]; - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[1]); - n = Integer.parseInt(sVal[2]); - - a = new double[m * n]; - b = new double[m * 1]; - - for(int i = 0; i < m; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * m) ] = Double.parseDouble(sVal[j]); - } - for(int j = n; j < m; j++){ - b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - //Setting these in try block is more robust but less neat - //May be needed for array sizes~ - ir = 1; - lda = m; - ldb = m; - ldqr = m; - ldx = n; - - alpha = new double[n]; - e = new double[n]; - qr = new double[ldqr * n]; - r = new double[m]; - x = new double[ldx * ir]; - y = new double[n]; - z = new double[n]; - ipiv = new int[n]; - - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - - ifail = 0; - - F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); - f04am.eval(); - //update any values you want here - x = f04am.getX(); - - System.out.println("Solution"); - for(int i = 0; i < n; i++){ - for(int j = 0; j < ir; j++){ - System.out.printf("%.4f ", x[j + (i * ir)]); - } - System.out.printf("\n"); - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - - - - - - diff --git a/simple_examples/int32/F04BAJE.java b/simple_examples/int32/F04BAJE.java deleted file mode 100644 index 79c2b01..0000000 --- a/simple_examples/int32/F04BAJE.java +++ /dev/null @@ -1,144 +0,0 @@ -import com.nag.routines.F04.F04BA; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04BAJE{ - - /** - * F04BAJ example main program. - */ - public static void main(String[] args){ - int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder - int ierr, ifail; - double errbnd, rcond; - double a[], b[]; - int ipiv[]; - - a = new double[0]; b = new double[0]; //placeholder - - if(args.length != 1){ - F04BAJE.usage(); - } - - System.out.println("F04BAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - nrhs = Integer.parseInt(sVal[2]); - - lda = n; - ldb = n; - - a = new double[lda * n]; - b = new double[ldb * nrhs]; - - line = reader.readLine(); - for(int i = 0; i < lda; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < ldb; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < nrhs; j++){ - b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 1; - ipiv = new int[n]; - rcond = 0; - errbnd = 0; - F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); - f04ba.eval(); - - ifail = f04ba.getIFAIL(); - rcond = f04ba.getRCOND(); - errbnd = f04ba.getERRBND(); - ipiv = f04ba.getIPIV(); - a = f04ba.getA(); - b = f04ba.getB(); - - if(ifail == 0){ - //Print solution, estimate of condition number and approximate error bound. - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Estimate of condition number"); - System.out.printf("%.1e\n", 1/rcond); - System.out.println(); - System.out.println("Esttimate of error bound for computed solutions"); - System.out.printf("%.1e\n", errbnd); - } - else if(ifail == (n + 1)){ - //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. - System.out.println(); - System.out.println("Estimate of reciprocal of condition number"); - System.out.printf("%.1e\n", rcond); - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - } - else if(ifail > 0 && ifail <= n){ - //The upper triangular matrix U is exactly singular. Print details of factorization. - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivot indices"); - for(int i = 0; i < n; i++){ - System.out.printf("%d ", ipiv[i]); - } - System.out.printf("\n"); - } - else{ - System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); - } - - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/F05AAJE.java b/simple_examples/int32/F05AAJE.java deleted file mode 100644 index 317c269..0000000 --- a/simple_examples/int32/F05AAJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F05.F05AA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F05AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F05AAJE{ - - /** - * F05AAJ example main program. - */ - public static void main(String[] args) { - //Should initialise values to avoid issues with try/catch - int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; - double cc = 0; - double[] a, s; - - //same as ints - a = new double[1]; - s = new double[1]; - System.out.println("F05AAJ Example Program Results"); - System.out.println(); - - //supply data - if(args.length != 1){ - F05AAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+");; - m = Integer.parseInt(sVal[1]); - n1 = Integer.parseInt(sVal[2]); - n2 = Integer.parseInt(sVal[3]); - lda = m; - - a = new double[lda*n2]; - s = new double[n2]; - - //read in a from data - for(int i = 0; i < n2; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - a[i + (j * n2)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //create object then eval - F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); - f05aa.eval(); - - //update values - n1 = f05aa.getN1(); - n2 = f05aa.getN2(); - cc = f05aa.getCC(); - icol = f05aa.getICOL(); - a = f05aa.getA(); - - System.out.printf("N1 = %d N2 = %d\n", n1, n2); - System.out.println(); - System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); - System.out.println(); - System.out.println("Final Vectors"); - - for(int i = 0; i < n2; i++){ - for(int j = 1; j < m; j++){ - System.out.printf("%.4f ", a[i +(j * n2)]); - } - System.out.printf("\n"); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/F06CLJE.java b/simple_examples/int32/F06CLJE.java deleted file mode 100644 index ca2ac5e..0000000 --- a/simple_examples/int32/F06CLJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.F06.F06CL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F06CL example program text. - * @author ludovic - */ -public class F06CLJE { - - public static void main(String[] args) { - boolean fail = false; - NAGComplex z1 = new NAGComplex(); - NAGComplex z2 = new NAGComplex(); - NAGComplex z3 = new NAGComplex(); - - System.out.println(" F06CLJ Example Program Results"); - System.out.println(); - - Routine.complex = z1; - - z1.setRe(1.0); - z1.setIm(1.0); - z2.setRe(2.0); - z2.setIm(2.0); - - F06CL f06cl = new F06CL(z1,z2,fail); - z3 = (NAGComplex)f06cl.eval(); - fail = f06cl.getFAIL(); - - if (fail) { - System.err.println(" Something went wrong..."); - } - else { - System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); - } - - } - -} diff --git a/simple_examples/int32/F07AAJE.java b/simple_examples/int32/F07AAJE.java deleted file mode 100644 index 26eb5dc..0000000 --- a/simple_examples/int32/F07AAJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.F07.F07AA; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F07AA example program text. - * @author joed - */ -public class F07AAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, ldb, n; - double[] a, b; - int[] ipiv; - - System.out.println(" F07AAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - ldb = n; - - a = new double[n*n]; - b = new double[n]; - ipiv = new int[n]; - - a[0+0*n] = 1.80; - a[0+1*n] = 2.88; - a[0+2*n] = 2.05; - a[0+3*n] = -0.89; - a[1+0*n] = 5.25; - a[1+1*n] = -2.95; - a[1+2*n] = -0.95; - a[1+3*n] = -3.80; - a[2+0*n] = 1.58; - a[2+1*n] = -2.69; - a[2+2*n] = -2.90; - a[2+3*n] = -1.04; - a[3+0*n] = -1.11; - a[3+1*n] = -0.66; - a[3+2*n] = -0.59; - a[3+3*n] = 0.80; - - b[0] = 9.52; - b[1] = 24.35; - b[2] = 0.77; - b[3] = -6.22; - - /* Solve the equations Ax = b for x */ - - F07AA f07aa = new F07AA(); - info = 0; - f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); - info = f07aa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); - - /* Print pivot indices */ - - System.out.println(); - System.out.println(" Pivot indices"); - for (i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.printf("\n"); - - } - else { - System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); - } - - } - -} diff --git a/simple_examples/int32/F07ABJE.java b/simple_examples/int32/F07ABJE.java deleted file mode 100644 index 6362739..0000000 --- a/simple_examples/int32/F07ABJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.F07.DGESVX; -import com.nag.routines.X04.X04CA; - -/** - * F07ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ABJE{ - - /** - * F07ABJ example main program - */ - public static void main(String[] args){ - double rcond = 0; - int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders - String equed; - double[] a, af, b, berr, c, ferr, r, work, x; - int[] ipiv, iwork; - - System.out.println("F07ABJ Example Program Results"); - System.out.println(); - - //Problem size - n = 4; - nrhs = 2; - lda = n; - ldaf = n; - ldb = n; - ldx = n; - - //Allocate - a = new double[lda * n]; - af = new double[ldaf * n]; - b = new double[ldb * nrhs]; - berr = new double[nrhs]; - c = new double[n]; - ferr = new double[nrhs]; - r = new double[n]; - work = new double[4 * n]; - x = new double[ldx * nrhs]; - ipiv = new int[n]; - iwork = new int[n]; - equed = " "; - - //Matrices A and B - a[0] = 1.8; - a[1] = 525; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -295; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -380; - a[14] = -1.04; - a[15] = 0.8; - b[0] = 9.52; - b[1] = 2435; - b[2] = 0.77; - b[3] = -6.22; - b[4] = 18.47; - b[5] = 225; - b[6] = -13.28; - b[7] = -6.21; - - //Solve the equations AX = B for X - //The NAG name equivalent of dgesvx is f07abf - DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, - c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - dgesvx.eval(); - - //Update - info = dgesvx.getINFO(); - equed = dgesvx.getEQUED(); - rcond = dgesvx.getRCOND(); - - if(info == 0 || info == n + 1){ - //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Backward errors (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", berr[i]); - } - System.out.println(); - System.out.println(); - System.out.println("Estimated forward error bounds (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", ferr[i]); - } - System.out.println(); - System.out.println(); - if(equed.equals("N")){ - System.out.println("A has not been equilibrated"); - } - else if(equed.equals("R")){ - System.out.println("A has been row scaled as diag(R)*A"); - } - else if(equed.equals("C")){ - System.out.println("A has been column scaled as A*diag(C)"); - } - else if(equed.equals("B")){ - System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); - } - System.out.println(); - System.out.println("Reciprocal condition number estimate of scaled matrix"); - System.out.printf(" %.1e\n", rcond); - System.out.println(); - System.out.println("Estimate of reciprocal pivot growth factor"); - System.out.printf(" %.1e\n", work[0]); - System.out.println(); - - if(info == n + 1){ - System.out.println(); - System.out.println("The matrix A is singular to working precision"); - } - } - else{ - System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); - } - } -} diff --git a/simple_examples/int32/F07ADJE.java b/simple_examples/int32/F07ADJE.java deleted file mode 100644 index 4450683..0000000 --- a/simple_examples/int32/F07ADJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F07.DGETRF; -import com.nag.routines.X04.X04CA; - -/** - * F07ADJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ADJE{ - - /** - * F07ADJ Example main program - */ - public static void main(String[] args){ - int ifail, info = 0, lda, m, n; - double[] a; - int[] ipiv; - - System.out.println("F07ADJ Example Program Results"); - System.out.println(); - - //Problem size (can be read from data file) - m = 4; - n = 4; - lda = m; - - //Data - ipiv = new int[n]; - a = new double[m * n]; - a[0] = 1.8; - a[1] = 5.25; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -2.95; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -0.95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -3.8; - a[14] = -1.04; - a[15] = 0.8; - - //Factorize A - //The NAG name equivalent of dgetrf is F07ADF - DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); - dgetrf.eval(); - - //Update - info = dgetrf.getINFO(); - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); - x04ca.eval(); - - //Print pivot indices - System.out.println("IPIV"); - for(int i = 0; i < Math.min(m, n); i++){ - System.out.printf("\t%d", ipiv[i]); - } - System.out.println(); - - if(info != 0){ - System.out.println("The factor U is singular"); - } - } -} diff --git a/simple_examples/int32/F07AQJE.java b/simple_examples/int32/F07AQJE.java deleted file mode 100644 index 5ee47e5..0000000 --- a/simple_examples/int32/F07AQJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F07.F07AQ; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexF; - -/** - * F07AQ example program text. - * @author joed - * @since 27.1.0.0 - */ -public class F07AQJE { - - public static void main(String[] args) { - - F07AQ f07aq = new F07AQ(); - int info, iter, lda, ldb, ldx, n, r; - NAGComplex[] a, b, work, x; - NAGComplexF[] swork; - double[] rwork; - int[] ipiv; - - System.out.println(" F07AQJ Example Program Results"); - System.out.println(); - - // Set dimensions and instantiate arrays - n = 4; - r = 1; - lda = ldb = ldx = n; - a = new NAGComplex[lda*n]; - b = new NAGComplex[ldb*r]; - work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); - x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); - swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); - ipiv = new int[n]; - rwork = new double[n]; - - // Set A - a[0] = new NAGComplex(-1.34, 2.55); // Column 1 - a[1] = new NAGComplex(-0.17, -1.41); - a[2] = new NAGComplex(-3.29, -2.39); - a[3] = new NAGComplex(2.41, 0.39); - a[4] = new NAGComplex(0.28, 3.17); // Column 2 - a[5] = new NAGComplex(3.31, -0.15); - a[6] = new NAGComplex(-1.91, 4.42); - a[7] = new NAGComplex(-0.56, 1.47); - a[8] = new NAGComplex(-6.39, -2.20); // Column 3 - a[9] = new NAGComplex(-0.15, 1.34); - a[10] = new NAGComplex(-0.14, -1.35); - a[11] = new NAGComplex(-0.83, -0.69); - a[12] = new NAGComplex(0.72, -0.92); // Column 4 - a[13] = new NAGComplex(1.29, 1.38); - a[14] = new NAGComplex(1.72, 1.35); - a[15] = new NAGComplex(-1.96, 0.67); - - // Set B - b[0] = new NAGComplex(26.26,51.78); - b[1] = new NAGComplex( 6.43,-8.68); - b[2] = new NAGComplex(-5.75,25.31); - b[3] = new NAGComplex( 1.16, 2.57); - - // Notify wrappers of complex types - Routine.setComplex(new NAGComplex()); - Routine.setComplexF(new NAGComplexF()); - - // Solve the equations Ax = b for x - iter = info = 0; - f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); - iter = f07aq.getITER(); - info = f07aq.getINFO(); - - if (info == 0) { - - // Print solution - - System.out.println(" Solution"); - for (int i = 0; i < n; i++) { - for (int j = 0; j < r; j++) { - System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); - } - } - System.out.println(); - - // Print pivot indices - - System.out.println(); - System.out.println(" Pivot indices"); - for (int i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.println(); - - } - else { - System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); - } - - } - -} diff --git a/simple_examples/int32/F07FAJE.java b/simple_examples/int32/F07FAJE.java deleted file mode 100644 index e516051..0000000 --- a/simple_examples/int32/F07FAJE.java +++ /dev/null @@ -1,79 +0,0 @@ -import com.nag.routines.F07.F07FA; -import com.nag.routines.X04.X04CA; - -/** - * F07FA example program text. - * @author saraht - */ -public class F07FAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, n; - double[] a, b; - - System.out.println(" F07FAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - - a = new double[n*n]; - b = new double[n]; - - /* A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18 */ - - a[0+0*n] = 4.16; - a[0+1*n] = -3.12; - a[0+2*n] = 0.56; - a[0+3*n] = -0.10; - - a[1+1*n] = 5.03; - a[1+2*n] = -0.83; - a[1+3*n] = 1.18; - - a[2+2*n] = 0.76; - a[2+3*n] = 0.34; - - a[3+3*n] = 1.18; - - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - /* Solve the equations Ax = b for x */ - - F07FA f07fa = new F07FA(); - info = 0; - f07fa.eval("Upper", n, 1, a, lda, b, n, info); - info = f07fa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); - - } - else { - System.err.printf(" The leading minor of order %d is not positive definite \n", info); - } - - } - -} diff --git a/simple_examples/int32/F07FBJE.java b/simple_examples/int32/F07FBJE.java deleted file mode 100644 index 09bbd37..0000000 --- a/simple_examples/int32/F07FBJE.java +++ /dev/null @@ -1,122 +0,0 @@ -import com.nag.routines.F07.F07FB; -import com.nag.routines.X04.X04CA; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * F07FB example program text. - * @author ludovic - */ -public class F07FBJE { - - public static void main(String[] args) { - String fact,uplo,equed; - int n, nrhs,lda,ldaf,ldb,ldx; - int[] iwork; - double rcond; - double[] a,af,s,b,x,ferr,berr,work; - int info,ifail; - lda = 4; - ldaf = lda; - ldb = lda; - ldx = lda; - nrhs = 2; - n = 4; - a = new double[lda*lda]; - af = new double[ldaf*ldaf]; - b = new double[ldb*nrhs]; - berr = new double[nrhs]; - ferr = new double[nrhs]; - s = new double[lda]; - work = new double[3*lda]; - x = new double[ldx*nrhs]; - iwork = new int[lda]; - info = 1; - rcond = Double.NaN; - fact = "E"; - uplo = "U"; - equed = "Z";//dummy value - /*A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18*/ - a[0] = 4.16; - - a[4] = -3.12; - a[5] = 5.03; - - a[8] = 0.56; - a[9] = -0.83; - a[10] = 0.76; - - a[12] = -0.10; - a[13] = 1.18; - a[14] = 0.34; - a[15] = 1.18; - - /*B= 8.70 8.30 - -13.35 2.13 - 1.89 1.61 - - 4.14 5.00*/ - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - b[4] = 8.30; - b[5] = 2.13; - b[6] = 1.61; - b[7] = 5.00; - - System.out.println(" F07FBJ Example Program Results"); - System.out.println(); - - F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, - ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - f07fb.eval(); - fact = f07fb.getFACT(); - uplo = f07fb.getUPLO(); - equed = f07fb.getEQUED(); - rcond = f07fb.getRCOND(); - info = f07fb.getINFO(); - - - if ((info == 0) || (info == n+1)) { - ifail = 0; - (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); - System.out.println(); - System.out.println(" Backward errors (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",berr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimated forward error bounds (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",ferr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimate of reciprocal condition number"); - System.out.printf(" %11.1e\n",rcond); - System.out.println(); - if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has not been equilibrated"); - } - else if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); - } - - if (info == n+1) { - System.out.println(); - System.out.println(" The matrix A is singular to working precision"); - } - - } - else { - System.out.printf(" The leading minor of order %3d is not positive definite\n"); - } - - } - -} diff --git a/simple_examples/int32/F08BTJE.java b/simple_examples/int32/F08BTJE.java deleted file mode 100644 index 43c219b..0000000 --- a/simple_examples/int32/F08BTJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import static java.lang.Math.*; - -import com.nag.routines.F06.F06JJ; -import com.nag.routines.F06.F06ZJ; -import com.nag.routines.F08.F08AU; -import com.nag.routines.F08.F08BT; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04DB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * F08BT example program text. - * @author ludovic - */ -public class F08BTJE { - - public static void main(String[] args) throws FileNotFoundException, IOException { - int incl = 1, nb = 64; - double tol; - int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; - NAGComplex[] a, b, tau, work; - double[] rnorm, rwork; - int[] jpvt; - String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; - - // Setup complex constants - NAGComplex one = new NAGComplex(); - NAGComplex zero = new NAGComplex(); - one.setRe(1.0); - one.setIm(0.0); - zero.setRe(0.0); - zero.setIm(0.0); - - // Inform the Routine class of the type of complex in use - can use any complex object - Routine.complex = one; - - System.out.println(" F08BTJ Example Program Results"); - System.out.println(); - - // Read values from data file - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); - line = br.readLine().trim(); - line = br.readLine().trim(); - String[] vals = line.split("\\s+"); - m = Integer.parseInt(vals[0].trim()); - n = Integer.parseInt(vals[1].trim()); - nrhs = Integer.parseInt(vals[2].trim()); - lda = ldb = m; - lwork = (n + 1) * nb; - a = new NAGComplex[lda * n]; - b = new NAGComplex[ldb * nrhs]; - tau = new NAGComplex[n]; - work = new NAGComplex[lwork]; - rnorm = new double[nrhs]; - rwork = new double[2 * n]; - jpvt = new int[n]; - - // Actually initialize the complex arrays - for (int i = 0; i < a.length; ++i) { - a[i] = new NAGComplex(); - } - for (int i = 0; i < b.length; ++i) { - b[i] = new NAGComplex(); - } - for (int i = 0; i < tau.length; ++i) { - tau[i] = new NAGComplex(); - } - for (int i = 0; i < work.length; ++i) { - work[i] = new NAGComplex(); - } - - /* Read A and B from data file */ - - readCompMatrix(br, a, lda, n); - readCompMatrix(br, b, ldb, nrhs); - br.close(); - - /* Initialize JPVT to be zero so that all columns are free */ - - for (int i = 0; i < n; ++i) { - jpvt[i] = 0; - } - - /* Compute the QR factorization of A */ - - F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); - f08bt.eval(); - - /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ - - String side = "Left"; - String conjTrans = "Conjugate Transpose"; - F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); - f08au.eval(); - a = (NAGComplex[])f08au.getA(); - - /* Choose TOL to reflect the relative accuracy of the input data */ - - tol = 0.01; - - /* Determine and print the rank, K, or R relative to TOL */ - - for (k = 1; k < n + 1; ++k) { - if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { - break; - } - } - k = k - 1; - - System.out.println(" Tolerance used to estimate the rank of A"); - System.out.printf(" %11.2E\n", tol); - System.out.println(" Estimated rank of A"); - System.out.printf(" %8d\n", k); - - /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 - * storing the result in B */ - - String upDown = "Upper"; - String trans = "No transpose"; - String unit = "Non-Unit"; - F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); - f06zj.eval(); - - /* Compute estimates of the square roots of the residual sums of squares - * (2-norm of each of the columns of C2) */ - - int mMinusK = m - k; - NAGComplex[] btmp = new NAGComplex[b.length]; - for (int i = 0; i < btmp.length; ++i) { - btmp[i] = new NAGComplex(); - } - System.arraycopy(b, k, btmp, 0, b.length - k); - - F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); - rnorm[0] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp, 0, b, k, b.length - k); - for (int j = 1; j < nrhs; ++j) { - System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); - rnorm[j] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); - } - - /* Set the remaining elements of the solutions to zero (to give the - * basic solutions) */ - - for (int i = k; i < n; ++i) { - for (int j = 0; j < nrhs; ++j) { - NAGComplex tmp = new NAGComplex(); - tmp.setRe(0.0); - tmp.setIm(0.0); - b[i + j * ldb] = tmp; - } - } - - /* Permute the least squares solution stored in B to give X = P*Y */ - - for (int j = 0; j < nrhs; j++) { - for (int i = 0; i < n; i++) { - work[jpvt[i] - 1] = b[j*ldb + i]; - } - for (int i = 0; i < n; i++) { - b[j*ldb + i] = work[i]; - } - } - - /* Print least squares solutions */ - - X04DB x04db = new X04DB(); - ifail = 0; - x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", - "Integer",rlabs,"Integer",clabs,80,0,ifail); - - /* Print the square roots of the residual sums of squares */ - - System.out.println(); - System.out.println(" Square root(s) of the residual sum(s) of squares"); - System.out.printf(" "); - for (int i = 0; i < nrhs; ++i) { - System.out.printf("%11.2E", rnorm[i]); - } - System.out.println(); - - } - - private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, - int col) throws IOException { - - // matches one complex number (without the brackets...) - String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; - String fullPattern = complexPat; - for (int i = 0; i < col -1; ++i) { - fullPattern = fullPattern + "\\s*" + complexPat; - } - fullPattern = fullPattern + ".*"; - Pattern comppat = Pattern.compile(fullPattern); - - for (int i = 0; i < row; ++i) { - String line = br.readLine().trim(); - if (line.equalsIgnoreCase("")) { - line = br.readLine().trim(); - } - Matcher m = comppat.matcher(line.trim()); - if (m.matches()) { - for (int j = 0; j < col; ++j) { - String[] numbers = m.group(j + 1).trim().split(","); - mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); - mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); - // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); - } - // System.out.println(); - } - - - } - } - - private static double abs(NAGComplex z) { - return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); - } - -} diff --git a/simple_examples/int32/F08FAJE.java b/simple_examples/int32/F08FAJE.java deleted file mode 100644 index 028f854..0000000 --- a/simple_examples/int32/F08FAJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.routines.F08.DDISNA; -import com.nag.routines.F08.F08FA; -import com.nag.routines.F16.F16JQ; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F08FA example program text. - * @author ludovic - */ -public class F08FAJE { - - public static void main(String[] args) { - int n = 4, LWork = n*64, lda = n; - double[] a, w, work,zerrbd,rcondz, colVector; - int info = 0, ifail = 0, k = 0; - a = new double[n * n]; - w = new double[n]; - work = new double[LWork]; - zerrbd = new double[n]; - rcondz = new double[n]; - colVector = new double[n]; - - System.out.println(" F08FAJ Example Program Results\n"); - - //array a : Stored in column major way - - a[0] = 1.0; - a[1] = 2.0; - a[2] = 3.0; - a[3] = 4.0; - - a[4] = 2.0; - a[5] = 2.0; - a[6] = 3.0; - a[7] = 4.0; - - a[8] = 3.0; - a[9] = 3.0; - a[10] = 3.0; - a[11] = 4.0; - - a[12] = 4.0; - a[13] = 4.0; - a[14] = 4.0; - a[15] = 4.0; - - //initializing the info parameter - info = 0; - w[0] = Double.NaN; - w[1] = Double.NaN; - w[2] = Double.NaN; - w[3] = Double.NaN; - F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); - f08fa.eval(); - info = f08fa.getINFO(); - - if (info == 0) { - System.out.println(" Eigenvalues"); - System.out.print(" "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %8.4f",w[i]); - } - System.out.println(); - - // Normalize the eigenvectors: largest element positive - F16JQ f16jq = new F16JQ(); // aka blas_damax_val - for (int i = 0; i < n; i++) { - System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate - f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value - k = f16jq.getK() - 1; // Make index zero based - - // Invert sign of column if largest element is negative - if (a[(4*i)+k] < 0) { - for (int j = 0; j < n; j++) { - a[(4*i)+j] = (-1) * a[(4*i)+j]; - } - } - - } - - (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); - - double eps = (new X02AJ()).eval(); - double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); - - (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); - for (int i = 0; i < n; ++i) { - zerrbd[i] = eerrbd/rcondz[i]; - } - - System.out.println(); - System.out.println(" Error estimate for the eigenvalues"); - System.out.printf(" %11.1e\n",eerrbd); - System.out.println(); - System.out.println(" Error estimates for the eigenvectors"); - for (int i = 0; i < n; ++i) { - System.out.printf(" %11.1e",zerrbd[i]); - } - System.out.println(); - - } - else { - System.out.printf(" Failure in DSYEV. INFO =%4d",info); - } - - } - -} diff --git a/simple_examples/int32/F08XPJE.java b/simple_examples/int32/F08XPJE.java deleted file mode 100644 index cc894d3..0000000 --- a/simple_examples/int32/F08XPJE.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.nag.routines.F06.F06UA; -import com.nag.routines.F06.F06BN; -import com.nag.routines.F06.ZGEMM; -import com.nag.routines.F08.ZGGESX; -import com.nag.routines.M01.M01DA; -import com.nag.routines.M01.M01ED; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04DB; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * F08XPJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F08XPJE{ - - public static boolean chkfac = false; - public static boolean prcond = false; - public static boolean prmat = false; - public static int nb = 64; - - /* - * F08XPJ Example main program - */ - public static void main(String[] args){ - NAGComplex alph, bet; - double abnorm, anorm, bnorm, eps, normd, norme, tol; - int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; - boolean factor; - NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; - double[] rconde, rcondv, rwork; - int[] idum, iwork; - boolean[] bwork; - String[] clabs, rlabs; - - //Placeholders - idum = new int[1]; - rconde = new double[2]; - rcondv = new double[2]; - dummy = NAGComplex.createArray(1); - - System.out.println("F08XPJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - //Tell wrappers what time of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //n declared here for neater code but can be read in from data file - n = 4; - lda = n; - ldb = n; - ldc = n; - ldd = n; - lde = n; - ldvsl = n; - ldvsr = n; - - //Allocate - a = NAGComplex.createArray(lda * n); - alpha = NAGComplex.createArray(n); - b = NAGComplex.createArray(ldb * n); - beta = NAGComplex.createArray(n); - c = NAGComplex.createArray(ldc * n); - d = NAGComplex.createArray(ldd * n); - e = NAGComplex.createArray(lde * n); - vsl = NAGComplex.createArray(ldvsl * n); - vsr = NAGComplex.createArray(ldvsr * n); - rwork = new double[8 * n]; - bwork = new boolean[n]; - clabs = new String[1]; - clabs[0] = " "; - rlabs = new String[1]; - rlabs[0] = " "; - - //Use routine workspace query to get optimal workspace - lwork = -1; - liwork = -1; - //The NAG name equivalent of zggesx is f08xpf - selctg selctg1 = new selctg(); - ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, - rwork, idum, liwork, bwork, info); - zggesx.eval(); - - //Make sure that there is a enough workspace for block size nb - lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); - liwork = Math.max(n + 2, idum[0]); - work = NAGComplex.createArray(lwork); - iwork = new int[liwork]; - - //Read in matrices A and B - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - line = reader.readLine(); //skip n (set manually for neater code) - String[] sVal; - - for(int i = 0; i < 2; i++){ - for(int j = 0; j < n; j++){ - line = reader.readLine(); - sVal = line.split("\\)"); - for(int k = 0; k < n; k++){ - if(i == 0){ - a[(k * n) + j] = parseComplex(sVal[k]); - } - else{ - b[(k * n) + j] = parseComplex(sVal[k]); - } - } - } - } - - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - - if(chkfac){ - for(int i = 0; i < a.length; i++){ - //Copy A and B into D and E respectively - d[i] = a[i]; - e[i] = b[i]; - } - } - - //Find the Forbenius norms of A and B - //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf - F06UA f06ua = new F06UA(); - anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); - bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); - - if(prmat){ - //Print matrices A and B - //ifail : behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - - ifail = 0; - x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - } - - factor = true; - //Find the generalized Schur form - //The NAG name equivalent of zggesx is f08xpf - zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, - rwork, iwork, liwork, bwork, info); - zggesx.eval(); - - //update - sdim = zggesx.getSDIM(); - - if(info != 0 && info != (n + 2)){ - System.out.printf("Failure in ZGGESX. INFO = %d\n", info); - factor = false; - } - else if(chkfac){ - //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D - //The NAG name equivalent of zgemm is f06zaf - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); - zgemm.eval(); - - //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); - zgemm.eval(); - - //Find norms of matrices D and E and warn if either is too large - f06ua = new F06UA("0", ldd, n, d, ldd, rwork); - normd = f06ua.eval(); - X02AJ x02aj = new X02AJ(); - if(normd > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); - factor = false; - System.out.println("Schur factorization has failed"); - } - f06ua = new F06UA("0", lde, n, e, lde, rwork); - norme = f06ua.eval(); - if(norme > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); - factor = false; - } - } - - if(factor){ - //Print eigenvalue details - System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); - System.out.println("(dimension of deflating subspaces)"); - - System.out.println(); - //Print selected (finite) generalized eigenvalues - System.out.println("Selected generalized eigenvalues"); - - //Store absolute values of eigenvalues for ranking - for(int i = 0; i < n; i++){ - work[i] = alpha[i].divide(beta[i]); - rwork[i] = NAGComplex.abs(work[i]); - } - - //Rank eigenvalues - ifail = 0; - M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); - m01da.eval(); - - //Sort eigevalues in work - M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); - m01ed.eval(); - for(int i = 0; i < sdim; i++){ - System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); - } - - if(info == n + 2){ - System.out.println("*** note that rounding errors mean that leading eigenvalues in"); - System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); - System.out.println(); - } - - if(prcond){ - //Compute the machine precision and sqrt(anorm^2 + bnorm^2) - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - F06BN f06bn = new F06BN(anorm, bnorm); - abnorm = f06bn.eval(); - tol = eps * abnorm; - - //Print out the reciprocal condition numbers and error bound for selected eigenvalues - System.out.println("Reciprocal condition numbers for the average of the selected"); - System.out.println("eigenvalues and their asymptotic error bound"); - System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); - } - } - else{ - System.out.println("Schur factorization has failed"); - } - - } - - /** - * Converts String read in from data file to NAGComplex value. - * @param s - * Complex number string - * @return new NAGComplex representing s - */ - public static NAGComplex parseComplex(String s){ - s = s.trim(); - double re = Double.parseDouble(s.substring(1, 7)); - double im = Double.parseDouble(s.substring(8)); - return new NAGComplex(re, im); - } - - /** - * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. - */ - public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ - public boolean eval(){ - return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); - } - } - -} diff --git a/simple_examples/int32/G01ALJE.java b/simple_examples/int32/G01ALJE.java deleted file mode 100644 index 672a151..0000000 --- a/simple_examples/int32/G01ALJE.java +++ /dev/null @@ -1,55 +0,0 @@ -import com.nag.routines.G01.G01AL; - -/** - * G01ALJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G01ALJE{ - - /** - * G01ALJ Example main program - */ - public static void main(String[] args){ - int ifail, n; - double[] x, res; - int[] iwrk; - - res = new double[5]; - - System.out.println("G01ALJ Example Program Results"); - System.out.println(); - - //Problem size - n = 12; - - //Allocate - x = new double[n]; - iwrk = new int[n]; - - //Data - x[0] = 12; - x[1] = 9; - x[2] = 2; - x[3] = 5; - x[4] = 6; - x[5] = 8; - x[6] = 2; - x[7] = 7; - x[8] = 3; - x[9] = 1; - x[10] = 11; - x[11] = 10; - - //Calculate summary statistics - ifail = 0; - G01AL g01al = new G01AL(n, x, iwrk, res, ifail); - g01al.eval(); - - System.out.printf("Maximum %.4f\n", res[4]); - System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); - System.out.printf("Median (50%% quantile) %.4f\n", res[2]); - System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); - System.out.printf("Minimum %.4f\n", res[0]); - } -} diff --git a/simple_examples/int32/G02AKJE.java b/simple_examples/int32/G02AKJE.java deleted file mode 100644 index 8ddaff2..0000000 --- a/simple_examples/int32/G02AKJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.G02.G02AK; -import com.nag.routines.X04.X04CA; - -/** - * G02AK example program text. - * @author joed - * @since 27.0.0.0 - */ -public class G02AKJE { - - /** - * G02AKJ example main program. - */ - public static void main(String[] args) { - - G02AK g02ak = new G02AK(); - X04CA x04ca = new X04CA(); - double errtol, f, rankerr, ranktol; - int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; - double[] g, x; - - System.out.println("G02AKJ Example Program Results\n"); - - // Problem size - n = 4; - ldg = n; - ldx = n; - - // Rank constraint - rank = 2; - - // Matrix G (column-major) - g = new double[]{ - 2.0, -1.0, 0.0, 0.0, - -1.0, 2.0, -1.0, 0.0, - 0.0, -1.0, 2.0, -1.0, - 0.0, 0.0, -1.0, 2.0 - }; - - // Use the defaults for errtol, ranktol, maxits, maxit - errtol = 0.0; - ranktol = 0.0; - maxits = 0; - maxit = 0; - - // Calculate rank constrained nearest correlation matrix - ifail = 0; - x = new double[ldx*n]; - f = 0.0; - rankerr = 0.0; - nsub = 0; - g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, - rankerr, nsub, ifail); - nsub = g02ak.getNSUB(); - f = g02ak.getF(); - rankerr = g02ak.getRANKERR(); - - // Display results - ifail = 0; - x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); - System.out.println(); - System.out.printf("Number of subproblems solved: %12d\n\n", nsub); - System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); - System.out.printf("Rank error: %35.4f\n", rankerr); - - } - -} diff --git a/simple_examples/int32/G02BJJE.java b/simple_examples/int32/G02BJJE.java deleted file mode 100644 index 3de843e..0000000 --- a/simple_examples/int32/G02BJJE.java +++ /dev/null @@ -1,303 +0,0 @@ -import com.nag.routines.G02.G02BJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G02BJ example program text. - * @author ludovic - */ -public class G02BJJE { - - public static void main(String[] args) { - int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; - double[] cnt, r, ssp, std, xbar;//, xmiss; - - if (args.length != 1) { - G02BJJE.usage(); - } - - String dataFile = args[0]; - DataHolder data = new DataHolder(); - readDataFile(dataFile, data); - System.out.println(" G02BJJ Example Program Results"); - System.out.println(); - - ldcnt = ldr = ldssp = data.nvars; - ldx = data.n; - cnt = new double[ldcnt * data.nvars]; - r = new double[ldr * data.nvars]; - ssp = new double[ldssp * data.nvars]; - std = new double[data.nvars]; - xbar = new double[data.nvars]; - - - //Display the data - - System.out.printf(" Number of variables (columns) = %5d\n", data.m); - System.out.printf(" Number of cases (rows) = %5d\n", data.n); - System.out.println(); - System.out.println(" Data matrix is:-"); - for (int ii = 0; ii < data.m; ++ii) { - System.out.printf(" %12d",ii+1); - } - System.out.println(); - for (int ii = 0; ii < data.n; ++ii) { - System.out.printf(" %3d ",ii+1); - for (int jj = 0; jj < data.m; ++jj) { - System.out.printf("%12.4f ",data.x[ii + jj * data.n]); - } - System.out.println(); - } - - ifail = 0; - G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, - data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, - ldcnt, ifail); - g02bj.eval(); - - data.n = g02bj.getN(); - data.m = g02bj.getM(); - data.x = g02bj.getX(); - ldx = g02bj.getLDX(); - data.miss = g02bj.getMISS(); - data.xmiss = g02bj.getXMISS(); - data.nvars = g02bj.getNVARS(); - data.kvar = g02bj.getKVAR(); - xbar = g02bj.getXBAR(); - std = g02bj.getSTD(); - ssp = g02bj.getSSP(); - ldssp = g02bj.getLDSSP(); - r = g02bj.getR(); - ldr = g02bj.getLDR(); - ncases = g02bj.getNCASES(); - cnt = g02bj.getCNT(); - ldcnt = g02bj.getLDCNT(); - ifail = g02bj.getIFAIL(); - - //Display results - System.out.println(); - System.out.println(" Variable\tMean\tSt.dev."); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); - } - System.out.println(); - System.out.println(" Sums of squares and cross-products of deviations"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.println(" Correlation coefficients"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",r[ii + ldr * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); - System.out.println(); - System.out.println(" Numbers used for each pair are:"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); - } - System.out.println(); - } - System.out.println(); - } - - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - /** - G02BJF Example Program Data - 5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 - 12.0 2.0 0.0 0.0 - -1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS - -1.0 0.0 0.0 0.0 :: XMISS - 4 1 2 :: KVAR - */ - private static void readDataFile(String filename, DataHolder data) { - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String line = br.readLine(); // skip header - line = br.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvars(Integer.parseInt(sVal[2])); - - data.x = new double[data.n * data.m]; - data.miss = new int[data.m]; - data.xmiss = new double[data.m]; - data.kvar = new int[data.nvars]; - - for (int i = 0; i < data.n; ++i) { - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.x[i + j * data.n] = Double.parseDouble(sVal[j]); - } - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.miss[j] = Integer.parseInt(sVal[j]); - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.xmiss[j] = Double.parseDouble(sVal[j]); - } - - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.nvars; ++j) { - data.kvar[j] = Integer.parseInt(sVal[j]); - } - } - catch (FileNotFoundException ex) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch (IOException ex) { - System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); - System.exit(-3); - } - - } - - private static class DataHolder { - private int n; - private int m; - private int nvars; - private double[] x; - private int[] miss; - private double[] xmiss; - private int[] kvar; - - /** - * @return the n - */ - public int getN() { - return n; - } - - /** - * @param n the n to set - */ - public void setN(int n) { - this.n = n; - } - - /** - * @return the m - */ - public int getM() { - return m; - } - - /** - * @param m the m to set - */ - public void setM(int m) { - this.m = m; - } - - /** - * @return the nvars - */ - public int getNvars() { - return nvars; - } - - /** - * @param nvars the nvars to set - */ - public void setNvars(int nvars) { - this.nvars = nvars; - } - - /** - * @return the x - */ - public double[] getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(double[] x) { - this.x = x; - } - - /** - * @return the miss - */ - public int[] getMiss() { - return miss; - } - - /** - * @param miss the miss to set - */ - public void setMiss(int[] miss) { - this.miss = miss; - } - - /** - * @return the xmiss - */ - public double[] getXmiss() { - return xmiss; - } - - /** - * @param xmiss the xmiss to set - */ - public void setXmiss(double[] xmiss) { - this.xmiss = xmiss; - } - - /** - * @return the kvar - */ - public int[] getKvar() { - return kvar; - } - - /** - * @param kvar the kvar to set - */ - public void setKvar(int[] kvar) { - this.kvar = kvar; - } - } -} diff --git a/simple_examples/int32/G02BRJE.java b/simple_examples/int32/G02BRJE.java deleted file mode 100644 index 084f478..0000000 --- a/simple_examples/int32/G02BRJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.G02.G02BR; - -/** - * G02BRJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G02BRJE{ - - /** - * G02BRJ Example main program - */ - public static void main(String[] args){ - int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder - double[] rr, work1, work2, x, xmiss; - int[] incase, kworka, kworkb, kworkc, miss; - - System.out.println("G02BRJ Example Program Results"); - System.out.println(); - - //Problem size - n = 9; - m = 3; - itype = 0; - - ldrr = m; - ldx = n; - - //Allocate - rr = new double[ldrr * m]; - work1 = new double[n]; - work2 = new double[n]; - x = new double[ldx * m]; - xmiss = new double[m]; - incase = new int[n]; - kworka = new int[n]; - kworkb = new int[n]; - kworkc = new int[n]; - miss = new int[m]; - - //Data - //X = (1.70, 1.00, 0.50) - // (2.80, 4.00, 3.00) - // (0.60, 6.00, 2.50) - // (1.80, 9.00, 6.00) - // (0.99, 4.00, 2.50) - // (1.40, 2.00, 5.50) - // (1.80, 9.00, 7.50) - // (2.50, 7.00, 0.00) - // (0.99, 5.00, 3.00) - x[0] = 1.7; - x[1] = 2.8; - x[2] = 0.6; - x[3] = 1.8; - x[4] = 0.99; - x[5] = 1.4; - x[6] = 1.8; - x[7] = 2.5; - x[8] = 0.99; - x[9] = 1; - x[10] = 4; - x[11] = 6; - x[12] = 9; - x[13] = 4; - x[14] = 2; - x[15] = 9; - x[16] = 7; - x[17] = 5; - x[18] = 0.5; - x[19] = 3; - x[20] = 2.5; - x[21] = 6; - x[22] = 2.5; - x[23] = 5.5; - x[24] = 7.5; - x[25] = 0; - x[26] = 3; - - //Missing value flags - miss[0] = 1; - miss[1] = 0; - miss[2] = 1; - xmiss[0] = 0.99; - xmiss[1] = 0; - xmiss[2] = 0; - - //Display data - System.out.printf("Number of variables (columns) = %d\n", m); - System.out.printf("Number of case (rows) = %d\n", n); - System.out.println(); - System.out.println("Data matrix is:-\n"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", x[(j * n) + i]); - } - System.out.println(); - } - System.out.println(); - - //Calculate correlation coefficients - ifail = 0; - G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, - work1, work2, ifail); - g02br.eval(); - - //Update - ncases = g02br.getNCASES(); - - //Display results - System.out.println("Matrix of rank correlation coefficients:"); - System.out.println("Upper triangle -- Spearman's"); - System.out.println("Lower triangle -- Kendall's tau"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", rr[(j * m) + i]); - } - System.out.println(); - } - System.out.println(); - System.out.printf("Number of cases actually used: %d\n", ncases); - } -} diff --git a/simple_examples/int32/G02DAJE.java b/simple_examples/int32/G02DAJE.java deleted file mode 100644 index c390197..0000000 --- a/simple_examples/int32/G02DAJE.java +++ /dev/null @@ -1,187 +0,0 @@ -import com.nag.routines.G02.G02BU; -import com.nag.routines.G02.G02DA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G02DAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02DAJE{ - - /** - * G02DAJ Example main program - */ - public static void main(String[] args){ - double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; - int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; - boolean svd = false; - String mean, weight; - double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; - int[] isx; - - System.out.println("G02DAJ Example Program Results"); - System.out.println(); - - c = new double[1]; - wmean = new double[1]; - - //Problem size (can be read in from data file - n = 12; - m = 4; - weight = "U"; - mean = "M"; - - if(weight.toLowerCase().equals("w")){ - lwt = n; - } - else{ - lwt = 0; - } - ldx = n; - - x = new double[ldx * m]; - y = new double[n]; - wt = new double[n]; - isx = new int[m]; - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip n, m, weight, mean - - //Read in data - String[] sVal; - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - x[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - if(lwt > 0){ - wt[i] = Double.parseDouble(sVal[m + 1]); - } - } - - //Read in variable inclusion flags - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < m; i++){ - isx[i] = Integer.parseInt(sVal[i]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Calcluate IP - ip = 0; - for(int i = 0; i < m; i++){ - if(isx[i] == 1){ - ip++; - } - } - if(mean.toLowerCase().equals("m")){ - ip = ip + 1; - } - - //Allocate - ldq = n; - b = new double[ip]; - cov = new double[((ip * ip) + ip)/2]; - h = new double[n]; - p = new double[ip * ip * (ip + 2)]; - q = new double[ldq * (ip + 1)]; - res = new double[n]; - se = new double[ip]; - wk = new double[ip * ip + (5 * (ip - 1))]; - - //Use suggested value for tolerance - tol = 0.000001; - - //fit general linear regression model - ifail = -1; - G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, - ldq, svd, irank, p, tol, wk, ifail); - g02da.eval(); - ifail = g02da.getIFAIL(); - if(ifail != 0){ - if(ifail != 5){ - System.exit(-3); - } - } - - //Calculate (weighted) total sums of squares, adjusted for mean if required - //If in G02DAF, an intercept is added to the regression by including a comlumn of - //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used - //in this call to G02BUF - ifail = 0; - G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); - g02bu.eval(); - - idf = g02da.getIDF(); - irank = g02da.getIRANK(); - //Get effective number of observations (=N if there are no zero weights) - en = (double) idf + irank; - - rss = g02da.getRSS(); - //Calculate R-squared, corrected R-Squared and AIC - rsq = 1 - rss/c[0]; - if(mean.toLowerCase().equals("m")){ - mult = (en - 1) / (en - irank); - } - else{ - mult = en / (en - irank); - } - arsq = 1 - mult * (1 - rsq); - aic = en * Math.log(rss/en) + (2 * irank); - - svd = g02da.getSVD(); - //Disply results - if(svd){ - System.out.printf("Model not of full rank, rank = %d", irank); - System.out.println(); - } - System.out.printf("Residual sum of squares = %.4e\n", rss); - System.out.printf("Degrees of freedom = %d\n", idf); - System.out.printf("R-squared = %.4e\n", rsq); - System.out.printf("Adjusted R-squared = %.4e\n", arsq); - System.out.printf("AIC = %.4e\n", aic); - System.out.println(); - System.out.printf("Variable\tParameter estimate\tStandard error\n"); - System.out.println(); - if(ifail == 0){ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); - } - } - else{ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); - } - } - System.out.println(); - System.out.printf(" Obs\t\t Residuals\t\t H\n"); - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); - } - - } -} diff --git a/simple_examples/int32/G02EEJE.java b/simple_examples/int32/G02EEJE.java deleted file mode 100644 index 5856fde..0000000 --- a/simple_examples/int32/G02EEJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.G02.G02EE; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G02EE example program text. - */ -public class G02EEJE { - - public static void main(String[] args) throws Exception { - int vnlen = 3; - double chrss, f, fin, rss; - rss = chrss = f = Double.NaN; - int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; - boolean addvar = false; - String mean, weight, newvar; - newvar = " "; - double[] exss, p, q, wk, wt, x, y; - int[] isx; - String[] free, model, vname; - - System.out.println(" G02EEJ Example Program Results\n"); - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - String line = dataIn.readLine(); - - String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - mean = data[2].substring(1,2); - weight = data[3].substring(1,2); - fin = Double.parseDouble(data[4]); - - if (weight.equalsIgnoreCase("W")) { - lwt = n; - } - else { - lwt = 0; - } - ldx = n; - - x = new double[ldx*m]; - y = new double[n]; - wt = new double[lwt]; - isx = new int[m]; - vname = new String[m]; - - for (int i = 0; i < vname.length;++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - vname[i] = tmp.toString(); - } - - if (lwt > 0) { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - wt[i] = Double.parseDouble(data[m+1]); - } - } - else { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - } - } - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int i = 0; i < m; ++i) { - isx[i] = Integer.parseInt(data[i]); - } - - data = dataIn.readLine().trim().split("::")[0].trim() - .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); - for (int i = 0; i < m; ++i) { - vname[i] = data[i].substring(0,3); - } - - dataIn.close(); - - maxip = 0; - for (int i = 0; i < m; ++i) { - if (isx[i] > 0) { - ++maxip; - } - } - - if (mean.equalsIgnoreCase("M")) { - maxip += 1; - } - - ldq = n; - model = new String[maxip]; - free = new String[maxip]; - exss = new double[maxip]; - q = new double[ldq*(maxip+2)]; - p = new double[maxip+1]; - wk = new double[2*maxip]; - - for (int i = 0; i < model.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - model[i] = tmp.toString(); - } - for (int i = 0; i < free.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - free[i] = tmp.toString(); - } - istep = 0; - ifail = -1; - - - G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, - addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, - wk,ifail); - for (int i = 0; i < m; ++i) { - g02ee.setIFAIL(0); - g02ee.eval(); - - System.out.printf(" Step %2d\n",g02ee.getISTEP()); - if (!g02ee.getADDVAR()) { - System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - break; - } - else { - System.out.println(" Added variable is "+g02ee.getNEWVAR()); - System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); - System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); - System.out.println(); - System.out.print(" Variables in model:"); - for (int j = 0; j < g02ee.getNTERM(); ++j) { - System.out.print(" "+g02ee.getMODEL()[j]); - } - System.out.println("\n"); - System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); - System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); - System.out.println(); - if (g02ee.getIFR() == 0) { - System.out.println(" No free variables remaining"); - break; - } - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - - } - - } - - } - -} diff --git a/simple_examples/int32/G02MAJE.java b/simple_examples/int32/G02MAJE.java deleted file mode 100644 index 4a8bfcb..0000000 --- a/simple_examples/int32/G02MAJE.java +++ /dev/null @@ -1,130 +0,0 @@ -import com.nag.routines.G02.G02MA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * G02MAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02MAJE{ - - /** - * G02MAJ example main program - */ - public static void main(String[] args){ - int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; - double[] b, d, fitsum, ropt, y; - int[] isx; - - isx = new int[0]; //placeholder - - System.out.println("G02MAJ Example Program Results"); - System.out.println(); - - //data (Could also read in from data file) - //Problem size - n = 20; - m = 6; - - //Model Specification - mtype = 1; - pred = 3; - prey = 1; - mnstep = 6; - lisx = 0; - - //Variable inclusion flags aren't needed in this example - ip = m; - - //Optional arguments (using defaults) - lropt = 0; - ropt = new double[lropt]; - - //D and Y - ldd = n; - y = new double[n]; - d = new double[ldd * m]; - - //Read in D and Y from data file (too large to write out) - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip N, M - line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx - - String sVal[]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - d[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Allocate output arrays - ldb = ip; - b = new double[ldb * (mnstep + 2)]; - fitsum = new double[6 * (mnstep + 1)]; - - //Call the model fitting routine - ifail = -1; - G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, - fitsum, ropt, lropt, ifail); - g02ma.eval(); - ifail = g02ma.getIFAIL(); - if(ifail != 0){ - if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ - //ifail = 112, 161, 162, 163 are warnings, so no need to terminate - System.exit(-2); - } - } - - //update - nstep = g02ma.getNSTEP(); - - //Display the parameter estimates - System.out.printf(" Step\t\t\tParameter Estimate\n"); - System.out.println("------------------------------------------------------"); - for(int i = 0; i < nstep; i++){ - System.out.printf(" %d", (i + 1)); - for(int j = 0; j < ip; j++){ - System.out.printf("\t%.3f", b[j + (i * nstep)]); - } - System.out.printf("\n"); - } - System.out.println(); - System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); - System.out.println(); - System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); - System.out.println("---------------------------------------------------------"); - for(int k = 0; k < nstep; k++){ - System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], - (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], - fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); - } - System.out.println(); - System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); - } -} diff --git a/simple_examples/int32/G03GAJE.java b/simple_examples/int32/G03GAJE.java deleted file mode 100644 index ba20592..0000000 --- a/simple_examples/int32/G03GAJE.java +++ /dev/null @@ -1,355 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import com.nag.routines.G03.G03GA; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * G03GAJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G03GAJE{ - - /** - * G03GAJ example main program. - */ - public static void main(String[] args){ - int i, ldx, lprob, riter, lds, sds, ifail = 0; - double[] w, g, s, f; - double tol, loglik = 0; - - if(args.length != 1){ - G03GAJE.usage(); - } - - // Data file name as argument - String filename = args[0]; - // DataHolder object to hold data read in from data file - DataHolder data = new DataHolder(); - - readDataFile(filename, data); - - System.out.println(" G03GAJ Example Program Results"); - System.out.println(); - - // Leading dimensions - ldx = data.n; - lprob = data.n; - - - switch(data.sopt){ - case 1: - s = new double[data.nvar * data.nvar * data.ng]; - lds = data.nvar; - sds = data.nvar; - break; - case 2: - s = new double[data.nvar * data.nvar * 1]; - lds = data.nvar; - sds = data.nvar; - break; - case 3: - s = new double[data.nvar * data.ng * 1]; - lds = data.nvar; - sds = data.ng; - break; - case 4: - s = new double[data.nvar * 1 * 1]; - lds = data.nvar; - sds = 1; - break; - default: - s = new double[1 * 1 * 1]; - lds = 1; - sds = 1; - break; - } - - // Allocate array size - g = new double[data.nvar * data.ng]; - w = new double[data.ng]; - f = new double[data.n * data.ng]; - tol = 0.0; - riter = 5; - - ifail = 0; - - // Create g03ga object with variables from data file - G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, - lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); - - // Run routine - g03ga.eval(); - - // Update variables - data.n = g03ga.getN(); - data.m = g03ga.getM(); - data.x = g03ga.getX(); - ldx = g03ga.getLDX(); - data.isx = g03ga.getISX(); - data.nvar = g03ga.getNVAR(); - data.ng = g03ga.getNG(); - data.popt = g03ga.getPOPT(); - data.prob = g03ga.getPROB(); - lprob = g03ga.getLPROB(); - data.niter = g03ga.getNITER(); - riter = g03ga.getRITER(); - w = g03ga.getW(); - g = g03ga.getG(); - data.sopt = g03ga.getSOPT(); - s = g03ga.getS(); - lds = g03ga.getLDS(); - sds = g03ga.getSDS(); - f = g03ga.getF(); - tol = g03ga.getTOL(); - loglik = g03ga.getLOGLIK(); - ifail = g03ga.getIFAIL(); - - // Results - X04CA x04ca = new X04CA(); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); - - System.out.println(); - switch(data.sopt){ - case 1: - for(i = 0; i < data.ng; i++){ - ifail = 0; - // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic - // calling X04CA along the 3rd dimension - x04ca.eval("g", "n", data.nvar, data.nvar, - Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), - lds, "Variance-cavariance matrix", ifail); - } - break; - case 2: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); - break; - case 3: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); - break; - case 4: - ifail = 0; - x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); - break; - case 5: - ifail = 0; - x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); - break; - } - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); - - System.out.println(); - System.out.println("No. iterations: " + data.niter); - System.out.printf("Log-likelihood: %.04f\n", loglik); - } - - /** - * Read data from given filename and puts into DataHolder object - * @param filename - * Name of data file (absolute or relative path) - * @param data - * DataHolder object to store data from data file - */ - public static void readDataFile(String filename, DataHolder data){ - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - // Problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvar(Integer.parseInt(sVal[2])); - - // Number of groups - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNg(Integer.parseInt(sVal[0])); - - // Scaling option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setSopt(Integer.parseInt(sVal[0])); - - // Initial probabilities option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setPopt(Integer.parseInt(sVal[0])); - - // Maximum number of iterations - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNiter(Integer.parseInt(sVal[0])); - - // - data.x = new double[data.m * data.n]; - data.prob = new double[data.ng * data.n]; - data.isx = new int[data.m]; - - //Data matrix X - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.m; ++j){ - data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - - //Included variables - if(data.nvar != data.m){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int i = 0; i < data.m; ++i){ - data.isx[i] = Integer.parseInt(sVal[i]); - } - } - - - //Optionally read initial probabilities of group memebership (included in example data) - if(data.popt == 2){ - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.ng; ++j){ - data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - } - - /** - * Stores data from data file for later reference - */ - private static class DataHolder{ - private int n; - private int m; - private int nvar; - private int ng; - private int sopt; - private int popt; - private int niter; - private int isx[]; - private double x[]; - private double prob[]; - - public void setN(int n){ - this.n = n; - } - - public int getN(){ - return n; - } - - public void setM(int m){ - this.m = m; - } - - public int getM(){ - return m; - } - - public void setNvar(int nvar){ - this.nvar = nvar; - } - - public int getNvar(){ - return nvar; - } - - public void setNg(int ng){ - this.ng = ng; - } - - public int getNg(){ - return ng; - } - - public void setSopt(int sopt){ - this.sopt = sopt; - } - - public int getSopt(){ - return sopt; - } - - public void setPopt(int popt){ - this.popt = popt; - } - - public int getPopt(){ - return popt; - } - - public void setNiter(int niter){ - this.niter = niter; - } - - public int getNiter(){ - return niter; - } - - public void setIsx(int[] isx){ - this.isx = isx; - } - - public int[] getIsx(){ - return isx; - } - - public void setX(double[] x){ - this.x = x; - } - - public double[] getX(){ - return x; - } - - public void setProb(double[] prob){ - this.prob = prob; - } - - public double[] getProb(){ - return prob; - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/int32/G05KFJE.java b/simple_examples/int32/G05KFJE.java deleted file mode 100644 index 18ce755..0000000 --- a/simple_examples/int32/G05KFJE.java +++ /dev/null @@ -1,105 +0,0 @@ -import com.nag.routines.G05.G05KF; -import com.nag.routines.G05.G05SA; -import com.nag.routines.Routine; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G05KFJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G05KFJE{ - - /** - * G05KFJ example main program. - */ - public static void main(String[] args){ - //genid, subid only initilised so they can be set in try{} without java throwing error - int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; - int ifail, lstate; - int[] seed, state; - double x[]; - - System.out.println("G05KFJ Example Program Results"); - System.out.println(); - - //No file input given - if(args.length != 1){ - G05KFJE.usage(); - } - - seed = new int[lseed]; - - //Read in data from data fiel - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the base generator information and seed - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - genid = Integer.parseInt(sVal[0]); - subid = Integer.parseInt(sVal[1]); - seed[0] = Integer.parseInt(sVal[2]); - - //Read in sample size - line = reader.readLine(); - sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - lstate = 0; - ifail = 0; - state = new int[lstate]; - - //Initial call to get size of STATE array - G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); - g05kf.eval(); - - //Update local variables - lstate = g05kf.getLSTATE(); - state = g05kf.getSTATE(); - - //Reallocate STATE - state = new int[lstate]; - - //Update object variables - g05kf.setSTATE(state); - g05kf.eval(); - - //Update local variables - state = g05kf.getSTATE(); - - x = new double[n]; - - //Generate the variates - ifail = 0; - G05SA g05sa = new G05SA(n, state, x, ifail); - g05sa.eval(); - - //Display the variates - for(int i = 0; i < x.length; i++){ - System.out.printf("%.4f\n", x[i]); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/int32/G13AWJE.java b/simple_examples/int32/G13AWJE.java deleted file mode 100644 index 9e829bd..0000000 --- a/simple_examples/int32/G13AWJE.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.nag.routines.G01.G01EW; -import com.nag.routines.G13.G13AW; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G13AW example program text. - */ -public class G13AWJE { - - public static void main(String[] args) { - - int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; - double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., - -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., - 88.,122.,126.,114.,85.,64}; - int[] state = new int[1]; - G13AW g13aw = new G13AW(type, p, n, y, ifail); - System.out.println(" G13AWJ Example Program Results\n"); - double ts = g13aw.eval(); - G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); - double pvalue = g01ew.eval(); - ifail = g01ew.getIFAIL(); - if (ifail == 0 || ifail == 201) { - System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); - System.out.printf("associated p-value = %6.3f\n", pvalue); - } - - } - -} diff --git a/simple_examples/int32/G13MEJE.java b/simple_examples/int32/G13MEJE.java deleted file mode 100644 index a768a46..0000000 --- a/simple_examples/int32/G13MEJE.java +++ /dev/null @@ -1,160 +0,0 @@ -import com.nag.routines.G13.G13ME; - -/** - * G13MEJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13MEJE{ - - /** - * G13MEJ main program - */ - public static void main(String[] args){ - double tau; - int ifail, lrcomm, m, nb, pn; - double[] iema, rcomm, sinit, t; - int[] inter, nbVal; - - inter = new int[2]; - - System.out.println("G13MEJ Example Program Results"); - System.out.println(); - - //data (can read in from data file) - //Number of iteration required - m = 2; - - //Decay parameter and interpolation method - tau = 2; - inter[0] = 3; - inter[1] = 2; - - //Initial values - sinit = new double[m + 2]; - sinit[0] = 5; - sinit[1] = 0.5; - sinit[2] = 0.5; - sinit[3] = 0.5; - - //Array of NB values in order - nbVal = new int[3]; - nbVal[0] = 5; - nbVal[1] = 10; - nbVal[2] = 15; - - //First block - double[] t1 = new double[nbVal[0]]; - double[] iema1 = new double[nbVal[0]]; - t1[0] = 7.5; - t1[1] = 8.2; - t1[2] = 18.1; - t1[3] = 22.8; - t1[4] = 25.8; - iema1[0] = 0.6; - iema1[1] = 0.6; - iema1[2] = 0.8; - iema1[3] = 0.1; - iema1[4] = 0.2; - - //Second block - double[] t2 = new double[nbVal[1]]; - double[] iema2 = new double[nbVal[1]]; - t2[0] = 26.8; - t2[1] = 31.1; - t2[2] = 38.4; - t2[3] = 45.9; - t2[4] = 48.2; - t2[5] = 48.9; - t2[6] = 57.9; - t2[7] = 58.5; - t2[8] = 63.9; - t2[9] = 65.2; - iema2[0] = 0.2; - iema2[1] = 0.5; - iema2[2] = 0.7; - iema2[3] = 0.1; - iema2[4] = 0.4; - iema2[5] = 0.7; - iema2[6] = 0.8; - iema2[7] = 0.3; - iema2[8] = 0.2; - iema2[9] = 0.5; - - //Third block - double[] t3 = new double[nbVal[2]]; - double[] iema3 = new double[nbVal[2]]; - t3[0] = 66.6; - t3[1] = 67.4; - t3[2] = 69.3; - t3[3] = 69.9; - t3[4] = 73.0; - t3[5] = 75.6; - t3[6] = 77.0; - t3[7] = 84.7; - t3[8] = 86.8; - t3[9] = 88.0; - t3[10] = 88.5; - t3[11] = 91.0; - t3[12] = 93.0; - t3[13] = 93.7; - t3[14] = 94.0; - iema3[0] = 0.2; - iema3[1] = 0.3; - iema3[2] = 0.8; - iema3[3] = 0.6; - iema3[4] = 0.1; - iema3[5] = 0.7; - iema3[6] = 0.9; - iema3[7] = 0.6; - iema3[8] = 0.3; - iema3[9] = 0.1; - iema3[10] = 0.1; - iema3[11] = 0.4; - iema3[12] = 1.0; - iema3[13] = 1.0; - iema3[14] = 0.1; - - //Print some titles - System.out.printf("\t\t\tIterated\n"); - System.out.println("\t\tTime\t EMA\n"); - System.out.println("--------------------------------"); - - lrcomm = 20 + m; - rcomm = new double[lrcomm]; - - pn = 0; - - //Loop through 3 blocks - for(int i = 0; i < nbVal.length; i++){ - //nb for given block - nb = nbVal[i]; - - //Use data for current block - if(i == 0){ - t = t1; - iema = iema1; - } - else if(i == 1){ - t = t2; - iema = iema2; - } - else{ - t = t3; - iema = iema3; - } - - ifail = 0; - G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); - g13me.eval(); - pn = g13me.getPN(); - - //Display results for this block of data - for(int j = 0; j < nb; j++){ - System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); - } - System.out.println(); - } - } -} - diff --git a/simple_examples/int32/G13NAJE.java b/simple_examples/int32/G13NAJE.java deleted file mode 100644 index 2032eb1..0000000 --- a/simple_examples/int32/G13NAJE.java +++ /dev/null @@ -1,123 +0,0 @@ -import com.nag.routines.G13.G13NA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G13NAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13NAJE{ - - /** - * G13NAJ example main program - */ - public static void main(String[] args){ - double beta = 0; - int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder - double[] param, sparam, y; - int[] tau; - - param = new double[1]; - //Placeholder y to be read in from data file - y = new double[0]; - - System.out.println("G13NAJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - //Allocate enough size to hold the input series - y = new double[n]; - - //Read in the input series - for(int i = 0; i < 10; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < 10; j++){ - y[(i * 10) + j] = Double.parseDouble(sVal[j]); - } - } - - //Read in the type of change point, penalty and minimum segment size - line = reader.readLine(); - sVal = line.split("\\s+"); - ctype = Integer.parseInt(sVal[0]); - iparam = Integer.parseInt(sVal[1]); - beta = Double.parseDouble(sVal[2]); - minss = Integer.parseInt(sVal[3]); - - //Read in the distribution parameter (if required) - if(iparam == 1){ - line = reader.readLine(); - sVal = line.split("\\s+"); - param[0] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Output arrays - tau = new int[n]; - sparam = new double[(2 * n) + 2]; - - ifail = -1; - - //Call routine to detece change points - G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); - g13na.eval(); - - //update - ifail = g13na.getIFAIL(); - ctype = g13na.getCTYPE(); - ntau = g13na.getNTAU(); - - if(ifail == 0 || ifail == 200 || ifail == 201){ - //Display the results - if(ctype == 5 || ctype == 6){ - //Exponential or Poisson distribtion - System.out.printf(" -- Charge Points -- Distribution\n"); - System.out.printf(" Number Position Parameter \n"); - System.out.println("====================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); - } - - } - else{ - //Normal of Gamma distribution - System.out.printf(" -- Charge Points -- --- Distribution ---\n"); - System.out.printf(" Number Position Parameters\n"); - System.out.println("================================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); - } - } - } - if(ifail == 200 || ifail == 201){ - System.out.println("Some truncation occured internally to avoid overflow"); - } - } -} diff --git a/simple_examples/int32/H02BBJE.java b/simple_examples/int32/H02BBJE.java deleted file mode 100644 index 04f4207..0000000 --- a/simple_examples/int32/H02BBJE.java +++ /dev/null @@ -1,92 +0,0 @@ -import com.nag.routines.H.H02BB; - -/** - * H02BBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class H02BBJE{ - - /** - * H02BBJ example main program - */ - public static void main(String[] args){ - double bigbnd, objmip = 0, tolfes, toliv; - int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; - double[] a, bl, bu, cvec, rwork, x; - int[] intvar, iwork; - - System.out.println("H02BBJ Example Program Results"); - System.out.println(); - - //Data (can be read in from data file) - n = 2; - m = 3; - lda = m; - - a = new double[lda * n]; - bl = new double[m + n]; - bu = new double[m + n]; - cvec = new double[n]; - x = new double[n]; - intvar = new int[n]; - - itmax = 0; - msglvl = 10; - maxnod = 0; - intfst = 0; - maxdpt = 4; - tolfes = 0; - toliv = 0; - - cvec[0] = -3; - cvec[1] = -4; - - //A = ( 2, 5) - // ( 2, -2) - // ( 3, 2) - a[0] = 2; - a[1] = 2; - a[2] = 3; - a[3] = 5; - a[4] = -2; - a[5] = 2; - - bigbnd = 1E+20; - - bl[0] = 0; - bl[1] = 0; - bl[2] = -1E+20; - bl[3] = -1E+20; - bl[4] = 5; - - bu[0] = 1E+20; - bu[1] = 1E+20; - bu[2] = 15; - bu[3] = 5; - bu[4] = 1E+20; - - intvar[0] = 1; - intvar[1] = 1; - - x[0] = 1; - x[1] = 1; - - liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; - //Math.pow() needs to be casted to int in java - lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); - iwork = new int[liwork]; - rwork = new double[lrwork]; - - ifail = 0; - - H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, - tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); - h02bb.eval(); - } -} - - - - - diff --git a/simple_examples/int32/H02DAJE.java b/simple_examples/int32/H02DAJE.java deleted file mode 100644 index 6e90401..0000000 --- a/simple_examples/int32/H02DAJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import com.nag.routines.H.H02DA; -import com.nag.routines.H.H02ZK; -import com.nag.routines.H.H02ZL; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * H02DAJ exmaple program text - * @author willa - * @since 27.1.0.0 - */ -public class H02DAJE{ - - /** - * H02DAJ example main program - */ - public static void main(String[] args){ - double acc, accqp = 0, objmip = 0; - int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; - String cvalue; - double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; - int[] iopts, iuser, varcon; - - System.out.println("H02DAJ Example Program Results"); - System.out.println(); - - opts = new double[100]; - ruser = new double[1]; - iopts = new int[200]; - iuser = new int[1]; - - //Blank 40 character string to represent ```Character (40) :: cvalue``` - char[] ch = new char[40]; - Arrays.fill(ch, ' '); - cvalue = new String(ch); - - n = 8; - nclin = 5; - ncnln = 2; - lda = nclin; - - a = new double[lda * n]; - d = new double[nclin]; - ax = new double[nclin]; - bl = new double[n]; - bu = new double[n]; - varcon = new int[n + nclin + ncnln]; - x = new double[n]; - c = new double[ncnln]; - cjac = new double[ncnln * n]; - objgrd = new double[n]; - - //Set variable types: continuous then binary - varcon[0] = 0; - varcon[1] = 0; - varcon[2] = 0; - varcon[3] = 0; - varcon[4] = 1; - varcon[5] = 1; - varcon[6] = 1; - varcon[7] = 1; - - //Set continuous variable bounds - bl[0] = 0; - bl[1] = 0; - bl[2] = 0; - bl[3] = 0; - bu[0] = 1000; - bu[1] = 1000; - bu[2] = 1000; - bu[3] = 1000; - - //Bounds for binary variables need not be provided - bl[4] = 0; - bl[5] = 0; - bl[6] = 0; - bl[7] = 0; - bu[4] = 1; - bu[5] = 1; - bu[6] = 1; - bu[7] = 1; - - //Set linear constraint, equality first - varcon[n] = 3; - varcon[n + 1] = 4; - varcon[n + 2] = 4; - varcon[n + 3] = 4; - varcon[n + 4] = 4; - - //Set Ax=d then Ax>=d - //( 1, 1, 1, 1, 0, 0, 0, 0) - //(-1, 0, 0, 0, 1, 0, 0, 0) - //( 0,-1, 0, 0, 0, 1, 0, 0) - //( 0, 0,-1, 0, 0, 0, 1, 0) - //( 0, 0, 0,-1, 0, 0, 0, 1) - a[0] = 1; - a[1] = -1; - a[5] = 1; - a[7] = -1; - a[10] = 1; - a[13] = -1; - a[15] = 1; - a[19] = -1; - a[21] = 1; - a[27] = 1; - a[33] = 1; - a[39] = 1; - d[0] = 1; - d[1] = 0; - d[2] = 0; - d[3] = 0; - d[4] = 0; - - //Set constraints supplied by CONFUN, equality first - varcon[n + nclin] = 3; - varcon[n + nclin + 1] = 4; - - liopts = iopts.length; - lopts = opts.length; - - //Initialize communication arrays - ifail = 0; - H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); - h02zk.eval(); - - - //Optimization parameters - maxit = 500; - acc = 0.000001; - - //Initial estimate (binary variables need not be given) - x[0] = 1; - x[1] = 1; - x[2] = 1; - x[3] = 1; - x[4] = 0; - x[5] = 0; - x[6] = 0; - x[7] = 0; - - //Portfolio parameters p and rho - iuser[0] = 3; - ruser[0] = 10; - - ifail = 0; - //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines - objfun objfun1 = new objfun(); - confun confun1 = new confun(); - H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, - objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); - h02da.eval(); - - //Results - ifail = h02da.getIFAIL(); - if(ifail == 0){ - X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); - x04ca.eval(); - - //Query the accuracy of the mixed integer QP Solver - ifail = -1; - H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); - h02zl.eval(); - - //Update values to print - accqp = h02zl.getRVALUE(); - objmip = h02da.getOBJMIP(); - ifail = h02zl.getIFAIL(); - if(ifail == 0){ - System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); - } - System.out.printf("Optimised value:\t%.3f\n", objmip); - } - else{ - System.out.printf("h02daf returns ifail = %d\n", ifail); - } - } - - /** - * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA - */ - public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ - public void eval(){ - if(this.MODE == 0){ - //Objective value - this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) - + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) - + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); - } - else{ - //Objective gradients for continous varaiables - this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); - this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); - this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); - this.OBJGRD[3] = 0; - } - } - } - - /** - * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA - */ - public static class confun extends H02DA.Abstract_H02DA_CONFUN{ - public void eval(){ - if(this.MODE == 0){ - //Constraints - int p = this.IUSER[0]; - double rho = this.RUSER[0]; - - //Mean return rho: - this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; - //Maximum of p assets in portfolio - this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; - } - else{ - //Jacobian - this.CJAC[0] = 8; - this.CJAC[2] = 9; - this.CJAC[4] = 12; - this.CJAC[6] = 7; - //c[2] does not include continuours varaibles which requries that their derivatives are zero - this.CJAC[1] = 0; - this.CJAC[3] = 0; - this.CJAC[5] = 0; - this.CJAC[7] = 0; - } - } - } -} diff --git a/simple_examples/int32/M01CCJE.java b/simple_examples/int32/M01CCJE.java deleted file mode 100644 index fda5e2f..0000000 --- a/simple_examples/int32/M01CCJE.java +++ /dev/null @@ -1,42 +0,0 @@ -import com.nag.routines.M01.M01CC; -import java.io.*; - -/** - * M01CC example program text. - */ -public class M01CCJE { - - public static void main(String[] args) throws Exception { - - String[] ch; - String order = "Reverse ASCII"; - int m1,m2,l1,l2; - int ifail = 0; - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); - ch = new String[m2]; - m1 = 1; - for (int i = m1-1; i < m2; ++i) { - ch[i] = dataIn.readLine(); - } - dataIn.close(); - l1 = 7; - l2 = 12; - - System.out.println(" M01CCJ Example Program Results"); - M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); - m01cc.eval(); - ifail = m01cc.getIFAIL(); - System.out.println(); - System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); - System.out.println(); - for (int i = m1-1; i < m2; ++i) { - System.out.println(" "+ch[i]); - } - - } - -} diff --git a/simple_examples/int32/S01BAJE.java b/simple_examples/int32/S01BAJE.java deleted file mode 100644 index 4bf2823..0000000 --- a/simple_examples/int32/S01BAJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.S.S01BA; - -/** - * S01BAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S01BAJE{ - - /** - * S01BAJE main program - */ - public static void main(String[] args){ - double y; - int ifail; - double[] xVal; //data - - //store data - xVal = new double[6]; - xVal[0] = 2.5; - xVal[1] = 0.125; - xVal[2] = -0.906; - xVal[3] = 0.00129; - xVal[4] = -0.00000783; - xVal[5] = 0.000000001; - - System.out.println("S01BAJ Example Program Results"); - System.out.println(); - System.out.printf("\tX\t\tY\n"); - - for(double x : xVal){ - ifail = -1; - S01BA s01ba = new S01BA(x, ifail); - y = s01ba.eval(); - - System.out.printf("\t%.4e\t%.4e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10AAJE.java b/simple_examples/int32/S10AAJE.java deleted file mode 100644 index 2a0878a..0000000 --- a/simple_examples/int32/S10AAJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.S.S10AA; - -/** - * S10AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10AAJE{ - - /** - * S10AAJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[4]; - xVal[0] = -20; - xVal[1] = -5.0; - xVal[2] = 0.5; - xVal[3] = 5.0; - - System.out.println("S10AAJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AA s10aa = new S10AA(x, ifail); - y = s10aa.eval(); - ifail = s10aa.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ABJE.java b/simple_examples/int32/S10ABJE.java deleted file mode 100644 index dd84ab7..0000000 --- a/simple_examples/int32/S10ABJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AB; - -/** - * S10ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ABJE{ - - /** - * S10ABJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ABJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AB s10ab = new S10AB(x, ifail); - y = s10ab.eval(); - ifail = s10ab.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S10ACJE.java b/simple_examples/int32/S10ACJE.java deleted file mode 100644 index cc0c04c..0000000 --- a/simple_examples/int32/S10ACJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AC; - -/** - * S10ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ACJE{ - - /** - * S10ACJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ACJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AC s10ac = new S10AC(x, ifail); - y = s10ac.eval(); - ifail = s10ac.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/int32/S14ABJE.java b/simple_examples/int32/S14ABJE.java deleted file mode 100644 index 673a4b3..0000000 --- a/simple_examples/int32/S14ABJE.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.nag.routines.S.S14AB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ABJE{ - - /** - * S14ABJ example main program - */ - public static void main(String[] args){ - double x, y; - int ifail; - - System.out.println("S14ABJ Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //loop until break - while(true){ - line = reader.readLine(); - - //if finished looping through file break - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[1]); - - ifail = -1; - S14AB s14ab = new S14AB(x, ifail); - y = s14ab.eval(); - //update ifail - ifail = s14ab.getIFAIL(); - - if(ifail < 0){ - break; - } - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S14ACJE.java b/simple_examples/int32/S14ACJE.java deleted file mode 100644 index e2fff05..0000000 --- a/simple_examples/int32/S14ACJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.S.S14AC; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ACJE{ - - /** - * S14ACJ example main program - */ - public static void main(String[] args){ - double f, x; - int ifail; - - System.out.println("S14ACJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\tpsi(X)-log(X)\n"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[0]); - - ifail = -1; - S14AC s14ac = new S14AC(x, ifail); - f = s14ac.eval(); - ifail = s14ac.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("\t%.4f\t%.4f\n", x, f); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S14AFJE.java b/simple_examples/int32/S14AFJE.java deleted file mode 100644 index 9005cc1..0000000 --- a/simple_examples/int32/S14AFJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.S.S14AF; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14AFJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14AFJE{ - - /** - * S14AFJ Example main program - */ - public static void main(String[] args){ - NAGComplex y, z; - int ifail, k; - - //Tell the wrapper the type of complex being used before calling a routine - Routine.setComplex(new NAGComplex()); - - y = new NAGComplex(); - z = new NAGComplex(); - - System.out.println("S14AFJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); - - System.out.println(); - System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); - System.out.println(); - - //loop until break... - while(true){ - line = reader.readLine(); - - //end of file reached - if(line == null){ - break; - } - - String[] sVal = line.split("\\s+"); - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - k = Integer.parseInt(sVal[2]); - - ifail = -1; - S14AF s14af = new S14AF(z, k, ifail); - y = (NAGComplex) s14af.eval(); - ifail = s14af.getIFAIL(); - - //ifail < 0 => error - if(ifail < 0){ - break; - } - System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/int32/S17DCJE.java b/simple_examples/int32/S17DCJE.java deleted file mode 100644 index ba01290..0000000 --- a/simple_examples/int32/S17DCJE.java +++ /dev/null @@ -1,69 +0,0 @@ -import com.nag.routines.S.S17DC; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class S17DCJE{ - private static int n = 2; - - public static void main(String[] args){ - double fnu; - int ifail, nz = 0; - String scal; - NAGComplex z; - NAGComplex[] cwrk, cy; - - z = new NAGComplex(); - //initiate complex arrays like this to save looping through and doing it manually by looping through - cwrk = NAGComplex.createArray(n); - cy = NAGComplex.createArray(n); - - System.out.println("S17DCF Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - System.out.println(); - System.out.printf("Calling with N = %d\n", n); - System.out.println(); - System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - fnu = Double.parseDouble(sVal[0]); - z.setRe(Double.parseDouble(sVal[1])); - z.setIm(Double.parseDouble(sVal[2])); - scal = sVal[3].substring(1,2); - - ifail = 0; - S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); - s17dc.eval(); - - System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/int32/S17DGJE.java b/simple_examples/int32/S17DGJE.java deleted file mode 100644 index b93c9e0..0000000 --- a/simple_examples/int32/S17DGJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.S.S17DG; -import com.nag.types.NAGComplex; -import java.io.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * S17DG example program text. - */ -public class S17DGJE { - - public static void main(String[] args) throws Exception { - String deriv,scal; - int ifail = 1; - NAGComplex z,ai; - int nz = -1; - z = new NAGComplex(); - ai = new NAGComplex(); - ai.setRe(Double.NaN); - ai.setIm(Double.NaN); - - System.out.println(" S17DGJ Example Program Results"); - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - System.out.println(); - System.out.println(" DERIV Z SCAL AI NZ"); - System.out.println(); - String line = dataIn.readLine(); - Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," - + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); - Matcher m; - S17DG s17dg = new S17DG(); - while (line != null) { - m = linePatt.matcher(line); - if (m.matches()) { - deriv = m.group(1); - z.setRe(Double.parseDouble(m.group(2))); - z.setIm(Double.parseDouble(m.group(3))); - scal = m.group(4); - ifail = 1;// SOFT AND SILENT FAILURE - s17dg.eval(deriv,z,scal,ai,nz,ifail); - if (s17dg.getIFAIL() == 0) { - System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", - s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), - s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); - } - else { - System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); - System.exit(-1); - } - } - else { - System.out.println("Can't match:\n"+line); - } - line = dataIn.readLine(); - } - - } - -} diff --git a/simple_examples/int32/S30AAJE.java b/simple_examples/int32/S30AAJE.java deleted file mode 100644 index 7e01ffe..0000000 --- a/simple_examples/int32/S30AAJE.java +++ /dev/null @@ -1,109 +0,0 @@ -import com.nag.routines.S.S30AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S30AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S30AAJE{ - - /** - * S30AAJ main program - */ - public static void main(String[] args){ - double q = 0, r = 0, s = 0, sigma = 0; - int ifail, ldp, m = 0, n = 0; - String calput = ""; //placeholders - double[] p, t, x; - - //placeholders - t = new double[0]; - x = new double[0]; - - System.out.println("S30AAJ Example Program Results"); - - //Supply file path as arugment - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - calput = sVal[0].substring(1,2); - - line = reader.readLine(); - sVal = line.split("\\s+"); - s = Double.parseDouble(sVal[0]); - sigma = Double.parseDouble(sVal[1]); - r = Double.parseDouble(sVal[2]); - q = Double.parseDouble(sVal[3]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - n = Integer.parseInt(sVal[1]); - - t = new double[n]; - x = new double[m]; - - for(int i = 0; i < m; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[0]); - } - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - t[i] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ldp = m; - p = new double[ldp * n]; - - ifail = 0; - S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); - s30aa.eval(); - - System.out.println(); - System.out.println("Black-Scholes-Merton formula"); - - if(calput.toLowerCase().equals("c")){ - System.out.println("European Call : "); - } - else if(calput.toLowerCase().equals("p")){ - System.out.println("European Put : "); - } - - System.out.printf(" Spot =\t%.4f\n", s); - System.out.printf(" Volatility =\t%.4f\n", sigma); - System.out.printf(" Rate =\t%.4f\n", r); - System.out.printf(" Dividend =\t%.4f\n", q); - - System.out.println(); - System.out.printf(" Strike\tExpiry\tOption Price\n"); - for(int i = 0; i < m; i++){ - for(int j = 0; j < n; j++){ - System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); - } - } - } -} - diff --git a/simple_examples/int32/S30ACJE.java b/simple_examples/int32/S30ACJE.java deleted file mode 100644 index 8d994dc..0000000 --- a/simple_examples/int32/S30ACJE.java +++ /dev/null @@ -1,129 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -import com.nag.routines.S.S30AC; - -/** - * S30AC example program text. - */ -public class S30ACJE { - - public static void main(String[] args) { - - int i, ifail, mode = 0, n = 0; - String calput; - - double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; - int[] ivalid = null; - - // Strings must be length expected by Fortran - calput = getBlankString(1); - - /* Header */ - System.out.println(" S30ACJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - System.out.println(); - System.out.println(" SIGMA IVALID"); - System.out.println(); - - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - calput = sVal[0].replaceAll("\'", ""); - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - mode = Integer.parseInt(sVal[1]); - - line = reader.readLine(); // skip empty line - - p = new double[n]; - k = new double[n]; - s0 = new double[n]; - t = new double[n]; - r = new double[n]; - sigma = new double[n]; - ivalid = new int[n]; - - // Read p, k, s0, t and r from data file - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - p[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - k[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - s0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - t[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - r[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find the implied volatilities, sigma - ifail = 0; - S30AC s30ac = new S30AC(); - s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); - - // Print solution - for (i = 0; i < n; i++) { - System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); - } - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } -} diff --git a/simple_examples/int32/X03AAJE.java b/simple_examples/int32/X03AAJE.java deleted file mode 100644 index b03f1ab..0000000 --- a/simple_examples/int32/X03AAJE.java +++ /dev/null @@ -1,87 +0,0 @@ -import com.nag.routines.X03.X03AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * X03AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class X03AAJE{ - - /** - * X03AAJ example main program. - */ - public static void main(String[] args){ - int n = 3; - double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder - int ifail, isizea, isizeb, istepa, istepb; - boolean sw; - double[] a, b; - - a = new double[n * n]; - b = new double[n]; - - System.out.println("X03AAF Example Program Results"); - System.out.println(); - - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //stored column wise - //a = (-2, -3, 7) - // ( 2, -5, 3) - // (-9, 1, 0) - for(int i = 0; i < n; i++){ - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < n; i++){ - String[] sVal = line.split("\\s+"); - b[i] = Double.parseDouble(sVal[i + 1]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - c1 = 1; - c2 = 0; - isizea = n; - isizeb = n; - istepa = 1; - istepb = 1; - sw = true; - - ifail = 0; - X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); - x03aa.eval(); - - //update - c1 = x03aa.getC1(); - c2 = x03aa.getC2(); - d1 = x03aa.getD1(); - d2 = x03aa.getD2(); - - System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); - } -} diff --git a/simple_examples/int32/X04CBJE.java b/simple_examples/int32/X04CBJE.java deleted file mode 100644 index fa77c3a..0000000 --- a/simple_examples/int32/X04CBJE.java +++ /dev/null @@ -1,53 +0,0 @@ -import com.nag.routines.X04.X04CB; - -/** - * X04CBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class X04CBJE{ - - /** - * X04CBJ example main program - */ - public static void main(String[] args){ - int nmax = 5, lda = nmax, ifail, indent, ncols; - double[] a; - - a = new double[lda * nmax]; - - String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; - String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; - - System.out.println("X04CBJ Example Program Results"); - System.out.println(); - - //generate an array of data - for(int i = 0; i < nmax; i++){ - for(int j = 0; j < lda; j++){ - a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); - } - } - - ncols = 80; - indent = 0; - - //Print 3 by nmax rectangular matrix with default format and integer row and column labels - ifail = 0; - X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", - clabs, ncols, indent, ifail); - x04cb.eval(); - System.out.println(); - - //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels - ifail = 0; - x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", - clabs, ncols, indent, ifail); - System.out.println(); - - //Print 3 by nmax lower triangular matrix in MATLAB format - //Row and column labelling is ignored - ifail = 0; - x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); - } -} diff --git a/simple_examples/int32/X05ABJE.java b/simple_examples/int32/X05ABJE.java deleted file mode 100644 index acb3804..0000000 --- a/simple_examples/int32/X05ABJE.java +++ /dev/null @@ -1,25 +0,0 @@ -import com.nag.routines.X05.X05AB; - -/** - * X05AB example program text. - */ -public class X05ABJE { - - public static void main(String[] args) { - - int[] itime = new int[7]; - - itime[0] = 1789; - itime[1] = 7; - itime[2] = 14; - itime[3] = 13; - itime[4] = 11; - itime[5] = 48; - itime[6] = 320; - - System.out.println(" X05ABJ Example Program Results"); - System.out.println((new X05AB(itime)).eval()); - - } - -} diff --git a/simple_examples/int64/A00AAJE.java b/simple_examples/int64/A00AAJE.java deleted file mode 100644 index 490c163..0000000 --- a/simple_examples/int64/A00AAJE.java +++ /dev/null @@ -1,14 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AA; -import com.nag.routines.Routine; - -public class A00AAJE { - - public static void main (String[] args) throws NAGBadIntegerException { - Routine.init(); - A00AA a00aa = new A00AA(); - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - } - -} diff --git a/simple_examples/int64/A00ADJE.java b/simple_examples/int64/A00ADJE.java deleted file mode 100644 index 8250321..0000000 --- a/simple_examples/int64/A00ADJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AD; -import com.nag.routines.Routine; -import java.util.Arrays; - -public class A00ADJE { - - /* Parameters */ - public static final int MSGLEN = 15; - - /** A00ADJ Example Program */ - public static void main (String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - int i; - long mkmaj, mkmin; - boolean licval; - String fcomp = getBlankString(80), hdware = getBlankString(80), - impl = getBlankString(80), opsys = getBlankString(80), - pcode = getBlankString(80), prec = getBlankString(80), - vend = getBlankString(80); - /* Local Arrays */ - int[] itime = new int[7]; - String[] msg = new String[MSGLEN]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); - - Routine.init(); - System.out.println(" A00ADJ Example Program Results\n"); - - A00AD a00ad = new A00AD(); - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - /* Print implementation details */ - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length - * - * @param len the required length of the String - * @returns a String of spaces of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/int64/C05AYJE.java b/simple_examples/int64/C05AYJE.java deleted file mode 100644 index a3bd5f1..0000000 --- a/simple_examples/int64/C05AYJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AY; -import com.nag.routines.Routine; - - -public class C05AYJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - long ifail = 0; - long[] iuser = new long[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - Routine.init(); - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch ((int)ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/int64/C05AZJE.java b/simple_examples/int64/C05AZJE.java deleted file mode 100644 index bec1b03..0000000 --- a/simple_examples/int64/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AZ; -import com.nag.routines.Routine; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class C05AZJE { - - public static void main (String[] args)throws NAGBadIntegerException{ - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - long ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - Routine.init(); - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - - if(ind == 0){ - keepOn = false; - } - else{ - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - } - - - - switch ((int)ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/int64/C05MBJE.java b/simple_examples/int64/C05MBJE.java deleted file mode 100644 index 08dd454..0000000 --- a/simple_examples/int64/C05MBJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ Example Program Text - * @author joed - * @since 27.0 - */ - /* ** There have been at least 200*(n+1) calls to fcn. - ** Consider restarting the calculation from the point held in x. - ** ABNORMAL EXIT from NAG Library routine - ** NAG soft failure - control returned -*/ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ Example Main Program - */ - public static void main(String[] args) throws NAGBadIntegerException { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - long astart, ifail, m; - int i; - double[] fvec, x; - double[] ruser = new double[1]; - long[] iuser = new long[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Initialise NAG for Java - Routine.init(); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail==0 || ifail==8 || ifail==9) { - if (ifail==0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/int64/C05QBJE.java b/simple_examples/int64/C05QBJE.java deleted file mode 100644 index d7a6435..0000000 --- a/simple_examples/int64/C05QBJE.java +++ /dev/null @@ -1,178 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; - -/** - * - * @author ludovic - */ -public class C05QBJE { - - /** - * @param args the command line arguments - */ - public static void main(String[] args) throws NAGBadIntegerException { - try { - Routine.init(); - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - long[] IUSER = new long[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = (int)c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - - break; - } - - } catch (NAGBadIntegerException ex) { - System.err.println("Something went wrong!\n" + ex.getMessage()); - } - - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private long N, IFLAG; - private double[] X, FVEC, RUSER; - private long[] IUSER; - - //@Override - public void setN(long N) { - this.N = N; - } - - //@Override - public long getN() { - return N; - } - - //@Override - public void setX(double[] X) { - this.X = X; - } - - //@Override - public double[] getX() { - return X; - } - - //@Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - //@Override - public double[] getFVEC() { - return FVEC; - } - - //@Override - public void setIUSER(long[] IUSER) { - this.IUSER = IUSER; - } - - //@Override - public long[] getIUSER() { - return IUSER; - } - - //@Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - //@Override - public double[] getRUSER() { - return RUSER; - } - - //@Override - public void setIFLAG(long IFLAG) { - this.IFLAG = IFLAG; - } - - //@Override - public long getIFLAG() { - return IFLAG; - } - - //@Override - public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class D01BDJE_FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - - } - -} diff --git a/simple_examples/int64/D02NEJE.java b/simple_examples/int64/D02NEJE.java deleted file mode 100644 index b32ae64..0000000 --- a/simple_examples/int64/D02NEJE.java +++ /dev/null @@ -1,393 +0,0 @@ -import java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; - - -/** - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) throws NAGBadIntegerException { - - // Initialise wrappers - Routine.init(); - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - long ifail, itask, maxord, ijac, itol, licom, neq, lcom; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - long ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - * Fortran array definition: - * a(dimX, *) - * - * Conversion: - * a(x, y) --> A[result] - */ - private static long getIdx(long x, long y, long dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - long neq, long ml, long mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - long md, ms, pd_dim1; - - pd_dim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; - pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[(int)getIdx(md, 3, pd_dim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; - pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; - pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - long neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/int64/DTFSMJE.java b/simple_examples/int64/DTFSMJE.java deleted file mode 100644 index d1feabb..0000000 --- a/simple_examples/int64/DTFSMJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * Adapted from f06wbfe.f90 - * - * @author joed - * - */ -public class DTFSMJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - double alpha = 4.21; - long ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - - // Init NAG Java - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - Routine.init(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[(int)(m*m)]; - for (int i=0; i=i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[((int)(m*(m+1)))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/int64/E01DAJE.java b/simple_examples/int64/E01DAJE.java deleted file mode 100644 index 89a89e4..0000000 --- a/simple_examples/int64/E01DAJE.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * E01DA Example Program - NAG Copyright 2016 - */ - import com.nag.exceptions.NAGBadIntegerException; - import com.nag.routines.E01.E01DA; - import com.nag.routines.E02.E02DF; - import com.nag.routines.Routine; - -public class E01DAJE { - - public static void main (String[] args)throws NAGBadIntegerException { - Routine.init(); - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = (int)e01da.getIFAIL(); - switch (ifail) - { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) - { - if (i <= mx) - System.out.printf("%4d %9.4f", i+1, lamda[i]); - else - System.out.printf(" "); - if (i <= my) - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - else - System.out.printf("\n"); - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) - { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) - System.out.printf("\n"); - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = (int)e01da.getPX(); - py = (int)e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px,4*ny+py); - if (4*nx+px>4*ny+py) - liwrk = ny + py - 4; - else - liwrk = nx + px - 4; - double tx[] = new double[nx]; - double ty[] = new double[ny]; - double ff[] = new double[nx*ny]; - wrk = new double[lwrk]; - long iwrk[] = new long[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new long[(int)(datafile.n + datafile.nclin)]; - ax = new double[(int)Math.max(1, datafile.nclin)]; - iwork = new long[(int)liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[(int)(datafile.n + datafile.nclin)]; - work = new double[(int)lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[(int)lcwsav]; - cwsav[0] = " "; - long[] iwsav = new long[(int)liwsav]; - boolean[] lwsav = new boolean[(int)llwsav]; - double[] rwsav = new double[(int)lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - long[] iuser = new long[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - - super.eval(); - - } - - } - - public static class DataFile { - - public String filename; - public long n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } else { - sda = 1; - - } - ldh = n; - - cvec = new double[(int)n]; - a = new double[(int)(lda * sda)]; - bl = new double[(int)(n + nclin)]; - bu = new double[(int)(n + nclin)]; - x = new double[(int)n]; - h = new double[(int)(ldh * n)]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/int64/E04UCJE.java b/simple_examples/int64/E04UCJE.java deleted file mode 100644 index 20ad573..0000000 --- a/simple_examples/int64/E04UCJE.java +++ /dev/null @@ -1,207 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.Routine; -import java.util.Arrays; - -/** - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - double objf; - long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; - long[] istate, iwork; - long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; - boolean[] lwsav = new boolean[(int)LLWSAV]; - String[] cwsav = new String[(int)LCWSAV]; - Arrays.fill(cwsav, " "); - - System.out.println(" E04UCJ Example Program Results"); - Routine.init(); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new long[(int)(n + nclin + ncnln)]; - iwork = new long[(int)liwork]; - c = new double[(int)(Math.max(1, ncnln))]; - cjac = new double[(int)(ldcj * sdcjac)]; - clamda = new double[(int)(n + nclin + ncnln)]; - objgrd = new double[(int)n]; - r = new double[(int)(ldr * n)]; - work = new double[(int)lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[(int)LDCJ] = X[1] + X[1]; - CJAC[(int)(2*LDCJ)] = X[2] + X[2]; - CJAC[(int)(3*LDCJ)] = X[3] + X[3]; - } - - } - - if (NEEDC[1]>0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; - CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; - CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/int64/F02EKJE.java b/simple_examples/int64/F02EKJE.java deleted file mode 100644 index d8f152c..0000000 --- a/simple_examples/int64/F02EKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -emacimport java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.Routine; -import com.nag.types.*; - - -/** - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) throws NAGBadIntegerException { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - // Initialise wrapper library - Routine.init(); - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval ( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW(){ - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/source/int32/A00AAJE.java b/simple_examples/source/int32/A00AAJE.java deleted file mode 100644 index 65b6c18..0000000 --- a/simple_examples/source/int32/A00AAJE.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.nag.routines.A00.A00AA; - -/** - * A00AA example program text. - */ -public class A00AAJE { - - public static void main(String[] args) { - A00AA a00aa = new A00AA(); - - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - - } - -} diff --git a/simple_examples/source/int32/A00ACJE.java b/simple_examples/source/int32/A00ACJE.java deleted file mode 100644 index 7f44ba3..0000000 --- a/simple_examples/source/int32/A00ACJE.java +++ /dev/null @@ -1,29 +0,0 @@ -import com.nag.routines.A00.A00AC; - -/** - * A00AC example program text. - * @author Mo - */ -public class A00ACJE { - - public static void main(String[] args) { - A00AC a00ac = new A00AC(); - boolean lmok; - - System.out.println(" A00ACJ Example Program Results\n"); - System.out.println(); - - a00ac.eval(); - - lmok = a00ac.eval(); - - if (lmok) { - System.out.println("A valid licence key is available"); - } - else { - System.out.println("No valid licence key was found"); - } - - } - -} diff --git a/simple_examples/source/int32/A00ADJE.java b/simple_examples/source/int32/A00ADJE.java deleted file mode 100644 index 139c8b9..0000000 --- a/simple_examples/source/int32/A00ADJE.java +++ /dev/null @@ -1,107 +0,0 @@ -import com.nag.routines.A00.A00AD; -import com.nag.routines.X05.X05AA; -import java.util.Arrays; - -/** - * A00AD example program text. - */ -public class A00ADJE { - - public static void main(String[] args) { - - A00AD a00ad = new A00AD(); - X05AA x05aa = new X05AA(); - int i, mkmaj, mkmin; - boolean licval; - String fcomp, hdware, impl, opsys, pcode, prec, vend; - int[] itime = new int[7]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - - System.out.println(" A00ADJ Example Program Results\n"); - - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - - // Output scalars must be retrieved manually - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - // Print implementation details - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/source/int32/C02AAJE.java b/simple_examples/source/int32/C02AAJE.java deleted file mode 100644 index 1abc528..0000000 --- a/simple_examples/source/int32/C02AAJE.java +++ /dev/null @@ -1,174 +0,0 @@ -import com.nag.routines.C02.C02AA; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.types.NAGComplex; -import java.util.Arrays; - -/** - * C02AA example program text. - * @author joed - * @since 27.1.0.0 - */ -public class C02AAJE { - - public static void main(String[] args) { - - System.out.println(" C02AAJ Example Program Results"); - - Routine.setComplex(new NAGComplex()); - exampleBasic(); - examplePolishing(); - - System.out.println(); - - } - - /** Demonstrate a basic problem. */ - public static void exampleBasic() { - - C02AA c02aa = new C02AA(); - int ifail, itmax, n, polish; - NAGComplex[] a, z; - double[] berr, cond; - int[] conv; - - System.out.println(); - System.out.println("Example 1: Basic Problem"); - System.out.println(); - - // Set polynomial degree and instantiate arrays - n = 5; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Set polynomial coefficients - a[0] = new NAGComplex(5.0, 6.0); - a[1] = new NAGComplex(30.0, 20.0); - a[2] = new NAGComplex(-0.2, -6.0); - a[3] = new NAGComplex(50.0, 100000.0); - a[4] = new NAGComplex(-2.0, 40.0); - a[5] = new NAGComplex(10.0, 1.0); - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond "); - System.out.println(" ---------------------------------------------------"); - for (int i = 0; i < n; i++) { - System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, - z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - - } - - /** Compare polishing processes on a Wilkinson-style polynomial. */ - public static void examplePolishing() { - - C02AA c02aa = new C02AA(); - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - NAGComplex pz; - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int ifail, itmax, k, n, polish; - NAGComplex[] a, z, zact; - double[] berr, cond; - int[] conv; - boolean[] matched; - - System.out.println(); - System.out.println("Example 2: Polishing Processes"); - System.out.println(); - - // Set polynomial degree and instantiate - n = 10; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = new NAGComplex[n]; - zact = new NAGComplex[n]; - - // Set known roots and (instantiate z) - for (int i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) i+1, 0.0); - z[i] = new NAGComplex(); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (int i = 0; i < n; i++) { - a[i] = new NAGComplex(); - } - a[n] = new NAGComplex(1.0, 0.0); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - a[j] = a[j+1].subtract(a[j].multiply(zact[i])); - } - a[n] = a[n].negate().multiply(zact[i]); - } - - System.out.println(" polish relerr fwderr "); - System.out.println(" ----------------------------"); - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - for (polish = 0; polish <= 2; polish++) { - - // Find roots - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - /* Calculate the maximum relative errors of the roots, and the maximum - * forward error evaluating the polynomial at those roots. Errors are - * capped at machine precision. */ - maxrelerr = maxfwderr = eps; - Arrays.fill(matched, false); - - for (int i = 0; i < n; i++) { - - // Evaluate polynomial at this root - pz = a[0].clone(); - for (int j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(a[j]); - } - - // Match to an expected root - k = 0; - err = rmax; - for (int j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - - } - -} diff --git a/simple_examples/source/int32/C02ABJE.java b/simple_examples/source/int32/C02ABJE.java deleted file mode 100644 index fad5ebb..0000000 --- a/simple_examples/source/int32/C02ABJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.C02.C02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AB - */ -public class C02ABJE { - - public static void main(String[] args) { - - final boolean polish_example = false; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" C02ABJ Example Program Results"); - - ex1_basic(args); - if (polish_example) { - ex2_polishing(args); - } - } - - public static void ex1_basic(String[] args) { - - int i, ifail, itmax, n = 0, polish; - - NAGComplex[] z = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - - System.out.println("\n Basic Problem\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - String line = reader.readLine(); - line = reader.readLine(); - line = reader.readLine(); - - // Read polynomial degree and allocate - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Read polynomial coefficients - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[i] = Double.parseDouble(sVal[0]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond"); - System.out.println(" -----------------------------------------------------"); - for (i = 0; i < n; i++) { - System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - } - - public static void ex2_polishing(String[] args) { - NAGComplex pz = new NAGComplex(); - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int i, ifail, itmax, j, k, n = 0, polish; - - NAGComplex[] z = null, zact = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - boolean[] matched = null; - - System.out.println("\n Polishing Processes\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i <= 12; i++) { - reader.readLine(); - } - - // Read polynomial degree and allocate - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = NAGComplex.createArray(n); - zact = NAGComplex.createArray(n); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Set known roots - for (i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) (i + 1), 0.0); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (i = 0; i < n; i++) { - a[i] = 0.0; - } - a[n] = 1.0; - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - a[j] = a[j + 1] - a[j] * zact[i].getRe(); - } - a[n] = -a[n] * zact[i].getRe(); - } - - System.out.println(" polish relerr fwderr"); - System.out.println(" ----------------------------"); - - // Use different polish modes - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - for (polish = 0; polish <= 2; polish++) { - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - // Find roots - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); - - // Calculate the maximum relative errors of the roots, and the maximum - // forward error evaluating the polynomial at those roots. Errors are - // capped at machine precision. - maxrelerr = eps; - maxfwderr = eps; - Arrays.fill(matched, false); - - for (i = 0; i < n; i++) { - // Evaluate polynomial at this root - pz = new NAGComplex(a[0], 0.0); - for (j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); - } - - // Match to an expected root - k = 0; - err = rmax; - for (j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - } -} diff --git a/simple_examples/source/int32/C02AFJE.java b/simple_examples/source/int32/C02AFJE.java deleted file mode 100644 index 6043be7..0000000 --- a/simple_examples/source/int32/C02AFJE.java +++ /dev/null @@ -1,271 +0,0 @@ -import com.nag.routines.C02.C02AF; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AF - */ -public class C02AFJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AFJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - - int i, ifail, n = 0; - - double[][] a = null, z = null; - double[] w = null; - - System.out.println("\n\n Example 1"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[2][n + 1]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); - } - - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[][] a = null, abar = null, z = null, zbar = null; - double[] r = null, w = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 12; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[2][n + 1]; - abar = new double[2][n + 1]; - r = new double[n]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar = 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[0][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[0][i] = f * a[0][i]; - - if (a[1][i] != 0.0E0) { - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - - } else { - - if (a[1][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] abar1d = convert2DTo1D(abar); - double[] zbar1d = convert2DTo1D(zbar); - c02af.eval(abar1d, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][j], zbar[1][j]); - deltac = Math.abs(r1 - r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0E0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j*n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; - } - } - - return b; - } -} diff --git a/simple_examples/source/int32/C02AGJE.java b/simple_examples/source/int32/C02AGJE.java deleted file mode 100644 index c58e524..0000000 --- a/simple_examples/source/int32/C02AGJE.java +++ /dev/null @@ -1,262 +0,0 @@ -import com.nag.routines.C02.C02AG; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AG - */ -public class C02AGJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AGJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - double zi, zr; - int i, ifail, n = 0, nroot; - - double[] a = null, w = null; - double[][] z = null; - - System.out.println("\n\n Example 1\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - w = new double[2 * (n + 1)]; - z = new double[2][n]; - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - nroot = 0; - - while (nroot < n) { - zr = z[0][nroot]; - zi = z[1][nroot]; - if (zi == 0.0E0) { - System.out.printf(" z = %12.4E\n", zr); - nroot += 1; - } else { - System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); - nroot += 2; - } - } - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[] a = null, abar = null, r = null, w = null; - double[][] z = null, zbar = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 7; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n+1]; - abar = new double[n+1]; - r = new double[n]; - w = new double[2 * (n+1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d ,w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar= 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[i] != 0.0) { - f = 1.0 + epsbar; - epsbar = -epsbar; - abar[i] = f * a[i]; - } else { - abar[i] = 0.0E0; - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] zbar1d = convert2DTo1D(zbar); - c02ag.eval(abar, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][i], zbar[1][i]); - deltac = Math.abs(r1-r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j * n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j * n]; - } - } - - return b; - } -} diff --git a/simple_examples/source/int32/C02AHJE.java b/simple_examples/source/int32/C02AHJE.java deleted file mode 100644 index b1e12cd..0000000 --- a/simple_examples/source/int32/C02AHJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.C02.C02AH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AH - */ -public class C02AHJE { - - public static void main(String[] args) { - - double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AHJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - ar = Double.parseDouble(sVal[0]); - ai = Double.parseDouble(sVal[1]); - br = Double.parseDouble(sVal[2]); - bi = Double.parseDouble(sVal[3]); - cr = Double.parseDouble(sVal[4]); - ci = Double.parseDouble(sVal[5]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AH c02ah = new C02AH(); - c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); - ifail = c02ah.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); - System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); - } - } -} diff --git a/simple_examples/source/int32/C02AJJE.java b/simple_examples/source/int32/C02AJJE.java deleted file mode 100644 index 64e3a5e..0000000 --- a/simple_examples/source/int32/C02AJJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C02.C02AJ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AJ - */ -public class C02AJJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AJJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - a = Double.parseDouble(sVal[0]); - b = Double.parseDouble(sVal[1]); - c = Double.parseDouble(sVal[2]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AJ c02aj = new C02AJ(); - c02aj.eval(a, b, c, zsm, zlg, ifail); - ifail = c02aj.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - - if (zsm[1] == 0.0E0) { - // 2 real roots. - System.out.printf(" z = %12.4E\n", zsm[0]); - System.out.printf(" z = %12.4E\n", zlg[0]); - } else { - // 2 complex roots. - System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); - } - } - } -} diff --git a/simple_examples/source/int32/C02AKJE.java b/simple_examples/source/int32/C02AKJE.java deleted file mode 100644 index 4a0579f..0000000 --- a/simple_examples/source/int32/C02AKJE.java +++ /dev/null @@ -1,62 +0,0 @@ -import com.nag.routines.C02.C02AK; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AK - */ -public class C02AKJE { - - public static void main(String[] args) { - - double r = 0, s = 0, t = 0, u = 0; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AKJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - u = Double.parseDouble(sVal[0]); - r = Double.parseDouble(sVal[1]); - s = Double.parseDouble(sVal[2]); - t = Double.parseDouble(sVal[3]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AK c02ak = new C02AK(); - c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/source/int32/C02ALJE.java b/simple_examples/source/int32/C02ALJE.java deleted file mode 100644 index 4f9eac9..0000000 --- a/simple_examples/source/int32/C02ALJE.java +++ /dev/null @@ -1,64 +0,0 @@ -import com.nag.routines.C02.C02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AL - */ -public class C02ALJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0, d = 0, e = 0; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ALJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - e = Double.parseDouble(sVal[0]); - a = Double.parseDouble(sVal[1]); - b = Double.parseDouble(sVal[2]); - c = Double.parseDouble(sVal[3]); - d = Double.parseDouble(sVal[4]); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AL c02al = new C02AL(); - c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02al.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/source/int32/C02AMJE.java b/simple_examples/source/int32/C02AMJE.java deleted file mode 100644 index f1fffa4..0000000 --- a/simple_examples/source/int32/C02AMJE.java +++ /dev/null @@ -1,75 +0,0 @@ -import com.nag.routines.C02.C02AM; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AM - */ -public class C02AMJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex r = null, s = null, t = null, u = null; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AMJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AM c02am = new C02AM(); - c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/source/int32/C02ANJE.java b/simple_examples/source/int32/C02ANJE.java deleted file mode 100644 index dc865e2..0000000 --- a/simple_examples/source/int32/C02ANJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.C02.C02AN; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AN - */ -public class C02ANJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex a = null, b = null, c = null, d = null, e = null; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ANJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AN c02an = new C02AN(); - c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02an.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/source/int32/C05AUJE.java b/simple_examples/source/int32/C05AUJE.java deleted file mode 100644 index d2b09b1..0000000 --- a/simple_examples/source/int32/C05AUJE.java +++ /dev/null @@ -1,67 +0,0 @@ -import com.nag.routines.C05.C05AU; - -/** - * C05AUJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05AUJE{ - - /** - * C05AUJ main program - */ - public static void main(String[] args){ - double a = 0, b = 0, eps, eta, h, x; //placeholders - int ifail; - double[] ruser; - int[] iuser; - - ruser = new double[1]; //need to initialise before passing to wrapper - iuser = new int[1]; - - System.out.println("C05AUJ Example Program Results"); - - x = 1; - h = 0.1; - eps = 0.00001; - eta = 0; - - //Instance of class f to pass to wrapper - f f1 = new f(); - - ifail = -1; - C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); - c05au.eval(); - - //update values - x = c05au.getX(); - a = c05au.getA(); - b = c05au.getB(); - ifail = c05au.getIFAIL(); - - System.out.println(); - - switch(ifail){ - case 0: - System.out.printf("Root is : \t%.5f\n", x); - System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); - break; - case 3: - case 4: - System.out.printf("Final value = %.5f\n", x); - break; - } - } - - /** - * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. - * eval() must be implemented by the user. - * @return x - e^x - */ - public static class f extends C05AU.Abstract_C05AU_F{ - public double eval(){ - return(this.X - Math.exp(-this.X)); - } - } -} - diff --git a/simple_examples/source/int32/C05AWJE.java b/simple_examples/source/int32/C05AWJE.java deleted file mode 100644 index 6ea3c9f..0000000 --- a/simple_examples/source/int32/C05AWJE.java +++ /dev/null @@ -1,59 +0,0 @@ -import com.nag.routines.C05.C05AW; - -public class C05AWJE{ - - public static void main(String[] args){ - double eps, eta, x; - int ifail, nfmax; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("C05AWJ Example Program Results"); - System.out.println(); - - boolean finished = false; - for(int i = 3; i <= 4; i++){ - eps = Math.pow(10, -i); - x = 1; - eta = 0; - nfmax = 200; - - ifail = -1; - f f1 = new f(); - C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); - c05aw.eval(); - - ifail = c05aw.getIFAIL(); - x = c05aw.getX(); - eps = c05aw.getEPS(); - - switch(ifail){ - case(0): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - case(-1): - //exit loop - finished = true; - break; - case(3): - case(4): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - } - if(finished){ - break; - } - } - } - - public static class f extends C05AW.Abstract_C05AW_F{ - public double eval(){ - return(Math.exp(-X) - X); - } - } -} - - diff --git a/simple_examples/source/int32/C05AYJE.java b/simple_examples/source/int32/C05AYJE.java deleted file mode 100644 index c9ee43b..0000000 --- a/simple_examples/source/int32/C05AYJE.java +++ /dev/null @@ -1,44 +0,0 @@ -import com.nag.routines.C05.C05AY; - -/** - * C05AY example program text. - */ -public class C05AYJE { - - public static void main(String[] args) { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - int ifail = 0; - int[] iuser = new int[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch (ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/source/int32/C05AZJE.java b/simple_examples/source/int32/C05AZJE.java deleted file mode 100644 index 7c3e27e..0000000 --- a/simple_examples/source/int32/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C05.C05AZ; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * C05AZ example program text. - */ -public class C05AZJE { - - public static void main(String[] args) { - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - int ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - if (ind == 0) { - keepOn = false; - } - else { - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - - } - - switch (ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/source/int32/C05BBJE.java b/simple_examples/source/int32/C05BBJE.java deleted file mode 100644 index 4723773..0000000 --- a/simple_examples/source/int32/C05BBJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.C05.C05BB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C05BBJ Example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05BBJE{ - - /** - * C05BBJE main program text - */ - public static void main(String[] args){ - NAGComplex w, z; - double resid = 0; - int branch = 0, ifail = 0; //placeholder - boolean offset = false; //placeholder - - //need to initialise first - z = new NAGComplex(); - w = new NAGComplex(); - - System.out.println("C05BBJ Example Program Results"); - - if(args.length != 1){ - System.out.println("Please specify path to data file as input"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - branch = Integer.parseInt(sVal[0]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - offset = Boolean.parseBoolean(sVal[0]); - - System.out.printf("Branch = %d\n", branch); - System.out.printf("Offset = %b\n", offset); - - System.out.println(); - System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - sVal = line.split("\\s+"); - - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - - ifail = -1; - C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); - c05bb.eval(); - - z = (NAGComplex) c05bb.getZ(); - w = (NAGComplex) c05bb.getW(); - resid = c05bb.getRESID(); - ifail = c05bb.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/source/int32/C05MBJE.java b/simple_examples/source/int32/C05MBJE.java deleted file mode 100644 index 9b46ff5..0000000 --- a/simple_examples/source/int32/C05MBJE.java +++ /dev/null @@ -1,95 +0,0 @@ -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ example program text. - * - * @author joed - * @since 27.0.0.0 - * - */ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ example main program. - */ - public static void main(String[] args) { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - int astart, i, ifail, m; - double[] fvec, x; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail == 0 || ifail == 8 || ifail == 9) { - if (ifail == 0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/source/int32/C05QBJE.java b/simple_examples/source/int32/C05QBJE.java deleted file mode 100644 index 4b93405..0000000 --- a/simple_examples/source/int32/C05QBJE.java +++ /dev/null @@ -1,167 +0,0 @@ -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05QB example program text. - * @author ludovic - */ -public class C05QBJE { - - public static void main(String[] args) { - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - int[] IUSER = new int[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - } - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private int N, IFLAG; - private double[] X, FVEC, RUSER; - private int[] IUSER; - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { - - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for (int i = 1; i < N; ++i) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - for (int i = 0; i < N-1; ++i) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - } - - } - - } - -} diff --git a/simple_examples/source/int32/C06BAJE.java b/simple_examples/source/int32/C06BAJE.java deleted file mode 100644 index 541d4d3..0000000 --- a/simple_examples/source/int32/C06BAJE.java +++ /dev/null @@ -1,56 +0,0 @@ -import com.nag.routines.C06.C06BA; -import com.nag.routines.X01.X01AA; - -/** - * C06BAJ example program text. - * @author willa - */ -public class C06BAJE{ - - public static void main(String[] args){ - int lwork = 16, nout = 6; - int ifail, ncall; - double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; - double[] work; - - C06BA c06ba = new C06BA(); - work = new double[lwork]; - - System.out.println("C06BAJ Example Program Results"); - System.out.println(); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - - ans = Math.pow(pi, 2)/12.0; - ncall = 0; - sig = 1.0; - seqn = 0.0; - System.out.println("\t\t\t Estimated\t Actual"); - System.out.println("I\t SEQN \t RESULT\t abs error\t error"); - System.out.println(); - - for(int i = 0; i < 10; i++){ - r = (double) i + 1; - seqn = seqn + sig/Math.pow(r, 2); - - ifail = 0; - c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); - - //update variables - ncall = c06ba.getNCALL(); - result = c06ba.getRESULT(); - abserr = c06ba.getABSERR(); - - error = result - ans; - sig = -sig; - - if(i <= 2){ - System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); - } - else{ - System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); - } - } - } -} diff --git a/simple_examples/source/int32/C06FKJE.java b/simple_examples/source/int32/C06FKJE.java deleted file mode 100644 index 58db62f..0000000 --- a/simple_examples/source/int32/C06FKJE.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.nag.routines.C06.C06FK; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C06FKJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class C06FKJE{ - - /** - * C06FKJE main program - */ - public static void main(String[] args){ - int ifail = 0, n = 0; //placeholder - double[] work, xa, xb, ya, yb; - - work = new double[0]; - xa = new double[0]; - xb = new double[0]; - ya = new double[0]; - yb = new double[0]; //placeholders - - System.out.println("C06FKJ Example Program Results"); - System.out.println(); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - //Break when the end of the file is reached - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - work = new double[n]; - xa = new double[n]; - xb = new double[n]; - ya = new double[n]; - yb = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - xa[i] = Double.parseDouble(sVal[0]); - xb[i] = xa[i]; - ya[i] = Double.parseDouble(sVal[1]); - yb[i] = ya[i]; - } - - ifail = 0; - - C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); - c06fk1.eval(); - xa = c06fk1.getX(); - C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); - c06fk2.eval(); - xb = c06fk2.getX(); - - System.out.printf("\tCovolution \tCorrelation\n"); - System.out.println(); - - for(int i = 0; i < n; i++){ - System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/source/int32/C09AAJE.java b/simple_examples/source/int32/C09AAJE.java deleted file mode 100644 index 48c38b6..0000000 --- a/simple_examples/source/int32/C09AAJE.java +++ /dev/null @@ -1,158 +0,0 @@ -import com.nag.routines.C09.C09AA; -import com.nag.routines.C09.C09CC; -import com.nag.routines.C09.C09CD; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C09AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C09AAJE{ - - /** - * C09AAJ example main program - */ - public static void main(String[] args){ - int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders - String mode = "", wavnam = "", wtrans; //placeholders - int[] dwtlev, icomm; - double[] c, x, y; - - x = new double[0]; y = new double[0]; //placeholders - - //print error message if no data file given - if(args.length != 1){ - C09AAJE.usage(); - } - - icomm = new int[100]; - - System.out.println("C09AAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - wavnam = sVal[1]; - mode = sVal[2]; - - x = new double[n]; - y = new double[n]; - - System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); - - System.out.println("Input data \tX : "); - for(int i = 0; i < n; i++){ - line = reader.readLine(); - //Avoid errors with data file format and negative numbers - line = " " + line; - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - System.out.printf("%.3f\t", x[i]); - } - System.out.printf("\n"); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //Query wavelet filter dimensions - //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' - wtrans = "Multilevel"; - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); - c09aa.eval(); - - nwc = c09aa.getNWC(); - nwlmax = c09aa.getNWLMAX(); - lenc = nwc; - c = new double[lenc]; - dwtlev = new int[nwlmax + 1]; - - icomm = c09aa.getICOMM(); - ifail = 0; - //Perform discrete wavelet transform - C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); - c09cc.eval(); - - nf = c09aa.getNF(); - nwlmax = c09cc.getNWL(); - dwtlev = c09cc.getDWTLEV(); - c = c09cc.getC(); - - System.out.println(); - System.out.printf("Length of wavelet filter : \t%d\n", nf); - System.out.printf("Number of Levels : \t%d\n", nwlmax); - System.out.printf("Number of coefficients in each level: \n\t\t"); - for(int i = 0; i <= nwlmax; i++){ - System.out.printf("%d\t ", dwtlev[i]); - } - System.out.printf("\n"); - System.out.printf("Total number of wavelength coefficients : %d\n", nwc); - nnz = arraySum(dwtlev); - System.out.println(); - System.out.println("Wavelet coefficients C:"); - for(int i = 0; i < nnz; i++){ - System.out.printf("%.3f ", c[i]); - } - System.out.printf("\n"); - - //Reconstruct original data - ny = n; - - ifail = 0; - lenc = c09cc.getLENC(); - icomm = c09cc.getICOMM(); - C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); - c09cd.eval(); - - y = c09cd.getY(); - System.out.println(); - System.out.printf("Reconstruction \tY : \n"); - for(int i = 0; i < ny; i++){ - System.out.printf("%.3f ", y[i]); - } - System.out.printf("\n"); - } - - /** - * Finds the sum of all integers in an array - * @param a - * Array to sum - * @return total - */ - private static int arraySum(int[] a){ - int tot = 0; - for(int i = 0; i < a.length; i++){ - tot += a[i]; - } - return tot; - } - - /** - * No arguments supplied when exmaple runs - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/source/int32/D01BDJE.java b/simple_examples/source/int32/D01BDJE.java deleted file mode 100644 index 8659cc4..0000000 --- a/simple_examples/source/int32/D01BDJE.java +++ /dev/null @@ -1,58 +0,0 @@ -import com.nag.routines.D01.D01BD; - -/** - * D01BD example program text. - */ -public class D01BDJE { - - public static void main(String[] args) { - - double a = 0.0, b = 1.0; - double epsabs = 0.0, epsrel = 0.0001; - double result = Double.NaN; - double abserr = Double.NaN; - FUN fun = new FUN(); - D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); - - d01bd.eval(); - result = d01bd.getRESULT(); - abserr = d01bd.getABSERR(); - - System.out.println(" D01BDJ Example Program Results"); - - System.out.println(); - System.out.printf(" A - lower limit of integration = %10.4f\n",a); - System.out.printf(" B - upper limit of integration = %10.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.println(); - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.println(); - - if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - } - -} diff --git a/simple_examples/source/int32/D01RJJE.java b/simple_examples/source/int32/D01RJJE.java deleted file mode 100644 index 9eee98a..0000000 --- a/simple_examples/source/int32/D01RJJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.D01.D01RJ; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RJ example program text. - * @author Mo - */ -public class D01RJJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RJJ Example Program Results"); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - /* pass constant to f through ruser */ - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RJ d01rj = new D01RJ(); - ifail = -1; - d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rj.getRESULT(); - abserr = d01rj.getABSERR(); - ifail = d01rj.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); - System.out.println(); - } - - } - - } - - public static class F implements D01RJ.D01RJ_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int i = 0; i < NX; i++) { - if (X[i] == 1.0) { - /* An undefined result will be generated. */ - /* Set iflag to force an immediate exit */ - IFLAG = -1; - /* Store chosen value of iflag in iuser */ - IUSER[0] = IFLAG; - } - } - if (IFLAG != -1) { - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j])/ - Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/source/int32/D01RKJE.java b/simple_examples/source/int32/D01RKJE.java deleted file mode 100644 index 20c0501..0000000 --- a/simple_examples/source/int32/D01RKJE.java +++ /dev/null @@ -1,173 +0,0 @@ -import com.nag.routines.D01.D01RK; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RK example program text. - * @author Mo - */ -public class D01RKJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, key, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RKJ Example Program Results"); - - key = 6; - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RK d01rk = new D01RK(); - ifail = -1; - d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rk.getRESULT(); - abserr = d01rk.getABSERR(); - ifail = d01rk.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RK.D01RK_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); - } - return; - - } - - } - -} diff --git a/simple_examples/source/int32/D01RLJE.java b/simple_examples/source/int32/D01RLJE.java deleted file mode 100644 index c8a6d0e..0000000 --- a/simple_examples/source/int32/D01RLJE.java +++ /dev/null @@ -1,196 +0,0 @@ -import com.nag.routines.D01.D01RL; -import java.util.Arrays; - -/** - * D01RL example program text. - * @author Mo - */ -public class D01RLJE { - - public static void main(String[] args) { - - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] points, rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub, npts; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RLJ Example Program Results"); - - epsabs = 0.0; - epsrel = 0.0001; - a = 0.0; - b = 1.0; - npts = 1; - maxsub = 20; - liinfo = 2*Math.max(maxsub,npts) + npts + 4; - lrinfo = 4*Math.max(maxsub,npts) + npts + 6; - - points = new double[npts]; - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[21]; - - points[0] = 1.0/7.0; - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RL d01rl = new D01RL(); - ifail = -1; - d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - points = d01rl.getPOINTS(); - result = d01rl.getRESULT(); - abserr = d01rl.getABSERR(); - ifail = d01rl.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F"); - System.out.println(); - } - - } - - } - - public static class F implements D01RL.D01RL_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - /*for (int i = 0; i < NX; i++) {*/ - /*FV[i] = 0.0;*/ - /*}*/ - - for (int i = 0; i < NX; i++) { - FV[i] = Math.abs(X[i] - 1.0/7.0); - } - - for (int i = 0; i < NX; i++) { - if (FV[i] == 0.0) { - /* A singular point will be hit. */ - /* Record offending abscissae and abort computation. */ - IFLAG = 0; - for (int k = 0; k < NX; k++) { - if (FV[k] == 0.0) { - IFLAG = IFLAG + 1; - RUSER[IFLAG-1] = X[k]; - } - } - /* Store value of iflag in iuser */ - IUSER[0] = IFLAG; - /* signal abort by setting iflag<0 */ - IFLAG = -IFLAG; - } - } - if (IFLAG == 0) { - /* Safe to evaluate. */ - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/Math.sqrt(FV[j]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/source/int32/D01RMJE.java b/simple_examples/source/int32/D01RMJE.java deleted file mode 100644 index 6e80b2b..0000000 --- a/simple_examples/source/int32/D01RMJE.java +++ /dev/null @@ -1,163 +0,0 @@ -import com.nag.routines.D01.D01RM; -import java.util.Arrays; - -/** - * D01RM example program text. - * @author Mo - */ -public class D01RMJE { - - public static void main(String[] args) { - - double bound, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, inf, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RMJ Example Program Results"); - - bound = 0.0; - inf = 1; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RM d01rm = new D01RM(); - ifail = -1; - d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rm.getRESULT(); - abserr = d01rm.getABSERR(); - ifail = d01rm.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",bound); - System.out.println(" B - upper limit of integration = infinity\n"); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RM.D01RM_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); - } - return; - - } - - } - -} diff --git a/simple_examples/source/int32/D01TCJE.java b/simple_examples/source/int32/D01TCJE.java deleted file mode 100644 index cde8428..0000000 --- a/simple_examples/source/int32/D01TCJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.routines.D01.D01TC; -import java.util.Arrays; - -/** - * D01TC example program text. - * @author Mo - */ -public class D01TCJE { - - public static void main(String[] args) { - - double a, b, c, d; - double[] abscis, weight; - int n, ifail, itype; - - /* Header */ - System.out.println(" D01TCJ Example Program Results"); - - n = 7; - a = 0.0; - b = 1.0; - c = 0.0; - d = 0.0; - itype = -3; - - abscis = new double[n]; - weight = new double[n]; - - D01TC d01tc = new D01TC(); - ifail = 0; - d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); - abscis= d01tc.getABSCIS(); - weight = d01tc.getWEIGHT(); - - System.out.println(); - System.out.printf(" Laguerre formula, %2d points\n",n); - System.out.println(); - System.out.println(" Abscissae Weights\n"); - for (int j = 0; j < n; j++) { - System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); - } - - } - -} diff --git a/simple_examples/source/int32/D02NEJE.java b/simple_examples/source/int32/D02NEJE.java deleted file mode 100644 index 34a5b25..0000000 --- a/simple_examples/source/int32/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/source/int32/D02TLJE.java b/simple_examples/source/int32/D02TLJE.java deleted file mode 100644 index 601b3ce..0000000 --- a/simple_examples/source/int32/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/source/int32/D03PCJE.java b/simple_examples/source/int32/D03PCJE.java deleted file mode 100644 index 4901e2e..0000000 --- a/simple_examples/source/int32/D03PCJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.D03.D03PC; -import com.nag.routines.D03.D03PZ; -import com.nag.routines.X01.X01AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.StringBuilder; - -/** - * D03PCJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D03PCJE{ - - /** - * D03PCJE main program - */ - public static void main(String[] args){ - int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; - double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; - int[] isave, iuser, iwsav; - double[] rsave, u, uout, x, xout, ruser, rwsav; - boolean[] lwsav; - String[] cwsav; - - xout = new double[0]; // placeholders - ruser = new double[1]; - rwsav = new double[1100]; - iuser = new int[1]; - iwsav = new int[505]; - lwsav = new boolean[100]; - cwsav = new String[10]; - - System.out.println("D03PCJ Example Program Results"); - - //Specify path to data file - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - intpts = Integer.parseInt(sVal[0]); - npts = Integer.parseInt(sVal[1]); - itype = Integer.parseInt(sVal[2]); - - xout = new double[intpts]; - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < intpts; i++){ - xout[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.split("\\s+"); - acc = Double.parseDouble(sVal[0]); - alpha = Double.parseDouble(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - itrace = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - ts = Double.parseDouble(sVal[0]); - tout = Double.parseDouble(sVal[1]); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - neqn = npde * npts; - lisave = neqn + 24; - nwk = (10 + (6 * npde)) * neqn; - lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; - - rsave = new double[lrsave]; - u = new double[npde * npts]; - uout = new double[npde * intpts * itype]; - x = new double[npts]; - isave = new int[lisave]; - ruser[0] = alpha; - ind = 0; - itask = 1; - - X01AA x01aa = new X01AA(); - pi = x01aa.eval(); - piby2 = 0.5 * pi; - hx = piby2/(double)(npts - 1); - x[0] = 0.0; - x[npts - 1] = 1.0; - for(int i = 1; i < (npts - 1); i++){ - x[i] = Math.sin(hx * (double)(i)); - } - - u = uinit(x, npts, iuser, ruser); - - //Character (80) :: cwsav(10) - //Surely a better way of doing this? - for(int i = 0; i < 10; i++){ - StringBuilder builder = new StringBuilder(""); - for(int j = 0; j < 80; j++){ - builder.append(" "); - } - cwsav[i] = builder.toString(); - } - - for(int i = 0; i <5; i++){ - tout = 10 * tout; - - ifail = 0; - pdedef pdedef1 = new pdedef(); - bndary bndary1 = new bndary(); - D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, - isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, - rwsav, ifail); - d03pc.eval(); - - //update ind - ind = d03pc.getIND(); - - if(i == 0){ - System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); - System.out.printf("T / X "); - for(int j = 0; j < xout.length; j++){ - System.out.printf("\t%.4f", xout[j]); - } - System.out.printf("\n"); - } - System.out.println(); - - //Interpolate at required spatial points - ifail = 0; - - D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); - d03pz.eval(); - - System.out.printf("%.4f \tU(1)", tout); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2]); - } - System.out.printf("\n"); - System.out.printf("\tU(2)"); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2 + 1]); - } - System.out.printf("\n"); - System.out.println(); - } - - System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); - System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); - System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); - System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); - } - - /** - * PDE initial condition - */ - public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ - double alpha = ruser[0]; - double[] u = new double[2 * npts]; - for(int i = 0; i < npts; i++){ - u[2 * i] = 2 * alpha * x[i]; - u[(2 * i) + 1] = 1; - } - return u; - } - - public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ - public void eval(){ - double alpha = this.RUSER[0]; - this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); - this.Q[1] = 0; - this.R[0] = this.X * this.UX[0]; - this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); - this.P[0] = 0; - this.P[1] = 0; - this.P[2] = 0; - this.P[3] = 1 - (this.X * this.X); - } - } - - public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ - public void eval(){ - if(this.IBND == 0){ - this.BETA[0] = 0; - this.BETA[1] = 1; - this.GAMMA[0] = this.U[0]; - this.GAMMA[1] = -this.U[0] * this.U[1]; - } - else{ - this.BETA[0] = 1; - this.BETA[1] = 0; - this.GAMMA[0] = -this.U[0]; - this.GAMMA[1] = this.U[1]; - } - } - } - -} - - - diff --git a/simple_examples/source/int32/D03RAJE.java b/simple_examples/source/int32/D03RAJE.java deleted file mode 100644 index 88d49aa..0000000 --- a/simple_examples/source/int32/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/source/int32/D03RBJE.java b/simple_examples/source/int32/D03RBJE.java deleted file mode 100644 index 9b1b482..0000000 --- a/simple_examples/source/int32/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/source/int32/D05BAJE.java b/simple_examples/source/int32/D05BAJE.java deleted file mode 100644 index 7a8caf7..0000000 --- a/simple_examples/source/int32/D05BAJE.java +++ /dev/null @@ -1,111 +0,0 @@ -import com.nag.routines.D05.D05BA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BAJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D05BAJE{ - - /** - * D05BAJE main program - */ - public static void main(String[] args){ - double alim, h, hi, si, thresh, tlim, tol; - int ifail, iorder, lwk, nmesh = 6; - String method; - double[] errest, yn, work; - - errest = new double[nmesh]; - yn = new double[nmesh]; - - System.out.println("D05BAJ Example Program Results"); - - method = "A"; - iorder = 6; - alim = 0; - tlim = 20; - h = (tlim - alim) / (double) nmesh; - tol = 0.001; - X02AJ x02aj = new X02AJ(); - thresh = x02aj.eval(); - lwk = 10 * nmesh + 6; - work = new double[lwk]; - - //Loop until the supplied workspace is big enough - //breakflag used to exit loop - boolean breakflag = false; - while(true){ - ifail = 1; - - ck ck1 = new ck(); - cf cf1 = new cf(); - cg cg1 = new cg(); - - D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, - tol, thresh, work, lwk, ifail); - d05ba.eval(); - - //update - ifail = d05ba.getIFAIL(); - lwk = d05ba.getLWK(); - work = d05ba.getWORK(); - - switch(ifail){ - case 5: - lwk = (int) work[0]; - work = new double[lwk]; - break; - case 6: - lwk = (int) work[0]; - work = new double[lwk]; - break; - default: - breakflag = true; - } - - if(breakflag == true){ - break; - } - } - - if(ifail != 0){ - System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); - } - - System.out.println(); - System.out.printf("Size of workplace = %d\n", lwk); - System.out.printf("Tolerance = %.4e\n", tol); - System.out.println(); - System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); - for(int i = 0; i < nmesh; i++){ - hi = (double) (i + 1) * h; - si = sol(hi); - System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); - } - } - - private static double sol(double t){ - return Math.log(t + Math.exp(1)); - } - - public static class ck extends D05BA.Abstract_D05BA_CK{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cf extends D05BA.Abstract_D05BA_CF{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cg extends D05BA.Abstract_D05BA_CG{ - public double eval(){ - return (this.Y + Math.exp(-this.Y)); - } - } -} - diff --git a/simple_examples/source/int32/D05BEJE.java b/simple_examples/source/int32/D05BEJE.java deleted file mode 100644 index f98bea3..0000000 --- a/simple_examples/source/int32/D05BEJE.java +++ /dev/null @@ -1,185 +0,0 @@ -import com.nag.routines.D05.D05BE; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BEJ example program text. - * @author willa - */ -public class D05BEJE{ - - private static final int iorder = 4; - private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); - private static final int nout = 6; - private static final int lct = nmesh / 32 + 1; - private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; - - public static void main(String[] args){ - double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; - int ifail; - double[] work, yn; - int[] nct; - - work = new double[lwk]; - yn = new double[nmesh]; - nct = new int[lct]; - - System.out.println("D05BEJ Example Program Results"); - - X02AJ x02aj = new X02AJ(); - tlim = 7; - tolnl = Math.sqrt(x02aj.eval()); - h = tlim /(double) (nmesh - 1); - yn[0] = 0; - - ifail = 0; - - D05BE d05be = new D05BE(); - ck1 k1 = new ck1(); - cf1 f1 = new cf1(); - cg1 g1 = new cg1(); - d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 1"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 1; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol1(hi1)); - - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 4) && (i % 5 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - System.out.println(); - - tlim = 5; - h = tlim /(double) (nmesh - 1); - yn[0] = 1; - - ifail = 0; - - ck2 k2 = new ck2(); - cf2 f2 = new cf2(); - cg2 g2 = new cg2(); - d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 2"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 0; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol2(hi1)); - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 6) && (i % 7 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - } - - private static double sol1(double t){ - double c, pi, t1, x = 0; - - //x is dummy variable - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + t; - c = 1 / Math.sqrt(2 * pi); - - return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); - } - - private static double sol2(double t){ - return (1 / (1 + t)); - } - - private static class ck1 extends D05BE.Abstract_D05BE_CK{ - public double eval(){ - return (Math.exp(-0.5 * this.T)); - } - } - - private static class ck2 extends D05BE.Abstract_D05BE_CK{ - double pi, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - return Math.sqrt(pi); - } - } - - private static class cf1 extends D05BE.Abstract_D05BE_CF{ - double a, pi, t1, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + this.T; - a = 1 / Math.sqrt(pi * this.T); - return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); - } - } - - private static class cf2 extends D05BE.Abstract_D05BE_CF{ - double st1; - - public double eval(){ - st1 = Math.sqrt(1 + this.T); - return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); - } - } - - private static class cg1 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } - - private static class cg2 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } -} diff --git a/simple_examples/source/int32/DTFSMJE.java b/simple_examples/source/int32/DTFSMJE.java deleted file mode 100644 index a88b114..0000000 --- a/simple_examples/source/int32/DTFSMJE.java +++ /dev/null @@ -1,54 +0,0 @@ -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; - -/** - * DTFSM example program text. Adapted from f06wbfe.f90 - * @author joed - */ -public class DTFSMJE { - - public static void main(String[] args) { - - double alpha = 4.21; - int ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[m*m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - a[i*m+j] = (j >= i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[(m*(m+1))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/source/int32/E01DAJE.java b/simple_examples/source/int32/E01DAJE.java deleted file mode 100644 index 10c008f..0000000 --- a/simple_examples/source/int32/E01DAJE.java +++ /dev/null @@ -1,182 +0,0 @@ -import com.nag.routines.E01.E01DA; -import com.nag.routines.E02.E02DF; - -/** - * E01DA example program text. - */ -public class E01DAJE { - - public static void main(String[] args) { - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = e01da.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) { - if (i <= mx) { - System.out.printf("%4d %9.4f", i+1, lamda[i]); - } - else { - System.out.printf(" "); - } - if (i <= my) { - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - } - else { - System.out.printf("\n"); - } - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = e01da.getPX(); - py = e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px, 4*ny+py); - if (4*nx+px > 4*ny+py) { - liwrk = ny + py - 4; - } - else { - liwrk = nx + px - 4; - } - double[] tx = new double[nx]; - double[] ty = new double[ny]; - double[] ff = new double[nx*ny]; - wrk = new double[lwrk]; - int[] iwrk = new int[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i < nx-1; i++) { - tx[i] = tx[i-1] + step; - } - tx[nx-1] = xhi; - - step = (yhi-ylo)/(ny-1); - ty[0] = ylo; - for (int i = 1; i < ny-1; i++) { - ty[i] = ty[i-1] + step; - } - ty[ny-1] = yhi; - - /* Evaluate the spline. */ - E02DF e02df = new E02DF(); - ifail = 0; - e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); - - ifail = e02df.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); - System.out.printf(" "); - for (int i = 0; i < nx; ++i) { - System.out.printf(" %5.2f ", tx[i]); - } - System.out.printf("\n"); - for (int i = 0; i < ny; ++i) { - System.out.printf(" %5.2f ", ty[i]); - for (int j = 0; j < nx; ++j) { - System.out.printf(" %8.3f", ff[ny*j+i]); - } - System.out.printf("\n"); - } - break; - default: - System.out.printf("\n Error detected by E02DF: %d\n", ifail); - } - - } - -} diff --git a/simple_examples/source/int32/E02ALJE.java b/simple_examples/source/int32/E02ALJE.java deleted file mode 100644 index 372f125..0000000 --- a/simple_examples/source/int32/E02ALJE.java +++ /dev/null @@ -1,101 +0,0 @@ -import com.nag.routines.E02.E02AL; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E02ALJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E02ALJE{ - - /** - * E02ALJ Example main program - */ - public static void main(String[] args){ - double dxx, ref = 0, s, t, xx; - int ifail, n = 0, m = 0, neval = 0; //placeholders - double[] a, x, y; - - a = new double[0]; - x = new double[0]; - y = new double[0]; //placeholders - - System.out.println("E02ALJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - m = Integer.parseInt(sVal[2]); - neval = Integer.parseInt(sVal[3]); - - a = new double[m + 1]; - x = new double[n]; - y = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - y[i] = Double.parseDouble(sVal[2]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - ifail = 0; - E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); - e02al.eval(); - - //update - ref = e02al.getREF(); - x = e02al.getX(); - y = e02al.getY(); - - - System.out.println(); - System.out.printf(" Polynomial coefficients\n"); - for(int i = 0; i <= m; i++){ - System.out.printf("\t%.4e\n", a[i]); - } - System.out.println(); - System.out.printf(" Reference deviation = %.2e\n", ref); - System.out.println(); - System.out.printf("\tX\tFit\texp(x)\tResidual\n"); - - dxx = 1/(double)(neval - 1); - - for(int j = 0; j < neval; j++){ - xx = (double) j * dxx; - - s = a[m]; - - for(int i = m - 1; i >=0; i--){ - s = s * xx + a[i]; - } - - t = Math.exp(xx); - System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); - } - } -} - diff --git a/simple_examples/source/int32/E04ABJE.java b/simple_examples/source/int32/E04ABJE.java deleted file mode 100644 index 773f1ff..0000000 --- a/simple_examples/source/int32/E04ABJE.java +++ /dev/null @@ -1,76 +0,0 @@ -import com.nag.routines.E04.E04AB; - -/** - * E04ABJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04ABJE{ - - /** - * E04ABJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04ABJ Example Program Results"); - - //e1 and e2 are set to zero so that E04ABA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); - e04ab.eval(); - - //update - ifail = e04ab.getIFAIL(); - a = e04ab.getA(); - b = e04ab.getB(); - x = e04ab.getX(); - f = e04ab.getF(); - maxcal = e04ab.getMAXCAL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04AB.Abstract_E04AB_FUNCT{ - public void eval(){ - FC = Math.sin(this.XC) / this.XC; - } - } -} diff --git a/simple_examples/source/int32/E04BBJE.java b/simple_examples/source/int32/E04BBJE.java deleted file mode 100644 index d7032f5..0000000 --- a/simple_examples/source/int32/E04BBJE.java +++ /dev/null @@ -1,81 +0,0 @@ -import com.nag.routines.E04.E04BB; - -/** - * E04BBJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04BBJE{ - - /** - * E04BBJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04BBJ Example Program Results"); - - //e1 and e2 are set to zero so that E04BBA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); - e04bb.eval(); - - //update - a = e04bb.getA(); - b = e04bb.getB(); - maxcal = e04bb.getMAXCAL(); - x = e04bb.getX(); - f = e04bb.getF(); - g = e04bb.getG(); - ifail = e04bb.getIFAIL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04BB.Abstract_E04BB_FUNCT{ - public void eval(){ - this.FC = Math.sin(this.XC) / this.XC; - this.GC = (Math.cos(this.XC) - this.FC)/this.XC; - } - } -} - diff --git a/simple_examples/source/int32/E04CBJE.java b/simple_examples/source/int32/E04CBJE.java deleted file mode 100644 index fbde674..0000000 --- a/simple_examples/source/int32/E04CBJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.E04.E04CB; -import com.nag.routines.E04.E04CBK; -import com.nag.routines.X02.X02AJ; - -/** - * E04CBJ Example Program text - * @author willa - * @since 27.1.0.0 - */ -public class E04CBJE{ - - /** - * E04CBJE main program - */ - public static void main(String[] args){ - int n = 2, ifail, maxcal; - double f = 0, tolf, tolx; //placeholders - boolean monitoring; - int[] iuser; - double[] ruser, x; - - iuser = new int[1]; - ruser = new double[1]; - x = new double[n]; - - System.out.println("E04CBJ Example Program Results"); - - //Set monitoring to true to obtain monitoring information - monitoring = false; - - x[0] = -1.0; - x[1] = 1.0; - X02AJ x02aj = new X02AJ(); - tolf = Math.sqrt(x02aj.eval()); - tolx = Math.sqrt(tolf); - maxcal = 100; - - ifail = 0; - - funct funct1 = new funct(); - if(!monitoring){ - defMonit monit = new defMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - else{ - myMonit monit = new myMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - - System.out.println(); - System.out.printf("The final function value is \t%.4f\n", f); - System.out.printf("at the point\t"); - for(int i = 0; i < n; i++){ - System.out.printf("%.4f\t", x[i]); - } - System.out.printf("\n"); - } - - public static class funct extends E04CB.Abstract_E04CB_FUNCT{ - public void eval(){ - this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); - } - } - - public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ - public void eval(){ - System.out.println(); - System.out.printf("There have been %d function calls\n", this.NCALL); - System.out.printf("The smallest function value is %.4f\n", this.FMIN); - System.out.printf("The simplex is\n"); - for(int i = 0; i <= this.N; i++){ - for(int j = 0; j < this.N; j++){ - System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); - } - System.out.printf("\n"); - } - System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); - System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); - } - } - - //This is how to use NAG supplied function as argument - public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ - public void eval(){ - super.eval(); - } - } -} diff --git a/simple_examples/source/int32/E04FCJE.java b/simple_examples/source/int32/E04FCJE.java deleted file mode 100644 index 939f68d..0000000 --- a/simple_examples/source/int32/E04FCJE.java +++ /dev/null @@ -1,420 +0,0 @@ -import com.nag.routines.E04.E04FC; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04FC example program text. - * @author ludovic - */ -public class E04FCJE { - - public static void main(String[] args) { - - BufferedReader dataIn = null; - - try { - E04FC e04fc = new E04FC(); - System.out.println(" E04FCJ Example Program Results"); - dataIn = new BufferedReader(new FileReader(args[0])); - //skip header - dataIn.readLine(); - - int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, - lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; - String trans = "T"; - - double eta, fsumsq, stepmx, xtol; - eta = fsumsq = stepmx = xtol = Double.NaN; - int ifail, iprint, maxcal, nf, niter; - ifail = iprint = maxcal = nf = niter = 0; - double[] fjac = new double[m * n], - fvec = new double[m], - g = new double[n], - s = new double[n], - v = new double[ldv * n], - w = new double[lw], - x = new double[n], - y = new double[m], - t = new double[m * nt]; - - - int[] iw = new int[liw]; - - for (int i = 0; i < m; ++i) { - String[] line = dataIn.readLine().trim().split("\\s+"); - if (line.length != nt + 1) { - System.err.println("Error in data file - only " + line.length - + " records at line " + (i + 2) + " while expecting " + (nt + 1) - + " elements"); - System.exit(1); - } - y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format - for (int j = 1; j <= nt; ++j) { - t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); - } - } - - // Set IPRINT to 1 to obtain output from LSQMON at each iteration - iprint = -1; - - maxcal = 400 * n; - eta = 0.5; - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - - // We estimate that the minimum will be within 10 units of the starting point - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - - LSQFUN lsqfun = new LSQFUN(); - lsqfun.t = t; - lsqfun.y = y; - LSQMON lsqmon = new LSQMON(); - - e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, - fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); - - ifail = e04fc.getIFAIL(); - - - switch (ifail) { - case (1): - System.err.println("Unexpected ifail = " + ifail); - break; - default: - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); - System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); - lsqgrd(m, n, fvec, fjac, ldfjac, g); - System.out.print(" The estimated gradient is "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.3e\t", g[i]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int i = 0; i < m; ++i) { - System.out.printf(" %9.1e\n", fvec[i]); - } - } - - - - } - catch (Exception ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - finally { - try { - dataIn.close(); - } - catch (IOException ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - } - - - } - - public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); - dgemv.eval(); - for (int i = 0; i < g.length; ++i) { - g[i] = 2.0 * g[i]; - } - } - - public static class LSQFUN implements E04FC.E04FC_LSQFUN { - - public double[] t, y; - int IFLAG, M, N, LW, LIW; - double[] XC, FVEC, W; - int[] IW; - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, - int[] IW, int LIW, double[] W, int LW) { - for (int i = 0; i < M; ++i) { - FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; - } - } - - } - - public static class LSQMON implements E04FC.E04FC_LSQMON { - - int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; - int[] IW; - double[] XC, FVEC, FJAC, S, W; - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setFJAC(double[] FJAC) { - this.FJAC = FJAC; - } - - @Override - public double[] getFJAC() { - return FJAC; - } - - @Override - public void setLDFJAC(int LDFJAC) { - this.LDFJAC = LDFJAC; - } - - @Override - public int getLDFJAC() { - return LDFJAC; - } - - @Override - public void setS(double[] S) { - this.S = S; - } - - @Override - public double[] getS() { - return S; - } - - @Override - public void setIGRADE(int IGRADE) { - this.IGRADE = IGRADE; - } - - @Override - public int getIGRADE() { - return IGRADE; - } - - @Override - public void setNITER(int NITER) { - this.NITER = NITER; - } - - @Override - public int getNITER() { - return NITER; - } - - @Override - public void setNF(int NF) { - this.NF = NF; - } - - @Override - public int getNF() { - return NF; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, - int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, - int LIW, double[] W, int LW) { - - int ndec = 3; - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); - fsumsq = ddot.eval(); - - lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); - - gtg = ddot.eval(N, g, 1, g, 1); - // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", - NITER, NF, fsumsq, gtg, IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < N; ++j) { - System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); - } - - } - - } - -} diff --git a/simple_examples/source/int32/E04FFJE.java b/simple_examples/source/int32/E04FFJE.java deleted file mode 100644 index ad81e32..0000000 --- a/simple_examples/source/int32/E04FFJE.java +++ /dev/null @@ -1,140 +0,0 @@ -import com.nag.routines.E04.E04FF; -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.util.Arrays; - -/** - * E04FF example program text. - * @author joed - */ -public class E04FFJE { - - public static void main(String[] args) { - double infbnd = 1.0e20; - double[] lx, rx, ux, x, ruser, pdy, pdz; - double[] rinfo = new double[100], stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; - int[] iuser; - int[] icolrd = new int[1], irowrd = new int[1]; - long cpuser, handle; // c_ptr - MONIT monit = new MONIT(); - OBJFUN objfun = new OBJFUN(); - - /* Header */ - System.out.printf(" E04FFJ Example Program Results\n\n"); - - /* Fill problem data structure */ - pdny = 11; - pdnz = 11; - pdy = new double[] { - 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, - 8.33e-2, 7.14e-2, 6.25e-2 - }; - pdz = new double[] { - 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, - 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 - }; - nvar = 4; - nres = 11; - - /* Initialize handle */ - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define residuals structure */ - E04RM e04rm = new E04RM(); - isparse = 0; // Dense => irowrd and icolrd are not accessed - nnzrd = 1; - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set options */ - E04ZM e04zm = new E04ZM(); - ifail = 0; - e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - - /* Define starting point */ - x = new double[] {0.25, 0.39, 0.415, 0.39}; - rx = new double[nres]; - - /* Define bounds for the second and the fourth variable */ - E04RH e04rh = new E04RH(); - lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; - ux = new double[] {infbnd, 1.0, infbnd, infbnd}; - ifail = 0; - e04rh.eval(handle, nvar, lx, ux, ifail); - - /* Call the solver */ - E04FF e04ff = new E04FF(); - ifail = -1; - iuser = new int[] {pdny, pdnz}; - ruser = new double[2 * nres]; - cpuser = 0L; - for (int i = 0; i < nres; i++) { - ruser[i] = pdy[i]; - ruser[nres + i] = pdz[i]; - } - e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, - iuser, ruser, cpuser, ifail); - - /* Free handle memory */ - E04RZ e04rz = new E04RZ(); - ifail = 0; - e04rz.eval(handle, ifail); - - } - - public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { - - public void eval() { - int pdny, pdnz; - double r1, r2; - double[] pdy, pdz; - - /* Interrupt solver if the dimensions are incorrect */ - if (this.NRES != 11 || this.NVAR != 4) { - this.INFORM = -1; - return; - } - - /* Extract the problem data structure from the workspaces */ - pdny = this.IUSER[0]; - pdnz = this.IUSER[1]; - if (pdny != this.NRES || pdnz != this.NRES) { - this.INFORM = -1; - return; - } - pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); - pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); - - for (int i = 0; i < this.NRES; i++) { - r1 = pdy[i] * (pdy[i] + this.X[1]); - r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; - this.RX[i] = pdz[i] - (this.X[0] * r1/r2); - } - - } - - } - - public static class MONIT extends E04FF.Abstract_E04FF_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/source/int32/E04GBJE.java b/simple_examples/source/int32/E04GBJE.java deleted file mode 100644 index 7becf21..0000000 --- a/simple_examples/source/int32/E04GBJE.java +++ /dev/null @@ -1,183 +0,0 @@ -import com.nag.routines.A00.A00AA; -import com.nag.routines.E04.E04GB; -import com.nag.routines.E04.E04HEV; -import com.nag.routines.E04.E04YA; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.F06PA; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04GB example program text. - */ -public class E04GBJE { - - public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; - public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; - public static final String trans = "T"; - public static double[] y; - public static double[] t; - - public static void main(String[] args) { - - double eta, fsumq = 0.0, stepmx, xtol; - int ifail, iprint, maxcal, nf = 0, niter = 0; - double[] fjac = new double[ldfjac * n]; - double[] fvec = new double[m]; - double[] g = new double[n]; - double[] s = new double[n]; - double[] v = new double[ldv * n]; - double[] w = new double[lw * n]; - double[] x = new double[n]; - int[] iw = new int[liw]; - - System.out.println(" E04GBJ Example Program Results"); - - // Data - y = new double[] { - 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, - 0.96, 1.34, 2.10, 4.39 - }; - - t = new double[m * nt]; - for (int i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - // Check LSQFUN by calling E04YA at an arbitrary point - E04YA e04ya = new E04YA(); - LSQFUN lsqfun = new LSQFUN(); - x[0] = 0.19; - x[1] = -.34; - x[2] = 0.88; - ifail = 0; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); - - // Continue setting parameters for E04GB - E04GB e04gb = new E04GB(); - LSQMON lsqmon = new LSQMON(); - LSQLIN lsqlin = new LSQLIN(); - iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration - maxcal = 50 * n; - eta = 0.09; // Since E04HEV is being used as LSQLIN - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, - stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, - liw, w, lw, ifail); - fsumq = e04gb.getFSUMSQ(); - x = e04gb.getX(); - ifail = e04gb.getIFAIL(); - - if (ifail == 0 || ifail >= 2) { - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); - System.out.printf(" at the point "); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.4f", x[ii]); - } - System.out.println(); - - lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); - - System.out.print(" The corresponding gradient is"); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.3E", g[ii]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int ii = 0; ii < m; ++ii) { - System.out.printf(" %9.1E\n", fvec[ii]); - } - System.out.println(); - } - - } - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - - for (int i = 0; i < m; i++) { - denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; - this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; - - if (this.IFLAG != 0) { - this.FJAC[i] = 1.0; - dummy = -1.0 / (denom * denom); - this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; - this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; - } - } - - } - - } - - public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { - - public static final int ndec = 3; - - /** Monitoring routine. */ - public void eval() { - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(); - - fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); - this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); - gtg = ddot.eval(this.N, g, inc1, g, inc1); - - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", - this.NITER, this.NF, fsumsq, gtg, this.IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < n; j++) { - System.out.printf(" %13.5E %9.1E %9.1E\n", - this.XC[j], g[j], this.S[j]); - } - - } - - /** Routine to evaluate gradient of the sum of squares. */ - public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); - f06pa.eval(); - - for (int i = 0; i < n; ++i) { - g[i] = 2.0 * g[i]; - } - - } - - } - - /** Using E04HEV as LSQLIN. */ - private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { - - public void eval() { - super.eval(); - } - - } - -} diff --git a/simple_examples/source/int32/E04GGJE.java b/simple_examples/source/int32/E04GGJE.java deleted file mode 100644 index 8a18c6a..0000000 --- a/simple_examples/source/int32/E04GGJE.java +++ /dev/null @@ -1,219 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RX; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; - -/** - * E04GG example program text. - */ -public class E04GGJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser = 0, handle = 0; - int ifail, isparse, nnzrd, nres, nvar; - - double[] blx, bux, ruser, rx, x, z; - double[] rinfo = new double[100], stats = new double[100]; - int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; - - /* Header */ - System.out.println(" E04GGJ Example Program Results\n"); - - nvar = 6; - nres = 24; - // ruser = new double[2*nres]; - // Data from Lanczos 3 Problem - ruser = new double[] { - // t(:) = - 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, - 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, - 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, - // y(:) = - 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, - 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, - 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 - }; - - iuser[0] = 0; - - // Initialize handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define residuals structure, isparse=0 means the residual structure is - // dense => irowrd and icolrd are not accessed - isparse = 0; - nnzrd = 0; - E04RM e04rm = new E04RM(); - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); - e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); - e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); - // Change printed output verbosity - e04zm.eval(handle, "Print Level = 1",ifail); - - // Define starting point - rx = new double[nres]; - z = new double[nvar]; - // x = new double[nvar]; - x = new double[] { - 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 - }; - - // Define bounds - blx = new double[nvar]; - bux = new double[nvar]; - blx[0] = 0.0; - bux[0] = 1.0; - blx[1] = -1.0; - bux[1] = infbnd; - blx[2] = -1.0; - bux[2] = infbnd; - blx[3] = -1.0; - bux[3] = infbnd; - blx[4] = -1.0; - bux[4] = 1.0; - blx[5] = -1.0; - bux[5] = 10.0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, blx, bux, ifail); - - // Call the solver - ifail = -1; - E04GG e04gg = new E04GG(); - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); - ifail = e04gg.getIFAIL(); - - // Recover latest iterate from handle if available - if (ifail == 0) { - ifail = -1; - E04RX e04rx = new E04RX(); - e04rx.eval(handle,"X",1,nvar,z,ifail); - ifail = e04rx.getIFAIL(); - if (ifail == 0) { - System.out.println("\nSolver stored solution iterate in the handle"); - System.out.print("X: "); - for (int i = 0; i < nvar; i++){ - System.out.printf("%8.2E ", z[i]); - } - System.out.println(); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - - this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int i; - - for (i = 0; i < this.RDX.length; i++) { - this.RDX[i] = 0; - } - - for (i = 0; i < this.NRES; i++) { - this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); - this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - for (int i = 0; i < this.NVAR * this.NVAR; i++) { - this.HX[i] = 0.0; - } - - double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; - - for (int i = 0; i < this.NRES; i++){ - sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); - sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); - sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); - sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); - sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); - sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); - } - - this.HX[(2-1) + (1-1) * this.NVAR] = sum21; - this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; - this.HX[(2-1) + (2-1) * this.NVAR] = sum22; - this.HX[(4-1) + (3-1) * this.NVAR] = sum43; - this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; - this.HX[(4-1) + (4-1) * this.NVAR] = sum44; - this.HX[(6-1) + (5-1) * this.NVAR] = sum65; - this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; - this.HX[(6-1) + (6-1) * this.NVAR] = sum66; - - this.INFORM = 0; - } - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - } - -} diff --git a/simple_examples/source/int32/E04MTJE.java b/simple_examples/source/int32/E04MTJE.java deleted file mode 100644 index 6272e91..0000000 --- a/simple_examples/source/int32/E04MTJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RF; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04MT example program text. - */ -public class E04MTJE { - - public static void main(String[] args) throws IOException { - - System.out.println(" E04MTJ Example Program Results"); - int m = 7; - int n = 7; - int nnza = 41; - int nnzc = 7; - int nnzu = 2*n + 2*m; - - int[] cindex = {1,2,3,4,5,6,7}; - double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; - int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, - 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; - int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, - 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; - double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, - 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, - 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, - 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, - 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, - 0.12, 0.02, 0.01, 0.97}; - double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, - -0.0992,-0.003}; - double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, - 1.0e20, 0.002}; - double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; - double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; - double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; - - long handle = 0; - int ifail = 0; - E04RA e04ra = new E04RA(handle,n,ifail); - e04ra.eval(); - - handle = e04ra.getHANDLE(); - - int[] icolh = new int[1]; - int[] irowh = new int[1]; - double[] h = new double[1]; - E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); - e04rf.eval(); - handle = e04ra.getHANDLE(); - - E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); - e04rh.eval(); - handle = e04rh.getHANDLE(); - - int idlc = 0; - E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); - e04rj.eval(); - handle = e04rj.getHANDLE(); - - E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); - e04zm.eval(); - e04zm.setOPTSTR("Print Solution = YES"); - e04zm.eval(); - e04zm.setOPTSTR("Print Options = NO"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); - e04zm.eval(); - handle = e04zm.getHANDLE(); - - long cpuser = 2; - int[] iuser = {1}; - double[] ruser = new double[1]; - ifail = -1; - MONIT monit = new MONIT(); - double[] x = new double[n], u = new double[nnzu]; - double[] rinfo = new double[100], stats = new double[100]; - System.out.println(); - System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); - E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, - monit,iuser,ruser,cpuser,ifail); - e04mt.eval(); - System.out.println(); - System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); - e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); - e04zm.eval(); - iuser[0] = 2; - e04mt.setIFAIL(-1); - e04mt.setHANDLE(e04zm.getHANDLE()); - e04mt.setIUSER(iuser); - e04mt.eval(); - - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - - double tol = 1.2e-8; - - if (IUSER[0] == 1) { - if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - else { - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - - } - - } - -} diff --git a/simple_examples/source/int32/E04MXJE.java b/simple_examples/source/int32/E04MXJE.java deleted file mode 100644 index 642a933..0000000 --- a/simple_examples/source/int32/E04MXJE.java +++ /dev/null @@ -1,292 +0,0 @@ -import com.nag.routines.E04.E04MX; -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NS; -import com.nag.routines.E04.E04NT; -import com.nag.routines.X04.X04AC; -import com.nag.routines.X04.X04AD; -import java.util.Arrays; - -/** - * E04MX example program text. - */ -public class E04MXJE { - - public static void main(String[] args) { - - /* Parameters */ - int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; - boolean readints = false; - String fname = args[0]; - /* Local Scalars */ - double obj, objadd, sinf; - int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, - maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; - boolean verboseOutput; - String start; - /* Local Arrays */ - double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; - int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; - String[] crname, cw; - String[] cuser = new String[1], pnames = new String[5]; - cuser[0] = " "; - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - - System.out.println(" E04MXJ Example Program Results"); - - // Initialize - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - maxm = 0; - maxn = 0; - maxnnz = 0; - maxnnzh = 0; - maxncolh = 0; - maxlintvar = 0; - - // Open the data file for reading - X04AC x04ac = new X04AC(); - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Prep call to E04MX in query mode - E04MX e04mx = new E04MX(); - a = new double[1]; - irowa = new int[1]; - iccola = new int[1]; - bl = new double[1]; - bu = new double[1]; - crname = new String[]{" "}; - h = new double[1]; - irowh = new int[1]; - iccolh = new int[1]; - intvar = new int[1]; - ifail = 0; - - // Placeholders for output only scalars - n = 0; - m = 0; - nnz = 0; - ncolh = 0; - nnzh = 0; - lintvar = 0; - iobj = 0; - nname = 0; - minmax = 0; - - // Make call to E04MX - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - - // Get output scalar values - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close file - X04AD x04ad = new X04AD(); - ifail = 0; - x04ad.eval(nin, ifail); - - // Set maxm, maxn and maxnnz - maxm = m; - maxn = n; - maxnnz = nnz; - maxnnzh = nnzh; - maxncolh = ncolh; - maxlintvar = (readints) ? lintvar : 1; - - // Allocate memory - irowa = new int[maxnnz]; - iccola = new int[maxn + 1]; - a = new double[maxnnz]; - bl = new double[maxn + maxm]; - bu = new double[maxn + maxm]; - crname = new String[maxn + maxm]; - for (int j = 0; j < (maxn + maxm); j++) { - crname[j] = " "; - } - irowh = new int[maxnnzh]; - iccolh = new int[maxncolh + 1]; - h = new double[maxnnzh]; - intvar = new int[maxlintvar]; - - // Open the data file for reading - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Call E04MX to read the problem - ifail = 0; - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close the data file - ifail = 0; - x04ad.eval(nin, ifail); - - /* Data has been read. Set up and run the solver */ - - iw = new int[leniw]; - rw = new double[lenrw]; - cw = new String[lencw]; - for (int j = 0; j < lencw; j++) { - cw[j] = " "; - } - - // Call E04NP to initialize workspace - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); - - // Call option setter E04NS to change the direction of optimization. - // Minimization is assumed by default. - E04NS e04ns = new E04NS(); - if (minmax == 1) { - ifail = 0; - e04ns.eval("Maximize", cw, iw, rw, ifail); - } - else if (minmax == 0) { - ifail = 0; - e04ns.eval("Feasible Point", cw, iw, rw, ifail); - } - - // Set this to TRUE to cause E04NQ to produce intermediate progress output - verboseOutput = false; - - if (verboseOutput) { - // By default E04NQ does not print monitoring information. Set the print - // file unit or the summary file unit to get information. - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", nout, cw, iw, rw, ifail); - } - else { - System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); - } - - // We have no explicit objective vector so set LENC = 0; the objective vector - // is stored in row IOBJ of ACOL. - lenc = 0; - objadd = 0.0; - start = "C"; - - c = new double[Math.max(1, lenc)]; - helast = new int[n + m]; - x = new double[n + m]; - pi = new double[m]; - rc = new double[n + m]; - hs = new int[n + m]; - iuser = new int[ncolh + 1 + nnzh]; - ruser = new double[nnzh]; - - if (ncolh > 0) { - // Store the non zeros of H in ruser for use by qphx - for (int j = 0; j < nnzh; j++) { - ruser[j] = h[j]; - } - // Store iccolh and irowh in iuser for use by qphx - for (int j = 0; j < ncolh + 1; j++) { - iuser[j] = iccolh[j]; - } - for (int j = 0; j < nnzh; j++) { - iuser[j + ncolh + 1] = irowh[j]; - } - - } - - // Call E04NQ to solve the problem - E04NQ e04nq = new E04NQ(); - QPHX qphx = new QPHX(); - ns = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - ifail = 0; - e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, - pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, - x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, - lenrw,cuser,iuser,ruser,ifail); - ns = e04nq.getNS(); - ninf = e04nq.getNINF(); - sinf = e04nq.getSINF(); - obj = e04nq.getOBJ(); - ifail = e04nq.getIFAIL(); - - if (!verboseOutput) { - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n", obj); - System.out.printf(" Optimal X = \n"); - System.out.printf(" "); - for (int j = 0; j < n; j++) { - System.out.printf("%9.2f", x[j]); - } - System.out.printf("\n"); - } - - } - - public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { - - /** - * Subroutine to compute H*x. - * Note: IUSER and RUSER contain the following data: - * RUSER(1:NNZH) = H(1:NNZH) - * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) - * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) - */ - public void eval() { - /* Local Scalars */ - int end, icol, idx, irow, start; - - Arrays.fill(HX, 0.0); - - for (icol = 0; icol < this.NCOLH + 1; ++icol) { - - start = this.IUSER[icol] - 1; - end = IUSER[icol+1] - 2; - - for (idx = start; idx < end + 1; ++idx) { - - irow = this.IUSER[this.NCOLH + 1 + idx] - 1; - this.HX[irow] += this.X[icol] * this.RUSER[idx]; - - if (irow != icol) { - this.HX[icol] += this.X[irow] * this.RUSER[idx]; - } - - } - - } - - } - - } - - -} diff --git a/simple_examples/source/int32/E04NCJE.java b/simple_examples/source/int32/E04NCJE.java deleted file mode 100644 index d6c3010..0000000 --- a/simple_examples/source/int32/E04NCJE.java +++ /dev/null @@ -1,246 +0,0 @@ -import static java.lang.Math.max; - -import com.nag.routines.E04.E04NC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NC example program text. - * @author ludovic - */ -public class E04NCJE { - - public static void main(String[] args) { - - double one = 1.0; - double zero = 0.0; - int inc1 = 1, lcwsav = 1, liwsav = 610, - llwsav = 120, lrwsav = 475, nin = 5, - nout = 6; - double obj; - int i, ifail, iter, lda, ldc, liwork, - lwork, m, n, nclin, sdc; - double[] a, b, bl, bu, c, - clamda, cvec, work, x; - double[] rwsav = new double[lrwsav]; - int[] istate, iwork, kx; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - String[] cwsav = new String[lcwsav]; - - System.out.println(" E04NCJ Example Program Results"); - try { - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - m = Integer.parseInt(data[0]); - n = Integer.parseInt(data[1]); - nclin = Integer.parseInt(data[2]); - - liwork = n; - ldc = max(1,nclin); - lda = max(1,m); - - if (nclin > 0) { - sdc = n; - } - else { - sdc = 1; - } - - /* This particular example problem is of type LS1, so we allocate - * A(LDA,N), CVEC(1), B(M) and define LWORK as below - */ - if (nclin > 0) { - lwork = 2*n*n + 9*n + 6*nclin; - } - else { - lwork = 9*n; - } - - /* - * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column - * ie: - * 1 1 1 - * 2 2 2 - * 3 3 3 - * - * is stored [1,2,3,1,2,3,1,2,3] - */ - istate = new int[n+nclin]; - kx = new int[n]; - iwork = new int[liwork]; - c = new double[ldc*sdc]; - bl = new double[n+nclin]; - bu = new double[n+nclin]; - cvec = new double[1]; - x = new double[n]; - a = new double[lda * n]; - b = new double[m]; - clamda = new double[n+nclin]; - work = new double[lwork]; - - /* - * Extra arrays to initialize: - */ - for (int ii = 0; ii < cwsav.length; ++ii) { - // 80 characters long... - cwsav[ii] - = " "; - } - - for (int ii = 0; ii < lda; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < n; ++jj) { - a[lda*jj+ii] = Double.parseDouble(data[jj]); - } - } - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - - for (int ii = 0; ii < m; ++ii) { - b[ii] = Double.parseDouble(data[ii]); - } - - for (int ii = 0; ii < ldc; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < sdc; ++jj) { - c[ldc*jj+ii] = Double.parseDouble(data[jj]); - } - } - - //bl and bu to complicated to read properly -> hardcoded - line = br.readLine(); - line = br.readLine(); - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = -1.0E+25; - bl[3] = 0.0; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 0.0; - bl[8] = 0.0; - bl[9] = 2.0; - bl[10] = -1.0E+25; - bl[11] = 1.0; - - line = br.readLine(); - line = br.readLine(); - bu[0] = 2.0; - bu[1] = 2.0; - bu[2] = 2.0; - bu[3] = 2.0; - bu[4] = 2.0; - bu[5] = 2.0; - bu[6] = 2.0; - bu[7] = 2.0; - bu[8] = 2.0; - bu[9] = 1.0E+25; - bu[10] = 2.0; - bu[11] = 4.0; - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int ii = 0; ii < n; ++ii) { - x[ii] = Double.parseDouble(data[ii]); - } - - // CALL TO E04WBF - ifail = 0; - String routname = "E04NCA"; - E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, - lrwsav, ifail); - e04wb.eval(); - cwsav = e04wb.getCWSAV(); - iwsav = e04wb.getIWSAV(); - lwsav = e04wb.getLWSAV(); - rwsav = e04wb.getRWSAV(); - - // CALL TO E04NCF - ifail = -1; - - /* Java needs these to be initialized, so set it to an impossible value - * to trap possible error later */ - iter = Integer.MIN_VALUE; - obj = Double.NaN; - - E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, - clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); - e04nc.eval(); - - // Getting ifail's value back - ifail = e04nc.getIFAIL(); - - switch (ifail) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 7: - System.out.println("\n Varbl Istate Value Lagr Mult\n"); - - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println("\n\n L Con Istate Value Lagr Mult\n"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); - break; - default: - if (ifail > 7) { - System.out.println(" Varbl Istate Value Lagr Mult"); - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println(" L Con Istate Value Lagr Mult"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); - } - else { - System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); - } - } - } - catch (Exception ex) { - Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - -} diff --git a/simple_examples/source/int32/E04NFJE.java b/simple_examples/source/int32/E04NFJE.java deleted file mode 100644 index e341f9f..0000000 --- a/simple_examples/source/int32/E04NFJE.java +++ /dev/null @@ -1,234 +0,0 @@ -import com.nag.routines.E04.E04NF; -import com.nag.routines.E04.E04NH; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E54NFU; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NF example program text. - */ -public class E04NFJE { - - public static void main(String[] args) { - - /* Local Scalars */ - double obj; - int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; - /* Local Arrays */ - double[] a, ax, bl, bu, clamda, cvec, h, work, x; - int[] istate, iwork; - - try { - - System.out.println(" E04NFJ Example Program Results"); - - if (args.length == 0) { - System.err.println("You need to provide the path to the data file e04nfae.d"); - System.exit(-1); - } - - // Read data from file - DataFile datafile = new DataFile(args[0]); - datafile.read(); - - liwork = 2 * datafile.n + 3; - lda = Math.max(1, datafile.nclin); - - sda = (datafile.nclin > 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new int[datafile.n + datafile.nclin]; - ax = new double[Math.max(1, datafile.nclin)]; - iwork = new int[liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[datafile.n + datafile.nclin]; - work = new double[lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[lcwsav]; - cwsav[0] - = " "; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - double[] rwsav = new double[lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - int[] iuser = new int[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } - catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default. */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - super.eval(); - } - - } - - public static class DataFile { - - public String filename; - public int n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file" - + " - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } - else { - sda = 1; - } - ldh = n; - - cvec = new double[n]; - a = new double[lda * sda]; - bl = new double[n + nclin]; - bu = new double[n + nclin]; - x = new double[n]; - h = new double[ldh * n]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/source/int32/E04NKJE.java b/simple_examples/source/int32/E04NKJE.java deleted file mode 100644 index 604ee66..0000000 --- a/simple_examples/source/int32/E04NKJE.java +++ /dev/null @@ -1,295 +0,0 @@ -import com.nag.routines.E04.E04NK; -import com.nag.routines.E04.E04WB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NKJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class E04NKJE{ - private static int lcwsav = 1; - private static int liwsav = 380; - private static int llwsav = 20; - private static int lrwsav = 285; - - /** - * E04NKJ Example main program. - */ - public static void main(String[] args){ - double obj, sinf; - int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; - String start; - double[] a, bl, bu, clamda, xs, z, ruser, rwsav; - int[] ha, istate, iz, ka, iuser, iwsav; - boolean[] lwsav; - String[] crname, cwsav, names; - - System.out.println("E04NKJ Example Program Results"); - - ruser = new double[1]; - rwsav = new double[lrwsav]; - iuser = new int[1]; - iwsav = new int[liwsav]; - - cwsav = new String[lcwsav]; - //equivalent to ```Character (80) :: cwsav(lcwsav)``` - for(i = 0; i < lcwsav; i++){ - char[] chars = new char[80]; - Arrays.fill(chars, ' '); - cwsav[i] = new String(chars); - } - names = new String[5]; - //names all blank anyway this time - for(i = 0; i < 5; i++){ - char[] chars = new char[8]; - Arrays.fill(chars, ' '); - names[i] = new String(chars); - } - - //dummy arrays - crname = new String[0]; - - n = 7; - m = 8; - nnz = 48; - iobj = 8; - ncolh = 7; - start = "C"; - nname = 15; - - ha = new int[nnz]; - ka = new int[n + 1]; - istate = new int[n + m]; - a = new double[nnz]; - bl = new double[n + m]; - bu = new double[n + m]; - xs = new double[n + m]; - clamda = new double[n + m]; - crname = new String[nname]; - lwsav = new boolean[llwsav]; - - names[0] = " "; - names[1] = " "; - names[2] = " "; - names[3] = " "; - names[4] = " "; - - crname[0] = "...X1..."; - crname[1] = "...X2..."; - crname[2] = "...X3..."; - crname[3] = "...X4..."; - crname[4] = "...X5..."; - crname[5] = "...X6..."; - crname[6] = "...X7..."; - crname[7] = "..ROW1.."; - crname[8] = "..ROW2.."; - crname[9] = "..ROW3.."; - crname[10] = "..ROW4.."; - crname[11] = "..ROW5.."; - crname[12] = "..ROW6.."; - crname[13] = "..ROW7.."; - crname[14] = "..COST.."; - - //Matrix A. Set up KA - jcol = 1; - ka[0] = 1; - - a[0] = 0.02; ha[0] = 7; - a[1] = 0.02; ha[1] = 5; - a[2] = 0.03; ha[2] = 3; - a[3] = 1.00; ha[3] = 1; - a[4] = 0.70; ha[4] = 6; - a[5] = 0.02; ha[5] = 4; - a[6] = 0.15; ha[6] = 2; - a[7] = -200.00; ha[7] = 8; - a[8] = 0.06; ha[8] = 7; - a[9] = 0.75; ha[9] = 6; - a[10] = 0.03; ha[10] = 5; - a[11] = 0.04; ha[11] = 4; - a[12] = 0.05; ha[12] = 3; - a[13] = 0.04; ha[13] = 2; - a[14] = 1.00; ha[14] = 1; - a[15] = -2000.00; ha[15] = 8; - a[16] = 0.02; ha[16] = 2; - a[17] = 1.00; ha[17] = 1; - a[18] = 0.01; ha[18] = 4; - a[19] = 0.08; ha[19] = 3; - a[20] = 0.08; ha[20] = 7; - a[21] = 0.80; ha[21] = 6; - a[22] = -2000.00; ha[22] = 8; - a[23] = 1.00; ha[23] = 1; - a[24] = 0.12; ha[24] = 7; - a[25] = 0.02; ha[25] = 3; - a[26] = 0.02; ha[26] = 4; - a[27] = 0.75; ha[27] = 6; - a[28] = 0.04; ha[28] = 2; - a[29] = -2000.00; ha[29] = 8; - a[30] = 0.01; ha[30] = 5; - a[31] = 0.80; ha[31] = 6; - a[32] = 0.02; ha[32] = 7; - a[33] = 1.00; ha[33] = 1; - a[34] = 0.02; ha[34] = 2; - a[35] = 0.06; ha[35] = 3; - a[36] = 0.02; ha[36] = 4; - a[37] = -2000.00; ha[37] = 8; - a[38] = 1.00; ha[38] = 1; - a[39] = 0.01; ha[39] = 2; - a[40] = 0.01; ha[40] = 3; - a[41] = 0.97; ha[41] = 6; - a[42] = 0.01; ha[42] = 7; - a[43] = 400.00; ha[43] = 8; - a[44] = 0.97; ha[44] = 7; - a[45] = 0.03; ha[45] = 2; - a[46] = 1.00; ha[46] = 1; - a[47] = 400.00; ha[47] = 8; - - ka[1] = 9; - ka[2] = 17; - ka[3] = 24; - ka[4] = 31; - ka[5] = 39; - ka[6] = 45; - ka[7] = 49; - - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = 4.0e2; - bl[3] = 1.0e2; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 2.0e3; - bl[8] = -1.0e25; - bl[9] = -1.0e25; - bl[10] = -1.0e25; - bl[11] = -1.0e25; - bl[12] = 1.5e3; - bl[13] = 2.5e2; - bl[14] = -1.0e25; - - bu[0] = 2.0e2; - bu[1] = 2.5e3; - bu[2] = 8.0e2; - bu[3] = 7.0e2; - bu[4] = 1.5e3; - bu[5] = 1.0e25; - bu[6] = 1.0e25; - bu[7] = 2.0e3; - bu[8] = 6.0e1; - bu[9] = 1.0e2; - bu[10] = 4.0e1; - bu[11] = 3.0e1; - bu[12] = 1.0e25; - bu[13] = 3.0e2; - bu[14] = 1.0e25; - - istate[0] = 0; - istate[1] = 0; - istate[2] = 0; - istate[3] = 0; - istate[4] = 0; - istate[5] = 0; - istate[6] = 0; - istate[7] = 0; - - xs[0] = 0.0; - xs[1] = 0.0; - xs[2] = 0.0; - xs[3] = 0.0; - xs[4] = 0.0; - xs[5] = 0.0; - xs[6] = 0.0; - xs[7] = 0.0; - - ifail = 0; - E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, - lrwsav,ifail); - e04wb.eval(); - - leniz = 1; - lenz = 1; - iz = new int[leniz]; - z = new double[lenz]; - - QPHX qphx = new QPHX(); - - ifail = 1; - - //placeholders - ns = 0; - miniz = 0; - minz = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - - E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, - crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, - leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); - e04nk.eval(); - ifail = e04nk.getIFAIL(); - - minz = e04nk.getMINZ(); - miniz = e04nk.getMINIZ(); - - lenz = minz; - leniz = miniz; - - iz = new int[leniz]; - z = new double[lenz]; - - ifail = -1; - - e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, - istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, - lwsav,iwsav,rwsav,ifail); - - //update - ifail = e04nk.getIFAIL(); - obj = e04nk.getOBJ(); - - if(ifail == 0){ - System.out.println(); - System.out.println("\tVariable Istate Value Lagr Mult"); - System.out.println(); - - for(i = 0; i < n; i++){ - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - if(m > 0){ - System.out.println(); - System.out.println(); - System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); - System.out.println(); - - for(i = n; i < n + m - 1; i++){ - System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - System.out.println(); - System.out.println(); - System.out.printf("Final objetive value = %15.7g\n", obj); - } - - } - - public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ - public void eval(){ - this.HX[0] = 2 * this.X[0]; - this.HX[1] = 2 * this.X[1]; - this.HX[2] = 2 * (this.X[2] + this.X[3]); - this.HX[3] = this.HX[2]; - this.HX[4] = 2 * this.X[4]; - this.HX[5] = 2 * (this.X[5] + this.X[6]); - this.HX[6] = this.HX[5]; - } - } -} diff --git a/simple_examples/source/int32/E04NQJE.java b/simple_examples/source/int32/E04NQJE.java deleted file mode 100644 index 6cf84fe..0000000 --- a/simple_examples/source/int32/E04NQJE.java +++ /dev/null @@ -1,384 +0,0 @@ -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NT; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NQ example program text. - */ -public class E04NQJE { - - public static final int LENCW = 600; - public static final int LENIW = 600; - public static final int LENRW = 600; - public static final int NIN = 5; - public static final int NOUT = 6; - - public static void main(String[] args) throws IOException { - - /* Local Scalars */ - double obj, objadd, sinf; - int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; - boolean verboseOutput; - String prob; // Length = 8 - String start; // Length = 1 - /* Local Arrays */ - double[] acol, bl, bu, c, pi, rc, x; - double[] ruser = new double[1], rw = new double[LENRW]; - int[] helast, hs, inda, loca; - int[] iuser = new int[1], iw = new int[LENIW]; - String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 - String[] names; // Length = 8 - /* Init String arrays with same length*/ - Arrays.fill(cuser, " "); - Arrays.fill(cw, " "); - - System.out.println(" E04NQJ Example Program Results"); - - /* Read data file */ - - if (args.length != 1) { - usage(); - } - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - String line; - - // Skip heading in data file - line = dataIn.readLine(); - - // Read n, m - line = dataIn.readLine(); - String[] data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 2) { - System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" - + line + "\n"+Arrays.toString(data)); - System.exit(1); - } - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - - // Read ne, iobj, ncolh, start, nname - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 5) { - System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); - System.exit(1); - } - ne = Integer.parseInt(data[0]); - iobj = Integer.parseInt(data[1]); - ncolh = Integer.parseInt(data[2]); - start = data[3].replaceAll("'",""); - nname = Integer.parseInt(data[4]); - - // Allocate - inda = new int[ne]; - loca = new int[n+1]; - helast = new int[n+m]; - hs = new int[n+m]; - acol = new double[ne]; - bl = new double[n+m]; - bu = new double[n+m]; - x = new double[n+m]; - pi = new double[m]; - rc = new double[n+m]; - names = new String[nname]; - - // Read names - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - int nameIndex = 0; - int dataIndex = 0; - while (nameIndex < nname) { - names[nameIndex] = data[dataIndex].replaceAll("'", ""); - ++nameIndex; - ++dataIndex; - if (nameIndex < nname && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read matrix - line = dataIn.readLine(); // skipping blank line - int locaIndex = 0; - int currentCol = 0; - for (i = 0; i < ne; ++i) { - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 3) { - System.out.println("The line is not well formatted for input of A:\n\t"+line); - System.exit(1); - } - acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); - inda[i] = Integer.parseInt(data[1]); - if (i == 0) { - loca[locaIndex] = 1;//storing for Fortran use: 1-based - ++locaIndex; - ++currentCol; - } - else { - int tmp = Integer.parseInt(data[2]); - if (tmp != currentCol) { - loca[locaIndex] = i+1; - ++currentCol; - ++locaIndex; - } - } - } - loca[n] = ne + 1; - - // Read bl - line = dataIn.readLine(); // skipping blank line - int blindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (blindex < bl.length) { - bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++blindex; - ++dataIndex; - if (blindex < bl.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read bu - line = dataIn.readLine(); // skipping blank line - int buindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (buindex < bu.length) { - bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++buindex; - ++dataIndex; - if (buindex < bu.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read hs - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (start.equalsIgnoreCase("C")) { - if (data.length != n) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - else { - if (data.length != n+m) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - for (i = 0; i < data.length; ++i) { - hs[i] = Integer.parseInt(data[i]); - } - - // Read x - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != n) { - System.out.println("Wrong format for X data."); - System.exit(1); - } - for (i = 0; i < data.length; ++i) { - x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); - } - - /* Done reading data file */ - - System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); - - /* Call E04NP to initialize E04NQ. */ - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); - - /* Set this to .True. to cause e04nqf to produce intermediate - * progress output. */ - verboseOutput = true; - - if (verboseOutput) { - /* By default e04nqf does not print monitoring - * information. Set the print file unit or the summary - * file unit to get information. */ - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); - } - - /* We have no explicit objective vector so set LENC = 0; the - * objective vector is stored in row IOBJ of ACOL. */ - lenc = 0; - c = new double[Math.max(1,lenc)]; - objadd = 0.0; - sinf = 0.0; - obj = Double.NaN; - prob = " "; - - /* Do not allow any elastic variables (i.e. they cannot be - * infeasible). If we'd set optional argument "Elastic mode" to 0, - * we wouldn't need to set the individual elements of array HELAST. */ - - for (int j = 0; j < (n+m); j++) { - helast[j] = 0; - } - - /* Solve the QP problem. */ - - E04NQ e04nq = new E04NQ(); - ifail = 0; - ns = 0; - ninf = 0; - e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, - inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, - iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); - - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); - System.out.print(" Optimal X = "); - for (i = 0; i < n; ++i) { - System.out.printf("%9.2f ", x[i]); - } - System.out.println(); - - } - - private static void usage() { - System.out.println("Usage:\n" - + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator - + ". E04NQJE " + File.separator + "e04nqfe.d"); - System.exit(1); - } - - public static class QPHX implements E04NQ.E04NQ_QPHX { - - private int NCOLHREF; - - public QPHX(int NCOLHREF) { - this.NCOLHREF = NCOLHREF; - } - - // @Override - public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, - String[] CUSER, int[] IUSER, double[] RUSER) { - - if (NCOLH != NCOLHREF) { - System.out.println("NCOLH value is wrong!"); - System.out.println("TEST FAILED"); - System.exit(1); - } - HX[0] = 2.0*X[0]; - HX[1] = 2.0*X[1]; - HX[2] = 2.0*(X[2]+X[3]); - HX[3] = HX[2]; - HX[4] = 2.0*X[4]; - HX[5] = 2.0*(X[5]+X[6]); - HX[6] = HX[5]; - - } - - private String[] CUSER; - private double[] HX,RUSER,X; - private int[] IUSER; - private int NCOLH, NSTATE; - - // @Override - public String[] getCUSER() { - return CUSER; - } - - // @Override - public double[] getHX() { - return HX; - } - - // @Override - public int[] getIUSER() { - return IUSER; - } - - // @Override - public int getNCOLH() { - return NCOLH; - } - - // @Override - public int getNSTATE() { - return NSTATE; - } - - // @Override - public double[] getRUSER() { - return RUSER; - } - - // @Override - public double[] getX() { - return X; - } - - // @Override - public void setCUSER(String[] arg0) { - CUSER = arg0; - - } - - // @Override - public void setHX(double[] arg0) { - HX = arg0; - - } - - // @Override - public void setIUSER(int[] arg0) { - IUSER = arg0; - - } - - // @Override - public void setNCOLH(int arg0) { - NCOLH = arg0; - - } - - // @Override - public void setNSTATE(int arg0) { - NSTATE = arg0; - - } - - // @Override - public void setRUSER(double[] arg0) { - RUSER = arg0; - - } - - // @Override - public void setX(double[] arg0) { - X = arg0; - - } - - } - - - - -} diff --git a/simple_examples/source/int32/E04PTJE.java b/simple_examples/source/int32/E04PTJE.java deleted file mode 100644 index 75303ac..0000000 --- a/simple_examples/source/int32/E04PTJE.java +++ /dev/null @@ -1,344 +0,0 @@ -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RB; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.F08.DSYEVD; -import java.util.Arrays; - -/** - * E04PTJ example program text. - * @author joed - * @since 27.0.0.0 - */ -public class E04PTJE { - - - /** - * Monitoring function can be used to monitor the progress - * or, for example, to implement bespoke stopping criteria. - */ - private static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - - double tol = RUSER[0]; - int tolReached = IUSER[1]; - - // If x is close to the solution, print a message - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - if (tolReached == 0) { - System.out.println(); - System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); - IUSER[1] = 1; - } - } - - } - - } - - - /** - * E04PTJ example main program. - */ - public static void main(String[] args) { - - DSYEVD dsyevd = new DSYEVD(); - E04PT e04pt = new E04PT(); - E04RA e04ra = new E04RA(); - E04RB e04rb = new E04RB(); - E04RE e04re = new E04RE(); - E04RH e04rh = new E04RH(); - E04RJ e04rj = new E04RJ(); - E04RZ e04rz = new E04RZ(); - E04ZM e04zm = new E04ZM(); - MONIT monit = new MONIT(); - - final int nqc = 1; - long cpuser, handle; - double r1; - int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, - nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; - boolean verboseOutput; - String ctype1, ctype2; // Length must be 8 - double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, - work, x, xl, xu; - double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; - int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; - int[] iuser = new int[2]; - - System.out.println("E04PTJ Example Program Results\n"); - - // Dimensions of the problem - n = 3; - nnzp0 = 6; - nnzp1 = 6; - - // Initialize size of linear constraints in SOCP - m = nqc; - na = n + nqc + 1; - nnza = nqc + n; - - // Initialize size of cone constraints - nvarc1 = 2; - nvarc2 = 2; - - // Set problem data - lwork = Math.max(2*n*n+6*n+1, 120+9*n); - liwork = 5*n + 3; - irowp0 = new int[]{1, 2, 3, 2, 3, 3}; - icolp0 = new int[]{1, 1, 1, 2, 2, 3}; - p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; - irowp1 = new int[]{1, 2, 3, 2, 3, 3}; - icolp1 = new int[]{1, 1, 1, 2, 2, 3}; - p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; - q0 = new double[]{0.847, 0.08, 0.505}; - q1 = new double[]{0.065, 0.428, 0.097}; - r1 = 1.276; - f0 = new double[n*n]; - f1 = new double[n*n]; - lambda0 = new double[n]; - lambda1 = new double[n]; - work = new double[lwork]; - iwork = new int[liwork]; - - // Store full P0 and P1 in F0 and F1 - Arrays.fill(f0, 0.0); - for (i = 0; i < nnzp0; i++) { - f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; - } - Arrays.fill(f1, 0.0); - for (i = 0; i < nnzp1; i++) { - f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; - } - - // Factorize P0 and P1 via eigenvalue decomposition - ifail = 0; - dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); - dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); - - // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 - nu = 0; - nv = 0; - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - for (j = 1; j <= n; j++) { - f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); - } - m++; - nu++; - nnza += n; - } - if (lambda1[i-1] > 0) { - for (j = 1; j <= n; j++) { - f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); - } - m++; - nv++; - nnza += n; - } - } - nnza += nu + nv; - na += nu+ nv; - nvarc1 += nu; - nvarc2 += nv; - - // Add two fixed variable for two rotated quadratic cones - na += 2; - m += 2; - nnza += 2; - - // Compute size of multipliers - nnzu = 2*na + 2*m; - nnzuc = nvarc1 + nvarc2; - - // Initialize arrays to build SOCP - icola = new int[nnza]; - irowa = new int[nnza]; - a = new double[nnza]; - bla = new double[m]; - bua = new double[m]; - xl = new double[na]; - xu = new double[na]; - c = new double[na]; - x = new double[na]; - u = new double[nnzu]; - uc = new double[nnzuc]; - idxc1 = new int[nvarc1]; - idxc2 = new int[nvarc2]; - - // Build objective function parameter c - // [x, t1, u, v, y1, y2, t0] - Arrays.fill(c, 0.0); - for (j = 0; j < n; j++) { - c[j] = q0[j]; - } - c[na-1] = 1.0; - - // Build linear constraints parameter A - idxa = 0; - rptr = 0; - // q1 in First row - rptr++; - Arrays.fill(irowa, 0, n, rptr); - for (j = 0; j < n; j++) { - icola[j] = j+1; - a[j] = q1[j]; - } - idxa += n; - - // F0 in F0*x-u=0 row - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f0[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // F1 in F1*x-v=0 row - for (i = 1; i <= n; i++) { - if (lambda1[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f1[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // Rest of A, a diagonal matrix - for (j = 0; j < m; j++) { - irowa[idxa+j] = j+1; - icola[idxa+j] = n+j+1; - a[idxa+j] = 1.0; - } - for (j = 1; j < (nu+nv+1); j++) { - a[idxa+j] = -1.0; - } - // RHS in linear constraints - Arrays.fill(bla, 0.0); - Arrays.fill(bua, 0.0); - bla[0] = -r1; - bua[0] = -r1; - for (j = (m-nqc); j <= m; j++) { - bla[j-1] = 1.0; - bua[j-1] = 1.0; - } - - // Box constraints, all variables are free - Arrays.fill(xl, -1E+20); - Arrays.fill(xu, 1E+20); - - // Cone constraints - // First cone - idxc1[0] = na; - idxc1[1] = n + 1 + nu + nv + 1; - for (j = 2; j < nvarc1; j++) { - idxc1[j] = n + j; - } - ctype1 = "RQUAD "; - // Second cone - idxc2[0] = n + 1; - idxc2[1] = n + 1 + nu + nv + 2; - for (j = 2; j < nvarc2; j++) { - idxc2[j] = n + nu + j; - } - ctype2 = "RQUAD "; - - // Create the problem handle - handle = 0; - ifail = 0; - e04ra.eval(handle, na, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - ifail = 0; - e04re.eval(handle, na, c, ifail); - - // Set box constraints - ifail = 0; - e04rh.eval(handle, na, xl, xu, ifail); - - // Set linear constraints - ifail = 0; - idlc = 0; - e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); - idlc = e04rj.getIDLC(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Turn on monitoring - ifail = 0; - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - /* Set this to true to cause e04pt to produce intermediate - * progress output */ - verboseOutput = false; - - if (verboseOutput) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } - else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = 0; // unused in this example - iuser[1] = 0; - ruser[0] = 1.0E-7; - ifail = -1; - e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, - ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if (ifail == 0 || ifail == 50) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (xIdx = 1; xIdx <= n; xIdx++) { - System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); - } - } - - // Free the handle memory - ifail = 0; - e04rz.eval(handle, ifail); - - } - - - /** - * Convert from 2D Fortran index to 1D-column major Java index. - * @param x 1-based row index for a 2D array - * @param y 1-based column index for a 2D array - * @return the corresponding 0-based index for a 1D column-major array - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/source/int32/E04RPJE.java b/simple_examples/source/int32/E04RPJE.java deleted file mode 100644 index d22d3d1..0000000 --- a/simple_examples/source/int32/E04RPJE.java +++ /dev/null @@ -1,199 +0,0 @@ -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RN; -import com.nag.routines.E04.E04RP; -import com.nag.routines.E04.E04RY; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04SV; - -/** - * E04RPJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ - -public class E04RPJE{ - - /** - * E04RPJ Example main program - */ - public static void main(String[] args){ - int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, - nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; - double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; - int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, - nnzq, qi, qj, idummy; - long cpuser, handle; - - rdummy = new double[1]; - rinfo = new double[32]; - stats = new double[32]; - idummy = new int[1]; - - System.out.println("E04RPJ Example Program Results"); - System.out.println(); - - //Problem size - nvar = 5; - nnzh = 0; - nclin = 0; - nnzb = 0; - nblk = 2; - - //Initialize handle to an empty problem - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - //Linear part of the objective function - cvec = new double[nvar]; - cvec[0] = 1; - cvec[1] = 0; - cvec[2] = 1; - cvec[3] = 0; - cvec[4] = 0; - - //Add the linear objetive function to the problem formulation - ifail = 0; - E04RE e04re = new E04RE(handle, nvar, cvec, ifail); - e04re.eval(); - - //Matrix inequalities - //block 1 - dimaq = 2; - nnzasum = 9; nnzqsum = 8; - idblk = 0; - - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 2; - nnza[2] = 3; - nnza[3] = 2; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 2.0; irowa[2] = 1; icola[2] = 1; - a[3] = -2.0; irowa[3] = 1; icola[3] = 2; - a[4] = 6.0; irowa[4] = 1; icola[4] = 1; - a[5] = 5.0; irowa[5] = 1; icola[5] = 2; - a[6] = -4.0; irowa[6] = 2; icola[6] = 2; - a[7] = 3.0; irowa[7] = 1; icola[7] = 2; - a[8] = 8.0; irowa[8] = 2; icola[8] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - //update - idblk = e04rn.getIDBLK(); - - nq = 6; - - qi = new int[nq]; - qj = new int[nq]; - nnzq = new int[nq]; - irowq = new int[nnzqsum]; - icolq = new int[nnzqsum]; - q = new double[nnzqsum]; - - qi[0] = 1; qj[0] = 4; - qi[1] = 2; qj[1] = 4; - qi[2] = 3; qj[2] = 4; - qi[3] = 1; qj[3] = 5; - qi[4] = 2; qj[4] = 5; - qi[5] = 3; qj[5] = 5; - - nnzq[0] = 1; - nnzq[1] = 2; - nnzq[2] = 1; - nnzq[3] = 1; - nnzq[4] = 2; - nnzq[5] = 1; - - q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; - q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; - q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; - q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; - q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; - q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; - q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; - q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; - - ifail = 0; - //Expand the existing linear matrix inequality with bilnear term - E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, - q,idblk,ifail); - e04rp.eval(); - - //block 2 - dimaq = 2; - nnzasum = 5; - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 1; - nnza[2] = 1; - nnza[3] = 1; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 1.0; irowa[2] = 1; icola[2] = 1; - a[3] = 1.0; irowa[3] = 1; icola[3] = 2; - a[4] = 1.0; irowa[4] = 2; icola[4] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - - System.out.println("Passing SDP problem to solver"); - System.out.println(); - - ifail = 0; - //Print overview of handle - //nout = 6 is default output for fortran - E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); - e04ry.eval(); - - //Allocate memory for the solver - x = new double[nvar]; - nnzu = 0; - nnzuc = 0; - nnzua = 0; - inform = 0; - for(int i = 0; i < nvar; i++){ - x[i] = 0.0; - } - - ifail = 0; - E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, - rinfo,stats,inform,ifail); - e04sv.eval(); - - //Destroy handle - ifail = 0; - E04RZ e04rz = new E04RZ(handle,ifail); - e04rz.eval(); - } - -} - - - diff --git a/simple_examples/source/int32/E04RSJE.java b/simple_examples/source/int32/E04RSJE.java deleted file mode 100644 index d614fbb..0000000 --- a/simple_examples/source/int32/E04RSJE.java +++ /dev/null @@ -1,229 +0,0 @@ -import com.nag.routines.E04.E04RS; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RS - */ -public class E04RSJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - double s = 0.0; - int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; - int[] iuser = new int[2]; - - System.out.println(" E04RSJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - nnzq0 = Integer.parseInt(sVal[1]); - nnzq1 = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - irowq0 = new int[nnzq0]; - icolq0 = new int[nnzq0]; - q0 = new double[nnzq0]; - irowq1 = new int[nnzq1]; - icolq1 = new int[nnzq1]; - q1 = new double[nnzq1]; - idxr0 = new int[n]; - r0 = new double[n]; - idxr1 = new int[n]; - r1 = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - irowq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - icolq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - q0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - irowq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - icolq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - q1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - s = Double.parseDouble(sVal[0]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute size of multipliers - // One quadratic constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - idqc = -1; - ifail = 0; - E04RS e04rs = new E04RS(); - e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); - - // Set quadratic constraint - idqc = 0; - ifail = 0; - e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } -} diff --git a/simple_examples/source/int32/E04RTJE.java b/simple_examples/source/int32/E04RTJE.java deleted file mode 100644 index dd4bce8..0000000 --- a/simple_examples/source/int32/E04RTJE.java +++ /dev/null @@ -1,225 +0,0 @@ -import com.nag.routines.E04.E04RT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RT example program text. - */ -public class E04RTJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; - double[] lc = new double[3]; - double[] lc_rhs = new double[1]; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icola = null, idxr0 = null, irowa = null; - int[] icollc = new int[3]; - int[] irowlc = new int[3]; - int[] iuser = new int[2]; - - System.out.println(" E04RTJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - m = Integer.parseInt(sVal[1]); - nnza = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - a = new double[nnza]; - icola = new int[nnza]; - irowa = new int[nnza]; - idxr0 = new int[n]; - r0 = new double[n]; - b = new double[m]; - xl = new double[n]; - xu = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - irowa[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - icola[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < m; i++) { - b[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xl[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xu[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute -2*b'A as linear term in quadratic function - for (j = 0; j < n; j++) { - r0[j] = 0.0; - idxr0[j] = j + 1; - } - for (i = 0; i < nnza; i++) { - r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; - } - - // Compute size of multipliers - // One linear constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2 * n + 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set quadratic objective function - idqc = -1; - ifail = 0; - E04RT e04rt = new E04RT(); - e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); - - // Set box constraints - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, n, xl, xu, ifail); - - // Set linear constraint: x1 + x2 + x3 = 1 - for (j = 0; j < n; j++) { - irowlc[j] = 1; - icollc[j] = j + 1; - lc[j] = 1.0; - } - lc_rhs[0] = 1.0; - ifail = 0; - idlc = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } - } diff --git a/simple_examples/source/int32/E04SAJE.java b/simple_examples/source/int32/E04SAJE.java deleted file mode 100644 index 325267b..0000000 --- a/simple_examples/source/int32/E04SAJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.routines.E04.E04RC; -import com.nag.routines.E04.E04SA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04PTU; - -/** - * E04SA example program text. - */ -public class E04SAJE { - - public static final String fname = "e04saje.opt"; - public static void main(String[] args) { - - long cpuser, handle = 0; - int ifail, n, nnzu, nnzuc, x_idx; - boolean verbose_output; - String ftype; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u, uc, x; - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04SAJ Example Program Results"); - - // Read mps file to a handle - ifail = 0; - ftype = "mps"; - E04SA e04sa = new E04SA(); - e04sa.eval(handle, fname, ftype, pinfo, ifail); - handle = e04sa.getHANDLE(); - - // Get problem size from pinfo - pinfo = e04sa.getPINFO(); - n = pinfo[0]; - nnzu = pinfo[10]; - nnzuc = pinfo[11]; - - // Set all variables as continuous - ifail = 0; - E04RC e04rc = new E04RC(); - - int[] x_idx_Arr = new int[n]; - for (x_idx = 1; x_idx <= n; x_idx++) { - x_idx_Arr[x_idx - 1] = x_idx; - } - - e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); - - // Allocate memory - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Set this to .True. to cause e04ptf to produce intermediate progress output - verbose_output = false; - - E04ZM e04zm = new E04ZM(); - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx " + " Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - E04PTU e04ptu = new E04PTU(); - e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); - this.INFORM = e04ptu.getINFORM(); - } - } -} diff --git a/simple_examples/source/int32/E04TAJE.java b/simple_examples/source/int32/E04TAJE.java deleted file mode 100644 index 97cebe2..0000000 --- a/simple_examples/source/int32/E04TAJE.java +++ /dev/null @@ -1,188 +0,0 @@ -import com.nag.routines.E04.E04TA; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04MTU; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04TE; -import com.nag.routines.E04.E04TJ; -import com.nag.routines.E04.E04RW; -import com.nag.routines.E04.E04RZ; - -import java.util.Arrays; - -/** - * E04TA - */ -public class E04TAJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser, handle; - int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; - - double[] a, bla, bua, cvec, ulag, x, xl, xu; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u = new double[1]; - - int[] icola, irowa; - - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04TAJ Example Program Results\n"); - System.out.println(" Solve the first LP\n"); - - handle = 0; - cpuser = 0; - - // Initialize the handle - nvar = 2; - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define the objective function - cvec = new double[nvar]; - cvec[0] = 2.0; - cvec[1] = 4.5; - ifail = 0; - E04RE e04re = new E04RE(); - e04re.eval(handle, nvar, cvec, ifail); - - // Box constraints - xl = new double[nvar]; - xu = new double[nvar]; - Arrays.fill(xl, 0.0); - xu[0] = infbnd; - xu[1] = 100.0; - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, xl, xu, ifail); - - // Set the linear constraints - idlc = 0; - nclin = 3; - nnza = 6; - bla = new double[nclin]; - bua = new double[nclin]; - irowa = new int[nnza]; - icola = new int[nnza]; - a = new double[nnza]; - Arrays.fill(bla, -infbnd); - bua = new double[] { - 1500.0, 6000.0, 16000.0 - }; - irowa = new int[] { - 1, 1, 2, 2, 3, 3 - }; - icola = new int[] { - 1, 2, 1, 2, 1, 2 - }; - a = new double[] { - 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 - }; - ifail = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); - - // Optional parameters - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Task = Max", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - - // Call the LP solver - x = new double[nvar + 1]; - nnzu = 0; - ifail = -1; - E04MT e04mt = new E04MT(); - MONIT monit = new MONIT(); - e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a variable - ifail = 0; - E04TA e04ta = new E04TA(); - e04ta.eval(handle, 1, nvar, ifail); - nvar = e04ta.getNVAR(); - - // Box constraint on the new variable - ifail = 0; - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); - - // Add the linear objective component - ifail = 0; - E04TE e04te = new E04TE(); - e04te.eval(handle, 3, 7.0, ifail); - - // Add linear constraints coefficients - E04TJ e04tj = new E04TJ(); - ifail = 0; - e04tj.eval(handle, 1, 3, 5.0, ifail); - ifail = 0; - e04tj.eval(handle, 2, 3, 12.0, ifail); - ifail = 0; - e04tj.eval(handle, 3, 3, 120.0, ifail); - - System.out.println("\n The new variable has been added, solve the handle again\n"); - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a linear constraint - nclin = 1; - bla[0] = -infbnd; - bua[0] = 100.0; - nnza = 2; - irowa[0] = 1; - irowa[1] = 1; - icola[0] = 2; - icola[1] = 3; - a[0] = 1.0; - a[1] = 1.0; - idlc = 0; - e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); - - System.out.println("\n The new constraint has been added, solve the handle again\n"); - - // Query the problem sizes to request the Lagrangian multipliers for the - // last solve - ioflag = 1; - liarr = 100; - E04RW e04rw = new E04RW(); - e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); - nnzu = pinfo[10]; - ulag = new double[nnzu]; - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Free the memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - E04MTU e04mtu = new E04MTU(); - e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, - this.CPUSER, this.INFORM); - this.INFORM = e04mtu.getINFORM(); - } - } -} diff --git a/simple_examples/source/int32/E04TCJE.java b/simple_examples/source/int32/E04TCJE.java deleted file mode 100644 index d28d78b..0000000 --- a/simple_examples/source/int32/E04TCJE.java +++ /dev/null @@ -1,263 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGU; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04TB; -import com.nag.routines.E04.E04TC; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Arrays; - -/** - * E04TC example program text. - * @author Mo - */ -public class E04TCJE { - - public static void main(String[] args) { - double[] rx, x, udt, udy; - double[] rinfo = new double[100], ruser = new double[0], - stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, udnres; - int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; - int[] idx; - long cpuser, handle; // c_ptr - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - /* Header */ - System.out.printf(" E04TCJ Example Program Results\n\n"); - try { - - handle = 0L; - cpuser = 0L; - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - - /* Read number of residuals */ - nres = Integer.parseInt(data[0]); - - udnres = nres; - - /* Allocate memory */ - udt = new double[nres]; - udy = new double[nres]; - - /* Read observations */ - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udt[ii+jj] = Double.parseDouble(data[jj]); - } - } - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udy[ii+jj] = Double.parseDouble(data[jj]); - } - } - - /* try to fit the model */ - /* f(t) = at^2 + bt + c + d sin(omega t) */ - /* To the data {(t_i, y_i)} */ - nvar = 5; - - /* Initialize the NAG optimization handle */ - E04RA e04ra = new E04RA(); - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define a dense nonlinear least-squares objective function */ - /* (isparse = 0 => the sparsity pattern of the Jacobian */ - /* doesn't need to be defined) */ - E04RM e04rm = new E04RM(); - isparse = 0; - nnzrd = 1; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set some optional parameters to control the output of the solver */ - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - - System.out.println("First solve the problem with the outliers"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Call the solver */ - E04GG e04gg = new E04GG(); - x = new double[nvar]; - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - rx = new double[nres]; - iuser = new int[] {udnres}; - ruser = new double[2 * udnres];; - for (int ii = 0; ii < udnres; ii++) { - ruser[ii] = udt[ii]; - ruser[udnres + ii] = udy[ii]; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Now remove the outlier residuals from the problem handle"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Disable the two outlier residuals */ - E04TC e04tc = new E04TC(); - idx = new int[] {10, 20}; - e04tc.eval(handle, "NLS", 2, idx, ifail); - - /* Solve the problem again */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Assuming the outliers points are measured again"); - System.out.println("we can enable the residuals and adjust the values"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Fix the first variable to its known value of 0.3 */ - /* enable the residuals and adjust the values in the data */ - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); - E04TB e04tb = new E04TB(); - e04tb.eval(handle, "NLS", 2, idx, ifail); - udy[9] = -0.515629; - udy[19] = 0.54920; - - /* Solve the problem */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - } - catch (Exception ex) { - Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + - this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - - udy[i]; - } - - this.INFORM = 0; - - } - - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 1; i <= this.NRES; i++) { - this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); - this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; - this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; - this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); - this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * - Math.cos(this.X[4] * udt[i-1]); - - } - - this.INFORM = 0; - - } - - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - E04GGU e04ggu = new E04GGU(); - e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggu.getINFORM(); - } - - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/source/int32/E04UCJE.java b/simple_examples/source/int32/E04UCJE.java deleted file mode 100644 index e43d457..0000000 --- a/simple_examples/source/int32/E04UCJE.java +++ /dev/null @@ -1,211 +0,0 @@ -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E04UE; -import com.nag.routines.F06.DGEMV; -import java.util.Arrays; - -/** - * E04UC example program text. - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) { - - /* Local Scalars */ - double objf; - int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[LRWSAV]; - int[] istate, iwork; - int[] iuser = new int[1], iwsav = new int[LIWSAV]; - boolean[] lwsav = new boolean[LLWSAV]; - String[] cwsav = new String[LCWSAV]; - Arrays.fill(cwsav, - " "); - - System.out.println(" E04UCJ Example Program Results"); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new int[n + nclin + ncnln]; - iwork = new int[liwork]; - c = new double[Math.max(1, ncnln)]; - cjac = new double[ldcj * sdcjac]; - clamda = new double[n + nclin + ncnln]; - objgrd = new double[n]; - r = new double[ldr * n]; - work = new double[lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - E04UE e04ue = new E04UE(); - inform = 0; - e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives. */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[LDCJ] = X[1] + X[1]; - CJAC[2*LDCJ] = X[2] + X[2]; - CJAC[3*LDCJ] = X[3] + X[3]; - } - - } - - if (NEEDC[1] > 0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[1+LDCJ] = X[0]*X[2]*X[3]; - CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; - CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/source/int32/E04YAJE.java b/simple_examples/source/int32/E04YAJE.java deleted file mode 100644 index 72d80da..0000000 --- a/simple_examples/source/int32/E04YAJE.java +++ /dev/null @@ -1,112 +0,0 @@ -import com.nag.routines.E04.E04YA; - - -/** - * E04YA example program text. - * @author joed - */ -public class E04YAJE { - - public static LSQFUN lsqfun = new LSQFUN(); - public static final int LIW = 1, MDEC = 15, NDEC = 3; - public static final int LDFJAC = MDEC; - public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; - public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - int i; - - for (i = 0; i < M; i++) { - denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); - - if (IFLAG != 1) { - FVEC[i] = XC[0] + (t[i]/denom) - y[i]; - } - - if (IFLAG != 0) { - FJAC[i] = 1.0; - dummy = -1.0/(denom*denom); - FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; - FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; - } - - } - } - - } - - public static void main(String[] args) { - int i, ifail, m, n; - double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], - w = new double[LW], x = new double[NDEC]; - int[] iw = new int[LIW]; - - System.out.println(" E04YAJ Example Program Results"); - - n = NDEC; - m = MDEC; - - /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) - * (I = 1, 2, ..., m) */ - - y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, - 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; - for (i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - /* Set up an arbitrary point at which to check the 1st derivatives */ - - x[0] = 0.19; - x[1] = -1.34; - x[2] = 0.88; - - System.out.println(); - System.out.println("The test point is"); - System.out.printf(" "); - for (i = 0; i < n; i++) { - System.out.printf("%10.5f", x[i]); - } - System.out.printf("\n"); - - E04YA e04ya = new E04YA(); - ifail = -1; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); - ifail = e04ya.getIFAIL(); - - if (ifail >= 0 && ifail != 1) { - - switch (ifail) { - case 0: - System.out.println(); - System.out.println("1st derivatives are consistent with residual values"); - break; - case 2: - System.out.println(); - System.out.println("Probable error in calculation of 1st derivatives"); - break; - default: - } - - System.out.println(); - System.out.println("At the test point, LSQFUN gives"); - System.out.println(); - System.out.println(" Residuals 1st derivatives"); - for (i = 0; i < m; i++) { - System.out.printf(" %15.3E", fvec[i]); - System.out.printf("%15.3E", fjac[i]); - System.out.printf("%15.3E", fjac[LDFJAC + i]); - System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); - } - - } - - } - -} diff --git a/simple_examples/source/int32/F01ADJE.java b/simple_examples/source/int32/F01ADJE.java deleted file mode 100644 index 4167f71..0000000 --- a/simple_examples/source/int32/F01ADJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.F01.F01AD; -import com.nag.routines.X04.X04CA; - - -/** - * F01AD example program text. - * @author joed - */ -public class F01ADJE { - - public static void main(String[] args) { - - int i, ifail, lda, n; - double[] a; - - System.out.println(" F01ADJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n + 1; - a = new double[] { - 5.0, 7.0, 6.0, 5.0, 0.0, - 7.0, 10.0, 8.0, 7.0, 0.0, - 6.0, 8.0, 10.0, 9.0, 0.0, - 5.0, 7.0, 9.0, 10.0, 0.0 - }; - - F01AD f01ad = new F01AD(); - ifail = -1; - f01ad.eval(n, a, lda, ifail); - ifail = f01ad.getIFAIL(); - - /* Print the result matrix A */ - X04CA x04ca = new X04CA(); - x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); - - } - -} diff --git a/simple_examples/source/int32/F01CKJE.java b/simple_examples/source/int32/F01CKJE.java deleted file mode 100644 index ed3ffa2..0000000 --- a/simple_examples/source/int32/F01CKJE.java +++ /dev/null @@ -1,60 +0,0 @@ -import com.nag.routines.F01.F01CK; -import com.nag.routines.X04.X04CB; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CK example program text. - * @author ludovic - */ -public class F01CKJE { - - public static void main(String[] args) { - - double[] a, b, c, z; - int n, p, m, iz, opt; - int ifail; - - m = 3; - n = p = 2; - iz = 1; - opt = 1; - a = new double[n * p]; - b = new double[n * m]; - c = new double[m * p]; - z = new double[iz]; - ifail = 0; - - System.out.println(" F01CKJ Example Program Results"); - - // Initialising b and c - - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - b[j+i*n] = (double) (i+j); - } - for (int j = 0; j < p; ++j) { - c[i+j*m] = (double) (i+j); - } - } - - F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); - f01ck.eval(); - ifail = f01ck.getIFAIL(); - String title = "Matrix A"; - System.out.println(); - System.out.flush(); - ifail = 0; - - String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; - String[] dummy = {" "}; - int ncols = 80; - int indent = 0; - - (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, - dummy,ncols,indent, ifail); - - } - -} diff --git a/simple_examples/source/int32/F01CRJE.java b/simple_examples/source/int32/F01CRJE.java deleted file mode 100644 index c10b284..0000000 --- a/simple_examples/source/int32/F01CRJE.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.nag.routines.F01.F01CR; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CR example program text. - * @author ludovic - */ -public class F01CRJE { - - public static void main(String[] args) { - System.out.println(" F01CRJ Example Program Results"); - double[] a; - int m,n,mn,lmove; - int[] move; - int ifail; - n = 7; - m = 3; - mn = m*n; - lmove = (m + n)/2; - a = new double[mn]; - move = new int[lmove]; - ifail = 1; - - for (int i = 0; i < mn; i++) { - a[i] = i+1.0; - } - - F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); - f01cr.eval(); - - System.out.println(); - int index = 0; - for (int i = 0; i < mn; ++i) { - System.out.printf(" %7.1f",a[i]); - ++index; - if (index == 7) { - System.out.println(); - index = 0; - } - } - System.out.println(); - - } - -} diff --git a/simple_examples/source/int32/F01DGJE.java b/simple_examples/source/int32/F01DGJE.java deleted file mode 100644 index 107137f..0000000 --- a/simple_examples/source/int32/F01DGJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F01.F01DG; -import com.nag.routines.X04.X04CA; - -/** - * F01DG example program text. - * @author joed - * @since 27.0.0.0 - */ -public class F01DGJE { - - /** - * F01DG example main program. - */ - public static void main(String[] args) { - - F01DG f01dg = new F01DG(); - X04CA x04ca = new X04CA(); - double alpha; - int i, ifail, lda, ldb, n; - String side, transa, uplo; // Length 1 - double[] a, b; - - System.out.println("F01DGJ Example Program Results\n"); - - // Values for side, uplo and transa - side = "L"; - uplo = "U"; - transa = "T"; - - // Order of square matrices - n = 4; - lda = n; - ldb = n; - - // Scaling constant alpha - alpha = 0.4; - - // Set input matrices (column-major order) - a = new double[]{ - 1.5, 0.0, 0.0, 0.0, - 2.3, 3.4, 0.0, 0.0, - 6.7, 5.4, 8.1, 0.0, - 1.9, 8.6, 2.0, 5.9 - }; - b = new double[]{ - 3.5, 0.0, 0.0, 0.0, - 2.1, 5.6, 0.0, 0.0, - 4.0, 2.1, 1.7, 0.0, - 2.1, 2.5, 1.1, 7.4 - }; - - /* ifail: behaviour on error exit - * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ - ifail = 0; - - // Find B=alpha*A*B - f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); - ifail = f01dg.getIFAIL(); - - // Print the solution - if (ifail == 0) { - if (transa.equals("N")) { - x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); - } - else { - x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); - } - } - - } - -} diff --git a/simple_examples/source/int32/F01ELJE.java b/simple_examples/source/int32/F01ELJE.java deleted file mode 100644 index 9986c6c..0000000 --- a/simple_examples/source/int32/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/source/int32/F01EMJE.java b/simple_examples/source/int32/F01EMJE.java deleted file mode 100644 index 716a7b5..0000000 --- a/simple_examples/source/int32/F01EMJE.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.nag.routines.F01.F01EM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F01EMJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F01EMJE{ - - /** - * F01EMJ Example main program - */ - public static void main(String[] args){ - double imnorm = 0; - int ifail, iflag = 0, lda, n; //placeholders - double[] a, ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("F01EMJ Example Program Results"); - System.out.println(); - - //Tell wrapper what type of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //Problem size - n = 4; - lda = n; - - //Allocate - a = new double[lda * n]; - - //Data - //A = ( 1, 0,-2, 1) - // (-1, 2, 0, 1) - // ( 2, 0, 1, 0) - // ( 1, 0,-2, 2) - a[0] = 1; - a[1] = -1; - a[2] = 2; - a[3] = 1; - a[4] = 0; - a[5] = 2; - a[6] = 0; - a[7] = 0; - a[8] = -2; - a[9] = 0; - a[10] = 1; - a[11] = -1; - a[12] = 1; - a[13] = 1; - a[14] = 0; - a[15] = 2; - - //Find f(A) - ifail = 0; - //Create fexp2 object to pass to wrapper - fexp2 f = new fexp2(); - F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); - f01em.eval(); - - //Print solution - ifail = 0; - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); - x04ca.eval(); - - //Print the norm oof the imaginary part to check if it small - System.out.println(); - System.out.printf("Imnorm = %.2f\n", imnorm); - } - - /** - * fexp2 class representing f routine argument - */ - public static class fexp2 extends F01EM.Abstract_F01EM_F{ - public void eval(){ - NAGComplex two = new NAGComplex(2, 0); - NAGComplex twoPowM = new NAGComplex(2, 0); - - twoPowM.setRe(Math.pow(2, this.M)); - - for(int i = 0; i < this.NZ; i++){ - this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); - } - - //Set iflag nonzero to terminate exectuion for any reason - this.IFLAG = 0; - } - - //Raises e ^ z where z is a complex number - //Uses eulers formula; - //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) - public NAGComplex complexExp(NAGComplex x){ - NAGComplex tmp = new NAGComplex(); - tmp.setRe(Math.cos(x.getIm())); - tmp.setIm(Math.sin(x.getIm())); - NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); - return ans; - } - } -} diff --git a/simple_examples/source/int32/F02EKJE.java b/simple_examples/source/int32/F02EKJE.java deleted file mode 100644 index 3737022..0000000 --- a/simple_examples/source/int32/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/source/int32/F02FKJE.java b/simple_examples/source/int32/F02FKJE.java deleted file mode 100644 index 0dd7ab9..0000000 --- a/simple_examples/source/int32/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/source/int32/F02WGJE.java b/simple_examples/source/int32/F02WGJE.java deleted file mode 100644 index 36c26c6..0000000 --- a/simple_examples/source/int32/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/source/int32/F03BAJE.java b/simple_examples/source/int32/F03BAJE.java deleted file mode 100644 index 673ddec..0000000 --- a/simple_examples/source/int32/F03BAJE.java +++ /dev/null @@ -1,108 +0,0 @@ -import com.nag.routines.F03.F03BA; -import com.nag.routines.F07.F07AD; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F03BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F03BAJE{ - - /** - * F03BAJ example main program. - */ - public static void main(String[] args){ - double d = 0; - int id = 0, ifail, info = 0, lda = 0, n = 0; - double[] a; - int[] ipiv; - - //Should initialise values so java doesn't give any errors because of try/catch - a = new double[n]; - ipiv = new int[n]; - - System.out.println("F03BAJ Example Program Results"); - - //If file name not given print usage info - if(args.length != 1){ - F03BAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - lda = n; - - //reallocate with values from data file - a = new double[n * lda]; - ipiv = new int[n]; - - //read in matrix - for(int i = 0; i < n; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); - f07ad.eval(); - - ifail = 0; - - //Print out matrix - System.out.println(); - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivots"); - for(int i = 0; i < n; i++){ - System.out.printf("\t%d ", ipiv[i]); - } - System.out.printf("\n"); - System.out.println(); - - ifail = 0; - - F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); - f03ba.eval(); - d = f03ba.getD(); - id = f03ba.getID(); - - System.out.printf("D = \t%.5f ID = \t%d\n", d, id); - System.out.println(); - System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); - - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - -} - diff --git a/simple_examples/source/int32/F04AMJE.java b/simple_examples/source/int32/F04AMJE.java deleted file mode 100644 index a498b2b..0000000 --- a/simple_examples/source/int32/F04AMJE.java +++ /dev/null @@ -1,114 +0,0 @@ -import com.nag.routines.F04.F04AM; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04AMJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04AMJE{ - - /** - * F04AMJ example main program. - */ - public static void main(String[] args){ - int m = 0, n = 0; - int ifail, ir, lda, ldb, ldqr, ldx; - double eps; - double[] a, b, alpha, e, qr, r, x, y, z; - int[] ipiv; - - System.out.println("F04AMJ Example Program Results"); - - if(args.length != 1){ - F04AMJE.usage(); - } - - //declare so try/catch works - a = new double[0]; - b = new double[0]; - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[1]); - n = Integer.parseInt(sVal[2]); - - a = new double[m * n]; - b = new double[m * 1]; - - for(int i = 0; i < m; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * m) ] = Double.parseDouble(sVal[j]); - } - for(int j = n; j < m; j++){ - b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - //Setting these in try block is more robust but less neat - //May be needed for array sizes~ - ir = 1; - lda = m; - ldb = m; - ldqr = m; - ldx = n; - - alpha = new double[n]; - e = new double[n]; - qr = new double[ldqr * n]; - r = new double[m]; - x = new double[ldx * ir]; - y = new double[n]; - z = new double[n]; - ipiv = new int[n]; - - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - - ifail = 0; - - F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); - f04am.eval(); - //update any values you want here - x = f04am.getX(); - - System.out.println("Solution"); - for(int i = 0; i < n; i++){ - for(int j = 0; j < ir; j++){ - System.out.printf("%.4f ", x[j + (i * ir)]); - } - System.out.printf("\n"); - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - - - - - - diff --git a/simple_examples/source/int32/F04BAJE.java b/simple_examples/source/int32/F04BAJE.java deleted file mode 100644 index 79c2b01..0000000 --- a/simple_examples/source/int32/F04BAJE.java +++ /dev/null @@ -1,144 +0,0 @@ -import com.nag.routines.F04.F04BA; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04BAJE{ - - /** - * F04BAJ example main program. - */ - public static void main(String[] args){ - int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder - int ierr, ifail; - double errbnd, rcond; - double a[], b[]; - int ipiv[]; - - a = new double[0]; b = new double[0]; //placeholder - - if(args.length != 1){ - F04BAJE.usage(); - } - - System.out.println("F04BAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - nrhs = Integer.parseInt(sVal[2]); - - lda = n; - ldb = n; - - a = new double[lda * n]; - b = new double[ldb * nrhs]; - - line = reader.readLine(); - for(int i = 0; i < lda; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < ldb; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < nrhs; j++){ - b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 1; - ipiv = new int[n]; - rcond = 0; - errbnd = 0; - F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); - f04ba.eval(); - - ifail = f04ba.getIFAIL(); - rcond = f04ba.getRCOND(); - errbnd = f04ba.getERRBND(); - ipiv = f04ba.getIPIV(); - a = f04ba.getA(); - b = f04ba.getB(); - - if(ifail == 0){ - //Print solution, estimate of condition number and approximate error bound. - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Estimate of condition number"); - System.out.printf("%.1e\n", 1/rcond); - System.out.println(); - System.out.println("Esttimate of error bound for computed solutions"); - System.out.printf("%.1e\n", errbnd); - } - else if(ifail == (n + 1)){ - //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. - System.out.println(); - System.out.println("Estimate of reciprocal of condition number"); - System.out.printf("%.1e\n", rcond); - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - } - else if(ifail > 0 && ifail <= n){ - //The upper triangular matrix U is exactly singular. Print details of factorization. - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivot indices"); - for(int i = 0; i < n; i++){ - System.out.printf("%d ", ipiv[i]); - } - System.out.printf("\n"); - } - else{ - System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); - } - - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/source/int32/F05AAJE.java b/simple_examples/source/int32/F05AAJE.java deleted file mode 100644 index 317c269..0000000 --- a/simple_examples/source/int32/F05AAJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F05.F05AA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F05AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F05AAJE{ - - /** - * F05AAJ example main program. - */ - public static void main(String[] args) { - //Should initialise values to avoid issues with try/catch - int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; - double cc = 0; - double[] a, s; - - //same as ints - a = new double[1]; - s = new double[1]; - System.out.println("F05AAJ Example Program Results"); - System.out.println(); - - //supply data - if(args.length != 1){ - F05AAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+");; - m = Integer.parseInt(sVal[1]); - n1 = Integer.parseInt(sVal[2]); - n2 = Integer.parseInt(sVal[3]); - lda = m; - - a = new double[lda*n2]; - s = new double[n2]; - - //read in a from data - for(int i = 0; i < n2; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - a[i + (j * n2)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //create object then eval - F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); - f05aa.eval(); - - //update values - n1 = f05aa.getN1(); - n2 = f05aa.getN2(); - cc = f05aa.getCC(); - icol = f05aa.getICOL(); - a = f05aa.getA(); - - System.out.printf("N1 = %d N2 = %d\n", n1, n2); - System.out.println(); - System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); - System.out.println(); - System.out.println("Final Vectors"); - - for(int i = 0; i < n2; i++){ - for(int j = 1; j < m; j++){ - System.out.printf("%.4f ", a[i +(j * n2)]); - } - System.out.printf("\n"); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/source/int32/F06CLJE.java b/simple_examples/source/int32/F06CLJE.java deleted file mode 100644 index ca2ac5e..0000000 --- a/simple_examples/source/int32/F06CLJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.F06.F06CL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F06CL example program text. - * @author ludovic - */ -public class F06CLJE { - - public static void main(String[] args) { - boolean fail = false; - NAGComplex z1 = new NAGComplex(); - NAGComplex z2 = new NAGComplex(); - NAGComplex z3 = new NAGComplex(); - - System.out.println(" F06CLJ Example Program Results"); - System.out.println(); - - Routine.complex = z1; - - z1.setRe(1.0); - z1.setIm(1.0); - z2.setRe(2.0); - z2.setIm(2.0); - - F06CL f06cl = new F06CL(z1,z2,fail); - z3 = (NAGComplex)f06cl.eval(); - fail = f06cl.getFAIL(); - - if (fail) { - System.err.println(" Something went wrong..."); - } - else { - System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); - } - - } - -} diff --git a/simple_examples/source/int32/F07AAJE.java b/simple_examples/source/int32/F07AAJE.java deleted file mode 100644 index 26eb5dc..0000000 --- a/simple_examples/source/int32/F07AAJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.F07.F07AA; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F07AA example program text. - * @author joed - */ -public class F07AAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, ldb, n; - double[] a, b; - int[] ipiv; - - System.out.println(" F07AAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - ldb = n; - - a = new double[n*n]; - b = new double[n]; - ipiv = new int[n]; - - a[0+0*n] = 1.80; - a[0+1*n] = 2.88; - a[0+2*n] = 2.05; - a[0+3*n] = -0.89; - a[1+0*n] = 5.25; - a[1+1*n] = -2.95; - a[1+2*n] = -0.95; - a[1+3*n] = -3.80; - a[2+0*n] = 1.58; - a[2+1*n] = -2.69; - a[2+2*n] = -2.90; - a[2+3*n] = -1.04; - a[3+0*n] = -1.11; - a[3+1*n] = -0.66; - a[3+2*n] = -0.59; - a[3+3*n] = 0.80; - - b[0] = 9.52; - b[1] = 24.35; - b[2] = 0.77; - b[3] = -6.22; - - /* Solve the equations Ax = b for x */ - - F07AA f07aa = new F07AA(); - info = 0; - f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); - info = f07aa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); - - /* Print pivot indices */ - - System.out.println(); - System.out.println(" Pivot indices"); - for (i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.printf("\n"); - - } - else { - System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); - } - - } - -} diff --git a/simple_examples/source/int32/F07ABJE.java b/simple_examples/source/int32/F07ABJE.java deleted file mode 100644 index 6362739..0000000 --- a/simple_examples/source/int32/F07ABJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.F07.DGESVX; -import com.nag.routines.X04.X04CA; - -/** - * F07ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ABJE{ - - /** - * F07ABJ example main program - */ - public static void main(String[] args){ - double rcond = 0; - int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders - String equed; - double[] a, af, b, berr, c, ferr, r, work, x; - int[] ipiv, iwork; - - System.out.println("F07ABJ Example Program Results"); - System.out.println(); - - //Problem size - n = 4; - nrhs = 2; - lda = n; - ldaf = n; - ldb = n; - ldx = n; - - //Allocate - a = new double[lda * n]; - af = new double[ldaf * n]; - b = new double[ldb * nrhs]; - berr = new double[nrhs]; - c = new double[n]; - ferr = new double[nrhs]; - r = new double[n]; - work = new double[4 * n]; - x = new double[ldx * nrhs]; - ipiv = new int[n]; - iwork = new int[n]; - equed = " "; - - //Matrices A and B - a[0] = 1.8; - a[1] = 525; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -295; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -380; - a[14] = -1.04; - a[15] = 0.8; - b[0] = 9.52; - b[1] = 2435; - b[2] = 0.77; - b[3] = -6.22; - b[4] = 18.47; - b[5] = 225; - b[6] = -13.28; - b[7] = -6.21; - - //Solve the equations AX = B for X - //The NAG name equivalent of dgesvx is f07abf - DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, - c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - dgesvx.eval(); - - //Update - info = dgesvx.getINFO(); - equed = dgesvx.getEQUED(); - rcond = dgesvx.getRCOND(); - - if(info == 0 || info == n + 1){ - //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Backward errors (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", berr[i]); - } - System.out.println(); - System.out.println(); - System.out.println("Estimated forward error bounds (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", ferr[i]); - } - System.out.println(); - System.out.println(); - if(equed.equals("N")){ - System.out.println("A has not been equilibrated"); - } - else if(equed.equals("R")){ - System.out.println("A has been row scaled as diag(R)*A"); - } - else if(equed.equals("C")){ - System.out.println("A has been column scaled as A*diag(C)"); - } - else if(equed.equals("B")){ - System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); - } - System.out.println(); - System.out.println("Reciprocal condition number estimate of scaled matrix"); - System.out.printf(" %.1e\n", rcond); - System.out.println(); - System.out.println("Estimate of reciprocal pivot growth factor"); - System.out.printf(" %.1e\n", work[0]); - System.out.println(); - - if(info == n + 1){ - System.out.println(); - System.out.println("The matrix A is singular to working precision"); - } - } - else{ - System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); - } - } -} diff --git a/simple_examples/source/int32/F07ADJE.java b/simple_examples/source/int32/F07ADJE.java deleted file mode 100644 index 4450683..0000000 --- a/simple_examples/source/int32/F07ADJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F07.DGETRF; -import com.nag.routines.X04.X04CA; - -/** - * F07ADJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ADJE{ - - /** - * F07ADJ Example main program - */ - public static void main(String[] args){ - int ifail, info = 0, lda, m, n; - double[] a; - int[] ipiv; - - System.out.println("F07ADJ Example Program Results"); - System.out.println(); - - //Problem size (can be read from data file) - m = 4; - n = 4; - lda = m; - - //Data - ipiv = new int[n]; - a = new double[m * n]; - a[0] = 1.8; - a[1] = 5.25; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -2.95; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -0.95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -3.8; - a[14] = -1.04; - a[15] = 0.8; - - //Factorize A - //The NAG name equivalent of dgetrf is F07ADF - DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); - dgetrf.eval(); - - //Update - info = dgetrf.getINFO(); - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); - x04ca.eval(); - - //Print pivot indices - System.out.println("IPIV"); - for(int i = 0; i < Math.min(m, n); i++){ - System.out.printf("\t%d", ipiv[i]); - } - System.out.println(); - - if(info != 0){ - System.out.println("The factor U is singular"); - } - } -} diff --git a/simple_examples/source/int32/F07AQJE.java b/simple_examples/source/int32/F07AQJE.java deleted file mode 100644 index 5ee47e5..0000000 --- a/simple_examples/source/int32/F07AQJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F07.F07AQ; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexF; - -/** - * F07AQ example program text. - * @author joed - * @since 27.1.0.0 - */ -public class F07AQJE { - - public static void main(String[] args) { - - F07AQ f07aq = new F07AQ(); - int info, iter, lda, ldb, ldx, n, r; - NAGComplex[] a, b, work, x; - NAGComplexF[] swork; - double[] rwork; - int[] ipiv; - - System.out.println(" F07AQJ Example Program Results"); - System.out.println(); - - // Set dimensions and instantiate arrays - n = 4; - r = 1; - lda = ldb = ldx = n; - a = new NAGComplex[lda*n]; - b = new NAGComplex[ldb*r]; - work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); - x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); - swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); - ipiv = new int[n]; - rwork = new double[n]; - - // Set A - a[0] = new NAGComplex(-1.34, 2.55); // Column 1 - a[1] = new NAGComplex(-0.17, -1.41); - a[2] = new NAGComplex(-3.29, -2.39); - a[3] = new NAGComplex(2.41, 0.39); - a[4] = new NAGComplex(0.28, 3.17); // Column 2 - a[5] = new NAGComplex(3.31, -0.15); - a[6] = new NAGComplex(-1.91, 4.42); - a[7] = new NAGComplex(-0.56, 1.47); - a[8] = new NAGComplex(-6.39, -2.20); // Column 3 - a[9] = new NAGComplex(-0.15, 1.34); - a[10] = new NAGComplex(-0.14, -1.35); - a[11] = new NAGComplex(-0.83, -0.69); - a[12] = new NAGComplex(0.72, -0.92); // Column 4 - a[13] = new NAGComplex(1.29, 1.38); - a[14] = new NAGComplex(1.72, 1.35); - a[15] = new NAGComplex(-1.96, 0.67); - - // Set B - b[0] = new NAGComplex(26.26,51.78); - b[1] = new NAGComplex( 6.43,-8.68); - b[2] = new NAGComplex(-5.75,25.31); - b[3] = new NAGComplex( 1.16, 2.57); - - // Notify wrappers of complex types - Routine.setComplex(new NAGComplex()); - Routine.setComplexF(new NAGComplexF()); - - // Solve the equations Ax = b for x - iter = info = 0; - f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); - iter = f07aq.getITER(); - info = f07aq.getINFO(); - - if (info == 0) { - - // Print solution - - System.out.println(" Solution"); - for (int i = 0; i < n; i++) { - for (int j = 0; j < r; j++) { - System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); - } - } - System.out.println(); - - // Print pivot indices - - System.out.println(); - System.out.println(" Pivot indices"); - for (int i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.println(); - - } - else { - System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); - } - - } - -} diff --git a/simple_examples/source/int32/F07FAJE.java b/simple_examples/source/int32/F07FAJE.java deleted file mode 100644 index e516051..0000000 --- a/simple_examples/source/int32/F07FAJE.java +++ /dev/null @@ -1,79 +0,0 @@ -import com.nag.routines.F07.F07FA; -import com.nag.routines.X04.X04CA; - -/** - * F07FA example program text. - * @author saraht - */ -public class F07FAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, n; - double[] a, b; - - System.out.println(" F07FAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - - a = new double[n*n]; - b = new double[n]; - - /* A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18 */ - - a[0+0*n] = 4.16; - a[0+1*n] = -3.12; - a[0+2*n] = 0.56; - a[0+3*n] = -0.10; - - a[1+1*n] = 5.03; - a[1+2*n] = -0.83; - a[1+3*n] = 1.18; - - a[2+2*n] = 0.76; - a[2+3*n] = 0.34; - - a[3+3*n] = 1.18; - - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - /* Solve the equations Ax = b for x */ - - F07FA f07fa = new F07FA(); - info = 0; - f07fa.eval("Upper", n, 1, a, lda, b, n, info); - info = f07fa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); - - } - else { - System.err.printf(" The leading minor of order %d is not positive definite \n", info); - } - - } - -} diff --git a/simple_examples/source/int32/F07FBJE.java b/simple_examples/source/int32/F07FBJE.java deleted file mode 100644 index 09bbd37..0000000 --- a/simple_examples/source/int32/F07FBJE.java +++ /dev/null @@ -1,122 +0,0 @@ -import com.nag.routines.F07.F07FB; -import com.nag.routines.X04.X04CA; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * F07FB example program text. - * @author ludovic - */ -public class F07FBJE { - - public static void main(String[] args) { - String fact,uplo,equed; - int n, nrhs,lda,ldaf,ldb,ldx; - int[] iwork; - double rcond; - double[] a,af,s,b,x,ferr,berr,work; - int info,ifail; - lda = 4; - ldaf = lda; - ldb = lda; - ldx = lda; - nrhs = 2; - n = 4; - a = new double[lda*lda]; - af = new double[ldaf*ldaf]; - b = new double[ldb*nrhs]; - berr = new double[nrhs]; - ferr = new double[nrhs]; - s = new double[lda]; - work = new double[3*lda]; - x = new double[ldx*nrhs]; - iwork = new int[lda]; - info = 1; - rcond = Double.NaN; - fact = "E"; - uplo = "U"; - equed = "Z";//dummy value - /*A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18*/ - a[0] = 4.16; - - a[4] = -3.12; - a[5] = 5.03; - - a[8] = 0.56; - a[9] = -0.83; - a[10] = 0.76; - - a[12] = -0.10; - a[13] = 1.18; - a[14] = 0.34; - a[15] = 1.18; - - /*B= 8.70 8.30 - -13.35 2.13 - 1.89 1.61 - - 4.14 5.00*/ - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - b[4] = 8.30; - b[5] = 2.13; - b[6] = 1.61; - b[7] = 5.00; - - System.out.println(" F07FBJ Example Program Results"); - System.out.println(); - - F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, - ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - f07fb.eval(); - fact = f07fb.getFACT(); - uplo = f07fb.getUPLO(); - equed = f07fb.getEQUED(); - rcond = f07fb.getRCOND(); - info = f07fb.getINFO(); - - - if ((info == 0) || (info == n+1)) { - ifail = 0; - (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); - System.out.println(); - System.out.println(" Backward errors (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",berr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimated forward error bounds (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",ferr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimate of reciprocal condition number"); - System.out.printf(" %11.1e\n",rcond); - System.out.println(); - if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has not been equilibrated"); - } - else if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); - } - - if (info == n+1) { - System.out.println(); - System.out.println(" The matrix A is singular to working precision"); - } - - } - else { - System.out.printf(" The leading minor of order %3d is not positive definite\n"); - } - - } - -} diff --git a/simple_examples/source/int32/F08BTJE.java b/simple_examples/source/int32/F08BTJE.java deleted file mode 100644 index 43c219b..0000000 --- a/simple_examples/source/int32/F08BTJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import static java.lang.Math.*; - -import com.nag.routines.F06.F06JJ; -import com.nag.routines.F06.F06ZJ; -import com.nag.routines.F08.F08AU; -import com.nag.routines.F08.F08BT; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04DB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * F08BT example program text. - * @author ludovic - */ -public class F08BTJE { - - public static void main(String[] args) throws FileNotFoundException, IOException { - int incl = 1, nb = 64; - double tol; - int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; - NAGComplex[] a, b, tau, work; - double[] rnorm, rwork; - int[] jpvt; - String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; - - // Setup complex constants - NAGComplex one = new NAGComplex(); - NAGComplex zero = new NAGComplex(); - one.setRe(1.0); - one.setIm(0.0); - zero.setRe(0.0); - zero.setIm(0.0); - - // Inform the Routine class of the type of complex in use - can use any complex object - Routine.complex = one; - - System.out.println(" F08BTJ Example Program Results"); - System.out.println(); - - // Read values from data file - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); - line = br.readLine().trim(); - line = br.readLine().trim(); - String[] vals = line.split("\\s+"); - m = Integer.parseInt(vals[0].trim()); - n = Integer.parseInt(vals[1].trim()); - nrhs = Integer.parseInt(vals[2].trim()); - lda = ldb = m; - lwork = (n + 1) * nb; - a = new NAGComplex[lda * n]; - b = new NAGComplex[ldb * nrhs]; - tau = new NAGComplex[n]; - work = new NAGComplex[lwork]; - rnorm = new double[nrhs]; - rwork = new double[2 * n]; - jpvt = new int[n]; - - // Actually initialize the complex arrays - for (int i = 0; i < a.length; ++i) { - a[i] = new NAGComplex(); - } - for (int i = 0; i < b.length; ++i) { - b[i] = new NAGComplex(); - } - for (int i = 0; i < tau.length; ++i) { - tau[i] = new NAGComplex(); - } - for (int i = 0; i < work.length; ++i) { - work[i] = new NAGComplex(); - } - - /* Read A and B from data file */ - - readCompMatrix(br, a, lda, n); - readCompMatrix(br, b, ldb, nrhs); - br.close(); - - /* Initialize JPVT to be zero so that all columns are free */ - - for (int i = 0; i < n; ++i) { - jpvt[i] = 0; - } - - /* Compute the QR factorization of A */ - - F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); - f08bt.eval(); - - /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ - - String side = "Left"; - String conjTrans = "Conjugate Transpose"; - F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); - f08au.eval(); - a = (NAGComplex[])f08au.getA(); - - /* Choose TOL to reflect the relative accuracy of the input data */ - - tol = 0.01; - - /* Determine and print the rank, K, or R relative to TOL */ - - for (k = 1; k < n + 1; ++k) { - if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { - break; - } - } - k = k - 1; - - System.out.println(" Tolerance used to estimate the rank of A"); - System.out.printf(" %11.2E\n", tol); - System.out.println(" Estimated rank of A"); - System.out.printf(" %8d\n", k); - - /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 - * storing the result in B */ - - String upDown = "Upper"; - String trans = "No transpose"; - String unit = "Non-Unit"; - F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); - f06zj.eval(); - - /* Compute estimates of the square roots of the residual sums of squares - * (2-norm of each of the columns of C2) */ - - int mMinusK = m - k; - NAGComplex[] btmp = new NAGComplex[b.length]; - for (int i = 0; i < btmp.length; ++i) { - btmp[i] = new NAGComplex(); - } - System.arraycopy(b, k, btmp, 0, b.length - k); - - F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); - rnorm[0] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp, 0, b, k, b.length - k); - for (int j = 1; j < nrhs; ++j) { - System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); - rnorm[j] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); - } - - /* Set the remaining elements of the solutions to zero (to give the - * basic solutions) */ - - for (int i = k; i < n; ++i) { - for (int j = 0; j < nrhs; ++j) { - NAGComplex tmp = new NAGComplex(); - tmp.setRe(0.0); - tmp.setIm(0.0); - b[i + j * ldb] = tmp; - } - } - - /* Permute the least squares solution stored in B to give X = P*Y */ - - for (int j = 0; j < nrhs; j++) { - for (int i = 0; i < n; i++) { - work[jpvt[i] - 1] = b[j*ldb + i]; - } - for (int i = 0; i < n; i++) { - b[j*ldb + i] = work[i]; - } - } - - /* Print least squares solutions */ - - X04DB x04db = new X04DB(); - ifail = 0; - x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", - "Integer",rlabs,"Integer",clabs,80,0,ifail); - - /* Print the square roots of the residual sums of squares */ - - System.out.println(); - System.out.println(" Square root(s) of the residual sum(s) of squares"); - System.out.printf(" "); - for (int i = 0; i < nrhs; ++i) { - System.out.printf("%11.2E", rnorm[i]); - } - System.out.println(); - - } - - private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, - int col) throws IOException { - - // matches one complex number (without the brackets...) - String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; - String fullPattern = complexPat; - for (int i = 0; i < col -1; ++i) { - fullPattern = fullPattern + "\\s*" + complexPat; - } - fullPattern = fullPattern + ".*"; - Pattern comppat = Pattern.compile(fullPattern); - - for (int i = 0; i < row; ++i) { - String line = br.readLine().trim(); - if (line.equalsIgnoreCase("")) { - line = br.readLine().trim(); - } - Matcher m = comppat.matcher(line.trim()); - if (m.matches()) { - for (int j = 0; j < col; ++j) { - String[] numbers = m.group(j + 1).trim().split(","); - mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); - mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); - // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); - } - // System.out.println(); - } - - - } - } - - private static double abs(NAGComplex z) { - return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); - } - -} diff --git a/simple_examples/source/int32/F08FAJE.java b/simple_examples/source/int32/F08FAJE.java deleted file mode 100644 index 028f854..0000000 --- a/simple_examples/source/int32/F08FAJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.routines.F08.DDISNA; -import com.nag.routines.F08.F08FA; -import com.nag.routines.F16.F16JQ; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F08FA example program text. - * @author ludovic - */ -public class F08FAJE { - - public static void main(String[] args) { - int n = 4, LWork = n*64, lda = n; - double[] a, w, work,zerrbd,rcondz, colVector; - int info = 0, ifail = 0, k = 0; - a = new double[n * n]; - w = new double[n]; - work = new double[LWork]; - zerrbd = new double[n]; - rcondz = new double[n]; - colVector = new double[n]; - - System.out.println(" F08FAJ Example Program Results\n"); - - //array a : Stored in column major way - - a[0] = 1.0; - a[1] = 2.0; - a[2] = 3.0; - a[3] = 4.0; - - a[4] = 2.0; - a[5] = 2.0; - a[6] = 3.0; - a[7] = 4.0; - - a[8] = 3.0; - a[9] = 3.0; - a[10] = 3.0; - a[11] = 4.0; - - a[12] = 4.0; - a[13] = 4.0; - a[14] = 4.0; - a[15] = 4.0; - - //initializing the info parameter - info = 0; - w[0] = Double.NaN; - w[1] = Double.NaN; - w[2] = Double.NaN; - w[3] = Double.NaN; - F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); - f08fa.eval(); - info = f08fa.getINFO(); - - if (info == 0) { - System.out.println(" Eigenvalues"); - System.out.print(" "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %8.4f",w[i]); - } - System.out.println(); - - // Normalize the eigenvectors: largest element positive - F16JQ f16jq = new F16JQ(); // aka blas_damax_val - for (int i = 0; i < n; i++) { - System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate - f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value - k = f16jq.getK() - 1; // Make index zero based - - // Invert sign of column if largest element is negative - if (a[(4*i)+k] < 0) { - for (int j = 0; j < n; j++) { - a[(4*i)+j] = (-1) * a[(4*i)+j]; - } - } - - } - - (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); - - double eps = (new X02AJ()).eval(); - double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); - - (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); - for (int i = 0; i < n; ++i) { - zerrbd[i] = eerrbd/rcondz[i]; - } - - System.out.println(); - System.out.println(" Error estimate for the eigenvalues"); - System.out.printf(" %11.1e\n",eerrbd); - System.out.println(); - System.out.println(" Error estimates for the eigenvectors"); - for (int i = 0; i < n; ++i) { - System.out.printf(" %11.1e",zerrbd[i]); - } - System.out.println(); - - } - else { - System.out.printf(" Failure in DSYEV. INFO =%4d",info); - } - - } - -} diff --git a/simple_examples/source/int32/F08XPJE.java b/simple_examples/source/int32/F08XPJE.java deleted file mode 100644 index cc894d3..0000000 --- a/simple_examples/source/int32/F08XPJE.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.nag.routines.F06.F06UA; -import com.nag.routines.F06.F06BN; -import com.nag.routines.F06.ZGEMM; -import com.nag.routines.F08.ZGGESX; -import com.nag.routines.M01.M01DA; -import com.nag.routines.M01.M01ED; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04DB; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * F08XPJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F08XPJE{ - - public static boolean chkfac = false; - public static boolean prcond = false; - public static boolean prmat = false; - public static int nb = 64; - - /* - * F08XPJ Example main program - */ - public static void main(String[] args){ - NAGComplex alph, bet; - double abnorm, anorm, bnorm, eps, normd, norme, tol; - int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; - boolean factor; - NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; - double[] rconde, rcondv, rwork; - int[] idum, iwork; - boolean[] bwork; - String[] clabs, rlabs; - - //Placeholders - idum = new int[1]; - rconde = new double[2]; - rcondv = new double[2]; - dummy = NAGComplex.createArray(1); - - System.out.println("F08XPJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - //Tell wrappers what time of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //n declared here for neater code but can be read in from data file - n = 4; - lda = n; - ldb = n; - ldc = n; - ldd = n; - lde = n; - ldvsl = n; - ldvsr = n; - - //Allocate - a = NAGComplex.createArray(lda * n); - alpha = NAGComplex.createArray(n); - b = NAGComplex.createArray(ldb * n); - beta = NAGComplex.createArray(n); - c = NAGComplex.createArray(ldc * n); - d = NAGComplex.createArray(ldd * n); - e = NAGComplex.createArray(lde * n); - vsl = NAGComplex.createArray(ldvsl * n); - vsr = NAGComplex.createArray(ldvsr * n); - rwork = new double[8 * n]; - bwork = new boolean[n]; - clabs = new String[1]; - clabs[0] = " "; - rlabs = new String[1]; - rlabs[0] = " "; - - //Use routine workspace query to get optimal workspace - lwork = -1; - liwork = -1; - //The NAG name equivalent of zggesx is f08xpf - selctg selctg1 = new selctg(); - ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, - rwork, idum, liwork, bwork, info); - zggesx.eval(); - - //Make sure that there is a enough workspace for block size nb - lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); - liwork = Math.max(n + 2, idum[0]); - work = NAGComplex.createArray(lwork); - iwork = new int[liwork]; - - //Read in matrices A and B - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - line = reader.readLine(); //skip n (set manually for neater code) - String[] sVal; - - for(int i = 0; i < 2; i++){ - for(int j = 0; j < n; j++){ - line = reader.readLine(); - sVal = line.split("\\)"); - for(int k = 0; k < n; k++){ - if(i == 0){ - a[(k * n) + j] = parseComplex(sVal[k]); - } - else{ - b[(k * n) + j] = parseComplex(sVal[k]); - } - } - } - } - - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - - if(chkfac){ - for(int i = 0; i < a.length; i++){ - //Copy A and B into D and E respectively - d[i] = a[i]; - e[i] = b[i]; - } - } - - //Find the Forbenius norms of A and B - //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf - F06UA f06ua = new F06UA(); - anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); - bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); - - if(prmat){ - //Print matrices A and B - //ifail : behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - - ifail = 0; - x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - } - - factor = true; - //Find the generalized Schur form - //The NAG name equivalent of zggesx is f08xpf - zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, - rwork, iwork, liwork, bwork, info); - zggesx.eval(); - - //update - sdim = zggesx.getSDIM(); - - if(info != 0 && info != (n + 2)){ - System.out.printf("Failure in ZGGESX. INFO = %d\n", info); - factor = false; - } - else if(chkfac){ - //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D - //The NAG name equivalent of zgemm is f06zaf - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); - zgemm.eval(); - - //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); - zgemm.eval(); - - //Find norms of matrices D and E and warn if either is too large - f06ua = new F06UA("0", ldd, n, d, ldd, rwork); - normd = f06ua.eval(); - X02AJ x02aj = new X02AJ(); - if(normd > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); - factor = false; - System.out.println("Schur factorization has failed"); - } - f06ua = new F06UA("0", lde, n, e, lde, rwork); - norme = f06ua.eval(); - if(norme > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); - factor = false; - } - } - - if(factor){ - //Print eigenvalue details - System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); - System.out.println("(dimension of deflating subspaces)"); - - System.out.println(); - //Print selected (finite) generalized eigenvalues - System.out.println("Selected generalized eigenvalues"); - - //Store absolute values of eigenvalues for ranking - for(int i = 0; i < n; i++){ - work[i] = alpha[i].divide(beta[i]); - rwork[i] = NAGComplex.abs(work[i]); - } - - //Rank eigenvalues - ifail = 0; - M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); - m01da.eval(); - - //Sort eigevalues in work - M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); - m01ed.eval(); - for(int i = 0; i < sdim; i++){ - System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); - } - - if(info == n + 2){ - System.out.println("*** note that rounding errors mean that leading eigenvalues in"); - System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); - System.out.println(); - } - - if(prcond){ - //Compute the machine precision and sqrt(anorm^2 + bnorm^2) - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - F06BN f06bn = new F06BN(anorm, bnorm); - abnorm = f06bn.eval(); - tol = eps * abnorm; - - //Print out the reciprocal condition numbers and error bound for selected eigenvalues - System.out.println("Reciprocal condition numbers for the average of the selected"); - System.out.println("eigenvalues and their asymptotic error bound"); - System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); - } - } - else{ - System.out.println("Schur factorization has failed"); - } - - } - - /** - * Converts String read in from data file to NAGComplex value. - * @param s - * Complex number string - * @return new NAGComplex representing s - */ - public static NAGComplex parseComplex(String s){ - s = s.trim(); - double re = Double.parseDouble(s.substring(1, 7)); - double im = Double.parseDouble(s.substring(8)); - return new NAGComplex(re, im); - } - - /** - * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. - */ - public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ - public boolean eval(){ - return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); - } - } - -} diff --git a/simple_examples/source/int32/G01ALJE.java b/simple_examples/source/int32/G01ALJE.java deleted file mode 100644 index 672a151..0000000 --- a/simple_examples/source/int32/G01ALJE.java +++ /dev/null @@ -1,55 +0,0 @@ -import com.nag.routines.G01.G01AL; - -/** - * G01ALJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G01ALJE{ - - /** - * G01ALJ Example main program - */ - public static void main(String[] args){ - int ifail, n; - double[] x, res; - int[] iwrk; - - res = new double[5]; - - System.out.println("G01ALJ Example Program Results"); - System.out.println(); - - //Problem size - n = 12; - - //Allocate - x = new double[n]; - iwrk = new int[n]; - - //Data - x[0] = 12; - x[1] = 9; - x[2] = 2; - x[3] = 5; - x[4] = 6; - x[5] = 8; - x[6] = 2; - x[7] = 7; - x[8] = 3; - x[9] = 1; - x[10] = 11; - x[11] = 10; - - //Calculate summary statistics - ifail = 0; - G01AL g01al = new G01AL(n, x, iwrk, res, ifail); - g01al.eval(); - - System.out.printf("Maximum %.4f\n", res[4]); - System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); - System.out.printf("Median (50%% quantile) %.4f\n", res[2]); - System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); - System.out.printf("Minimum %.4f\n", res[0]); - } -} diff --git a/simple_examples/source/int32/G02AKJE.java b/simple_examples/source/int32/G02AKJE.java deleted file mode 100644 index 8ddaff2..0000000 --- a/simple_examples/source/int32/G02AKJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.G02.G02AK; -import com.nag.routines.X04.X04CA; - -/** - * G02AK example program text. - * @author joed - * @since 27.0.0.0 - */ -public class G02AKJE { - - /** - * G02AKJ example main program. - */ - public static void main(String[] args) { - - G02AK g02ak = new G02AK(); - X04CA x04ca = new X04CA(); - double errtol, f, rankerr, ranktol; - int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; - double[] g, x; - - System.out.println("G02AKJ Example Program Results\n"); - - // Problem size - n = 4; - ldg = n; - ldx = n; - - // Rank constraint - rank = 2; - - // Matrix G (column-major) - g = new double[]{ - 2.0, -1.0, 0.0, 0.0, - -1.0, 2.0, -1.0, 0.0, - 0.0, -1.0, 2.0, -1.0, - 0.0, 0.0, -1.0, 2.0 - }; - - // Use the defaults for errtol, ranktol, maxits, maxit - errtol = 0.0; - ranktol = 0.0; - maxits = 0; - maxit = 0; - - // Calculate rank constrained nearest correlation matrix - ifail = 0; - x = new double[ldx*n]; - f = 0.0; - rankerr = 0.0; - nsub = 0; - g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, - rankerr, nsub, ifail); - nsub = g02ak.getNSUB(); - f = g02ak.getF(); - rankerr = g02ak.getRANKERR(); - - // Display results - ifail = 0; - x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); - System.out.println(); - System.out.printf("Number of subproblems solved: %12d\n\n", nsub); - System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); - System.out.printf("Rank error: %35.4f\n", rankerr); - - } - -} diff --git a/simple_examples/source/int32/G02BJJE.java b/simple_examples/source/int32/G02BJJE.java deleted file mode 100644 index 3de843e..0000000 --- a/simple_examples/source/int32/G02BJJE.java +++ /dev/null @@ -1,303 +0,0 @@ -import com.nag.routines.G02.G02BJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G02BJ example program text. - * @author ludovic - */ -public class G02BJJE { - - public static void main(String[] args) { - int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; - double[] cnt, r, ssp, std, xbar;//, xmiss; - - if (args.length != 1) { - G02BJJE.usage(); - } - - String dataFile = args[0]; - DataHolder data = new DataHolder(); - readDataFile(dataFile, data); - System.out.println(" G02BJJ Example Program Results"); - System.out.println(); - - ldcnt = ldr = ldssp = data.nvars; - ldx = data.n; - cnt = new double[ldcnt * data.nvars]; - r = new double[ldr * data.nvars]; - ssp = new double[ldssp * data.nvars]; - std = new double[data.nvars]; - xbar = new double[data.nvars]; - - - //Display the data - - System.out.printf(" Number of variables (columns) = %5d\n", data.m); - System.out.printf(" Number of cases (rows) = %5d\n", data.n); - System.out.println(); - System.out.println(" Data matrix is:-"); - for (int ii = 0; ii < data.m; ++ii) { - System.out.printf(" %12d",ii+1); - } - System.out.println(); - for (int ii = 0; ii < data.n; ++ii) { - System.out.printf(" %3d ",ii+1); - for (int jj = 0; jj < data.m; ++jj) { - System.out.printf("%12.4f ",data.x[ii + jj * data.n]); - } - System.out.println(); - } - - ifail = 0; - G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, - data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, - ldcnt, ifail); - g02bj.eval(); - - data.n = g02bj.getN(); - data.m = g02bj.getM(); - data.x = g02bj.getX(); - ldx = g02bj.getLDX(); - data.miss = g02bj.getMISS(); - data.xmiss = g02bj.getXMISS(); - data.nvars = g02bj.getNVARS(); - data.kvar = g02bj.getKVAR(); - xbar = g02bj.getXBAR(); - std = g02bj.getSTD(); - ssp = g02bj.getSSP(); - ldssp = g02bj.getLDSSP(); - r = g02bj.getR(); - ldr = g02bj.getLDR(); - ncases = g02bj.getNCASES(); - cnt = g02bj.getCNT(); - ldcnt = g02bj.getLDCNT(); - ifail = g02bj.getIFAIL(); - - //Display results - System.out.println(); - System.out.println(" Variable\tMean\tSt.dev."); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); - } - System.out.println(); - System.out.println(" Sums of squares and cross-products of deviations"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.println(" Correlation coefficients"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",r[ii + ldr * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); - System.out.println(); - System.out.println(" Numbers used for each pair are:"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); - } - System.out.println(); - } - System.out.println(); - } - - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - /** - G02BJF Example Program Data - 5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 - 12.0 2.0 0.0 0.0 - -1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS - -1.0 0.0 0.0 0.0 :: XMISS - 4 1 2 :: KVAR - */ - private static void readDataFile(String filename, DataHolder data) { - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String line = br.readLine(); // skip header - line = br.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvars(Integer.parseInt(sVal[2])); - - data.x = new double[data.n * data.m]; - data.miss = new int[data.m]; - data.xmiss = new double[data.m]; - data.kvar = new int[data.nvars]; - - for (int i = 0; i < data.n; ++i) { - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.x[i + j * data.n] = Double.parseDouble(sVal[j]); - } - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.miss[j] = Integer.parseInt(sVal[j]); - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.xmiss[j] = Double.parseDouble(sVal[j]); - } - - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.nvars; ++j) { - data.kvar[j] = Integer.parseInt(sVal[j]); - } - } - catch (FileNotFoundException ex) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch (IOException ex) { - System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); - System.exit(-3); - } - - } - - private static class DataHolder { - private int n; - private int m; - private int nvars; - private double[] x; - private int[] miss; - private double[] xmiss; - private int[] kvar; - - /** - * @return the n - */ - public int getN() { - return n; - } - - /** - * @param n the n to set - */ - public void setN(int n) { - this.n = n; - } - - /** - * @return the m - */ - public int getM() { - return m; - } - - /** - * @param m the m to set - */ - public void setM(int m) { - this.m = m; - } - - /** - * @return the nvars - */ - public int getNvars() { - return nvars; - } - - /** - * @param nvars the nvars to set - */ - public void setNvars(int nvars) { - this.nvars = nvars; - } - - /** - * @return the x - */ - public double[] getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(double[] x) { - this.x = x; - } - - /** - * @return the miss - */ - public int[] getMiss() { - return miss; - } - - /** - * @param miss the miss to set - */ - public void setMiss(int[] miss) { - this.miss = miss; - } - - /** - * @return the xmiss - */ - public double[] getXmiss() { - return xmiss; - } - - /** - * @param xmiss the xmiss to set - */ - public void setXmiss(double[] xmiss) { - this.xmiss = xmiss; - } - - /** - * @return the kvar - */ - public int[] getKvar() { - return kvar; - } - - /** - * @param kvar the kvar to set - */ - public void setKvar(int[] kvar) { - this.kvar = kvar; - } - } -} diff --git a/simple_examples/source/int32/G02BRJE.java b/simple_examples/source/int32/G02BRJE.java deleted file mode 100644 index 084f478..0000000 --- a/simple_examples/source/int32/G02BRJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.G02.G02BR; - -/** - * G02BRJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G02BRJE{ - - /** - * G02BRJ Example main program - */ - public static void main(String[] args){ - int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder - double[] rr, work1, work2, x, xmiss; - int[] incase, kworka, kworkb, kworkc, miss; - - System.out.println("G02BRJ Example Program Results"); - System.out.println(); - - //Problem size - n = 9; - m = 3; - itype = 0; - - ldrr = m; - ldx = n; - - //Allocate - rr = new double[ldrr * m]; - work1 = new double[n]; - work2 = new double[n]; - x = new double[ldx * m]; - xmiss = new double[m]; - incase = new int[n]; - kworka = new int[n]; - kworkb = new int[n]; - kworkc = new int[n]; - miss = new int[m]; - - //Data - //X = (1.70, 1.00, 0.50) - // (2.80, 4.00, 3.00) - // (0.60, 6.00, 2.50) - // (1.80, 9.00, 6.00) - // (0.99, 4.00, 2.50) - // (1.40, 2.00, 5.50) - // (1.80, 9.00, 7.50) - // (2.50, 7.00, 0.00) - // (0.99, 5.00, 3.00) - x[0] = 1.7; - x[1] = 2.8; - x[2] = 0.6; - x[3] = 1.8; - x[4] = 0.99; - x[5] = 1.4; - x[6] = 1.8; - x[7] = 2.5; - x[8] = 0.99; - x[9] = 1; - x[10] = 4; - x[11] = 6; - x[12] = 9; - x[13] = 4; - x[14] = 2; - x[15] = 9; - x[16] = 7; - x[17] = 5; - x[18] = 0.5; - x[19] = 3; - x[20] = 2.5; - x[21] = 6; - x[22] = 2.5; - x[23] = 5.5; - x[24] = 7.5; - x[25] = 0; - x[26] = 3; - - //Missing value flags - miss[0] = 1; - miss[1] = 0; - miss[2] = 1; - xmiss[0] = 0.99; - xmiss[1] = 0; - xmiss[2] = 0; - - //Display data - System.out.printf("Number of variables (columns) = %d\n", m); - System.out.printf("Number of case (rows) = %d\n", n); - System.out.println(); - System.out.println("Data matrix is:-\n"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", x[(j * n) + i]); - } - System.out.println(); - } - System.out.println(); - - //Calculate correlation coefficients - ifail = 0; - G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, - work1, work2, ifail); - g02br.eval(); - - //Update - ncases = g02br.getNCASES(); - - //Display results - System.out.println("Matrix of rank correlation coefficients:"); - System.out.println("Upper triangle -- Spearman's"); - System.out.println("Lower triangle -- Kendall's tau"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", rr[(j * m) + i]); - } - System.out.println(); - } - System.out.println(); - System.out.printf("Number of cases actually used: %d\n", ncases); - } -} diff --git a/simple_examples/source/int32/G02DAJE.java b/simple_examples/source/int32/G02DAJE.java deleted file mode 100644 index c390197..0000000 --- a/simple_examples/source/int32/G02DAJE.java +++ /dev/null @@ -1,187 +0,0 @@ -import com.nag.routines.G02.G02BU; -import com.nag.routines.G02.G02DA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G02DAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02DAJE{ - - /** - * G02DAJ Example main program - */ - public static void main(String[] args){ - double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; - int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; - boolean svd = false; - String mean, weight; - double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; - int[] isx; - - System.out.println("G02DAJ Example Program Results"); - System.out.println(); - - c = new double[1]; - wmean = new double[1]; - - //Problem size (can be read in from data file - n = 12; - m = 4; - weight = "U"; - mean = "M"; - - if(weight.toLowerCase().equals("w")){ - lwt = n; - } - else{ - lwt = 0; - } - ldx = n; - - x = new double[ldx * m]; - y = new double[n]; - wt = new double[n]; - isx = new int[m]; - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip n, m, weight, mean - - //Read in data - String[] sVal; - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - x[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - if(lwt > 0){ - wt[i] = Double.parseDouble(sVal[m + 1]); - } - } - - //Read in variable inclusion flags - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < m; i++){ - isx[i] = Integer.parseInt(sVal[i]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Calcluate IP - ip = 0; - for(int i = 0; i < m; i++){ - if(isx[i] == 1){ - ip++; - } - } - if(mean.toLowerCase().equals("m")){ - ip = ip + 1; - } - - //Allocate - ldq = n; - b = new double[ip]; - cov = new double[((ip * ip) + ip)/2]; - h = new double[n]; - p = new double[ip * ip * (ip + 2)]; - q = new double[ldq * (ip + 1)]; - res = new double[n]; - se = new double[ip]; - wk = new double[ip * ip + (5 * (ip - 1))]; - - //Use suggested value for tolerance - tol = 0.000001; - - //fit general linear regression model - ifail = -1; - G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, - ldq, svd, irank, p, tol, wk, ifail); - g02da.eval(); - ifail = g02da.getIFAIL(); - if(ifail != 0){ - if(ifail != 5){ - System.exit(-3); - } - } - - //Calculate (weighted) total sums of squares, adjusted for mean if required - //If in G02DAF, an intercept is added to the regression by including a comlumn of - //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used - //in this call to G02BUF - ifail = 0; - G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); - g02bu.eval(); - - idf = g02da.getIDF(); - irank = g02da.getIRANK(); - //Get effective number of observations (=N if there are no zero weights) - en = (double) idf + irank; - - rss = g02da.getRSS(); - //Calculate R-squared, corrected R-Squared and AIC - rsq = 1 - rss/c[0]; - if(mean.toLowerCase().equals("m")){ - mult = (en - 1) / (en - irank); - } - else{ - mult = en / (en - irank); - } - arsq = 1 - mult * (1 - rsq); - aic = en * Math.log(rss/en) + (2 * irank); - - svd = g02da.getSVD(); - //Disply results - if(svd){ - System.out.printf("Model not of full rank, rank = %d", irank); - System.out.println(); - } - System.out.printf("Residual sum of squares = %.4e\n", rss); - System.out.printf("Degrees of freedom = %d\n", idf); - System.out.printf("R-squared = %.4e\n", rsq); - System.out.printf("Adjusted R-squared = %.4e\n", arsq); - System.out.printf("AIC = %.4e\n", aic); - System.out.println(); - System.out.printf("Variable\tParameter estimate\tStandard error\n"); - System.out.println(); - if(ifail == 0){ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); - } - } - else{ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); - } - } - System.out.println(); - System.out.printf(" Obs\t\t Residuals\t\t H\n"); - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); - } - - } -} diff --git a/simple_examples/source/int32/G02EEJE.java b/simple_examples/source/int32/G02EEJE.java deleted file mode 100644 index 5856fde..0000000 --- a/simple_examples/source/int32/G02EEJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.G02.G02EE; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G02EE example program text. - */ -public class G02EEJE { - - public static void main(String[] args) throws Exception { - int vnlen = 3; - double chrss, f, fin, rss; - rss = chrss = f = Double.NaN; - int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; - boolean addvar = false; - String mean, weight, newvar; - newvar = " "; - double[] exss, p, q, wk, wt, x, y; - int[] isx; - String[] free, model, vname; - - System.out.println(" G02EEJ Example Program Results\n"); - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - String line = dataIn.readLine(); - - String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - mean = data[2].substring(1,2); - weight = data[3].substring(1,2); - fin = Double.parseDouble(data[4]); - - if (weight.equalsIgnoreCase("W")) { - lwt = n; - } - else { - lwt = 0; - } - ldx = n; - - x = new double[ldx*m]; - y = new double[n]; - wt = new double[lwt]; - isx = new int[m]; - vname = new String[m]; - - for (int i = 0; i < vname.length;++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - vname[i] = tmp.toString(); - } - - if (lwt > 0) { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - wt[i] = Double.parseDouble(data[m+1]); - } - } - else { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - } - } - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int i = 0; i < m; ++i) { - isx[i] = Integer.parseInt(data[i]); - } - - data = dataIn.readLine().trim().split("::")[0].trim() - .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); - for (int i = 0; i < m; ++i) { - vname[i] = data[i].substring(0,3); - } - - dataIn.close(); - - maxip = 0; - for (int i = 0; i < m; ++i) { - if (isx[i] > 0) { - ++maxip; - } - } - - if (mean.equalsIgnoreCase("M")) { - maxip += 1; - } - - ldq = n; - model = new String[maxip]; - free = new String[maxip]; - exss = new double[maxip]; - q = new double[ldq*(maxip+2)]; - p = new double[maxip+1]; - wk = new double[2*maxip]; - - for (int i = 0; i < model.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - model[i] = tmp.toString(); - } - for (int i = 0; i < free.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - free[i] = tmp.toString(); - } - istep = 0; - ifail = -1; - - - G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, - addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, - wk,ifail); - for (int i = 0; i < m; ++i) { - g02ee.setIFAIL(0); - g02ee.eval(); - - System.out.printf(" Step %2d\n",g02ee.getISTEP()); - if (!g02ee.getADDVAR()) { - System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - break; - } - else { - System.out.println(" Added variable is "+g02ee.getNEWVAR()); - System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); - System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); - System.out.println(); - System.out.print(" Variables in model:"); - for (int j = 0; j < g02ee.getNTERM(); ++j) { - System.out.print(" "+g02ee.getMODEL()[j]); - } - System.out.println("\n"); - System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); - System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); - System.out.println(); - if (g02ee.getIFR() == 0) { - System.out.println(" No free variables remaining"); - break; - } - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - - } - - } - - } - -} diff --git a/simple_examples/source/int32/G02MAJE.java b/simple_examples/source/int32/G02MAJE.java deleted file mode 100644 index 4a8bfcb..0000000 --- a/simple_examples/source/int32/G02MAJE.java +++ /dev/null @@ -1,130 +0,0 @@ -import com.nag.routines.G02.G02MA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * G02MAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02MAJE{ - - /** - * G02MAJ example main program - */ - public static void main(String[] args){ - int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; - double[] b, d, fitsum, ropt, y; - int[] isx; - - isx = new int[0]; //placeholder - - System.out.println("G02MAJ Example Program Results"); - System.out.println(); - - //data (Could also read in from data file) - //Problem size - n = 20; - m = 6; - - //Model Specification - mtype = 1; - pred = 3; - prey = 1; - mnstep = 6; - lisx = 0; - - //Variable inclusion flags aren't needed in this example - ip = m; - - //Optional arguments (using defaults) - lropt = 0; - ropt = new double[lropt]; - - //D and Y - ldd = n; - y = new double[n]; - d = new double[ldd * m]; - - //Read in D and Y from data file (too large to write out) - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip N, M - line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx - - String sVal[]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - d[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Allocate output arrays - ldb = ip; - b = new double[ldb * (mnstep + 2)]; - fitsum = new double[6 * (mnstep + 1)]; - - //Call the model fitting routine - ifail = -1; - G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, - fitsum, ropt, lropt, ifail); - g02ma.eval(); - ifail = g02ma.getIFAIL(); - if(ifail != 0){ - if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ - //ifail = 112, 161, 162, 163 are warnings, so no need to terminate - System.exit(-2); - } - } - - //update - nstep = g02ma.getNSTEP(); - - //Display the parameter estimates - System.out.printf(" Step\t\t\tParameter Estimate\n"); - System.out.println("------------------------------------------------------"); - for(int i = 0; i < nstep; i++){ - System.out.printf(" %d", (i + 1)); - for(int j = 0; j < ip; j++){ - System.out.printf("\t%.3f", b[j + (i * nstep)]); - } - System.out.printf("\n"); - } - System.out.println(); - System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); - System.out.println(); - System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); - System.out.println("---------------------------------------------------------"); - for(int k = 0; k < nstep; k++){ - System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], - (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], - fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); - } - System.out.println(); - System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); - } -} diff --git a/simple_examples/source/int32/G03GAJE.java b/simple_examples/source/int32/G03GAJE.java deleted file mode 100644 index ba20592..0000000 --- a/simple_examples/source/int32/G03GAJE.java +++ /dev/null @@ -1,355 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import com.nag.routines.G03.G03GA; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * G03GAJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G03GAJE{ - - /** - * G03GAJ example main program. - */ - public static void main(String[] args){ - int i, ldx, lprob, riter, lds, sds, ifail = 0; - double[] w, g, s, f; - double tol, loglik = 0; - - if(args.length != 1){ - G03GAJE.usage(); - } - - // Data file name as argument - String filename = args[0]; - // DataHolder object to hold data read in from data file - DataHolder data = new DataHolder(); - - readDataFile(filename, data); - - System.out.println(" G03GAJ Example Program Results"); - System.out.println(); - - // Leading dimensions - ldx = data.n; - lprob = data.n; - - - switch(data.sopt){ - case 1: - s = new double[data.nvar * data.nvar * data.ng]; - lds = data.nvar; - sds = data.nvar; - break; - case 2: - s = new double[data.nvar * data.nvar * 1]; - lds = data.nvar; - sds = data.nvar; - break; - case 3: - s = new double[data.nvar * data.ng * 1]; - lds = data.nvar; - sds = data.ng; - break; - case 4: - s = new double[data.nvar * 1 * 1]; - lds = data.nvar; - sds = 1; - break; - default: - s = new double[1 * 1 * 1]; - lds = 1; - sds = 1; - break; - } - - // Allocate array size - g = new double[data.nvar * data.ng]; - w = new double[data.ng]; - f = new double[data.n * data.ng]; - tol = 0.0; - riter = 5; - - ifail = 0; - - // Create g03ga object with variables from data file - G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, - lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); - - // Run routine - g03ga.eval(); - - // Update variables - data.n = g03ga.getN(); - data.m = g03ga.getM(); - data.x = g03ga.getX(); - ldx = g03ga.getLDX(); - data.isx = g03ga.getISX(); - data.nvar = g03ga.getNVAR(); - data.ng = g03ga.getNG(); - data.popt = g03ga.getPOPT(); - data.prob = g03ga.getPROB(); - lprob = g03ga.getLPROB(); - data.niter = g03ga.getNITER(); - riter = g03ga.getRITER(); - w = g03ga.getW(); - g = g03ga.getG(); - data.sopt = g03ga.getSOPT(); - s = g03ga.getS(); - lds = g03ga.getLDS(); - sds = g03ga.getSDS(); - f = g03ga.getF(); - tol = g03ga.getTOL(); - loglik = g03ga.getLOGLIK(); - ifail = g03ga.getIFAIL(); - - // Results - X04CA x04ca = new X04CA(); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); - - System.out.println(); - switch(data.sopt){ - case 1: - for(i = 0; i < data.ng; i++){ - ifail = 0; - // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic - // calling X04CA along the 3rd dimension - x04ca.eval("g", "n", data.nvar, data.nvar, - Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), - lds, "Variance-cavariance matrix", ifail); - } - break; - case 2: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); - break; - case 3: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); - break; - case 4: - ifail = 0; - x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); - break; - case 5: - ifail = 0; - x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); - break; - } - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); - - System.out.println(); - System.out.println("No. iterations: " + data.niter); - System.out.printf("Log-likelihood: %.04f\n", loglik); - } - - /** - * Read data from given filename and puts into DataHolder object - * @param filename - * Name of data file (absolute or relative path) - * @param data - * DataHolder object to store data from data file - */ - public static void readDataFile(String filename, DataHolder data){ - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - // Problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvar(Integer.parseInt(sVal[2])); - - // Number of groups - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNg(Integer.parseInt(sVal[0])); - - // Scaling option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setSopt(Integer.parseInt(sVal[0])); - - // Initial probabilities option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setPopt(Integer.parseInt(sVal[0])); - - // Maximum number of iterations - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNiter(Integer.parseInt(sVal[0])); - - // - data.x = new double[data.m * data.n]; - data.prob = new double[data.ng * data.n]; - data.isx = new int[data.m]; - - //Data matrix X - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.m; ++j){ - data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - - //Included variables - if(data.nvar != data.m){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int i = 0; i < data.m; ++i){ - data.isx[i] = Integer.parseInt(sVal[i]); - } - } - - - //Optionally read initial probabilities of group memebership (included in example data) - if(data.popt == 2){ - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.ng; ++j){ - data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - } - - /** - * Stores data from data file for later reference - */ - private static class DataHolder{ - private int n; - private int m; - private int nvar; - private int ng; - private int sopt; - private int popt; - private int niter; - private int isx[]; - private double x[]; - private double prob[]; - - public void setN(int n){ - this.n = n; - } - - public int getN(){ - return n; - } - - public void setM(int m){ - this.m = m; - } - - public int getM(){ - return m; - } - - public void setNvar(int nvar){ - this.nvar = nvar; - } - - public int getNvar(){ - return nvar; - } - - public void setNg(int ng){ - this.ng = ng; - } - - public int getNg(){ - return ng; - } - - public void setSopt(int sopt){ - this.sopt = sopt; - } - - public int getSopt(){ - return sopt; - } - - public void setPopt(int popt){ - this.popt = popt; - } - - public int getPopt(){ - return popt; - } - - public void setNiter(int niter){ - this.niter = niter; - } - - public int getNiter(){ - return niter; - } - - public void setIsx(int[] isx){ - this.isx = isx; - } - - public int[] getIsx(){ - return isx; - } - - public void setX(double[] x){ - this.x = x; - } - - public double[] getX(){ - return x; - } - - public void setProb(double[] prob){ - this.prob = prob; - } - - public double[] getProb(){ - return prob; - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/source/int32/G05KFJE.java b/simple_examples/source/int32/G05KFJE.java deleted file mode 100644 index 18ce755..0000000 --- a/simple_examples/source/int32/G05KFJE.java +++ /dev/null @@ -1,105 +0,0 @@ -import com.nag.routines.G05.G05KF; -import com.nag.routines.G05.G05SA; -import com.nag.routines.Routine; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G05KFJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G05KFJE{ - - /** - * G05KFJ example main program. - */ - public static void main(String[] args){ - //genid, subid only initilised so they can be set in try{} without java throwing error - int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; - int ifail, lstate; - int[] seed, state; - double x[]; - - System.out.println("G05KFJ Example Program Results"); - System.out.println(); - - //No file input given - if(args.length != 1){ - G05KFJE.usage(); - } - - seed = new int[lseed]; - - //Read in data from data fiel - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the base generator information and seed - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - genid = Integer.parseInt(sVal[0]); - subid = Integer.parseInt(sVal[1]); - seed[0] = Integer.parseInt(sVal[2]); - - //Read in sample size - line = reader.readLine(); - sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - lstate = 0; - ifail = 0; - state = new int[lstate]; - - //Initial call to get size of STATE array - G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); - g05kf.eval(); - - //Update local variables - lstate = g05kf.getLSTATE(); - state = g05kf.getSTATE(); - - //Reallocate STATE - state = new int[lstate]; - - //Update object variables - g05kf.setSTATE(state); - g05kf.eval(); - - //Update local variables - state = g05kf.getSTATE(); - - x = new double[n]; - - //Generate the variates - ifail = 0; - G05SA g05sa = new G05SA(n, state, x, ifail); - g05sa.eval(); - - //Display the variates - for(int i = 0; i < x.length; i++){ - System.out.printf("%.4f\n", x[i]); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/source/int32/G13AWJE.java b/simple_examples/source/int32/G13AWJE.java deleted file mode 100644 index 9e829bd..0000000 --- a/simple_examples/source/int32/G13AWJE.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.nag.routines.G01.G01EW; -import com.nag.routines.G13.G13AW; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G13AW example program text. - */ -public class G13AWJE { - - public static void main(String[] args) { - - int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; - double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., - -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., - 88.,122.,126.,114.,85.,64}; - int[] state = new int[1]; - G13AW g13aw = new G13AW(type, p, n, y, ifail); - System.out.println(" G13AWJ Example Program Results\n"); - double ts = g13aw.eval(); - G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); - double pvalue = g01ew.eval(); - ifail = g01ew.getIFAIL(); - if (ifail == 0 || ifail == 201) { - System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); - System.out.printf("associated p-value = %6.3f\n", pvalue); - } - - } - -} diff --git a/simple_examples/source/int32/G13MEJE.java b/simple_examples/source/int32/G13MEJE.java deleted file mode 100644 index a768a46..0000000 --- a/simple_examples/source/int32/G13MEJE.java +++ /dev/null @@ -1,160 +0,0 @@ -import com.nag.routines.G13.G13ME; - -/** - * G13MEJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13MEJE{ - - /** - * G13MEJ main program - */ - public static void main(String[] args){ - double tau; - int ifail, lrcomm, m, nb, pn; - double[] iema, rcomm, sinit, t; - int[] inter, nbVal; - - inter = new int[2]; - - System.out.println("G13MEJ Example Program Results"); - System.out.println(); - - //data (can read in from data file) - //Number of iteration required - m = 2; - - //Decay parameter and interpolation method - tau = 2; - inter[0] = 3; - inter[1] = 2; - - //Initial values - sinit = new double[m + 2]; - sinit[0] = 5; - sinit[1] = 0.5; - sinit[2] = 0.5; - sinit[3] = 0.5; - - //Array of NB values in order - nbVal = new int[3]; - nbVal[0] = 5; - nbVal[1] = 10; - nbVal[2] = 15; - - //First block - double[] t1 = new double[nbVal[0]]; - double[] iema1 = new double[nbVal[0]]; - t1[0] = 7.5; - t1[1] = 8.2; - t1[2] = 18.1; - t1[3] = 22.8; - t1[4] = 25.8; - iema1[0] = 0.6; - iema1[1] = 0.6; - iema1[2] = 0.8; - iema1[3] = 0.1; - iema1[4] = 0.2; - - //Second block - double[] t2 = new double[nbVal[1]]; - double[] iema2 = new double[nbVal[1]]; - t2[0] = 26.8; - t2[1] = 31.1; - t2[2] = 38.4; - t2[3] = 45.9; - t2[4] = 48.2; - t2[5] = 48.9; - t2[6] = 57.9; - t2[7] = 58.5; - t2[8] = 63.9; - t2[9] = 65.2; - iema2[0] = 0.2; - iema2[1] = 0.5; - iema2[2] = 0.7; - iema2[3] = 0.1; - iema2[4] = 0.4; - iema2[5] = 0.7; - iema2[6] = 0.8; - iema2[7] = 0.3; - iema2[8] = 0.2; - iema2[9] = 0.5; - - //Third block - double[] t3 = new double[nbVal[2]]; - double[] iema3 = new double[nbVal[2]]; - t3[0] = 66.6; - t3[1] = 67.4; - t3[2] = 69.3; - t3[3] = 69.9; - t3[4] = 73.0; - t3[5] = 75.6; - t3[6] = 77.0; - t3[7] = 84.7; - t3[8] = 86.8; - t3[9] = 88.0; - t3[10] = 88.5; - t3[11] = 91.0; - t3[12] = 93.0; - t3[13] = 93.7; - t3[14] = 94.0; - iema3[0] = 0.2; - iema3[1] = 0.3; - iema3[2] = 0.8; - iema3[3] = 0.6; - iema3[4] = 0.1; - iema3[5] = 0.7; - iema3[6] = 0.9; - iema3[7] = 0.6; - iema3[8] = 0.3; - iema3[9] = 0.1; - iema3[10] = 0.1; - iema3[11] = 0.4; - iema3[12] = 1.0; - iema3[13] = 1.0; - iema3[14] = 0.1; - - //Print some titles - System.out.printf("\t\t\tIterated\n"); - System.out.println("\t\tTime\t EMA\n"); - System.out.println("--------------------------------"); - - lrcomm = 20 + m; - rcomm = new double[lrcomm]; - - pn = 0; - - //Loop through 3 blocks - for(int i = 0; i < nbVal.length; i++){ - //nb for given block - nb = nbVal[i]; - - //Use data for current block - if(i == 0){ - t = t1; - iema = iema1; - } - else if(i == 1){ - t = t2; - iema = iema2; - } - else{ - t = t3; - iema = iema3; - } - - ifail = 0; - G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); - g13me.eval(); - pn = g13me.getPN(); - - //Display results for this block of data - for(int j = 0; j < nb; j++){ - System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); - } - System.out.println(); - } - } -} - diff --git a/simple_examples/source/int32/G13NAJE.java b/simple_examples/source/int32/G13NAJE.java deleted file mode 100644 index 2032eb1..0000000 --- a/simple_examples/source/int32/G13NAJE.java +++ /dev/null @@ -1,123 +0,0 @@ -import com.nag.routines.G13.G13NA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G13NAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13NAJE{ - - /** - * G13NAJ example main program - */ - public static void main(String[] args){ - double beta = 0; - int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder - double[] param, sparam, y; - int[] tau; - - param = new double[1]; - //Placeholder y to be read in from data file - y = new double[0]; - - System.out.println("G13NAJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - //Allocate enough size to hold the input series - y = new double[n]; - - //Read in the input series - for(int i = 0; i < 10; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < 10; j++){ - y[(i * 10) + j] = Double.parseDouble(sVal[j]); - } - } - - //Read in the type of change point, penalty and minimum segment size - line = reader.readLine(); - sVal = line.split("\\s+"); - ctype = Integer.parseInt(sVal[0]); - iparam = Integer.parseInt(sVal[1]); - beta = Double.parseDouble(sVal[2]); - minss = Integer.parseInt(sVal[3]); - - //Read in the distribution parameter (if required) - if(iparam == 1){ - line = reader.readLine(); - sVal = line.split("\\s+"); - param[0] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Output arrays - tau = new int[n]; - sparam = new double[(2 * n) + 2]; - - ifail = -1; - - //Call routine to detece change points - G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); - g13na.eval(); - - //update - ifail = g13na.getIFAIL(); - ctype = g13na.getCTYPE(); - ntau = g13na.getNTAU(); - - if(ifail == 0 || ifail == 200 || ifail == 201){ - //Display the results - if(ctype == 5 || ctype == 6){ - //Exponential or Poisson distribtion - System.out.printf(" -- Charge Points -- Distribution\n"); - System.out.printf(" Number Position Parameter \n"); - System.out.println("====================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); - } - - } - else{ - //Normal of Gamma distribution - System.out.printf(" -- Charge Points -- --- Distribution ---\n"); - System.out.printf(" Number Position Parameters\n"); - System.out.println("================================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); - } - } - } - if(ifail == 200 || ifail == 201){ - System.out.println("Some truncation occured internally to avoid overflow"); - } - } -} diff --git a/simple_examples/source/int32/H02BBJE.java b/simple_examples/source/int32/H02BBJE.java deleted file mode 100644 index 04f4207..0000000 --- a/simple_examples/source/int32/H02BBJE.java +++ /dev/null @@ -1,92 +0,0 @@ -import com.nag.routines.H.H02BB; - -/** - * H02BBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class H02BBJE{ - - /** - * H02BBJ example main program - */ - public static void main(String[] args){ - double bigbnd, objmip = 0, tolfes, toliv; - int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; - double[] a, bl, bu, cvec, rwork, x; - int[] intvar, iwork; - - System.out.println("H02BBJ Example Program Results"); - System.out.println(); - - //Data (can be read in from data file) - n = 2; - m = 3; - lda = m; - - a = new double[lda * n]; - bl = new double[m + n]; - bu = new double[m + n]; - cvec = new double[n]; - x = new double[n]; - intvar = new int[n]; - - itmax = 0; - msglvl = 10; - maxnod = 0; - intfst = 0; - maxdpt = 4; - tolfes = 0; - toliv = 0; - - cvec[0] = -3; - cvec[1] = -4; - - //A = ( 2, 5) - // ( 2, -2) - // ( 3, 2) - a[0] = 2; - a[1] = 2; - a[2] = 3; - a[3] = 5; - a[4] = -2; - a[5] = 2; - - bigbnd = 1E+20; - - bl[0] = 0; - bl[1] = 0; - bl[2] = -1E+20; - bl[3] = -1E+20; - bl[4] = 5; - - bu[0] = 1E+20; - bu[1] = 1E+20; - bu[2] = 15; - bu[3] = 5; - bu[4] = 1E+20; - - intvar[0] = 1; - intvar[1] = 1; - - x[0] = 1; - x[1] = 1; - - liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; - //Math.pow() needs to be casted to int in java - lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); - iwork = new int[liwork]; - rwork = new double[lrwork]; - - ifail = 0; - - H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, - tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); - h02bb.eval(); - } -} - - - - - diff --git a/simple_examples/source/int32/H02DAJE.java b/simple_examples/source/int32/H02DAJE.java deleted file mode 100644 index 6e90401..0000000 --- a/simple_examples/source/int32/H02DAJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import com.nag.routines.H.H02DA; -import com.nag.routines.H.H02ZK; -import com.nag.routines.H.H02ZL; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * H02DAJ exmaple program text - * @author willa - * @since 27.1.0.0 - */ -public class H02DAJE{ - - /** - * H02DAJ example main program - */ - public static void main(String[] args){ - double acc, accqp = 0, objmip = 0; - int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; - String cvalue; - double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; - int[] iopts, iuser, varcon; - - System.out.println("H02DAJ Example Program Results"); - System.out.println(); - - opts = new double[100]; - ruser = new double[1]; - iopts = new int[200]; - iuser = new int[1]; - - //Blank 40 character string to represent ```Character (40) :: cvalue``` - char[] ch = new char[40]; - Arrays.fill(ch, ' '); - cvalue = new String(ch); - - n = 8; - nclin = 5; - ncnln = 2; - lda = nclin; - - a = new double[lda * n]; - d = new double[nclin]; - ax = new double[nclin]; - bl = new double[n]; - bu = new double[n]; - varcon = new int[n + nclin + ncnln]; - x = new double[n]; - c = new double[ncnln]; - cjac = new double[ncnln * n]; - objgrd = new double[n]; - - //Set variable types: continuous then binary - varcon[0] = 0; - varcon[1] = 0; - varcon[2] = 0; - varcon[3] = 0; - varcon[4] = 1; - varcon[5] = 1; - varcon[6] = 1; - varcon[7] = 1; - - //Set continuous variable bounds - bl[0] = 0; - bl[1] = 0; - bl[2] = 0; - bl[3] = 0; - bu[0] = 1000; - bu[1] = 1000; - bu[2] = 1000; - bu[3] = 1000; - - //Bounds for binary variables need not be provided - bl[4] = 0; - bl[5] = 0; - bl[6] = 0; - bl[7] = 0; - bu[4] = 1; - bu[5] = 1; - bu[6] = 1; - bu[7] = 1; - - //Set linear constraint, equality first - varcon[n] = 3; - varcon[n + 1] = 4; - varcon[n + 2] = 4; - varcon[n + 3] = 4; - varcon[n + 4] = 4; - - //Set Ax=d then Ax>=d - //( 1, 1, 1, 1, 0, 0, 0, 0) - //(-1, 0, 0, 0, 1, 0, 0, 0) - //( 0,-1, 0, 0, 0, 1, 0, 0) - //( 0, 0,-1, 0, 0, 0, 1, 0) - //( 0, 0, 0,-1, 0, 0, 0, 1) - a[0] = 1; - a[1] = -1; - a[5] = 1; - a[7] = -1; - a[10] = 1; - a[13] = -1; - a[15] = 1; - a[19] = -1; - a[21] = 1; - a[27] = 1; - a[33] = 1; - a[39] = 1; - d[0] = 1; - d[1] = 0; - d[2] = 0; - d[3] = 0; - d[4] = 0; - - //Set constraints supplied by CONFUN, equality first - varcon[n + nclin] = 3; - varcon[n + nclin + 1] = 4; - - liopts = iopts.length; - lopts = opts.length; - - //Initialize communication arrays - ifail = 0; - H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); - h02zk.eval(); - - - //Optimization parameters - maxit = 500; - acc = 0.000001; - - //Initial estimate (binary variables need not be given) - x[0] = 1; - x[1] = 1; - x[2] = 1; - x[3] = 1; - x[4] = 0; - x[5] = 0; - x[6] = 0; - x[7] = 0; - - //Portfolio parameters p and rho - iuser[0] = 3; - ruser[0] = 10; - - ifail = 0; - //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines - objfun objfun1 = new objfun(); - confun confun1 = new confun(); - H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, - objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); - h02da.eval(); - - //Results - ifail = h02da.getIFAIL(); - if(ifail == 0){ - X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); - x04ca.eval(); - - //Query the accuracy of the mixed integer QP Solver - ifail = -1; - H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); - h02zl.eval(); - - //Update values to print - accqp = h02zl.getRVALUE(); - objmip = h02da.getOBJMIP(); - ifail = h02zl.getIFAIL(); - if(ifail == 0){ - System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); - } - System.out.printf("Optimised value:\t%.3f\n", objmip); - } - else{ - System.out.printf("h02daf returns ifail = %d\n", ifail); - } - } - - /** - * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA - */ - public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ - public void eval(){ - if(this.MODE == 0){ - //Objective value - this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) - + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) - + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); - } - else{ - //Objective gradients for continous varaiables - this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); - this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); - this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); - this.OBJGRD[3] = 0; - } - } - } - - /** - * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA - */ - public static class confun extends H02DA.Abstract_H02DA_CONFUN{ - public void eval(){ - if(this.MODE == 0){ - //Constraints - int p = this.IUSER[0]; - double rho = this.RUSER[0]; - - //Mean return rho: - this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; - //Maximum of p assets in portfolio - this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; - } - else{ - //Jacobian - this.CJAC[0] = 8; - this.CJAC[2] = 9; - this.CJAC[4] = 12; - this.CJAC[6] = 7; - //c[2] does not include continuours varaibles which requries that their derivatives are zero - this.CJAC[1] = 0; - this.CJAC[3] = 0; - this.CJAC[5] = 0; - this.CJAC[7] = 0; - } - } - } -} diff --git a/simple_examples/source/int32/M01CCJE.java b/simple_examples/source/int32/M01CCJE.java deleted file mode 100644 index fda5e2f..0000000 --- a/simple_examples/source/int32/M01CCJE.java +++ /dev/null @@ -1,42 +0,0 @@ -import com.nag.routines.M01.M01CC; -import java.io.*; - -/** - * M01CC example program text. - */ -public class M01CCJE { - - public static void main(String[] args) throws Exception { - - String[] ch; - String order = "Reverse ASCII"; - int m1,m2,l1,l2; - int ifail = 0; - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); - ch = new String[m2]; - m1 = 1; - for (int i = m1-1; i < m2; ++i) { - ch[i] = dataIn.readLine(); - } - dataIn.close(); - l1 = 7; - l2 = 12; - - System.out.println(" M01CCJ Example Program Results"); - M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); - m01cc.eval(); - ifail = m01cc.getIFAIL(); - System.out.println(); - System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); - System.out.println(); - for (int i = m1-1; i < m2; ++i) { - System.out.println(" "+ch[i]); - } - - } - -} diff --git a/simple_examples/source/int32/S01BAJE.java b/simple_examples/source/int32/S01BAJE.java deleted file mode 100644 index 4bf2823..0000000 --- a/simple_examples/source/int32/S01BAJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.S.S01BA; - -/** - * S01BAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S01BAJE{ - - /** - * S01BAJE main program - */ - public static void main(String[] args){ - double y; - int ifail; - double[] xVal; //data - - //store data - xVal = new double[6]; - xVal[0] = 2.5; - xVal[1] = 0.125; - xVal[2] = -0.906; - xVal[3] = 0.00129; - xVal[4] = -0.00000783; - xVal[5] = 0.000000001; - - System.out.println("S01BAJ Example Program Results"); - System.out.println(); - System.out.printf("\tX\t\tY\n"); - - for(double x : xVal){ - ifail = -1; - S01BA s01ba = new S01BA(x, ifail); - y = s01ba.eval(); - - System.out.printf("\t%.4e\t%.4e\n", x, y); - } - } -} diff --git a/simple_examples/source/int32/S10AAJE.java b/simple_examples/source/int32/S10AAJE.java deleted file mode 100644 index 2a0878a..0000000 --- a/simple_examples/source/int32/S10AAJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.S.S10AA; - -/** - * S10AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10AAJE{ - - /** - * S10AAJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[4]; - xVal[0] = -20; - xVal[1] = -5.0; - xVal[2] = 0.5; - xVal[3] = 5.0; - - System.out.println("S10AAJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AA s10aa = new S10AA(x, ifail); - y = s10aa.eval(); - ifail = s10aa.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/source/int32/S10ABJE.java b/simple_examples/source/int32/S10ABJE.java deleted file mode 100644 index dd84ab7..0000000 --- a/simple_examples/source/int32/S10ABJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AB; - -/** - * S10ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ABJE{ - - /** - * S10ABJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ABJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AB s10ab = new S10AB(x, ifail); - y = s10ab.eval(); - ifail = s10ab.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/source/int32/S10ACJE.java b/simple_examples/source/int32/S10ACJE.java deleted file mode 100644 index cc0c04c..0000000 --- a/simple_examples/source/int32/S10ACJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AC; - -/** - * S10ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ACJE{ - - /** - * S10ACJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ACJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AC s10ac = new S10AC(x, ifail); - y = s10ac.eval(); - ifail = s10ac.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/source/int32/S14ABJE.java b/simple_examples/source/int32/S14ABJE.java deleted file mode 100644 index 673a4b3..0000000 --- a/simple_examples/source/int32/S14ABJE.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.nag.routines.S.S14AB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ABJE{ - - /** - * S14ABJ example main program - */ - public static void main(String[] args){ - double x, y; - int ifail; - - System.out.println("S14ABJ Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //loop until break - while(true){ - line = reader.readLine(); - - //if finished looping through file break - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[1]); - - ifail = -1; - S14AB s14ab = new S14AB(x, ifail); - y = s14ab.eval(); - //update ifail - ifail = s14ab.getIFAIL(); - - if(ifail < 0){ - break; - } - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/source/int32/S14ACJE.java b/simple_examples/source/int32/S14ACJE.java deleted file mode 100644 index e2fff05..0000000 --- a/simple_examples/source/int32/S14ACJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.S.S14AC; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ACJE{ - - /** - * S14ACJ example main program - */ - public static void main(String[] args){ - double f, x; - int ifail; - - System.out.println("S14ACJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\tpsi(X)-log(X)\n"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[0]); - - ifail = -1; - S14AC s14ac = new S14AC(x, ifail); - f = s14ac.eval(); - ifail = s14ac.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("\t%.4f\t%.4f\n", x, f); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/source/int32/S14AFJE.java b/simple_examples/source/int32/S14AFJE.java deleted file mode 100644 index 9005cc1..0000000 --- a/simple_examples/source/int32/S14AFJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.S.S14AF; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14AFJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14AFJE{ - - /** - * S14AFJ Example main program - */ - public static void main(String[] args){ - NAGComplex y, z; - int ifail, k; - - //Tell the wrapper the type of complex being used before calling a routine - Routine.setComplex(new NAGComplex()); - - y = new NAGComplex(); - z = new NAGComplex(); - - System.out.println("S14AFJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); - - System.out.println(); - System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); - System.out.println(); - - //loop until break... - while(true){ - line = reader.readLine(); - - //end of file reached - if(line == null){ - break; - } - - String[] sVal = line.split("\\s+"); - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - k = Integer.parseInt(sVal[2]); - - ifail = -1; - S14AF s14af = new S14AF(z, k, ifail); - y = (NAGComplex) s14af.eval(); - ifail = s14af.getIFAIL(); - - //ifail < 0 => error - if(ifail < 0){ - break; - } - System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/source/int32/S17DCJE.java b/simple_examples/source/int32/S17DCJE.java deleted file mode 100644 index ba01290..0000000 --- a/simple_examples/source/int32/S17DCJE.java +++ /dev/null @@ -1,69 +0,0 @@ -import com.nag.routines.S.S17DC; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class S17DCJE{ - private static int n = 2; - - public static void main(String[] args){ - double fnu; - int ifail, nz = 0; - String scal; - NAGComplex z; - NAGComplex[] cwrk, cy; - - z = new NAGComplex(); - //initiate complex arrays like this to save looping through and doing it manually by looping through - cwrk = NAGComplex.createArray(n); - cy = NAGComplex.createArray(n); - - System.out.println("S17DCF Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - System.out.println(); - System.out.printf("Calling with N = %d\n", n); - System.out.println(); - System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - fnu = Double.parseDouble(sVal[0]); - z.setRe(Double.parseDouble(sVal[1])); - z.setIm(Double.parseDouble(sVal[2])); - scal = sVal[3].substring(1,2); - - ifail = 0; - S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); - s17dc.eval(); - - System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/source/int32/S17DGJE.java b/simple_examples/source/int32/S17DGJE.java deleted file mode 100644 index b93c9e0..0000000 --- a/simple_examples/source/int32/S17DGJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.S.S17DG; -import com.nag.types.NAGComplex; -import java.io.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * S17DG example program text. - */ -public class S17DGJE { - - public static void main(String[] args) throws Exception { - String deriv,scal; - int ifail = 1; - NAGComplex z,ai; - int nz = -1; - z = new NAGComplex(); - ai = new NAGComplex(); - ai.setRe(Double.NaN); - ai.setIm(Double.NaN); - - System.out.println(" S17DGJ Example Program Results"); - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - System.out.println(); - System.out.println(" DERIV Z SCAL AI NZ"); - System.out.println(); - String line = dataIn.readLine(); - Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," - + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); - Matcher m; - S17DG s17dg = new S17DG(); - while (line != null) { - m = linePatt.matcher(line); - if (m.matches()) { - deriv = m.group(1); - z.setRe(Double.parseDouble(m.group(2))); - z.setIm(Double.parseDouble(m.group(3))); - scal = m.group(4); - ifail = 1;// SOFT AND SILENT FAILURE - s17dg.eval(deriv,z,scal,ai,nz,ifail); - if (s17dg.getIFAIL() == 0) { - System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", - s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), - s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); - } - else { - System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); - System.exit(-1); - } - } - else { - System.out.println("Can't match:\n"+line); - } - line = dataIn.readLine(); - } - - } - -} diff --git a/simple_examples/source/int32/S30AAJE.java b/simple_examples/source/int32/S30AAJE.java deleted file mode 100644 index 7e01ffe..0000000 --- a/simple_examples/source/int32/S30AAJE.java +++ /dev/null @@ -1,109 +0,0 @@ -import com.nag.routines.S.S30AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S30AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S30AAJE{ - - /** - * S30AAJ main program - */ - public static void main(String[] args){ - double q = 0, r = 0, s = 0, sigma = 0; - int ifail, ldp, m = 0, n = 0; - String calput = ""; //placeholders - double[] p, t, x; - - //placeholders - t = new double[0]; - x = new double[0]; - - System.out.println("S30AAJ Example Program Results"); - - //Supply file path as arugment - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - calput = sVal[0].substring(1,2); - - line = reader.readLine(); - sVal = line.split("\\s+"); - s = Double.parseDouble(sVal[0]); - sigma = Double.parseDouble(sVal[1]); - r = Double.parseDouble(sVal[2]); - q = Double.parseDouble(sVal[3]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - n = Integer.parseInt(sVal[1]); - - t = new double[n]; - x = new double[m]; - - for(int i = 0; i < m; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[0]); - } - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - t[i] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ldp = m; - p = new double[ldp * n]; - - ifail = 0; - S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); - s30aa.eval(); - - System.out.println(); - System.out.println("Black-Scholes-Merton formula"); - - if(calput.toLowerCase().equals("c")){ - System.out.println("European Call : "); - } - else if(calput.toLowerCase().equals("p")){ - System.out.println("European Put : "); - } - - System.out.printf(" Spot =\t%.4f\n", s); - System.out.printf(" Volatility =\t%.4f\n", sigma); - System.out.printf(" Rate =\t%.4f\n", r); - System.out.printf(" Dividend =\t%.4f\n", q); - - System.out.println(); - System.out.printf(" Strike\tExpiry\tOption Price\n"); - for(int i = 0; i < m; i++){ - for(int j = 0; j < n; j++){ - System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); - } - } - } -} - diff --git a/simple_examples/source/int32/S30ACJE.java b/simple_examples/source/int32/S30ACJE.java deleted file mode 100644 index 8d994dc..0000000 --- a/simple_examples/source/int32/S30ACJE.java +++ /dev/null @@ -1,129 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -import com.nag.routines.S.S30AC; - -/** - * S30AC example program text. - */ -public class S30ACJE { - - public static void main(String[] args) { - - int i, ifail, mode = 0, n = 0; - String calput; - - double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; - int[] ivalid = null; - - // Strings must be length expected by Fortran - calput = getBlankString(1); - - /* Header */ - System.out.println(" S30ACJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - System.out.println(); - System.out.println(" SIGMA IVALID"); - System.out.println(); - - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - calput = sVal[0].replaceAll("\'", ""); - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - mode = Integer.parseInt(sVal[1]); - - line = reader.readLine(); // skip empty line - - p = new double[n]; - k = new double[n]; - s0 = new double[n]; - t = new double[n]; - r = new double[n]; - sigma = new double[n]; - ivalid = new int[n]; - - // Read p, k, s0, t and r from data file - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - p[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - k[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - s0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - t[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - r[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find the implied volatilities, sigma - ifail = 0; - S30AC s30ac = new S30AC(); - s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); - - // Print solution - for (i = 0; i < n; i++) { - System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); - } - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } -} diff --git a/simple_examples/source/int32/X03AAJE.java b/simple_examples/source/int32/X03AAJE.java deleted file mode 100644 index b03f1ab..0000000 --- a/simple_examples/source/int32/X03AAJE.java +++ /dev/null @@ -1,87 +0,0 @@ -import com.nag.routines.X03.X03AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * X03AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class X03AAJE{ - - /** - * X03AAJ example main program. - */ - public static void main(String[] args){ - int n = 3; - double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder - int ifail, isizea, isizeb, istepa, istepb; - boolean sw; - double[] a, b; - - a = new double[n * n]; - b = new double[n]; - - System.out.println("X03AAF Example Program Results"); - System.out.println(); - - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //stored column wise - //a = (-2, -3, 7) - // ( 2, -5, 3) - // (-9, 1, 0) - for(int i = 0; i < n; i++){ - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < n; i++){ - String[] sVal = line.split("\\s+"); - b[i] = Double.parseDouble(sVal[i + 1]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - c1 = 1; - c2 = 0; - isizea = n; - isizeb = n; - istepa = 1; - istepb = 1; - sw = true; - - ifail = 0; - X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); - x03aa.eval(); - - //update - c1 = x03aa.getC1(); - c2 = x03aa.getC2(); - d1 = x03aa.getD1(); - d2 = x03aa.getD2(); - - System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); - } -} diff --git a/simple_examples/source/int32/X04CBJE.java b/simple_examples/source/int32/X04CBJE.java deleted file mode 100644 index fa77c3a..0000000 --- a/simple_examples/source/int32/X04CBJE.java +++ /dev/null @@ -1,53 +0,0 @@ -import com.nag.routines.X04.X04CB; - -/** - * X04CBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class X04CBJE{ - - /** - * X04CBJ example main program - */ - public static void main(String[] args){ - int nmax = 5, lda = nmax, ifail, indent, ncols; - double[] a; - - a = new double[lda * nmax]; - - String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; - String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; - - System.out.println("X04CBJ Example Program Results"); - System.out.println(); - - //generate an array of data - for(int i = 0; i < nmax; i++){ - for(int j = 0; j < lda; j++){ - a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); - } - } - - ncols = 80; - indent = 0; - - //Print 3 by nmax rectangular matrix with default format and integer row and column labels - ifail = 0; - X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", - clabs, ncols, indent, ifail); - x04cb.eval(); - System.out.println(); - - //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels - ifail = 0; - x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", - clabs, ncols, indent, ifail); - System.out.println(); - - //Print 3 by nmax lower triangular matrix in MATLAB format - //Row and column labelling is ignored - ifail = 0; - x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); - } -} diff --git a/simple_examples/source/int32/X05ABJE.java b/simple_examples/source/int32/X05ABJE.java deleted file mode 100644 index acb3804..0000000 --- a/simple_examples/source/int32/X05ABJE.java +++ /dev/null @@ -1,25 +0,0 @@ -import com.nag.routines.X05.X05AB; - -/** - * X05AB example program text. - */ -public class X05ABJE { - - public static void main(String[] args) { - - int[] itime = new int[7]; - - itime[0] = 1789; - itime[1] = 7; - itime[2] = 14; - itime[3] = 13; - itime[4] = 11; - itime[5] = 48; - itime[6] = 320; - - System.out.println(" X05ABJ Example Program Results"); - System.out.println((new X05AB(itime)).eval()); - - } - -} diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java deleted file mode 100644 index 490c163..0000000 --- a/simple_examples/source/int64/A00AAJE.java +++ /dev/null @@ -1,14 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AA; -import com.nag.routines.Routine; - -public class A00AAJE { - - public static void main (String[] args) throws NAGBadIntegerException { - Routine.init(); - A00AA a00aa = new A00AA(); - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - } - -} diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java deleted file mode 100644 index 8250321..0000000 --- a/simple_examples/source/int64/A00ADJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AD; -import com.nag.routines.Routine; -import java.util.Arrays; - -public class A00ADJE { - - /* Parameters */ - public static final int MSGLEN = 15; - - /** A00ADJ Example Program */ - public static void main (String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - int i; - long mkmaj, mkmin; - boolean licval; - String fcomp = getBlankString(80), hdware = getBlankString(80), - impl = getBlankString(80), opsys = getBlankString(80), - pcode = getBlankString(80), prec = getBlankString(80), - vend = getBlankString(80); - /* Local Arrays */ - int[] itime = new int[7]; - String[] msg = new String[MSGLEN]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); - - Routine.init(); - System.out.println(" A00ADJ Example Program Results\n"); - - A00AD a00ad = new A00AD(); - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - /* Print implementation details */ - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length - * - * @param len the required length of the String - * @returns a String of spaces of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java deleted file mode 100644 index a3bd5f1..0000000 --- a/simple_examples/source/int64/C05AYJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AY; -import com.nag.routines.Routine; - - -public class C05AYJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - long ifail = 0; - long[] iuser = new long[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - Routine.init(); - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch ((int)ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java deleted file mode 100644 index bec1b03..0000000 --- a/simple_examples/source/int64/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AZ; -import com.nag.routines.Routine; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class C05AZJE { - - public static void main (String[] args)throws NAGBadIntegerException{ - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - long ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - Routine.init(); - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - - if(ind == 0){ - keepOn = false; - } - else{ - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - } - - - - switch ((int)ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java deleted file mode 100644 index 08dd454..0000000 --- a/simple_examples/source/int64/C05MBJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ Example Program Text - * @author joed - * @since 27.0 - */ - /* ** There have been at least 200*(n+1) calls to fcn. - ** Consider restarting the calculation from the point held in x. - ** ABNORMAL EXIT from NAG Library routine - ** NAG soft failure - control returned -*/ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ Example Main Program - */ - public static void main(String[] args) throws NAGBadIntegerException { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - long astart, ifail, m; - int i; - double[] fvec, x; - double[] ruser = new double[1]; - long[] iuser = new long[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Initialise NAG for Java - Routine.init(); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail==0 || ifail==8 || ifail==9) { - if (ifail==0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java deleted file mode 100644 index d7a6435..0000000 --- a/simple_examples/source/int64/C05QBJE.java +++ /dev/null @@ -1,178 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; - -/** - * - * @author ludovic - */ -public class C05QBJE { - - /** - * @param args the command line arguments - */ - public static void main(String[] args) throws NAGBadIntegerException { - try { - Routine.init(); - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - long[] IUSER = new long[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = (int)c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - - break; - } - - } catch (NAGBadIntegerException ex) { - System.err.println("Something went wrong!\n" + ex.getMessage()); - } - - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private long N, IFLAG; - private double[] X, FVEC, RUSER; - private long[] IUSER; - - //@Override - public void setN(long N) { - this.N = N; - } - - //@Override - public long getN() { - return N; - } - - //@Override - public void setX(double[] X) { - this.X = X; - } - - //@Override - public double[] getX() { - return X; - } - - //@Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - //@Override - public double[] getFVEC() { - return FVEC; - } - - //@Override - public void setIUSER(long[] IUSER) { - this.IUSER = IUSER; - } - - //@Override - public long[] getIUSER() { - return IUSER; - } - - //@Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - //@Override - public double[] getRUSER() { - return RUSER; - } - - //@Override - public void setIFLAG(long IFLAG) { - this.IFLAG = IFLAG; - } - - //@Override - public long getIFLAG() { - return IFLAG; - } - - //@Override - public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class D01BDJE_FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - - } - -} diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java deleted file mode 100644 index b32ae64..0000000 --- a/simple_examples/source/int64/D02NEJE.java +++ /dev/null @@ -1,393 +0,0 @@ -import java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; - - -/** - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) throws NAGBadIntegerException { - - // Initialise wrappers - Routine.init(); - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - long ifail, itask, maxord, ijac, itol, licom, neq, lcom; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - long ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - * Fortran array definition: - * a(dimX, *) - * - * Conversion: - * a(x, y) --> A[result] - */ - private static long getIdx(long x, long y, long dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - long neq, long ml, long mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - long md, ms, pd_dim1; - - pd_dim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; - pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[(int)getIdx(md, 3, pd_dim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; - pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; - pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - long neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java deleted file mode 100644 index d1feabb..0000000 --- a/simple_examples/source/int64/DTFSMJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * Adapted from f06wbfe.f90 - * - * @author joed - * - */ -public class DTFSMJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - double alpha = 4.21; - long ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - - // Init NAG Java - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - Routine.init(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[(int)(m*m)]; - for (int i=0; i=i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[((int)(m*(m+1)))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java deleted file mode 100644 index 89a89e4..0000000 --- a/simple_examples/source/int64/E01DAJE.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * E01DA Example Program - NAG Copyright 2016 - */ - import com.nag.exceptions.NAGBadIntegerException; - import com.nag.routines.E01.E01DA; - import com.nag.routines.E02.E02DF; - import com.nag.routines.Routine; - -public class E01DAJE { - - public static void main (String[] args)throws NAGBadIntegerException { - Routine.init(); - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = (int)e01da.getIFAIL(); - switch (ifail) - { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) - { - if (i <= mx) - System.out.printf("%4d %9.4f", i+1, lamda[i]); - else - System.out.printf(" "); - if (i <= my) - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - else - System.out.printf("\n"); - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) - { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) - System.out.printf("\n"); - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = (int)e01da.getPX(); - py = (int)e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px,4*ny+py); - if (4*nx+px>4*ny+py) - liwrk = ny + py - 4; - else - liwrk = nx + px - 4; - double tx[] = new double[nx]; - double ty[] = new double[ny]; - double ff[] = new double[nx*ny]; - wrk = new double[lwrk]; - long iwrk[] = new long[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new long[(int)(datafile.n + datafile.nclin)]; - ax = new double[(int)Math.max(1, datafile.nclin)]; - iwork = new long[(int)liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[(int)(datafile.n + datafile.nclin)]; - work = new double[(int)lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[(int)lcwsav]; - cwsav[0] = " "; - long[] iwsav = new long[(int)liwsav]; - boolean[] lwsav = new boolean[(int)llwsav]; - double[] rwsav = new double[(int)lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - long[] iuser = new long[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - - super.eval(); - - } - - } - - public static class DataFile { - - public String filename; - public long n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } else { - sda = 1; - - } - ldh = n; - - cvec = new double[(int)n]; - a = new double[(int)(lda * sda)]; - bl = new double[(int)(n + nclin)]; - bu = new double[(int)(n + nclin)]; - x = new double[(int)n]; - h = new double[(int)(ldh * n)]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java deleted file mode 100644 index 20ad573..0000000 --- a/simple_examples/source/int64/E04UCJE.java +++ /dev/null @@ -1,207 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.Routine; -import java.util.Arrays; - -/** - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - double objf; - long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; - long[] istate, iwork; - long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; - boolean[] lwsav = new boolean[(int)LLWSAV]; - String[] cwsav = new String[(int)LCWSAV]; - Arrays.fill(cwsav, " "); - - System.out.println(" E04UCJ Example Program Results"); - Routine.init(); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new long[(int)(n + nclin + ncnln)]; - iwork = new long[(int)liwork]; - c = new double[(int)(Math.max(1, ncnln))]; - cjac = new double[(int)(ldcj * sdcjac)]; - clamda = new double[(int)(n + nclin + ncnln)]; - objgrd = new double[(int)n]; - r = new double[(int)(ldr * n)]; - work = new double[(int)lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[(int)LDCJ] = X[1] + X[1]; - CJAC[(int)(2*LDCJ)] = X[2] + X[2]; - CJAC[(int)(3*LDCJ)] = X[3] + X[3]; - } - - } - - if (NEEDC[1]>0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; - CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; - CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java deleted file mode 100644 index d8f152c..0000000 --- a/simple_examples/source/int64/F02EKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -emacimport java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.Routine; -import com.nag.types.*; - - -/** - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) throws NAGBadIntegerException { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - // Initialise wrapper library - Routine.init(); - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval ( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW(){ - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/source/withdrawn/D02TKJE.java b/simple_examples/source/withdrawn/D02TKJE.java deleted file mode 100644 index 16e9e9b..0000000 --- a/simple_examples/source/withdrawn/D02TKJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.D02.D02TK; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import com.nag.routines.Routine; - - -/** - * @author joed - */ -public class D02TKJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) throws NAGBadIntegerException { - D02TK d02tk = new D02TK(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; - double[] mesh, tol, work, y; - int[] icomm, ipmesh; - - // Initialise wrappers - Routine.init(); - - System.out.println(" D02TKJ Example Program Results"); - System.out.println(); - - // Values from d02tkfe.d - ncol = 7; - nmesh = 11; - mxmesh = 51; - - licomm = 23 + NEQ + mxmesh; - lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - work = new double[lrcomm]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - icomm = new int[licomm]; - - // Values from d02tkfe.d - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Initial integrator for given problem. - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, - lrcomm, icomm, licomm, ifail - ); - - // Values from d02tkfe.d - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tk.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, - ifail - ); - ifail = d02tk.getIFAIL(); - if (ifail == 1) break; - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) break; - - // Print mesh, error stats - System.out.printf( - "\n" + - " Used a mesh of %4d points\n" + - " Maximum error = %10.2E in interval %4d for component %4d\n" + - "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) System.out.printf("\n"); - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); - ifail = d02ty.getIFAIL(); - if (ifail != 0) { - System.err.println( - "D02TY failed with error code " + ifail - ); - break; - } - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) break; - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TX failed with error code " + ifail); - } - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - * Fortran array definition: - * a(dimX, 0:*) - * - * Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - * Fortran array definition: - * a(dimX, dimY, 0:*) - * - * Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TK.Abstract_D02TK_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TK.Abstract_D02TK_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TK.Abstract_D02TK_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/withdrawn/D02TKJE.java b/simple_examples/withdrawn/D02TKJE.java deleted file mode 100644 index 16e9e9b..0000000 --- a/simple_examples/withdrawn/D02TKJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.D02.D02TK; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import com.nag.routines.Routine; - - -/** - * @author joed - */ -public class D02TKJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) throws NAGBadIntegerException { - D02TK d02tk = new D02TK(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; - double[] mesh, tol, work, y; - int[] icomm, ipmesh; - - // Initialise wrappers - Routine.init(); - - System.out.println(" D02TKJ Example Program Results"); - System.out.println(); - - // Values from d02tkfe.d - ncol = 7; - nmesh = 11; - mxmesh = 51; - - licomm = 23 + NEQ + mxmesh; - lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - work = new double[lrcomm]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - icomm = new int[licomm]; - - // Values from d02tkfe.d - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Initial integrator for given problem. - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, - lrcomm, icomm, licomm, ifail - ); - - // Values from d02tkfe.d - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tk.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, - ifail - ); - ifail = d02tk.getIFAIL(); - if (ifail == 1) break; - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) break; - - // Print mesh, error stats - System.out.printf( - "\n" + - " Used a mesh of %4d points\n" + - " Maximum error = %10.2E in interval %4d for component %4d\n" + - "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) System.out.printf("\n"); - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); - ifail = d02ty.getIFAIL(); - if (ifail != 0) { - System.err.println( - "D02TY failed with error code " + ifail - ); - break; - } - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) break; - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TX failed with error code " + ifail); - } - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - * Fortran array definition: - * a(dimX, 0:*) - * - * Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - * Fortran array definition: - * a(dimX, dimY, 0:*) - * - * Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TK.Abstract_D02TK_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TK.Abstract_D02TK_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TK.Abstract_D02TK_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} From 647550f4d248aa5649ce79a757dc296d1d484ccd Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:13:46 +0000 Subject: [PATCH 120/196] Simple Examples Synced --- simple_examples/baseresults/a00aaje.r | 10 + simple_examples/baseresults/a00acje.r | 3 + simple_examples/baseresults/a00adje.r | 17 + simple_examples/baseresults/c02aaje.r | 19 + simple_examples/baseresults/c02abje.r | 12 + simple_examples/baseresults/c02afje.r | 28 ++ simple_examples/baseresults/c02agje.r | 27 ++ simple_examples/baseresults/c02ahje.r | 6 + simple_examples/baseresults/c02ajje.r | 6 + simple_examples/baseresults/c02akje.r | 8 + simple_examples/baseresults/c02alje.r | 9 + simple_examples/baseresults/c02amje.r | 8 + simple_examples/baseresults/c02anje.r | 9 + simple_examples/baseresults/c05auje.r | 4 + simple_examples/baseresults/c05awje.r | 4 + simple_examples/baseresults/c05ayje.r | 3 + simple_examples/baseresults/c05azje.r | 15 + simple_examples/baseresults/c05bbje.r | 10 + simple_examples/baseresults/c05mbje.r | 8 + simple_examples/baseresults/c05qbje.r | 8 + simple_examples/baseresults/c06baje.r | 15 + simple_examples/baseresults/c06fkje.r | 13 + simple_examples/baseresults/c09aaje.r | 18 + .../baseresults/complexargumentexample.r | 1 + simple_examples/baseresults/d01bdje.r | 9 + simple_examples/baseresults/d02neje.r | 25 ++ simple_examples/baseresults/d02tkje.r | 113 +++++ simple_examples/baseresults/d02tlje.r | 113 +++++ simple_examples/baseresults/d03pcje.r | 28 ++ simple_examples/baseresults/d03raje.r | 409 +++++++++++++++++ simple_examples/baseresults/d03rbje.r | 59 +++ simple_examples/baseresults/d05baje.r | 12 + simple_examples/baseresults/d05beje.r | 46 ++ simple_examples/baseresults/dtfsmje.r | 10 + simple_examples/baseresults/e01daje.r | 25 ++ simple_examples/baseresults/e02alje.r | 24 + simple_examples/baseresults/e04abje.r | 6 + simple_examples/baseresults/e04bbje.r | 7 + simple_examples/baseresults/e04cbje.r | 4 + simple_examples/baseresults/e04fcje.r | 22 + simple_examples/baseresults/e04ffje.r | 73 +++ simple_examples/baseresults/e04gbje.r | 22 + simple_examples/baseresults/e04ggje.r | 44 ++ simple_examples/baseresults/e04mtje.r | 162 +++++++ simple_examples/baseresults/e04mxje.r | 38 ++ simple_examples/baseresults/e04ncje.r | 23 + simple_examples/baseresults/e04nfje.r | 66 +++ simple_examples/baseresults/e04nkje.r | 26 ++ simple_examples/baseresults/e04nqje.r | 6 + simple_examples/baseresults/e04ptje.r | 39 ++ simple_examples/baseresults/e04rpje.r | 105 +++++ simple_examples/baseresults/e04rsje.r | 35 ++ simple_examples/baseresults/e04rtje.r | 35 ++ simple_examples/baseresults/e04saje.r | 33 ++ simple_examples/baseresults/e04taje.r | 39 ++ simple_examples/baseresults/e04tcje.r | 58 +++ simple_examples/baseresults/e04uc_example.r | 95 ++++ simple_examples/baseresults/e04ucje.r | 22 + simple_examples/baseresults/e04yaje.r | 25 ++ simple_examples/baseresults/f01adje.r | 9 + simple_examples/baseresults/f01ckje.r | 5 + simple_examples/baseresults/f01crje.r | 6 + simple_examples/baseresults/f01dgje.r | 8 + simple_examples/baseresults/f01elje.r | 10 + simple_examples/baseresults/f01emje.r | 10 + simple_examples/baseresults/f02ekje.r | 20 + simple_examples/baseresults/f02fkje.r | 14 + simple_examples/baseresults/f02wgje.r | 7 + simple_examples/baseresults/f03baje.r | 14 + simple_examples/baseresults/f04amje.r | 4 + simple_examples/baseresults/f04baje.r | 14 + simple_examples/baseresults/f05aaje.r | 11 + simple_examples/baseresults/f06clje.r | 3 + simple_examples/baseresults/f07aaje.r | 14 + simple_examples/baseresults/f07abje.r | 23 + simple_examples/baseresults/f07adje.r | 10 + simple_examples/baseresults/f07aqje.r | 7 + simple_examples/baseresults/f07faje.r | 11 + simple_examples/baseresults/f07fbje.r | 19 + simple_examples/baseresults/f08btje.r | 16 + simple_examples/baseresults/f08faje.r | 16 + simple_examples/baseresults/f08xpje.r | 8 + simple_examples/baseresults/g01alje.r | 7 + simple_examples/baseresults/g02akje.r | 14 + simple_examples/baseresults/g02bjje.r | 38 ++ simple_examples/baseresults/g02brje.r | 29 ++ simple_examples/baseresults/g02daje.r | 31 ++ simple_examples/baseresults/g02eeje.r | 20 + simple_examples/baseresults/g02maje.r | 23 + simple_examples/baseresults/g03gaje.r | 79 ++++ simple_examples/baseresults/g05kfje.r | 7 + simple_examples/baseresults/g13awje.r | 4 + simple_examples/baseresults/g13meje.r | 39 ++ simple_examples/baseresults/g13naje.r | 11 + simple_examples/baseresults/h02bbje.r | 79 ++++ simple_examples/baseresults/h02daje.r | 14 + simple_examples/baseresults/m01ccje.r | 15 + .../baseresults/nagcomplexexample.r | 60 +++ simple_examples/baseresults/outputexample.r | 10 + simple_examples/baseresults/s01baje.r | 9 + simple_examples/baseresults/s10aaje.r | 7 + simple_examples/baseresults/s10abje.r | 8 + simple_examples/baseresults/s10acje.r | 8 + simple_examples/baseresults/s14abje.r | 12 + simple_examples/baseresults/s14acje.r | 8 + simple_examples/baseresults/s14afje.r | 5 + simple_examples/baseresults/s17dcje.r | 10 + simple_examples/baseresults/s17dgje.r | 9 + simple_examples/baseresults/s30aaje.r | 16 + simple_examples/baseresults/s30acje.r | 9 + .../baseresults/simpleroutineexample.r | 15 + .../baseresults/userdefinedfunctionexample1.r | 1 + .../baseresults/userdefinedfunctionexample2.r | 1 + simple_examples/baseresults/x03aaje.r | 3 + simple_examples/baseresults/x04cbje.r | 21 + simple_examples/baseresults/x05abje.r | 2 + simple_examples/data/c02abje.d | 14 + simple_examples/data/c02afje.d | 19 + simple_examples/data/c02agje.d | 9 + simple_examples/data/c02ahje.d | 2 + simple_examples/data/c02ajje.d | 2 + simple_examples/data/c02akje.d | 2 + simple_examples/data/c02alje.d | 2 + simple_examples/data/c02amje.d | 5 + simple_examples/data/c02anje.d | 6 + simple_examples/data/c05bbje.d | 7 + simple_examples/data/c06fkje.d | 11 + simple_examples/data/c09aaje.d | 11 + simple_examples/data/d03pcje.d | 6 + simple_examples/data/e02alje.d | 23 + simple_examples/data/e04fcje.d | 16 + simple_examples/data/e04mxje.d | 64 +++ simple_examples/data/e04ncje.d | 21 + simple_examples/data/e04nfje.d | 22 + simple_examples/data/e04nqje.d | 67 +++ simple_examples/data/e04rsje.d | 13 + simple_examples/data/e04rtje.d | 8 + simple_examples/data/e04saje.opt | 30 ++ simple_examples/data/e04tcje.d | 22 + simple_examples/data/f03baje.d | 5 + simple_examples/data/f04amje.d | 5 + simple_examples/data/f04baje.d | 13 + simple_examples/data/f05aaje.d | 6 + simple_examples/data/f08btje.d | 15 + simple_examples/data/f08xpje.d | 10 + simple_examples/data/g02bjje.d | 10 + simple_examples/data/g02daje.d | 15 + simple_examples/data/g02eeje.d | 24 + simple_examples/data/g02maje.d | 23 + simple_examples/data/g03gaje.d | 56 +++ simple_examples/data/g05kfje.d | 3 + simple_examples/data/g13naje.d | 14 + simple_examples/data/m01ccje.d | 13 + simple_examples/data/s14abje.d | 10 + simple_examples/data/s14acje.d | 5 + simple_examples/data/s14afje.d | 2 + simple_examples/data/s17dcje.d | 6 + simple_examples/data/s17dgje.d | 6 + simple_examples/data/s30aaje.d | 9 + simple_examples/data/s30acje.d | 9 + simple_examples/data/x03aaje.d | 5 + simple_examples/source/int32/A00AAJE.java | 16 + simple_examples/source/int32/A00ACJE.java | 29 ++ simple_examples/source/int32/A00ADJE.java | 107 +++++ simple_examples/source/int32/C02AAJE.java | 174 ++++++++ simple_examples/source/int32/C02ABJE.java | 217 +++++++++ simple_examples/source/int32/C02AFJE.java | 271 +++++++++++ simple_examples/source/int32/C02AGJE.java | 262 +++++++++++ simple_examples/source/int32/C02AHJE.java | 61 +++ simple_examples/source/int32/C02AJJE.java | 65 +++ simple_examples/source/int32/C02AKJE.java | 62 +++ simple_examples/source/int32/C02ALJE.java | 64 +++ simple_examples/source/int32/C02AMJE.java | 75 ++++ simple_examples/source/int32/C02ANJE.java | 80 ++++ simple_examples/source/int32/C05AUJE.java | 67 +++ simple_examples/source/int32/C05AWJE.java | 59 +++ simple_examples/source/int32/C05AYJE.java | 44 ++ simple_examples/source/int32/C05AZJE.java | 65 +++ simple_examples/source/int32/C05BBJE.java | 89 ++++ simple_examples/source/int32/C05MBJE.java | 95 ++++ simple_examples/source/int32/C05QBJE.java | 167 +++++++ simple_examples/source/int32/C06BAJE.java | 56 +++ simple_examples/source/int32/C06FKJE.java | 91 ++++ simple_examples/source/int32/C09AAJE.java | 158 +++++++ simple_examples/source/int32/D01BDJE.java | 58 +++ simple_examples/source/int32/D01RJJE.java | 184 ++++++++ simple_examples/source/int32/D01RKJE.java | 173 ++++++++ simple_examples/source/int32/D01RLJE.java | 196 ++++++++ simple_examples/source/int32/D01RMJE.java | 163 +++++++ simple_examples/source/int32/D01TCJE.java | 45 ++ simple_examples/source/int32/D02NEJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D02TLJE.java | 290 ++++++++++++ simple_examples/source/int32/D03PCJE.java | 217 +++++++++ simple_examples/source/int32/D03RAJE.java | 307 +++++++++++++ simple_examples/source/int32/D03RBJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D05BAJE.java | 111 +++++ simple_examples/source/int32/D05BEJE.java | 185 ++++++++ simple_examples/source/int32/DTFSMJE.java | 54 +++ simple_examples/source/int32/E01DAJE.java | 182 ++++++++ simple_examples/source/int32/E02ALJE.java | 101 +++++ simple_examples/source/int32/E04ABJE.java | 76 ++++ simple_examples/source/int32/E04BBJE.java | 81 ++++ simple_examples/source/int32/E04CBJE.java | 90 ++++ simple_examples/source/int32/E04FCJE.java | 420 ++++++++++++++++++ simple_examples/source/int32/E04FFJE.java | 140 ++++++ simple_examples/source/int32/E04GBJE.java | 183 ++++++++ simple_examples/source/int32/E04GGJE.java | 219 +++++++++ simple_examples/source/int32/E04MTJE.java | 132 ++++++ simple_examples/source/int32/E04MXJE.java | 292 ++++++++++++ simple_examples/source/int32/E04NCJE.java | 246 ++++++++++ simple_examples/source/int32/E04NFJE.java | 234 ++++++++++ simple_examples/source/int32/E04NKJE.java | 295 ++++++++++++ simple_examples/source/int32/E04NQJE.java | 384 ++++++++++++++++ simple_examples/source/int32/E04PTJE.java | 344 ++++++++++++++ simple_examples/source/int32/E04RPJE.java | 199 +++++++++ simple_examples/source/int32/E04RSJE.java | 229 ++++++++++ simple_examples/source/int32/E04RTJE.java | 225 ++++++++++ simple_examples/source/int32/E04SAJE.java | 104 +++++ simple_examples/source/int32/E04TAJE.java | 188 ++++++++ simple_examples/source/int32/E04TCJE.java | 263 +++++++++++ simple_examples/source/int32/E04UCJE.java | 211 +++++++++ simple_examples/source/int32/E04YAJE.java | 112 +++++ simple_examples/source/int32/F01ADJE.java | 39 ++ simple_examples/source/int32/F01CKJE.java | 60 +++ simple_examples/source/int32/F01CRJE.java | 47 ++ simple_examples/source/int32/F01DGJE.java | 72 +++ simple_examples/source/int32/F01ELJE.java | 89 ++++ simple_examples/source/int32/F01EMJE.java | 106 +++++ simple_examples/source/int32/F02EKJE.java | 227 ++++++++++ simple_examples/source/int32/F02FKJE.java | 230 ++++++++++ simple_examples/source/int32/F02WGJE.java | 132 ++++++ simple_examples/source/int32/F03BAJE.java | 108 +++++ simple_examples/source/int32/F04AMJE.java | 114 +++++ simple_examples/source/int32/F04BAJE.java | 144 ++++++ simple_examples/source/int32/F05AAJE.java | 99 +++++ simple_examples/source/int32/F06CLJE.java | 40 ++ simple_examples/source/int32/F07AAJE.java | 90 ++++ simple_examples/source/int32/F07ABJE.java | 134 ++++++ simple_examples/source/int32/F07ADJE.java | 72 +++ simple_examples/source/int32/F07AQJE.java | 99 +++++ simple_examples/source/int32/F07FAJE.java | 79 ++++ simple_examples/source/int32/F07FBJE.java | 122 +++++ simple_examples/source/int32/F08BTJE.java | 228 ++++++++++ simple_examples/source/int32/F08FAJE.java | 113 +++++ simple_examples/source/int32/F08XPJE.java | 297 +++++++++++++ simple_examples/source/int32/G01ALJE.java | 55 +++ simple_examples/source/int32/G02AKJE.java | 68 +++ simple_examples/source/int32/G02BJJE.java | 303 +++++++++++++ simple_examples/source/int32/G02BRJE.java | 134 ++++++ simple_examples/source/int32/G02DAJE.java | 187 ++++++++ simple_examples/source/int32/G02EEJE.java | 184 ++++++++ simple_examples/source/int32/G02MAJE.java | 130 ++++++ simple_examples/source/int32/G03GAJE.java | 355 +++++++++++++++ simple_examples/source/int32/G05KFJE.java | 105 +++++ simple_examples/source/int32/G13AWJE.java | 31 ++ simple_examples/source/int32/G13MEJE.java | 160 +++++++ simple_examples/source/int32/G13NAJE.java | 123 +++++ simple_examples/source/int32/H02BBJE.java | 92 ++++ simple_examples/source/int32/H02DAJE.java | 228 ++++++++++ simple_examples/source/int32/M01CCJE.java | 42 ++ simple_examples/source/int32/S01BAJE.java | 39 ++ simple_examples/source/int32/S10AAJE.java | 40 ++ simple_examples/source/int32/S10ABJE.java | 41 ++ simple_examples/source/int32/S10ACJE.java | 41 ++ simple_examples/source/int32/S14ABJE.java | 71 +++ simple_examples/source/int32/S14ACJE.java | 68 +++ simple_examples/source/int32/S14AFJE.java | 80 ++++ simple_examples/source/int32/S17DCJE.java | 69 +++ simple_examples/source/int32/S17DGJE.java | 61 +++ simple_examples/source/int32/S30AAJE.java | 109 +++++ simple_examples/source/int32/S30ACJE.java | 129 ++++++ simple_examples/source/int32/X03AAJE.java | 87 ++++ simple_examples/source/int32/X04CBJE.java | 53 +++ simple_examples/source/int32/X05ABJE.java | 25 ++ simple_examples/source/int64/A00AAJE.java | 14 + simple_examples/source/int64/A00ADJE.java | 113 +++++ simple_examples/source/int64/C05AYJE.java | 45 ++ simple_examples/source/int64/C05AZJE.java | 65 +++ simple_examples/source/int64/C05MBJE.java | 104 +++++ simple_examples/source/int64/C05QBJE.java | 178 ++++++++ simple_examples/source/int64/D01BDJE.java | 57 +++ simple_examples/source/int64/D02NEJE.java | 393 ++++++++++++++++ simple_examples/source/int64/DTFSMJE.java | 61 +++ simple_examples/source/int64/E01DAJE.java | 177 ++++++++ simple_examples/source/int64/E04FCJE.java | 415 +++++++++++++++++ simple_examples/source/int64/E04MTJE.java | 134 ++++++ simple_examples/source/int64/E04NFJE.java | 223 ++++++++++ simple_examples/source/int64/E04UCJE.java | 207 +++++++++ simple_examples/source/int64/F02EKJE.java | 230 ++++++++++ simple_examples/source/withdrawn/D02TKJE.java | 290 ++++++++++++ 290 files changed, 22288 insertions(+) create mode 100644 simple_examples/baseresults/a00aaje.r create mode 100644 simple_examples/baseresults/a00acje.r create mode 100644 simple_examples/baseresults/a00adje.r create mode 100644 simple_examples/baseresults/c02aaje.r create mode 100644 simple_examples/baseresults/c02abje.r create mode 100644 simple_examples/baseresults/c02afje.r create mode 100644 simple_examples/baseresults/c02agje.r create mode 100644 simple_examples/baseresults/c02ahje.r create mode 100644 simple_examples/baseresults/c02ajje.r create mode 100644 simple_examples/baseresults/c02akje.r create mode 100644 simple_examples/baseresults/c02alje.r create mode 100644 simple_examples/baseresults/c02amje.r create mode 100644 simple_examples/baseresults/c02anje.r create mode 100644 simple_examples/baseresults/c05auje.r create mode 100644 simple_examples/baseresults/c05awje.r create mode 100644 simple_examples/baseresults/c05ayje.r create mode 100644 simple_examples/baseresults/c05azje.r create mode 100644 simple_examples/baseresults/c05bbje.r create mode 100644 simple_examples/baseresults/c05mbje.r create mode 100644 simple_examples/baseresults/c05qbje.r create mode 100644 simple_examples/baseresults/c06baje.r create mode 100644 simple_examples/baseresults/c06fkje.r create mode 100644 simple_examples/baseresults/c09aaje.r create mode 100644 simple_examples/baseresults/complexargumentexample.r create mode 100644 simple_examples/baseresults/d01bdje.r create mode 100644 simple_examples/baseresults/d02neje.r create mode 100644 simple_examples/baseresults/d02tkje.r create mode 100644 simple_examples/baseresults/d02tlje.r create mode 100644 simple_examples/baseresults/d03pcje.r create mode 100644 simple_examples/baseresults/d03raje.r create mode 100644 simple_examples/baseresults/d03rbje.r create mode 100644 simple_examples/baseresults/d05baje.r create mode 100644 simple_examples/baseresults/d05beje.r create mode 100644 simple_examples/baseresults/dtfsmje.r create mode 100644 simple_examples/baseresults/e01daje.r create mode 100644 simple_examples/baseresults/e02alje.r create mode 100644 simple_examples/baseresults/e04abje.r create mode 100644 simple_examples/baseresults/e04bbje.r create mode 100644 simple_examples/baseresults/e04cbje.r create mode 100644 simple_examples/baseresults/e04fcje.r create mode 100644 simple_examples/baseresults/e04ffje.r create mode 100644 simple_examples/baseresults/e04gbje.r create mode 100644 simple_examples/baseresults/e04ggje.r create mode 100644 simple_examples/baseresults/e04mtje.r create mode 100644 simple_examples/baseresults/e04mxje.r create mode 100644 simple_examples/baseresults/e04ncje.r create mode 100644 simple_examples/baseresults/e04nfje.r create mode 100644 simple_examples/baseresults/e04nkje.r create mode 100644 simple_examples/baseresults/e04nqje.r create mode 100644 simple_examples/baseresults/e04ptje.r create mode 100644 simple_examples/baseresults/e04rpje.r create mode 100644 simple_examples/baseresults/e04rsje.r create mode 100644 simple_examples/baseresults/e04rtje.r create mode 100644 simple_examples/baseresults/e04saje.r create mode 100644 simple_examples/baseresults/e04taje.r create mode 100644 simple_examples/baseresults/e04tcje.r create mode 100644 simple_examples/baseresults/e04uc_example.r create mode 100644 simple_examples/baseresults/e04ucje.r create mode 100644 simple_examples/baseresults/e04yaje.r create mode 100644 simple_examples/baseresults/f01adje.r create mode 100644 simple_examples/baseresults/f01ckje.r create mode 100644 simple_examples/baseresults/f01crje.r create mode 100644 simple_examples/baseresults/f01dgje.r create mode 100644 simple_examples/baseresults/f01elje.r create mode 100644 simple_examples/baseresults/f01emje.r create mode 100644 simple_examples/baseresults/f02ekje.r create mode 100644 simple_examples/baseresults/f02fkje.r create mode 100644 simple_examples/baseresults/f02wgje.r create mode 100644 simple_examples/baseresults/f03baje.r create mode 100644 simple_examples/baseresults/f04amje.r create mode 100644 simple_examples/baseresults/f04baje.r create mode 100644 simple_examples/baseresults/f05aaje.r create mode 100644 simple_examples/baseresults/f06clje.r create mode 100644 simple_examples/baseresults/f07aaje.r create mode 100644 simple_examples/baseresults/f07abje.r create mode 100644 simple_examples/baseresults/f07adje.r create mode 100644 simple_examples/baseresults/f07aqje.r create mode 100644 simple_examples/baseresults/f07faje.r create mode 100644 simple_examples/baseresults/f07fbje.r create mode 100644 simple_examples/baseresults/f08btje.r create mode 100644 simple_examples/baseresults/f08faje.r create mode 100644 simple_examples/baseresults/f08xpje.r create mode 100644 simple_examples/baseresults/g01alje.r create mode 100644 simple_examples/baseresults/g02akje.r create mode 100644 simple_examples/baseresults/g02bjje.r create mode 100644 simple_examples/baseresults/g02brje.r create mode 100644 simple_examples/baseresults/g02daje.r create mode 100644 simple_examples/baseresults/g02eeje.r create mode 100644 simple_examples/baseresults/g02maje.r create mode 100644 simple_examples/baseresults/g03gaje.r create mode 100644 simple_examples/baseresults/g05kfje.r create mode 100644 simple_examples/baseresults/g13awje.r create mode 100644 simple_examples/baseresults/g13meje.r create mode 100644 simple_examples/baseresults/g13naje.r create mode 100644 simple_examples/baseresults/h02bbje.r create mode 100644 simple_examples/baseresults/h02daje.r create mode 100644 simple_examples/baseresults/m01ccje.r create mode 100644 simple_examples/baseresults/nagcomplexexample.r create mode 100644 simple_examples/baseresults/outputexample.r create mode 100644 simple_examples/baseresults/s01baje.r create mode 100644 simple_examples/baseresults/s10aaje.r create mode 100644 simple_examples/baseresults/s10abje.r create mode 100644 simple_examples/baseresults/s10acje.r create mode 100644 simple_examples/baseresults/s14abje.r create mode 100644 simple_examples/baseresults/s14acje.r create mode 100644 simple_examples/baseresults/s14afje.r create mode 100644 simple_examples/baseresults/s17dcje.r create mode 100644 simple_examples/baseresults/s17dgje.r create mode 100644 simple_examples/baseresults/s30aaje.r create mode 100644 simple_examples/baseresults/s30acje.r create mode 100644 simple_examples/baseresults/simpleroutineexample.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample1.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample2.r create mode 100644 simple_examples/baseresults/x03aaje.r create mode 100644 simple_examples/baseresults/x04cbje.r create mode 100644 simple_examples/baseresults/x05abje.r create mode 100644 simple_examples/data/c02abje.d create mode 100644 simple_examples/data/c02afje.d create mode 100644 simple_examples/data/c02agje.d create mode 100644 simple_examples/data/c02ahje.d create mode 100644 simple_examples/data/c02ajje.d create mode 100644 simple_examples/data/c02akje.d create mode 100644 simple_examples/data/c02alje.d create mode 100644 simple_examples/data/c02amje.d create mode 100644 simple_examples/data/c02anje.d create mode 100644 simple_examples/data/c05bbje.d create mode 100644 simple_examples/data/c06fkje.d create mode 100644 simple_examples/data/c09aaje.d create mode 100644 simple_examples/data/d03pcje.d create mode 100644 simple_examples/data/e02alje.d create mode 100644 simple_examples/data/e04fcje.d create mode 100644 simple_examples/data/e04mxje.d create mode 100644 simple_examples/data/e04ncje.d create mode 100644 simple_examples/data/e04nfje.d create mode 100644 simple_examples/data/e04nqje.d create mode 100644 simple_examples/data/e04rsje.d create mode 100644 simple_examples/data/e04rtje.d create mode 100644 simple_examples/data/e04saje.opt create mode 100644 simple_examples/data/e04tcje.d create mode 100644 simple_examples/data/f03baje.d create mode 100644 simple_examples/data/f04amje.d create mode 100644 simple_examples/data/f04baje.d create mode 100644 simple_examples/data/f05aaje.d create mode 100644 simple_examples/data/f08btje.d create mode 100644 simple_examples/data/f08xpje.d create mode 100644 simple_examples/data/g02bjje.d create mode 100644 simple_examples/data/g02daje.d create mode 100644 simple_examples/data/g02eeje.d create mode 100644 simple_examples/data/g02maje.d create mode 100644 simple_examples/data/g03gaje.d create mode 100644 simple_examples/data/g05kfje.d create mode 100644 simple_examples/data/g13naje.d create mode 100644 simple_examples/data/m01ccje.d create mode 100644 simple_examples/data/s14abje.d create mode 100644 simple_examples/data/s14acje.d create mode 100644 simple_examples/data/s14afje.d create mode 100644 simple_examples/data/s17dcje.d create mode 100644 simple_examples/data/s17dgje.d create mode 100644 simple_examples/data/s30aaje.d create mode 100644 simple_examples/data/s30acje.d create mode 100644 simple_examples/data/x03aaje.d create mode 100644 simple_examples/source/int32/A00AAJE.java create mode 100644 simple_examples/source/int32/A00ACJE.java create mode 100644 simple_examples/source/int32/A00ADJE.java create mode 100644 simple_examples/source/int32/C02AAJE.java create mode 100644 simple_examples/source/int32/C02ABJE.java create mode 100644 simple_examples/source/int32/C02AFJE.java create mode 100644 simple_examples/source/int32/C02AGJE.java create mode 100644 simple_examples/source/int32/C02AHJE.java create mode 100644 simple_examples/source/int32/C02AJJE.java create mode 100644 simple_examples/source/int32/C02AKJE.java create mode 100644 simple_examples/source/int32/C02ALJE.java create mode 100644 simple_examples/source/int32/C02AMJE.java create mode 100644 simple_examples/source/int32/C02ANJE.java create mode 100644 simple_examples/source/int32/C05AUJE.java create mode 100644 simple_examples/source/int32/C05AWJE.java create mode 100644 simple_examples/source/int32/C05AYJE.java create mode 100644 simple_examples/source/int32/C05AZJE.java create mode 100644 simple_examples/source/int32/C05BBJE.java create mode 100644 simple_examples/source/int32/C05MBJE.java create mode 100644 simple_examples/source/int32/C05QBJE.java create mode 100644 simple_examples/source/int32/C06BAJE.java create mode 100644 simple_examples/source/int32/C06FKJE.java create mode 100644 simple_examples/source/int32/C09AAJE.java create mode 100644 simple_examples/source/int32/D01BDJE.java create mode 100644 simple_examples/source/int32/D01RJJE.java create mode 100644 simple_examples/source/int32/D01RKJE.java create mode 100644 simple_examples/source/int32/D01RLJE.java create mode 100644 simple_examples/source/int32/D01RMJE.java create mode 100644 simple_examples/source/int32/D01TCJE.java create mode 100644 simple_examples/source/int32/D02NEJE.java create mode 100644 simple_examples/source/int32/D02TLJE.java create mode 100644 simple_examples/source/int32/D03PCJE.java create mode 100644 simple_examples/source/int32/D03RAJE.java create mode 100644 simple_examples/source/int32/D03RBJE.java create mode 100644 simple_examples/source/int32/D05BAJE.java create mode 100644 simple_examples/source/int32/D05BEJE.java create mode 100644 simple_examples/source/int32/DTFSMJE.java create mode 100644 simple_examples/source/int32/E01DAJE.java create mode 100644 simple_examples/source/int32/E02ALJE.java create mode 100644 simple_examples/source/int32/E04ABJE.java create mode 100644 simple_examples/source/int32/E04BBJE.java create mode 100644 simple_examples/source/int32/E04CBJE.java create mode 100644 simple_examples/source/int32/E04FCJE.java create mode 100644 simple_examples/source/int32/E04FFJE.java create mode 100644 simple_examples/source/int32/E04GBJE.java create mode 100644 simple_examples/source/int32/E04GGJE.java create mode 100644 simple_examples/source/int32/E04MTJE.java create mode 100644 simple_examples/source/int32/E04MXJE.java create mode 100644 simple_examples/source/int32/E04NCJE.java create mode 100644 simple_examples/source/int32/E04NFJE.java create mode 100644 simple_examples/source/int32/E04NKJE.java create mode 100644 simple_examples/source/int32/E04NQJE.java create mode 100644 simple_examples/source/int32/E04PTJE.java create mode 100644 simple_examples/source/int32/E04RPJE.java create mode 100644 simple_examples/source/int32/E04RSJE.java create mode 100644 simple_examples/source/int32/E04RTJE.java create mode 100644 simple_examples/source/int32/E04SAJE.java create mode 100644 simple_examples/source/int32/E04TAJE.java create mode 100644 simple_examples/source/int32/E04TCJE.java create mode 100644 simple_examples/source/int32/E04UCJE.java create mode 100644 simple_examples/source/int32/E04YAJE.java create mode 100644 simple_examples/source/int32/F01ADJE.java create mode 100644 simple_examples/source/int32/F01CKJE.java create mode 100644 simple_examples/source/int32/F01CRJE.java create mode 100644 simple_examples/source/int32/F01DGJE.java create mode 100644 simple_examples/source/int32/F01ELJE.java create mode 100644 simple_examples/source/int32/F01EMJE.java create mode 100644 simple_examples/source/int32/F02EKJE.java create mode 100644 simple_examples/source/int32/F02FKJE.java create mode 100644 simple_examples/source/int32/F02WGJE.java create mode 100644 simple_examples/source/int32/F03BAJE.java create mode 100644 simple_examples/source/int32/F04AMJE.java create mode 100644 simple_examples/source/int32/F04BAJE.java create mode 100644 simple_examples/source/int32/F05AAJE.java create mode 100644 simple_examples/source/int32/F06CLJE.java create mode 100644 simple_examples/source/int32/F07AAJE.java create mode 100644 simple_examples/source/int32/F07ABJE.java create mode 100644 simple_examples/source/int32/F07ADJE.java create mode 100644 simple_examples/source/int32/F07AQJE.java create mode 100644 simple_examples/source/int32/F07FAJE.java create mode 100644 simple_examples/source/int32/F07FBJE.java create mode 100644 simple_examples/source/int32/F08BTJE.java create mode 100644 simple_examples/source/int32/F08FAJE.java create mode 100644 simple_examples/source/int32/F08XPJE.java create mode 100644 simple_examples/source/int32/G01ALJE.java create mode 100644 simple_examples/source/int32/G02AKJE.java create mode 100644 simple_examples/source/int32/G02BJJE.java create mode 100644 simple_examples/source/int32/G02BRJE.java create mode 100644 simple_examples/source/int32/G02DAJE.java create mode 100644 simple_examples/source/int32/G02EEJE.java create mode 100644 simple_examples/source/int32/G02MAJE.java create mode 100644 simple_examples/source/int32/G03GAJE.java create mode 100644 simple_examples/source/int32/G05KFJE.java create mode 100644 simple_examples/source/int32/G13AWJE.java create mode 100644 simple_examples/source/int32/G13MEJE.java create mode 100644 simple_examples/source/int32/G13NAJE.java create mode 100644 simple_examples/source/int32/H02BBJE.java create mode 100644 simple_examples/source/int32/H02DAJE.java create mode 100644 simple_examples/source/int32/M01CCJE.java create mode 100644 simple_examples/source/int32/S01BAJE.java create mode 100644 simple_examples/source/int32/S10AAJE.java create mode 100644 simple_examples/source/int32/S10ABJE.java create mode 100644 simple_examples/source/int32/S10ACJE.java create mode 100644 simple_examples/source/int32/S14ABJE.java create mode 100644 simple_examples/source/int32/S14ACJE.java create mode 100644 simple_examples/source/int32/S14AFJE.java create mode 100644 simple_examples/source/int32/S17DCJE.java create mode 100644 simple_examples/source/int32/S17DGJE.java create mode 100644 simple_examples/source/int32/S30AAJE.java create mode 100644 simple_examples/source/int32/S30ACJE.java create mode 100644 simple_examples/source/int32/X03AAJE.java create mode 100644 simple_examples/source/int32/X04CBJE.java create mode 100644 simple_examples/source/int32/X05ABJE.java create mode 100644 simple_examples/source/int64/A00AAJE.java create mode 100644 simple_examples/source/int64/A00ADJE.java create mode 100644 simple_examples/source/int64/C05AYJE.java create mode 100644 simple_examples/source/int64/C05AZJE.java create mode 100644 simple_examples/source/int64/C05MBJE.java create mode 100644 simple_examples/source/int64/C05QBJE.java create mode 100644 simple_examples/source/int64/D01BDJE.java create mode 100644 simple_examples/source/int64/D02NEJE.java create mode 100644 simple_examples/source/int64/DTFSMJE.java create mode 100644 simple_examples/source/int64/E01DAJE.java create mode 100644 simple_examples/source/int64/E04FCJE.java create mode 100644 simple_examples/source/int64/E04MTJE.java create mode 100644 simple_examples/source/int64/E04NFJE.java create mode 100644 simple_examples/source/int64/E04UCJE.java create mode 100644 simple_examples/source/int64/F02EKJE.java create mode 100644 simple_examples/source/withdrawn/D02TKJE.java diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r new file mode 100644 index 0000000..adcba2f --- /dev/null +++ b/simple_examples/baseresults/a00aaje.r @@ -0,0 +1,10 @@ + A00AAJ Example Program Results + + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: double precision + Product Code: CLL6I262CL + Mark: 27.2.0 (self-contained) + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/a00acje.r b/simple_examples/baseresults/a00acje.r new file mode 100644 index 0000000..0012531 --- /dev/null +++ b/simple_examples/baseresults/a00acje.r @@ -0,0 +1,3 @@ + A00ACJ Example Program Results + + A valid licence key is available diff --git a/simple_examples/baseresults/a00adje.r b/simple_examples/baseresults/a00adje.r new file mode 100644 index 0000000..5fb1839 --- /dev/null +++ b/simple_examples/baseresults/a00adje.r @@ -0,0 +1,17 @@ + A00ADJ Example Program Results + +*** Start of NAG Library implementation details *** + +Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: Fortran double precision + Product code: CLL6I262CL + Mark: 26.2 + Vendor Library: None +Applicable to: + hardware: x86_64 + operating system: Linux 2.6.32-696.6.3.el6.x86_64 + Fortran compiler: Intel ifort Version 18.0.1.163 20171018 +and compatible systems. + Licence query: Successful + +*** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/c02aaje.r b/simple_examples/baseresults/c02aaje.r new file mode 100644 index 0000000..fa3083b --- /dev/null +++ b/simple_examples/baseresults/c02aaje.r @@ -0,0 +1,19 @@ + C02AAJ Example Program Results + + Example 1: Basic Problem + + i z conv berr cond + --------------------------------------------------- + 1 6.53E-03, 7.42E-03 3 9.25E-18 4.84E+00 + 2 -6.93E-03, -7.44E-03 2 0.00E+00 4.95E+00 + 3 -2.43E+01, -4.86E+00 3 8.41E-18 1.13E+01 + 4 1.47E+01, -1.66E+01 3 1.07E-17 9.99E+00 + 5 5.25E+00, 2.27E+01 3 2.08E-17 1.06E+01 + + Example 2: Polishing Processes + + polish relerr fwderr + ---------------------------- + 0 3.18E-10 1.15E-04 + 1 6.16E-11 8.49E-06 + 2 1.11E-16 1.11E-16 diff --git a/simple_examples/baseresults/c02abje.r b/simple_examples/baseresults/c02abje.r new file mode 100644 index 0000000..01b29cd --- /dev/null +++ b/simple_examples/baseresults/c02abje.r @@ -0,0 +1,12 @@ + C02ABJ Example Program Results + + Basic Problem + + i z conv berr cond + ----------------------------------------------------- + 1 ( 1.15E+00, 7.36E-01) 3 5.37E-18 1.34E+01 + 2 ( -1.67E+00, 3.25E-01) 3 6.34E-18 2.20E+01 + 3 ( 3.79E-01, -1.25E+00) 3 2.98E-18 1.02E+01 + 4 ( -1.67E+00, -3.25E-01) 3 4.57E-18 2.20E+01 + 5 ( 1.15E+00, -7.36E-01) 3 1.04E-17 1.34E+01 + 6 ( 3.79E-01, 1.25E+00) 2 1.66E-18 1.02E+01 diff --git a/simple_examples/baseresults/c02afje.r b/simple_examples/baseresults/c02afje.r new file mode 100644 index 0000000..386d4fe --- /dev/null +++ b/simple_examples/baseresults/c02afje.r @@ -0,0 +1,28 @@ + C02AFJ Example Program Results + + + Example 1 + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -2.4328E+01 -4.8555E+00*i + z = 5.2487E+00 +2.2736E+01*i + z = 1.4653E+01 -1.6569E+01*i + z = -6.9264E-03 -7.4434E-03*i + z = 6.5264E-03 +7.4232E-03*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -2.4328E+01 -4.8555E+00*i 5.7E-16 + z = 5.2487E+00 +2.2736E+01*i 1.5E-16 + z = 1.4653E+01 -1.6569E+01*i 4.8E-16 + z = -6.9264E-03 -7.4434E-03*i 1.1E-16 + z = 6.5264E-03 +7.4232E-03*i 1.8E-16 diff --git a/simple_examples/baseresults/c02agje.r b/simple_examples/baseresults/c02agje.r new file mode 100644 index 0000000..8e10c18 --- /dev/null +++ b/simple_examples/baseresults/c02agje.r @@ -0,0 +1,27 @@ + C02AGJ Example Program Results + + + Example 1 + + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -1.4918E+00 + z = 5.5169E-01 +/- 1.2533E+00*i + z = -8.0579E-01 +/- 1.2229E+00*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -1.4918E+00 +0.0000E+00*i 7.4E-16 + z = 5.5169E-01 +1.2533E+00*i 1.1E-16 + z = 5.5169E-01 -1.2533E+00*i 1.1E-16 + z = -8.0579E-01 +1.2229E+00*i 3.0E-16 + z = -8.0579E-01 -1.2229E+00*i 3.0E-16 diff --git a/simple_examples/baseresults/c02ahje.r b/simple_examples/baseresults/c02ahje.r new file mode 100644 index 0000000..e3efc97 --- /dev/null +++ b/simple_examples/baseresults/c02ahje.r @@ -0,0 +1,6 @@ + C02AHJ Example Program Results + + Roots of quadratic equation + + z = 1.0000E+00 +2.0000E+00*i + z = 2.0000E+00 -3.0000E+00*i diff --git a/simple_examples/baseresults/c02ajje.r b/simple_examples/baseresults/c02ajje.r new file mode 100644 index 0000000..944fa06 --- /dev/null +++ b/simple_examples/baseresults/c02ajje.r @@ -0,0 +1,6 @@ + C02AJJ Example Program Results + + Roots of quadratic equation + + z = 2.0000E+00 + z = -5.0000E+00 diff --git a/simple_examples/baseresults/c02akje.r b/simple_examples/baseresults/c02akje.r new file mode 100644 index 0000000..34b3e74 --- /dev/null +++ b/simple_examples/baseresults/c02akje.r @@ -0,0 +1,8 @@ + C02AKJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = 1.0000E+00 +0.0000E+00*i 1.0E-15 + z = -2.0000E+00 +3.0000E+00*i 1.0E-15 + z = -2.0000E+00 -3.0000E+00*i 1.0E-15 diff --git a/simple_examples/baseresults/c02alje.r b/simple_examples/baseresults/c02alje.r new file mode 100644 index 0000000..ff49a36 --- /dev/null +++ b/simple_examples/baseresults/c02alje.r @@ -0,0 +1,9 @@ + C02ALJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 2.0000E+00 +0.0000E+00*i 1.2E-15 + z = -2.0000E+00 +0.0000E+00*i 1.1E-15 + z = -1.0000E+00 +3.0000E+00*i 1.1E-15 + z = -1.0000E+00 -3.0000E+00*i 1.1E-15 diff --git a/simple_examples/baseresults/c02amje.r b/simple_examples/baseresults/c02amje.r new file mode 100644 index 0000000..c2c70b4 --- /dev/null +++ b/simple_examples/baseresults/c02amje.r @@ -0,0 +1,8 @@ + C02AMJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = -2.0000E+00 +3.0000E+00*i 1.3E-15 + z = 1.0000E+00 -2.0000E+00*i 2.2E-15 + z = 3.0000E+00 -4.0000E+00*i 2.1E-15 diff --git a/simple_examples/baseresults/c02anje.r b/simple_examples/baseresults/c02anje.r new file mode 100644 index 0000000..4361b7e --- /dev/null +++ b/simple_examples/baseresults/c02anje.r @@ -0,0 +1,9 @@ + C02ANJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 3.0000E+00 -2.0000E+00*i 1.8E-15 + z = 1.0000E+00 -2.0000E+00*i 1.8E-15 + z = -2.0000E+00 +1.0000E+00*i 1.8E-15 + z = -2.0000E+00 +3.0000E+00*i 1.8E-15 diff --git a/simple_examples/baseresults/c05auje.r b/simple_examples/baseresults/c05auje.r new file mode 100644 index 0000000..1c8bb18 --- /dev/null +++ b/simple_examples/baseresults/c05auje.r @@ -0,0 +1,4 @@ +C05AUJ Example Program Results + +Root is : 0.56714 +Interval searched is : [ 0.50000, 0.90000] diff --git a/simple_examples/baseresults/c05awje.r b/simple_examples/baseresults/c05awje.r new file mode 100644 index 0000000..0868382 --- /dev/null +++ b/simple_examples/baseresults/c05awje.r @@ -0,0 +1,4 @@ +C05AWJ Example Program Results + +With eps = 1.00e-03 root = 0.56715 +With eps = 1.00e-04 root = 0.56715 diff --git a/simple_examples/baseresults/c05ayje.r b/simple_examples/baseresults/c05ayje.r new file mode 100644 index 0000000..50a0010 --- /dev/null +++ b/simple_examples/baseresults/c05ayje.r @@ -0,0 +1,3 @@ +C05AYJ Example Program Results + +Zero at x = 0.56714 diff --git a/simple_examples/baseresults/c05azje.r b/simple_examples/baseresults/c05azje.r new file mode 100644 index 0000000..1d3b6bc --- /dev/null +++ b/simple_examples/baseresults/c05azje.r @@ -0,0 +1,15 @@ + C05AZJ Example Program Results + + Iterations + + X = 0.00000 FX = 1.0000E+00 IND = 2 + X = 1.00000 FX = -6.3212E-01 IND = 3 + X = 0.61270 FX = -7.0814E-02 IND = 4 + X = 0.56707 FX = 1.1542E-04 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + X = 0.56713 FX = 1.4727E-05 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/c05bbje.r b/simple_examples/baseresults/c05bbje.r new file mode 100644 index 0000000..a963b94 --- /dev/null +++ b/simple_examples/baseresults/c05bbje.r @@ -0,0 +1,10 @@ +C05BBJ Example Program Results +Branch = 0 +Offset = false + + Z W(Z) RESID IFAIL + +(5.00000e-01, -1.00000e+00) (5.16511e-01, -4.22053e-01) 5.55112e-17 0 +(1.00000e+00, 2.30000e+00) (8.73606e-01, 5.76978e-01) 1.11022e-16 0 +(4.50000e+00, -1.00000e-01) (1.26735e+00, -1.24194e-02) 0.00000e+00 0 +(6.00000e+00, 6.00000e+00) (1.61492e+00, 4.90515e-01) 1.25607e-15 0 diff --git a/simple_examples/baseresults/c05mbje.r b/simple_examples/baseresults/c05mbje.r new file mode 100644 index 0000000..49cdab8 --- /dev/null +++ b/simple_examples/baseresults/c05mbje.r @@ -0,0 +1,8 @@ +C05MBJ Example Program Results + + +Final 2-norm of the residuals = 2.4765e-08 + +Final approximate solution + + 0.7682 0.7862 0.6948 0.6180 diff --git a/simple_examples/baseresults/c05qbje.r b/simple_examples/baseresults/c05qbje.r new file mode 100644 index 0000000..e161a18 --- /dev/null +++ b/simple_examples/baseresults/c05qbje.r @@ -0,0 +1,8 @@ + C05QBJ Example Program Results + + Final 2-norm of the residuals = 1.1926E-08 + + Final approximate solution + -0.5707 -0.6816 -0.7017 + -0.7042 -0.7014 -0.6919 + -0.6658 -0.5960 -0.4164 diff --git a/simple_examples/baseresults/c06baje.r b/simple_examples/baseresults/c06baje.r new file mode 100644 index 0000000..7049ba9 --- /dev/null +++ b/simple_examples/baseresults/c06baje.r @@ -0,0 +1,15 @@ +C06BAJ Example Program Results + + Estimated Actual +I SEQN RESULT abs error error + +1 1.0000 1.0000 - 1.78e-01 +2 0.7500 0.7500 - -7.25e-02 +3 0.8611 0.8269 - 4.46e-03 +4 0.7986 0.8211 2.56e-01 -1.36e-03 +5 0.8386 0.8226 7.84e-02 1.23e-04 +6 0.8108 0.8224 5.97e-03 -3.26e-05 +7 0.8312 0.8225 1.52e-03 3.50e-06 +8 0.8156 0.8225 1.60e-04 -8.51e-07 +9 0.8280 0.8225 3.70e-05 1.01e-07 +10 0.8180 0.8225 4.48e-06 -2.32e-08 \ No newline at end of file diff --git a/simple_examples/baseresults/c06fkje.r b/simple_examples/baseresults/c06fkje.r new file mode 100644 index 0000000..8ef60db --- /dev/null +++ b/simple_examples/baseresults/c06fkje.r @@ -0,0 +1,13 @@ +C06FKJ Example Program Results + + Covolution Correlation + +0 0.50000 2.00000 +1 1.00000 1.50000 +2 1.50000 1.00000 +3 2.00000 0.50000 +4 2.00000 0.00000 +5 1.50000 0.50000 +6 1.00000 1.00000 +7 0.50000 1.50000 +8 0.00000 2.00000 diff --git a/simple_examples/baseresults/c09aaje.r b/simple_examples/baseresults/c09aaje.r new file mode 100644 index 0000000..950c020 --- /dev/null +++ b/simple_examples/baseresults/c09aaje.r @@ -0,0 +1,18 @@ +C09AAJ Example Program Results + +Parameters read from file :: + Wavelet : Haar End mode : Zero N = 8 +Input data X : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 + +Length of wavelet filter : 2 +Number of Levels : 3 +Number of coefficients in each level: + 1 1 2 4 +Total number of wavelength coefficients : 8 + +Wavelet coefficients C: +12.374 4.596 -5.000 5.500 -2.121 -0.707 2.121 -1.414 + +Reconstruction Y : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 \ No newline at end of file diff --git a/simple_examples/baseresults/complexargumentexample.r b/simple_examples/baseresults/complexargumentexample.r new file mode 100644 index 0000000..19fc96c --- /dev/null +++ b/simple_examples/baseresults/complexargumentexample.r @@ -0,0 +1 @@ +(1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/d01bdje.r b/simple_examples/baseresults/d01bdje.r new file mode 100644 index 0000000..23c78d1 --- /dev/null +++ b/simple_examples/baseresults/d01bdje.r @@ -0,0 +1,9 @@ + D01BDJ Example Program Results + + A - lower limit of integration = 0.0000 + B - upper limit of integration = 1.0000 + EPSABS - absolute accuracy requested = 0.00E+00 + EPSREL - relative accuracy requested = 1.00E-04 + + RESULT - approximation to the integral = -0.03183 + ABSERR - estimate to the absolute error = 1.34E-11 diff --git a/simple_examples/baseresults/d02neje.r b/simple_examples/baseresults/d02neje.r new file mode 100644 index 0000000..b735aaf --- /dev/null +++ b/simple_examples/baseresults/d02neje.r @@ -0,0 +1,25 @@ + D02NEJ Example Program Results + + D02NEF Example 1 + + t Y(1) Y(2) Y(3) + 0.0000 1.000000 0.000000 0.000000 + 0.0200 0.999204 0.000036 0.000760 + 0.0400 0.998415 0.000036 0.001549 + 0.0600 0.997631 0.000036 0.002333 + 0.0800 0.996852 0.000036 0.003112 + 0.1000 0.996080 0.000036 0.003884 + + The integrator completed task, ITASK = 3 + + D02NEF Example 2 + + t y(1) + 0.0000 2.000000 + 0.2000 2.038016 + 0.4000 2.078379 + 0.6000 2.121462 + 0.8000 2.167736 + 1.0000 2.217821 + + The integrator completed task, ITASK = 3 diff --git a/simple_examples/baseresults/d02tkje.r b/simple_examples/baseresults/d02tkje.r new file mode 100644 index 0000000..4029a48 --- /dev/null +++ b/simple_examples/baseresults/d02tkje.r @@ -0,0 +1,113 @@ + D02TKJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d02tlje.r b/simple_examples/baseresults/d02tlje.r new file mode 100644 index 0000000..b56a57d --- /dev/null +++ b/simple_examples/baseresults/d02tlje.r @@ -0,0 +1,113 @@ + D02TLJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d03pcje.r b/simple_examples/baseresults/d03pcje.r new file mode 100644 index 0000000..154a2d9 --- /dev/null +++ b/simple_examples/baseresults/d03pcje.r @@ -0,0 +1,28 @@ +D03PCJ Example Program Results +Accuracy requirement = 1.00000e-03 + Parameter ALPHA = 1.000e+00 +T / X 0.0000 0.4000 0.6000 0.8000 0.9000 1.0000 + +0.0001 U(1) 0.0000 0.8008 1.1988 1.5990 1.7958 1.8485 + U(2) 0.9997 0.9995 0.9994 0.9988 0.9663 -0.0000 + + +0.0010 U(1) 0.0000 0.7982 1.1940 1.5841 1.7179 1.6734 + U(2) 0.9969 0.9952 0.9937 0.9484 0.6385 -0.0000 + + +0.0100 U(1) 0.0000 0.7676 1.1239 1.3547 1.3635 1.2830 + U(2) 0.9627 0.9495 0.8754 0.5537 0.2908 -0.0000 + + +0.1000 U(1) 0.0000 0.3908 0.5007 0.5297 0.5120 0.4744 + U(2) 0.5468 0.4299 0.2995 0.1479 0.0724 -0.0000 + + +1.0000 U(1) 0.0000 0.0007 0.0008 0.0008 0.0008 0.0007 + U(2) 0.0010 0.0007 0.0005 0.0002 0.0001 -0.0000 + +Number of Integration steps in time 78 +Number of residual evaluations of resulting ODE system 378 +Number of Jacobian evaluations 25 +Number of iterations of nonlinear solver 190 diff --git a/simple_examples/baseresults/d03raje.r b/simple_examples/baseresults/d03raje.r new file mode 100644 index 0000000..59cf403 --- /dev/null +++ b/simple_examples/baseresults/d03raje.r @@ -0,0 +1,409 @@ + D03RAJ Example Program Results + + Statistics: + Time = 0.2400 + Total number of accepted timesteps = 77 + Total number of rejected timesteps = 0 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 600 80 200 200 + + Maximum number of + Newton iters Lin sys iters + At level + 1 2 3 + + Solution at every 4th grid point in level 2 at time 0.2500: + + x y approx u + + 6.7500E-01 0.000E+00 2.000E+00 + 7.2500E-01 0.000E+00 1.980E+00 + 7.7500E-01 0.000E+00 1.342E+00 + 8.2500E-01 0.000E+00 1.190E+00 + 7.1250E-01 1.250E-02 1.996E+00 + 7.6250E-01 1.250E-02 1.468E+00 + 8.1250E-01 1.250E-02 1.213E+00 + 7.0000E-01 2.500E-02 1.999E+00 + 7.5000E-01 2.500E-02 1.625E+00 + 8.0000E-01 2.500E-02 1.240E+00 + 6.8750E-01 3.750E-02 2.000E+00 + 7.3750E-01 3.750E-02 1.870E+00 + 7.8750E-01 3.750E-02 1.283E+00 + 6.7500E-01 5.000E-02 2.000E+00 + 7.2500E-01 5.000E-02 1.980E+00 + 7.7500E-01 5.000E-02 1.342E+00 + 8.2500E-01 5.000E-02 1.190E+00 + 7.1250E-01 6.250E-02 1.996E+00 + 7.6250E-01 6.250E-02 1.468E+00 + 8.1250E-01 6.250E-02 1.213E+00 + 7.0000E-01 7.500E-02 1.999E+00 + 7.5000E-01 7.500E-02 1.625E+00 + 8.0000E-01 7.500E-02 1.240E+00 + 6.8750E-01 8.750E-02 2.000E+00 + 7.3750E-01 8.750E-02 1.870E+00 + 7.8750E-01 8.750E-02 1.283E+00 + 6.7500E-01 1.000E-01 2.000E+00 + 7.2500E-01 1.000E-01 1.980E+00 + 7.7500E-01 1.000E-01 1.342E+00 + 8.2500E-01 1.000E-01 1.190E+00 + 7.1250E-01 1.125E-01 1.996E+00 + 7.6250E-01 1.125E-01 1.468E+00 + 8.1250E-01 1.125E-01 1.213E+00 + 7.0000E-01 1.250E-01 1.999E+00 + 7.5000E-01 1.250E-01 1.625E+00 + 8.0000E-01 1.250E-01 1.240E+00 + 6.8750E-01 1.375E-01 2.000E+00 + 7.3750E-01 1.375E-01 1.870E+00 + 7.8750E-01 1.375E-01 1.283E+00 + 6.7500E-01 1.500E-01 2.000E+00 + 7.2500E-01 1.500E-01 1.980E+00 + 7.7500E-01 1.500E-01 1.341E+00 + 8.2500E-01 1.500E-01 1.190E+00 + 7.1250E-01 1.625E-01 1.995E+00 + 7.6250E-01 1.625E-01 1.467E+00 + 8.1250E-01 1.625E-01 1.213E+00 + 7.0000E-01 1.750E-01 1.999E+00 + 7.5000E-01 1.750E-01 1.624E+00 + 8.0000E-01 1.750E-01 1.240E+00 + 6.8750E-01 1.875E-01 2.000E+00 + 7.3750E-01 1.875E-01 1.869E+00 + 7.8750E-01 1.875E-01 1.282E+00 + 6.7500E-01 2.000E-01 2.000E+00 + 7.2500E-01 2.000E-01 1.980E+00 + 7.7500E-01 2.000E-01 1.341E+00 + 8.2500E-01 2.000E-01 1.189E+00 + 7.1250E-01 2.125E-01 1.995E+00 + 7.6250E-01 2.125E-01 1.465E+00 + 8.1250E-01 2.125E-01 1.212E+00 + 7.0000E-01 2.250E-01 1.999E+00 + 7.5000E-01 2.250E-01 1.621E+00 + 8.0000E-01 2.250E-01 1.240E+00 + 6.8750E-01 2.375E-01 2.000E+00 + 7.3750E-01 2.375E-01 1.869E+00 + 7.8750E-01 2.375E-01 1.282E+00 + 6.7500E-01 2.500E-01 2.000E+00 + 7.2500E-01 2.500E-01 1.980E+00 + 7.7500E-01 2.500E-01 1.340E+00 + 8.2500E-01 2.500E-01 1.189E+00 + 7.1250E-01 2.625E-01 1.995E+00 + 7.6250E-01 2.625E-01 1.462E+00 + 8.1250E-01 2.625E-01 1.212E+00 + 7.0000E-01 2.750E-01 1.999E+00 + 7.5000E-01 2.750E-01 1.616E+00 + 8.0000E-01 2.750E-01 1.239E+00 + 6.8750E-01 2.875E-01 2.000E+00 + 7.3750E-01 2.875E-01 1.866E+00 + 7.8750E-01 2.875E-01 1.281E+00 + 6.7500E-01 3.000E-01 2.000E+00 + 7.2500E-01 3.000E-01 1.979E+00 + 7.7500E-01 3.000E-01 1.337E+00 + 8.2500E-01 3.000E-01 1.189E+00 + 7.1250E-01 3.125E-01 1.995E+00 + 7.6250E-01 3.125E-01 1.455E+00 + 8.1250E-01 3.125E-01 1.212E+00 + 7.0000E-01 3.250E-01 1.999E+00 + 7.5000E-01 3.250E-01 1.605E+00 + 8.0000E-01 3.250E-01 1.239E+00 + 6.8750E-01 3.375E-01 2.000E+00 + 7.3750E-01 3.375E-01 1.862E+00 + 7.8750E-01 3.375E-01 1.279E+00 + 6.7500E-01 3.500E-01 2.000E+00 + 7.2500E-01 3.500E-01 1.977E+00 + 7.7500E-01 3.500E-01 1.332E+00 + 8.2500E-01 3.500E-01 1.189E+00 + 7.1250E-01 3.625E-01 1.993E+00 + 7.6250E-01 3.625E-01 1.442E+00 + 8.1250E-01 3.625E-01 1.211E+00 + 7.0000E-01 3.750E-01 1.999E+00 + 7.5000E-01 3.750E-01 1.585E+00 + 8.0000E-01 3.750E-01 1.236E+00 + 6.8750E-01 3.875E-01 2.000E+00 + 7.3750E-01 3.875E-01 1.849E+00 + 7.8750E-01 3.875E-01 1.274E+00 + 6.7500E-01 4.000E-01 2.000E+00 + 7.2500E-01 4.000E-01 1.972E+00 + 7.7500E-01 4.000E-01 1.324E+00 + 8.2500E-01 4.000E-01 1.187E+00 + 7.1250E-01 4.125E-01 1.990E+00 + 7.6250E-01 4.125E-01 1.420E+00 + 8.1250E-01 4.125E-01 1.209E+00 + 7.0000E-01 4.250E-01 1.997E+00 + 7.5000E-01 4.250E-01 1.549E+00 + 8.0000E-01 4.250E-01 1.233E+00 + 6.8750E-01 4.375E-01 1.999E+00 + 7.3750E-01 4.375E-01 1.813E+00 + 7.8750E-01 4.375E-01 1.267E+00 + 6.7500E-01 4.500E-01 2.000E+00 + 7.2500E-01 4.500E-01 1.952E+00 + 7.7500E-01 4.500E-01 1.310E+00 + 8.2500E-01 4.500E-01 1.185E+00 + 7.1250E-01 4.625E-01 1.976E+00 + 7.6250E-01 4.625E-01 1.387E+00 + 8.1250E-01 4.625E-01 1.206E+00 + 6.7500E-01 4.750E-01 2.000E+00 + 7.2500E-01 4.750E-01 1.924E+00 + 7.7500E-01 4.750E-01 1.301E+00 + 8.2500E-01 4.750E-01 1.184E+00 + 6.8750E-01 4.875E-01 1.999E+00 + 7.3750E-01 4.875E-01 1.714E+00 + 7.8750E-01 4.875E-01 1.257E+00 + 6.5000E-01 5.000E-01 2.000E+00 + 7.0000E-01 5.000E-01 1.991E+00 + 7.5000E-01 5.000E-01 1.454E+00 + 8.0000E-01 5.000E-01 1.224E+00 + 6.6250E-01 5.125E-01 2.000E+00 + 7.1250E-01 5.125E-01 1.932E+00 + 7.6250E-01 5.125E-01 1.346E+00 + 6.5000E-01 5.250E-01 2.000E+00 + 7.0000E-01 5.250E-01 1.986E+00 + 7.5000E-01 5.250E-01 1.414E+00 + 8.0000E-01 5.250E-01 1.219E+00 + 6.8750E-01 5.375E-01 1.996E+00 + 7.3750E-01 5.375E-01 1.545E+00 + 7.8750E-01 5.375E-01 1.243E+00 + 6.5000E-01 5.500E-01 2.000E+00 + 7.0000E-01 5.500E-01 1.978E+00 + 7.5000E-01 5.500E-01 1.373E+00 + 8.0000E-01 5.500E-01 1.214E+00 + 6.6250E-01 5.625E-01 1.999E+00 + 7.1250E-01 5.625E-01 1.843E+00 + 7.6250E-01 5.625E-01 1.302E+00 + 6.2500E-01 5.750E-01 2.000E+00 + 6.7500E-01 5.750E-01 1.995E+00 + 7.2500E-01 5.750E-01 1.545E+00 + 7.7500E-01 5.750E-01 1.256E+00 + 6.3750E-01 5.875E-01 2.000E+00 + 6.8750E-01 5.875E-01 1.954E+00 + 7.3750E-01 5.875E-01 1.392E+00 + 7.8750E-01 5.875E-01 1.226E+00 + 6.2500E-01 6.000E-01 2.000E+00 + 6.7500E-01 6.000E-01 1.984E+00 + 7.2500E-01 6.000E-01 1.443E+00 + 7.7500E-01 6.000E-01 1.243E+00 + 6.1250E-01 6.125E-01 2.000E+00 + 6.6250E-01 6.125E-01 1.988E+00 + 7.1250E-01 6.125E-01 1.531E+00 + 7.6250E-01 6.125E-01 1.263E+00 + 5.5000E-01 6.250E-01 2.000E+00 + 6.0000E-01 6.250E-01 2.000E+00 + 6.5000E-01 6.250E-01 1.993E+00 + 7.0000E-01 6.250E-01 1.577E+00 + 7.5000E-01 6.250E-01 1.280E+00 + 8.0000E-01 6.250E-01 1.194E+00 + 5.8750E-01 6.375E-01 2.000E+00 + 6.3750E-01 6.375E-01 1.992E+00 + 6.8750E-01 6.375E-01 1.672E+00 + 7.3750E-01 6.375E-01 1.300E+00 + 4.7500E-01 6.500E-01 2.000E+00 + 5.2500E-01 6.500E-01 2.000E+00 + 5.7500E-01 6.500E-01 2.000E+00 + 6.2500E-01 6.500E-01 1.993E+00 + 6.7500E-01 6.500E-01 1.680E+00 + 7.2500E-01 6.500E-01 1.314E+00 + 7.7500E-01 6.500E-01 1.218E+00 + 5.1250E-01 6.625E-01 2.000E+00 + 5.6250E-01 6.625E-01 1.999E+00 + 6.1250E-01 6.625E-01 1.988E+00 + 6.6250E-01 6.625E-01 1.721E+00 + 7.1250E-01 6.625E-01 1.331E+00 + 7.6250E-01 6.625E-01 1.229E+00 + 2.5000E-02 6.750E-01 2.000E+00 + 7.5000E-02 6.750E-01 2.000E+00 + 1.2500E-01 6.750E-01 2.000E+00 + 1.7500E-01 6.750E-01 2.000E+00 + 2.2500E-01 6.750E-01 2.000E+00 + 2.7500E-01 6.750E-01 2.000E+00 + 3.2500E-01 6.750E-01 2.000E+00 + 3.7500E-01 6.750E-01 2.000E+00 + 4.2500E-01 6.750E-01 2.000E+00 + 4.7500E-01 6.750E-01 2.000E+00 + 5.2500E-01 6.750E-01 2.000E+00 + 5.7500E-01 6.750E-01 1.995E+00 + 6.2500E-01 6.750E-01 1.932E+00 + 6.7500E-01 6.750E-01 1.447E+00 + 7.2500E-01 6.750E-01 1.277E+00 + 7.7500E-01 6.750E-01 1.205E+00 + 3.7500E-02 6.875E-01 2.000E+00 + 8.7500E-02 6.875E-01 2.000E+00 + 1.3750E-01 6.875E-01 2.000E+00 + 1.8750E-01 6.875E-01 2.000E+00 + 2.3750E-01 6.875E-01 2.000E+00 + 2.8750E-01 6.875E-01 2.000E+00 + 3.3750E-01 6.875E-01 2.000E+00 + 3.8750E-01 6.875E-01 2.000E+00 + 4.3750E-01 6.875E-01 1.999E+00 + 4.8750E-01 6.875E-01 1.999E+00 + 5.3750E-01 6.875E-01 1.996E+00 + 5.8750E-01 6.875E-01 1.954E+00 + 6.3750E-01 6.875E-01 1.672E+00 + 6.8750E-01 6.875E-01 1.343E+00 + 7.3750E-01 6.875E-01 1.244E+00 + 2.5000E-02 7.000E-01 1.999E+00 + 7.5000E-02 7.000E-01 1.999E+00 + 1.2500E-01 7.000E-01 1.999E+00 + 1.7500E-01 7.000E-01 1.999E+00 + 2.2500E-01 7.000E-01 1.999E+00 + 2.7500E-01 7.000E-01 1.999E+00 + 3.2500E-01 7.000E-01 1.999E+00 + 3.7500E-01 7.000E-01 1.999E+00 + 4.2500E-01 7.000E-01 1.997E+00 + 4.7500E-01 7.000E-01 1.994E+00 + 5.2500E-01 7.000E-01 1.986E+00 + 5.7500E-01 7.000E-01 1.941E+00 + 6.2500E-01 7.000E-01 1.577E+00 + 6.7500E-01 7.000E-01 1.336E+00 + 7.2500E-01 7.000E-01 1.247E+00 + 1.2500E-02 7.125E-01 1.996E+00 + 6.2500E-02 7.125E-01 1.996E+00 + 1.1250E-01 7.125E-01 1.995E+00 + 1.6250E-01 7.125E-01 1.995E+00 + 2.1250E-01 7.125E-01 1.995E+00 + 2.6250E-01 7.125E-01 1.995E+00 + 3.1250E-01 7.125E-01 1.995E+00 + 3.6250E-01 7.125E-01 1.993E+00 + 4.1250E-01 7.125E-01 1.990E+00 + 4.6250E-01 7.125E-01 1.976E+00 + 5.1250E-01 7.125E-01 1.932E+00 + 5.6250E-01 7.125E-01 1.843E+00 + 6.1250E-01 7.125E-01 1.531E+00 + 6.6250E-01 7.125E-01 1.331E+00 + 7.1250E-01 7.125E-01 1.250E+00 + 2.5000E-02 7.250E-01 1.980E+00 + 7.5000E-02 7.250E-01 1.980E+00 + 1.2500E-01 7.250E-01 1.980E+00 + 1.7500E-01 7.250E-01 1.980E+00 + 2.2500E-01 7.250E-01 1.980E+00 + 2.7500E-01 7.250E-01 1.979E+00 + 3.2500E-01 7.250E-01 1.978E+00 + 3.7500E-01 7.250E-01 1.975E+00 + 4.2500E-01 7.250E-01 1.965E+00 + 4.7500E-01 7.250E-01 1.924E+00 + 5.2500E-01 7.250E-01 1.772E+00 + 5.7500E-01 7.250E-01 1.545E+00 + 6.2500E-01 7.250E-01 1.366E+00 + 6.7500E-01 7.250E-01 1.277E+00 + 7.2500E-01 7.250E-01 1.222E+00 + 3.7500E-02 7.375E-01 1.870E+00 + 8.7500E-02 7.375E-01 1.870E+00 + 1.3750E-01 7.375E-01 1.870E+00 + 1.8750E-01 7.375E-01 1.869E+00 + 2.3750E-01 7.375E-01 1.868E+00 + 2.8750E-01 7.375E-01 1.866E+00 + 3.3750E-01 7.375E-01 1.862E+00 + 3.8750E-01 7.375E-01 1.849E+00 + 4.3750E-01 7.375E-01 1.813E+00 + 4.8750E-01 7.375E-01 1.714E+00 + 5.3750E-01 7.375E-01 1.545E+00 + 5.8750E-01 7.375E-01 1.392E+00 + 6.3750E-01 7.375E-01 1.300E+00 + 6.8750E-01 7.375E-01 1.244E+00 + 2.5000E-02 7.500E-01 1.625E+00 + 7.5000E-02 7.500E-01 1.625E+00 + 1.2500E-01 7.500E-01 1.625E+00 + 1.7500E-01 7.500E-01 1.624E+00 + 2.2500E-01 7.500E-01 1.621E+00 + 2.7500E-01 7.500E-01 1.616E+00 + 3.2500E-01 7.500E-01 1.605E+00 + 3.7500E-01 7.500E-01 1.585E+00 + 4.2500E-01 7.500E-01 1.549E+00 + 4.7500E-01 7.500E-01 1.491E+00 + 5.2500E-01 7.500E-01 1.414E+00 + 5.7500E-01 7.500E-01 1.337E+00 + 6.2500E-01 7.500E-01 1.280E+00 + 6.7500E-01 7.500E-01 1.237E+00 + 1.2500E-02 7.625E-01 1.468E+00 + 6.2500E-02 7.625E-01 1.468E+00 + 1.1250E-01 7.625E-01 1.468E+00 + 1.6250E-01 7.625E-01 1.467E+00 + 2.1250E-01 7.625E-01 1.465E+00 + 2.6250E-01 7.625E-01 1.462E+00 + 3.1250E-01 7.625E-01 1.455E+00 + 3.6250E-01 7.625E-01 1.442E+00 + 4.1250E-01 7.625E-01 1.420E+00 + 4.6250E-01 7.625E-01 1.387E+00 + 5.1250E-01 7.625E-01 1.345E+00 + 5.6250E-01 7.625E-01 1.302E+00 + 6.1250E-01 7.625E-01 1.263E+00 + 6.6250E-01 7.625E-01 1.229E+00 + 2.5000E-02 7.750E-01 1.342E+00 + 7.5000E-02 7.750E-01 1.342E+00 + 1.2500E-01 7.750E-01 1.342E+00 + 1.7500E-01 7.750E-01 1.341E+00 + 2.2500E-01 7.750E-01 1.340E+00 + 2.7500E-01 7.750E-01 1.339E+00 + 3.2500E-01 7.750E-01 1.335E+00 + 3.7500E-01 7.750E-01 1.329E+00 + 4.2500E-01 7.750E-01 1.317E+00 + 4.7500E-01 7.750E-01 1.301E+00 + 5.2500E-01 7.750E-01 1.280E+00 + 5.7500E-01 7.750E-01 1.256E+00 + 6.2500E-01 7.750E-01 1.231E+00 + 6.7500E-01 7.750E-01 1.205E+00 + 3.7500E-02 7.875E-01 1.283E+00 + 8.7500E-02 7.875E-01 1.283E+00 + 1.3750E-01 7.875E-01 1.283E+00 + 1.8750E-01 7.875E-01 1.282E+00 + 2.3750E-01 7.875E-01 1.282E+00 + 2.8750E-01 7.875E-01 1.281E+00 + 3.3750E-01 7.875E-01 1.279E+00 + 3.8750E-01 7.875E-01 1.274E+00 + 4.3750E-01 7.875E-01 1.267E+00 + 4.8750E-01 7.875E-01 1.257E+00 + 5.3750E-01 7.875E-01 1.243E+00 + 5.8750E-01 7.875E-01 1.226E+00 + 0.0000E+00 8.000E-01 1.240E+00 + 5.0000E-02 8.000E-01 1.240E+00 + 1.0000E-01 8.000E-01 1.240E+00 + 1.5000E-01 8.000E-01 1.240E+00 + 2.0000E-01 8.000E-01 1.240E+00 + 2.5000E-01 8.000E-01 1.240E+00 + 3.0000E-01 8.000E-01 1.239E+00 + 3.5000E-01 8.000E-01 1.238E+00 + 4.0000E-01 8.000E-01 1.235E+00 + 4.5000E-01 8.000E-01 1.230E+00 + 5.0000E-01 8.000E-01 1.224E+00 + 5.5000E-01 8.000E-01 1.214E+00 + 6.0000E-01 8.000E-01 1.202E+00 + 1.2500E-02 8.125E-01 1.213E+00 + 6.2500E-02 8.125E-01 1.213E+00 + 1.1250E-01 8.125E-01 1.213E+00 + 1.6250E-01 8.125E-01 1.213E+00 + 2.1250E-01 8.125E-01 1.212E+00 + 2.6250E-01 8.125E-01 1.212E+00 + 3.1250E-01 8.125E-01 1.212E+00 + 3.6250E-01 8.125E-01 1.211E+00 + 4.1250E-01 8.125E-01 1.209E+00 + 4.6250E-01 8.125E-01 1.206E+00 + 0.0000E+00 8.250E-01 1.190E+00 + 5.0000E-02 8.250E-01 1.190E+00 + 1.0000E-01 8.250E-01 1.190E+00 + 1.5000E-01 8.250E-01 1.190E+00 + 2.0000E-01 8.250E-01 1.189E+00 + 2.5000E-01 8.250E-01 1.189E+00 + 3.0000E-01 8.250E-01 1.189E+00 + 3.5000E-01 8.250E-01 1.189E+00 + 4.0000E-01 8.250E-01 1.187E+00 + 4.5000E-01 8.250E-01 1.185E+00 + 5.0000E-01 8.250E-01 1.182E+00 + + Statistics: + Time = 0.2500 + Total number of accepted timesteps = 161 + Total number of rejected timesteps = 2 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 1000 200 400 400 + 2 200 20 50 50 + + Maximum number of + Newton iters Lin sys iters + At level + 1 4 3 + 2 4 1 diff --git a/simple_examples/baseresults/d03rbje.r b/simple_examples/baseresults/d03rbje.r new file mode 100644 index 0000000..f49a127 --- /dev/null +++ b/simple_examples/baseresults/d03rbje.r @@ -0,0 +1,59 @@ + D03RBJ Example Program Results + + Solution at every 2nd grid point in level 1 at time 1.0000: + + x y approx u exact u approx v exact v + + 0.00 0.00 0.50 0.50 1.00 1.00 + 0.20 0.00 0.50 0.50 1.00 1.00 + 0.10 0.10 0.50 0.50 1.00 1.00 + 0.30 0.10 0.50 0.50 1.00 1.00 + 0.50 0.10 0.50 0.50 1.00 1.00 + 0.70 0.10 0.50 0.50 1.00 1.00 + 0.90 0.10 0.50 0.50 1.00 1.00 + 0.00 0.20 0.50 0.50 1.00 1.00 + 0.20 0.20 0.50 0.50 1.00 1.00 + 0.40 0.20 0.50 0.50 1.00 1.00 + 0.60 0.20 0.50 0.50 1.00 1.00 + 0.80 0.20 0.50 0.50 1.00 1.00 + 1.00 0.20 0.50 0.50 1.00 1.00 + 0.10 0.30 0.50 0.50 1.00 1.00 + 0.30 0.30 0.50 0.50 1.00 1.00 + 0.50 0.30 0.50 0.50 1.00 1.00 + 0.70 0.30 0.50 0.50 1.00 1.00 + 0.90 0.30 0.50 0.50 1.00 1.00 + 0.00 0.40 0.75 0.75 0.75 0.75 + 0.20 0.40 0.50 0.50 1.00 1.00 + 0.40 0.40 0.50 0.50 1.00 1.00 + 0.80 0.40 0.50 0.50 1.00 1.00 + 1.00 0.40 0.50 0.50 1.00 1.00 + 0.10 0.50 0.75 0.75 0.75 0.75 + 0.30 0.50 0.50 0.50 1.00 1.00 + 0.50 0.50 0.50 0.50 1.00 1.00 + 0.70 0.50 0.50 0.50 1.00 1.00 + 0.90 0.50 0.50 0.50 1.00 1.00 + 0.00 0.60 0.75 0.75 0.75 0.75 + 0.20 0.60 0.75 0.75 0.75 0.75 + 0.40 0.60 0.50 0.50 1.00 1.00 + 0.60 0.60 0.50 0.50 1.00 1.00 + 0.80 0.60 0.50 0.50 1.00 1.00 + 1.00 0.60 0.50 0.50 1.00 1.00 + 0.10 0.70 0.75 0.75 0.75 0.75 + 0.30 0.70 0.75 0.75 0.75 0.75 + 0.50 0.70 0.50 0.50 1.00 1.00 + 0.70 0.70 0.50 0.50 1.00 1.00 + 0.90 0.70 0.50 0.50 1.00 1.00 + 0.00 0.80 0.75 0.75 0.75 0.75 + 0.20 0.80 0.75 0.75 0.75 0.75 + 0.40 0.80 0.75 0.75 0.75 0.75 + 0.60 0.80 0.50 0.50 1.00 1.00 + 0.80 0.80 0.50 0.50 1.00 1.00 + 0.10 0.90 0.75 0.75 0.75 0.75 + 0.30 0.90 0.75 0.75 0.75 0.75 + 0.50 0.90 0.75 0.75 0.75 0.75 + 0.70 0.90 0.50 0.50 1.00 1.00 + 0.00 1.00 0.75 0.75 0.75 0.75 + 0.20 1.00 0.75 0.75 0.75 0.75 + 0.40 1.00 0.75 0.75 0.75 0.75 + 0.60 1.00 0.75 0.75 0.75 0.75 + 0.80 1.00 0.50 0.50 1.00 1.00 diff --git a/simple_examples/baseresults/d05baje.r b/simple_examples/baseresults/d05baje.r new file mode 100644 index 0000000..0833ea2 --- /dev/null +++ b/simple_examples/baseresults/d05baje.r @@ -0,0 +1,12 @@ +D05BAJ Example Program Results + +Size of workplace = 486 +Tolerance = 1.0000e-03 + +T Approx. Sol. True Sol. Est. Error Actual Error +3.33 1.80037 1.80033 8.03776e-05 2.38466e-05 +6.67 2.23916 2.23911 1.77740e-04 2.34772e-05 +10.00 2.54310 2.54304 2.45949e-04 2.24564e-05 +13.33 2.77587 2.77581 3.05737e-04 2.17430e-05 +16.67 2.96456 2.96450 3.61698e-04 2.13821e-05 +20.00 3.12324 3.12317 4.17127e-04 2.13102e-05 diff --git a/simple_examples/baseresults/d05beje.r b/simple_examples/baseresults/d05beje.r new file mode 100644 index 0000000..95731f4 --- /dev/null +++ b/simple_examples/baseresults/d05beje.r @@ -0,0 +1,46 @@ +D05BEJ Example Program Results + +Example 1 + +The stepsize h = 0.1000 + + T Approximate + Solution + + 0.5000 0.1191 + 1.0000 0.0528 + 1.5000 0.0265 + 2.0000 0.0146 + 2.5000 0.0086 + 3.0000 0.0052 + 3.5000 0.0033 + 4.0000 0.0022 + 4.5000 0.0014 + 5.0000 0.0010 + 5.5000 0.0007 + 6.0000 0.0004 + 6.5000 0.0003 + 7.0000 0.0002 + +The maximum absolute error, 2.86e-03, occured at T = 0.1000 with solution 0.0326 + + +Example 2 + +The stepsize h = 0.0714 + + T Approximate + Solution + + 0.5000 0.6667 + 1.0000 0.5000 + 1.5000 0.4000 + 2.0000 0.3333 + 2.5000 0.2857 + 3.0000 0.2500 + 3.5000 0.2222 + 4.0000 0.2000 + 4.5000 0.1818 + 5.0000 0.1667 + +The maximum absolute error, 3.17e-06, occured at T = 0.0714 with solution 0.9333 \ No newline at end of file diff --git a/simple_examples/baseresults/dtfsmje.r b/simple_examples/baseresults/dtfsmje.r new file mode 100644 index 0000000..761a9ed --- /dev/null +++ b/simple_examples/baseresults/dtfsmje.r @@ -0,0 +1,10 @@ + DTFSMJ Example Program Results + + The Solution + 1 2 3 4 + 1 13.5562 5.7677 9.7251 1.2209 + 2 -10.1040 -1.9787 -8.9252 -4.4205 + 3 -0.8280 0.2386 2.0348 2.0769 + 4 2.8488 -7.1745 -3.7925 -2.9505 + 5 -3.9321 0.8652 -1.4082 3.1217 + 6 -2.3127 1.8398 2.0152 1.5198 diff --git a/simple_examples/baseresults/e01daje.r b/simple_examples/baseresults/e01daje.r new file mode 100644 index 0000000..a9c2ddb --- /dev/null +++ b/simple_examples/baseresults/e01daje.r @@ -0,0 +1,25 @@ + E01DAJ Example Program Results + + I Knot LAMDA(I) J Knot MU(j) + 4 1.0000 4 0.0000 + 5 1.3000 5 0.4000 + 6 1.5000 6 0.7000 + 7 1.6000 7 1.0000 + 8 2.0000 + + The B-Spline coefficients: + 1.0000 1.1333 1.3667 1.7000 1.9000 2.0000 1.2000 1.3333 + 1.5667 1.9000 2.1000 2.2000 1.5833 1.7167 1.9500 2.2833 + 2.4833 2.5833 2.1433 2.2767 2.5100 2.8433 3.0433 3.1433 + 2.8667 3.0000 3.2333 3.5667 3.7667 3.8667 3.4667 3.6000 + 3.8333 4.1667 4.3667 4.4667 4.0000 4.1333 4.3667 4.7000 + 4.9000 5.0000 + + Spline evaluated on a regular mesh (X across, Y down): + 1.00 1.20 1.40 1.60 1.80 2.00 + 0.00 1.000 1.440 1.960 2.560 3.240 4.000 + 0.20 1.200 1.640 2.160 2.760 3.440 4.200 + 0.40 1.400 1.840 2.360 2.960 3.640 4.400 + 0.60 1.600 2.040 2.560 3.160 3.840 4.600 + 0.80 1.800 2.240 2.760 3.360 4.040 4.800 + 1.00 2.000 2.440 2.960 3.560 4.240 5.000 diff --git a/simple_examples/baseresults/e02alje.r b/simple_examples/baseresults/e02alje.r new file mode 100644 index 0000000..6dfc758 --- /dev/null +++ b/simple_examples/baseresults/e02alje.r @@ -0,0 +1,24 @@ +E02ALJ Example Program Results + + Polynomial coefficients + 1.0000e+00 + 1.0001e+00 + 4.9909e-01 + 1.7042e-01 + 3.4784e-02 + 1.3909e-02 + + Reference deviation = 1.09e-06 + + X Fit exp(x) Residual + 0.00 1.0000 1.0000 -1.09e-06 + 0.10 1.1052 1.1052 9.74e-07 + 0.20 1.2214 1.2214 -7.44e-07 + 0.30 1.3499 1.3499 -9.18e-07 + 0.40 1.4918 1.4918 2.99e-07 + 0.50 1.6487 1.6487 1.09e-06 + 0.60 1.8221 1.8221 4.59e-07 + 0.70 2.0138 2.0138 -8.16e-07 + 0.80 2.2255 2.2255 -8.42e-07 + 0.90 2.4596 2.4596 8.75e-07 + 1.00 2.7183 2.7183 -1.09e-06 diff --git a/simple_examples/baseresults/e04abje.r b/simple_examples/baseresults/e04abje.r new file mode 100644 index 0000000..18b685b --- /dev/null +++ b/simple_examples/baseresults/e04abje.r @@ -0,0 +1,6 @@ +E04ABJ Example Program Results + +The minimum lies in the interval 4.49340940 to 4.49340951 +Its estimated position is 4.49340945, +where the function value is -0.2172 +10 function evaluations were required diff --git a/simple_examples/baseresults/e04bbje.r b/simple_examples/baseresults/e04bbje.r new file mode 100644 index 0000000..86a41ba --- /dev/null +++ b/simple_examples/baseresults/e04bbje.r @@ -0,0 +1,7 @@ +E04BBJ Example Program Results + +The minimum lies in the interval 4.49340946 to 4.49340952 +Its estimated position is 4.49340946, +where the function value is -0.2172 +and the gradient is -3.8e-16 (machine dependent) +6 function evaluations were required diff --git a/simple_examples/baseresults/e04cbje.r b/simple_examples/baseresults/e04cbje.r new file mode 100644 index 0000000..67cd53d --- /dev/null +++ b/simple_examples/baseresults/e04cbje.r @@ -0,0 +1,4 @@ +E04CBJ Example Program Results + +The final function value is 0.0000 +at the point 0.5000 -0.9999 diff --git a/simple_examples/baseresults/e04fcje.r b/simple_examples/baseresults/e04fcje.r new file mode 100644 index 0000000..bd90f04 --- /dev/null +++ b/simple_examples/baseresults/e04fcje.r @@ -0,0 +1,22 @@ + E04FCJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The estimated gradient is -1.607e-09 -7.436e-11 6.130e-10 + (machine dependent) + and the residuals are + -5.9e-03 + -2.7e-04 + 2.7e-04 + 6.5e-03 + -8.2e-04 + -1.3e-03 + -4.5e-03 + -2.0e-02 + 8.2e-02 + -1.8e-02 + -1.5e-02 + -1.5e-02 + -1.1e-02 + -4.2e-03 + 6.8e-03 diff --git a/simple_examples/baseresults/e04ffje.r b/simple_examples/baseresults/e04ffje.r new file mode 100644 index 0000000..a772ab7 --- /dev/null +++ b/simple_examples/baseresults/e04ffje.r @@ -0,0 +1,73 @@ + E04FFJ Example Program Results + + --------------------------------------------------- + E04F(G|F)), Derivative free solver for data fitting + (nonlinear least-squares problems) + --------------------------------------------------- + + Problem statistics + Number of variables 4 + Number of unconstrained variables 2 + Number of fixed variables 0 + Starting interpolation points 5 + Total interpolation points 5 + Number of residuals 11 + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Print Solution = All * U + Monitoring File = -1 * d + Monitoring Level = 4 * d + Dfo Print Frequency = 1 * d + Dfo Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Dfo Initial Interp Points = Coordinate * d + Dfo Max Objective Calls = 500 * d + Dfo Max Soft Restarts = 5 * d + Dfo Max Unsucc Soft Restarts = 3 * d + Dfo Maximum Slow Steps = 20 * d + Dfo Noise Level = 0.00000E+00 * d + Dfo Noisy Problem = No * d + Dfo Number Initial Points = 0 * d + Dfo Number Interp Points = 0 * d + Dfo Number Soft Restarts Pts = 3 * d + Dfo Random Seed = -1 * d + Dfo Starting Trust Region = 1.00000E-01 * d + Dfo Trust Region Slow Tol = 1.02648E-04 * d + Dfo Trust Region Tolerance = 5.00000E-06 * U + Dfo Version = Latest * d + Dfls Small Residuals Tol = 1.08158E-12 * d + End of Options + ---------------------------------------- + step | obj rho | nf | + ---------------------------------------- + 1 | 1.72E-03 1.00E-01 | 6 | + 2 | 6.41E-04 1.00E-01 | 7 | + 3 | 4.52E-04 1.00E-01 | 8 | + 4 | 4.05E-04 1.00E-02 | 9 | + 5 | 4.04E-04 1.00E-02 | 10 | + 6 | 4.03E-04 1.00E-02 | 14 | + 7 | 4.02E-04 1.00E-02 | 15 | + 8 | 4.02E-04 1.00E-03 | 20 | + 9 | 4.02E-04 7.07E-05 | 21 | + 10 | 4.02E-04 7.07E-05 | 23 | s + ---------------------------------------- + Status: Converged, small trust region size + + Value of the objective 4.02423E-04 + Number of objective function evaluations 27 + Number of steps 10 + + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.81300E-01 inf + 2 2.00000E-01 5.90128E-01 1.00000E+00 + 3 -inf 2.56929E-01 inf + 4 3.00000E-01 3.00000E-01 inf diff --git a/simple_examples/baseresults/e04gbje.r b/simple_examples/baseresults/e04gbje.r new file mode 100644 index 0000000..6e9e25e --- /dev/null +++ b/simple_examples/baseresults/e04gbje.r @@ -0,0 +1,22 @@ + E04GBJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The corresponding gradient is 1.199E-09 -1.865E-11 1.807E-11 + (machine dependent) + and the residuals are + -5.9E-03 + -2.7E-04 + 2.7E-04 + 6.5E-03 + -8.2E-04 + -1.3E-03 + -4.5E-03 + -2.0E-02 + 8.2E-02 + -1.8E-02 + -1.5E-02 + -1.5E-02 + -1.1E-02 + -4.2E-03 + 6.8E-03 diff --git a/simple_examples/baseresults/e04ggje.r b/simple_examples/baseresults/e04ggje.r new file mode 100644 index 0000000..b5dd970 --- /dev/null +++ b/simple_examples/baseresults/e04ggje.r @@ -0,0 +1,44 @@ + E04GGJ Example Program Results + + E04GG, Nonlinear least squares method for bound-constrained problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Bxnl Model = Gauss-newton * U + Bxnl Nlls Method = Galahad * d + Bxnl Glob Method = Reg * U + Bxnl Reg Order = Auto * d + Bxnl Tn Method = Min-1-var * d + Bxnl Basereg Type = None * d + Bxnl Basereg Pow = 2.00000E+00 * d + Bxnl Basereg Term = 1.00000E-02 * d + Bxnl Iteration Limit = 1000 * d + Bxnl Monitor Frequency = 0 * d + Bxnl Print Header = 30 * d + Bxnl Save Covariance Matrix = No * d + Bxnl Stop Abs Tol Fun = 1.05367E-08 * d + Bxnl Stop Abs Tol Grd = 1.05737E-05 * d + Bxnl Stop Rel Tol Fun = 1.05367E-08 * d + Bxnl Stop Rel Tol Grd = 1.05367E-08 * d + Bxnl Stop Step Tol = 2.22045E-16 * d + Bxnl Use Second Derivatives = Yes * U + Bxnl Use Weights = No * d + End of Options + + Status: converged, an optimal solution was found + Value of the objective 2.17328E-06 + Norm of projected gradient 1.51989E-08 + Norm of scaled projected gradient 7.29019E-06 + Norm of step 4.98107E-04 + +Solver stored solution iterate in the handle +X: 4.45E-01 1.87E+00 3.07E+00 4.64E+00 -9.98E-01 4.64E+00 diff --git a/simple_examples/baseresults/e04mtje.r b/simple_examples/baseresults/e04mtje.r new file mode 100644 index 0000000..033d40f --- /dev/null +++ b/simple_examples/baseresults/e04mtje.r @@ -0,0 +1,162 @@ + E04MTJ Example Program Results + +++++++++++ Use the Primal-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | optim | feas | compl | mu | mcc | I + ------------------------------------------------------------------------------ + 0 -7.86591E-02 1.71637E-02 1.27E+00 1.06E+00 8.89E-02 1.5E-01 + 1 5.74135E-03 -2.24369E-02 6.11E-16 1.75E-01 2.25E-02 2.8E-02 0 + 2 1.96803E-02 1.37067E-02 5.06E-16 2.28E-02 2.91E-03 3.4E-03 0 + 3 2.15232E-02 1.96162E-02 7.00E-15 9.24E-03 1.44E-03 1.7E-03 0 + 4 2.30321E-02 2.28676E-02 1.15E-15 2.21E-03 2.97E-04 3.4E-04 0 + 5 2.35658E-02 2.35803E-02 1.32E-15 1.02E-04 8.41E-06 9.6E-06 0 + 6 2.35965E-02 2.35965E-02 1.64E-15 7.02E-08 6.35E-09 7.2E-09 0 +Iteration 7 + monit() reports good approximate solution (tol = 1.20E-08): + 7 2.35965E-02 2.35965E-02 1.35E-15 3.52E-11 3.18E-12 3.6E-12 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 4.168797E-15 + Relative primal infeasibility 1.350467E-15 + Absolute dual infeasibility 5.084353E-11 + Relative dual infeasibility 3.518607E-11 + Absolute complementarity gap 2.685778E-11 + Relative complementarity gap 3.175366E-12 + Iterations 7 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.51391E-11 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 3.42902E-11 inf 0.00000E+00 + 7 -1.00000E-02 8.61040E-12 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 4.00339E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.54305E-08 + 4 -inf 0.00000E+00 -3.70000E-03 3.80136E-10 + 5 -inf 0.00000E+00 -1.20000E-03 4.72629E-11 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 + +++++++++++ Use the Self-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | p.inf | d.inf | d.gap | tau | mcc | I + ------------------------------------------------------------------------------ + 0 -6.39941E-01 4.94000E-02 1.07E+01 2.69E+00 5.54E+00 1.0E+00 + 1 -8.56025E-02 -1.26938E-02 2.07E-01 2.07E-01 2.07E-01 1.7E+00 0 + 2 4.09196E-03 1.24373E-02 4.00E-02 4.00E-02 4.00E-02 2.8E+00 0 + 3 1.92404E-02 2.03658E-02 6.64E-03 6.64E-03 6.64E-03 3.2E+00 1 + 4 1.99631E-02 2.07574E-02 3.23E-03 3.23E-03 3.23E-03 2.3E+00 1 + 5 2.03834E-02 2.11141E-02 1.68E-03 1.68E-03 1.68E-03 1.4E+00 0 + 6 2.22419E-02 2.25057E-02 5.73E-04 5.73E-04 5.73E-04 1.4E+00 1 + 7 2.35051E-02 2.35294E-02 6.58E-05 6.58E-05 6.58E-05 1.4E+00 6 + 8 2.35936E-02 2.35941E-02 1.19E-06 1.19E-06 1.19E-06 1.4E+00 0 +Iteration 9 + monit() reports good approximate solution (tol = 1.20E-08): + 9 2.35965E-02 2.35965E-02 5.37E-10 5.37E-10 5.37E-10 1.4E+00 0 +Iteration 10 + monit() reports good approximate solution (tol = 1.20E-08): + 10 2.35965E-02 2.35965E-02 2.68E-13 2.68E-13 2.68E-13 1.4E+00 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 2.853383E-12 + Relative primal infeasibility 2.677658E-13 + Absolute dual infeasibility 1.485749E-12 + Relative dual infeasibility 2.679654E-13 + Absolute complementarity gap 7.228861E-13 + Relative complementarity gap 2.683908E-13 + Iterations 10 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.66960E-12 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 2.47652E-11 inf 0.00000E+00 + 7 -1.00000E-02 7.82645E-13 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 1.07904E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.14799E-09 + 4 -inf 0.00000E+00 -3.70000E-03 4.09190E-12 + 5 -inf 0.00000E+00 -1.20000E-03 1.52421E-12 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 diff --git a/simple_examples/baseresults/e04mxje.r b/simple_examples/baseresults/e04mxje.r new file mode 100644 index 0000000..1928db4 --- /dev/null +++ b/simple_examples/baseresults/e04mxje.r @@ -0,0 +1,38 @@ + E04MXJ Example Program Results + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Query mode - Ignoring NAME data. + Line 2: Found ROWS indicator line + Query mode - Counting ROWS data. + Line 7: Found COLUMNS indicator line + Query mode - Counting COLUMNS data. + Line 26: Found RHS indicator line + Query mode - Ignoring RHS data. + Line 31: Found RANGES indicator line + Query mode - Ignoring RANGES data. + Line 35: Found BOUNDS indicator line + Query mode - Counting BOUNDS data. + Line 54: Found QUADOBJ indicator line + Query mode - Counting QUADOBJ data. + Query mode - End of QUADOBJ data. Exit + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Line 2: Found ROWS indicator line + Line 7: Found COLUMNS indicator line + Line 26: Found RHS indicator line + Line 31: Found RANGES indicator line + Line 35: Found BOUNDS indicator line + Line 54: Found QUADOBJ indicator line + Line 64: Found ENDATA indicator line + + Problem contains 9 variables and 4 linear constraints + + Final objective value = -8.068E+00 + Optimal X = + 2.00 -0.23 -0.27 -0.30 -0.10 2.00 2.00 -1.78 -0.46 diff --git a/simple_examples/baseresults/e04ncje.r b/simple_examples/baseresults/e04ncje.r new file mode 100644 index 0000000..65a6326 --- /dev/null +++ b/simple_examples/baseresults/e04ncje.r @@ -0,0 +1,23 @@ + E04NCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 0.000E+00 1.572E-01 + V 2 0 4.153E-02 0.000E+00 + V 3 0 5.872E-01 0.000E+00 + V 4 1 0.000E+00 8.782E-01 + V 5 0 9.964E-02 0.000E+00 + V 6 1 0.000E+00 1.473E-01 + V 7 0 4.906E-02 0.000E+00 + V 8 1 0.000E+00 8.603E-01 + V 9 0 3.056E-01 0.000E+00 + + + L Con Istate Value Lagr Mult + + L 1 1 2.000E+00 3.777E-01 + L 2 2 2.000E+00 -5.791E-02 + L 3 1 1.000E+00 1.075E-01 + + + Final objective value = 8.134E-02 diff --git a/simple_examples/baseresults/e04nfje.r b/simple_examples/baseresults/e04nfje.r new file mode 100644 index 0000000..13101d2 --- /dev/null +++ b/simple_examples/baseresults/e04nfje.r @@ -0,0 +1,66 @@ + E04NFJ Example Program Results + + *** e04nf + + Parameters + ---------- + + Problem type........... QP2 + + Linear constraints..... 7 Feasibility tolerance.. 1.05E-08 + Variables.............. 7 Optimality tolerance... 1.05E-08 + Hessian rows........... 7 Rank tolerance......... 1.11E-14 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + + Check frequency........ 50 Expand frequency....... 5 + Minimum sum of infeas.. NO Crash tolerance........ 1.00E-02 + + Max degrees of freedom. 7 Print level............ 10 + Feasibility phase itns. 70 Monitoring file........ -1 + Optimality phase itns. 70 + + Workspace provided is IWORK( 17), WORK( 189). + To solve problem we need IWORK( 17), WORK( 189). + + + Itn Step Ninf Sinf/Objective Norm Gz + 0 0.0E+00 3 1.038000E-01 0.0E+00 + 1 4.1E-02 1 3.000000E-02 0.0E+00 + 2 4.2E-02 0 0.000000E+00 0.0E+00 + Itn 2 -- Feasible point found. + 2 0.0E+00 0 4.580000E-02 0.0E+00 + 3 1.3E-01 0 4.161596E-02 0.0E+00 + 4 1.0E+00 0 3.936227E-02 4.2E-17 + 5 4.1E-01 0 3.758935E-02 1.2E-02 + 6 1.0E+00 0 3.755377E-02 1.0E-17 + 7 1.0E+00 0 3.703165E-02 3.8E-17 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL -1.000000E-02 -1.000000E-02 1.000000E-02 0.4700 . + V 2 FR -6.986465E-02 -0.100000 0.150000 . 3.0135E-02 + V 3 FR 1.825915E-02 -1.000000E-02 3.000000E-02 . 1.1741E-02 + V 4 FR -2.426081E-02 -4.000000E-02 2.000000E-02 . 1.5739E-02 + V 5 FR -6.200564E-02 -0.100000 5.000000E-02 . 3.7994E-02 + V 6 FR 1.380544E-02 -1.000000E-02 None . 2.3805E-02 + V 7 FR 4.066496E-03 -1.000000E-02 None . 1.4066E-02 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 EQ -0.130000 -0.130000 -0.130000 -1.908 -5.5511E-17 + L 2 FR -5.879898E-03 None -4.900000E-03 . 9.7990E-04 + L 3 UL -6.400000E-03 None -6.400000E-03 -0.3144 8.6736E-19 + L 4 FR -4.537323E-03 None -3.700000E-03 . 8.3732E-04 + L 5 FR -2.915996E-03 None -1.200000E-03 . 1.7160E-03 + L 6 LL -9.920000E-02 -9.920000E-02 None 1.955 . + L 7 LL -3.000000E-03 -3.000000E-03 2.000000E-03 1.972 4.3368E-18 + + Exit e04nf - Optimal QP solution. + + Final QP objective value = 0.3703165E-01 + + Exit from QP problem after 7 iterations. diff --git a/simple_examples/baseresults/e04nkje.r b/simple_examples/baseresults/e04nkje.r new file mode 100644 index 0000000..bbfdea9 --- /dev/null +++ b/simple_examples/baseresults/e04nkje.r @@ -0,0 +1,26 @@ +E04NKJ Example Program Results + + Variable Istate Value Lagr Mult + + ...X1... 0 0.00000 2361 + ...X2... 3 349.399 -3.657e-12 + ...X3... 2 648.853 -5.924e-12 + ...X4... 2 172.847 1.949e-12 + ...X5... 3 407.521 0.000 + ...X6... 3 271.356 -3.280e-12 + ...X7... 3 150.023 -1.413e-12 + + + Constrnt Istate Value Lagr Mult + + ..ROW1.. 0 2000.00 -1.290e+04 + ..ROW2.. 3 49.2316 0.000 + ..ROW3.. 1 100.000 -2325 + ..ROW4.. 3 32.0719 0.000 + ..ROW5.. 3 14.5572 0.000 + ..ROW6.. 0 1500.00 1.445e+04 + ..ROW7.. 0 250.000 1.458e+04 + ..COST.. 3 -2.98869e+06 -1.000 + + +Final objetive value = -1847785 diff --git a/simple_examples/baseresults/e04nqje.r b/simple_examples/baseresults/e04nqje.r new file mode 100644 index 0000000..8515ce8 --- /dev/null +++ b/simple_examples/baseresults/e04nqje.r @@ -0,0 +1,6 @@ + E04NQJ Example Program Results + + QP problem contains 7 variables and 8 linear constraints + + Final objective value = -1.848E+06 + Optimal X = 0.00 349.40 648.85 172.85 407.52 271.36 150.02 diff --git a/simple_examples/baseresults/e04ptje.r b/simple_examples/baseresults/e04ptje.r new file mode 100644 index 0000000..24d78ba --- /dev/null +++ b/simple_examples/baseresults/e04ptje.r @@ -0,0 +1,39 @@ +E04PTJ Example Program Results + + + ------------------------------------------------ + E04PT, Interior point method for SOCP problems + ------------------------------------------------ + + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + +monit() reports good approximate solution (tol = 1.00E-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 1 1.174E+00 + 2 -4.257E+00 + 3 9.814E-01 diff --git a/simple_examples/baseresults/e04rpje.r b/simple_examples/baseresults/e04rpje.r new file mode 100644 index 0000000..93e29fb --- /dev/null +++ b/simple_examples/baseresults/e04rpje.r @@ -0,0 +1,105 @@ +E04RPJ Example Program Results + +Passing SDP problem to solver + + Overview + Status: Problem and option settings are editable. + No of variables: 5 + Objective function: linear + Simple bounds: not defined yet + Linear constraints: not defined yet + Nonlinear constraints: not defined yet + Cone constraints: not defined yet + Matrix constraints: 2 + Matrix constraints + IDblk = 1, size = 2 x 2, polynomial of order 2 + IDblk = 2, size = 2 x 2, linear + E04SV, NLP-SDP Solver (Pennon) + ------------------------------ + Number of variables 5 [eliminated 0] + simple linear nonlin + (Standard) inequalities 0 0 0 + (Standard) equalities 0 0 + Matrix inequalities 1 1 [dense 2, sparse 0] + [max dimension 2] + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + + Dimacs Measures = No * S + Hessian Density = Dense * S + Init Value P = 1.00000E+00 * d + Init Value Pmat = 1.00000E+00 * d + Initial P = Automatic * d + Initial U = Automatic * d + Initial X = User * d + Inner Iteration Limit = 100 * d + Inner Stop Criteria = Heuristic * d + Inner Stop Tolerance = 1.00000E-02 * d + Linesearch Mode = Goldstein * S + Outer Iteration Limit = 100 * d + P Min = 1.05367E-08 * d + P Update Speed = 12 * d + Pmat Min = 1.05367E-08 * d + Preference = Speed * d + Presolve Block Detect = Yes * d + Stop Criteria = Soft * d + Stop Tolerance 1 = 1.00000E-06 * d + Stop Tolerance 2 = 1.00000E-07 * d + Stop Tolerance Feasibility = 1.00000E-07 * d + Transform Constraints = No * S + U Update Restriction = 5.00000E-01 * d + Umat Update Restriction = 3.00000E-01 * d + End of Options + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 0 0.00000E+00 1.82E+01 1.00E+00 4.00E+00 2.00E+00 0 + 1 4.11823E+00 3.85E-03 0.00E+00 1.73E+00 2.00E+00 6 + 2 2.58252E+00 5.36E-03 0.00E+00 4.93E-01 9.04E-01 4 + 3 2.06132E+00 1.02E-03 0.00E+00 7.70E-02 4.08E-01 4 + 4 2.00050E+00 3.00E-03 8.91E-03 1.78E-02 1.85E-01 3 + 5 1.99929E+00 1.55E-03 3.16E-03 3.65E-03 8.34E-02 2 + 6 1.99985E+00 1.03E-04 3.16E-04 7.19E-04 3.77E-02 4 + 7 1.99997E+00 7.04E-04 5.76E-05 1.41E-04 1.70E-02 1 + 8 2.00000E+00 1.32E-04 6.52E-06 2.76E-05 7.70E-03 1 + 9 2.00000E+00 8.49E-06 7.86E-07 5.37E-06 3.48E-03 1 + 10 2.00000E+00 5.88E-07 1.06E-07 1.04E-06 1.57E-03 1 + 11 2.00000E+00 5.55E-08 4.87E-08 2.02E-07 7.11E-04 1 + 12 2.00000E+00 5.34E-09 5.37E-09 3.93E-08 3.21E-04 1 + 13 2.00000E+00 5.03E-10 5.45E-09 7.62E-09 1.45E-04 1 + 14 2.00000E+00 4.45E-11 5.55E-09 1.48E-09 6.56E-05 1 + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 15 2.00000E+00 4.36E-12 5.67E-09 2.87E-10 2.96E-05 1 + 16 2.00000E+00 1.61E-11 5.82E-09 5.57E-11 1.34E-05 1 + 17 2.00000E+00 3.13E-11 6.00E-09 1.08E-11 6.06E-06 1 + 18 2.00000E+00 8.65E-11 6.22E-09 2.10E-12 2.74E-06 1 + 19 2.00000E+00 1.31E-10 6.48E-09 4.07E-13 1.24E-06 1 + -------------------------------------------------------------- + Status: converged, an optimal solution found + -------------------------------------------------------------- + Final objective value 2.000000E+00 + Relative precision 8.141636E-16 + Optimality 1.310533E-10 + Feasibility 6.484489E-09 + Complementarity 4.066867E-13 + Iteration counts + Outer iterations 19 + Inner iterations 36 + Linesearch steps 56 + Evaluation counts + Augm. Lagr. values 76 + Augm. Lagr. gradient 56 + Augm. Lagr. hessian 36 + -------------------------------------------------------------- \ No newline at end of file diff --git a/simple_examples/baseresults/e04rsje.r b/simple_examples/baseresults/e04rsje.r new file mode 100644 index 0000000..170a9e9 --- /dev/null +++ b/simple_examples/baseresults/e04rsje.r @@ -0,0 +1,35 @@ + E04RSJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 0 1.174e+00 + 1 -4.257e+00 + 2 9.814e-01 diff --git a/simple_examples/baseresults/e04rtje.r b/simple_examples/baseresults/e04rtje.r new file mode 100644 index 0000000..65ffe25 --- /dev/null +++ b/simple_examples/baseresults/e04rtje.r @@ -0,0 +1,35 @@ + E04RTJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 1.313004E-01 + Final dual objective value 1.313004E-01 + Optimal X: + x_idx Value + 0 1.000e+00 + 1 -9.722e-01 + 2 9.722e-01 diff --git a/simple_examples/baseresults/e04saje.r b/simple_examples/baseresults/e04saje.r new file mode 100644 index 0000000..c10990a --- /dev/null +++ b/simple_examples/baseresults/e04saje.r @@ -0,0 +1,33 @@ + E04SAJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + Status: converged, an optimal solution found + Final primal objective value -1.951817E+01 + Final dual objective value -1.951817E+01 + Optimal X: + x_idx Value + 0 -1.26819e+00 + 1 -4.08429e-01 + 2 1.33234e+00 diff --git a/simple_examples/baseresults/e04taje.r b/simple_examples/baseresults/e04taje.r new file mode 100644 index 0000000..a6cf135 --- /dev/null +++ b/simple_examples/baseresults/e04taje.r @@ -0,0 +1,39 @@ + E04TAJ Example Program Results + + Solve the first LP + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.500000E+02 + Final dual objective value 8.500000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.00000E+02 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + + The new variable has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 9.000000E+02 + Final dual objective value 9.000000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 5.00000E+01 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 + + The new constraint has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.750000E+02 + Final dual objective value 8.750000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 1.50000E+02 inf + 2 0.00000E+00 5.00000E+01 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 diff --git a/simple_examples/baseresults/e04tcje.r b/simple_examples/baseresults/e04tcje.r new file mode 100644 index 0000000..cd501a1 --- /dev/null +++ b/simple_examples/baseresults/e04tcje.r @@ -0,0 +1,58 @@ + E04TCJ Example Program Results + + First solve the problem with the outliers + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 1.05037E+00 + Norm of gradient 8.78014E-06 + Norm of scaled gradient 6.05781E-06 + Norm of step 1.47886E-01 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.61301E-01 inf + 2 -inf 9.10227E-01 inf + 3 -inf 3.42138E-03 inf + 4 -inf -6.08965E+00 inf + 5 -inf 6.24881E-04 inf + -------------------------------------------------------- + + Now remove the outlier residuals from the problem handle + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 5.96811E-02 + Norm of gradient 1.19914E-06 + Norm of scaled gradient 3.47087E-06 + Norm of step 3.49256E-06 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.53888E-01 inf + 2 -inf 1.06575E+00 inf + 3 -inf 1.91383E-03 inf + 4 -inf 2.17299E-01 inf + 5 -inf 5.17660E+00 inf + -------------------------------------------------------- + + Assuming the outliers points are measured again + we can enable the residuals and adjust the values + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 6.51802E-02 + Norm of gradient 2.57338E-07 + Norm of scaled gradient 7.12740E-07 + Norm of step 1.56251E-05 + + Primal variables: + idx Lower bound Value Upper bound + 1 3.00000E-01 3.00000E-01 3.00000E-01 + 2 -inf 1.06039E+00 inf + 3 -inf 2.11765E-02 inf + 4 -inf 2.11749E-01 inf + 5 -inf 5.16415E+00 inf diff --git a/simple_examples/baseresults/e04uc_example.r b/simple_examples/baseresults/e04uc_example.r new file mode 100644 index 0000000..abde1c6 --- /dev/null +++ b/simple_examples/baseresults/e04uc_example.r @@ -0,0 +1,95 @@ + E04UC_Example Example Program Results + + *** e04uc + + Parameters + ---------- + + Linear constraints..... 1 Variables.............. 4 + Nonlinear constraints.. 2 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + Step limit............. 2.00E+00 Hessian................ NO + + Linear feasibility..... 1.05E-08 Crash tolerance........ 1.00E-02 + Nonlinear feasibility.. 1.05E-08 Optimality tolerance... 3.26E-12 + Line search tolerance.. 9.00E-01 Function precision..... 4.37E-15 + + Derivative level....... 3 Monitoring file........ -1 + Verify level........... 0 + + Major iterations limit. 50 Major print level...... 10 + Minor iterations limit. 50 Minor print level...... 0 + + Start point + 1.000000E+00 5.000000E+00 5.000000E+00 1.000000E+00 + + Workspace provided is IWORK( 17), WORK( 185). + To solve problem we need IWORK( 17), WORK( 185). + + + Verification of the constraint gradients. + ----------------------------------------- + + The constraint Jacobian seems to be ok. + + The largest relative error was 2.29E-07 in constraint 2 + + + + Verification of the objective gradients. + ---------------------------------------- + + The objective gradients seem to be ok. + + Directional derivative of the objective 8.15250000E-01 + Difference approximation 8.15249734E-01 + + + Maj Mnr Step Merit Function Norm Gz Violtn Cond Hz + 0 4 0.0E+00 1.738281E+01 7.1E-01 1.2E+01 1.0E+00 + 1 1 1.0E+00 1.703169E+01 4.6E-02 1.9E+00 1.0E+00 + 2 1 1.0E+00 1.701442E+01 2.1E-02 8.8E-02 1.0E+00 + 3 1 1.0E+00 1.701402E+01 3.1E-04 5.4E-04 1.0E+00 + 4 1 1.0E+00 1.701402E+01 7.0E-06 9.9E-08 1.0E+00 + 5 1 1.0E+00 1.701402E+01 1.1E-08 4.6E-11 1.0E+00 + + Exit from NP problem after 5 major iterations, + 9 minor iterations. + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL 1.00000 1.00000 5.00000 1.088 . + V 2 FR 4.74300 1.00000 5.00000 . 0.2570 + V 3 FR 3.82115 1.00000 5.00000 . 1.179 + V 4 FR 1.37941 1.00000 5.00000 . 0.3794 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 FR 10.9436 None 20.0000 . 9.056 + + + N Con State Value Lower Bound Upper Bound Lagr Mult Slack + + N 1 UL 40.0000 None 40.0000 -0.1615 -3.5264E-11 + N 2 LL 25.0000 25.0000 None 0.5523 -2.8791E-11 + + Exit e04uc - Optimal solution found. + + Final objective value = 17.01402 + + Varbl Istate Value Lagr Mult + + V 0 1 1.000000 1.0879 + V 1 0 4.743000 0.0000 + V 2 0 3.821150 0.0000 + V 3 0 1.379408 0.0000 + + L Con Istate Value Lagr Mult + + L 0 0 10.943558 0.0000 + + Final objective value = 17.0140173 diff --git a/simple_examples/baseresults/e04ucje.r b/simple_examples/baseresults/e04ucje.r new file mode 100644 index 0000000..c024cfc --- /dev/null +++ b/simple_examples/baseresults/e04ucje.r @@ -0,0 +1,22 @@ + E04UCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 1.00000 1.088 + V 2 0 4.74300 0.000 + V 3 0 3.82115 0.000 + V 4 0 1.37941 0.000 + + + L Con Istate Value Lagr Mult + + L 1 0 10.9436 0.000 + + + N Con Istate Value Lagr Mult + + N 1 2 40.0000 -0.1615 + N 2 1 25.0000 0.5523 + + + Final objective value = 17.01402 diff --git a/simple_examples/baseresults/e04yaje.r b/simple_examples/baseresults/e04yaje.r new file mode 100644 index 0000000..463bd7f --- /dev/null +++ b/simple_examples/baseresults/e04yaje.r @@ -0,0 +1,25 @@ + E04YAJ Example Program Results + +The test point is + 0.19000 -1.34000 0.88000 + +1st derivatives are consistent with residual values + +At the test point, LSQFUN gives + + Residuals 1st derivatives + -2.029E-03 1.000E+00 -4.061E-02 -2.707E-03 + -1.076E-01 1.000E+00 -9.689E-02 -1.384E-02 + -2.330E-01 1.000E+00 -1.785E-01 -4.120E-02 + -3.785E-01 1.000E+00 -3.043E-01 -1.014E-01 + -5.836E-01 1.000E+00 -5.144E-01 -2.338E-01 + -8.689E-01 1.000E+00 -9.100E-01 -5.460E-01 + -1.346E+00 1.000E+00 -1.810E+00 -1.408E+00 + -2.374E+00 1.000E+00 -4.726E+00 -4.726E+00 + -2.975E+00 1.000E+00 -6.076E+00 -6.076E+00 + -4.013E+00 1.000E+00 -7.876E+00 -7.876E+00 + -5.323E+00 1.000E+00 -1.040E+01 -1.040E+01 + -7.292E+00 1.000E+00 -1.418E+01 -1.418E+01 + -1.057E+01 1.000E+00 -2.048E+01 -2.048E+01 + -1.713E+01 1.000E+00 -3.308E+01 -3.308E+01 + -3.681E+01 1.000E+00 -7.089E+01 -7.089E+01 diff --git a/simple_examples/baseresults/f01adje.r b/simple_examples/baseresults/f01adje.r new file mode 100644 index 0000000..c8570bc --- /dev/null +++ b/simple_examples/baseresults/f01adje.r @@ -0,0 +1,9 @@ + F01ADJ Example Program Results + + Lower triangle of inverse + 1 2 3 4 + 1 + 2 68.0000 + 3 -41.0000 25.0000 + 4 -17.0000 10.0000 5.0000 + 5 10.0000 -6.0000 -3.0000 2.0000 diff --git a/simple_examples/baseresults/f01ckje.r b/simple_examples/baseresults/f01ckje.r new file mode 100644 index 0000000..3264e43 --- /dev/null +++ b/simple_examples/baseresults/f01ckje.r @@ -0,0 +1,5 @@ + F01CKJ Example Program Results + + Matrix A + 5.0 8.0 + 8.0 14.0 diff --git a/simple_examples/baseresults/f01crje.r b/simple_examples/baseresults/f01crje.r new file mode 100644 index 0000000..0b33f3a --- /dev/null +++ b/simple_examples/baseresults/f01crje.r @@ -0,0 +1,6 @@ + F01CRJ Example Program Results + + 1.0 4.0 7.0 10.0 13.0 16.0 19.0 + 2.0 5.0 8.0 11.0 14.0 17.0 20.0 + 3.0 6.0 9.0 12.0 15.0 18.0 21.0 + diff --git a/simple_examples/baseresults/f01dgje.r b/simple_examples/baseresults/f01dgje.r new file mode 100644 index 0000000..85c8df1 --- /dev/null +++ b/simple_examples/baseresults/f01dgje.r @@ -0,0 +1,8 @@ +F01DGJ Example Program Results + + Solution matrix B + 1 2 3 4 + 1 2.1000 1.2600 2.4000 1.2600 + 2 3.2200 9.5480 6.5360 5.3320 + 3 9.3800 17.7240 20.7640 14.5920 + 4 2.6600 20.8600 11.6240 28.5400 diff --git a/simple_examples/baseresults/f01elje.r b/simple_examples/baseresults/f01elje.r new file mode 100644 index 0000000..06a7a20 --- /dev/null +++ b/simple_examples/baseresults/f01elje.r @@ -0,0 +1,10 @@ + F01ELJ Example Program Results + + F(A) = COS(2A) + 1 2 3 4 + 1 -0.1704 -1.1597 -0.1878 -0.7307 + 2 -0.3950 -0.4410 0.7606 0.0655 + 3 -0.0950 -0.0717 0.0619 -0.4351 + 4 -0.1034 0.6424 -1.3964 0.1042 + +Imnorm = 0.0 diff --git a/simple_examples/baseresults/f01emje.r b/simple_examples/baseresults/f01emje.r new file mode 100644 index 0000000..d805f3c --- /dev/null +++ b/simple_examples/baseresults/f01emje.r @@ -0,0 +1,10 @@ +F01EMJ Example Program Results + + F(A) = EXP(2A) + 1 2 3 4 + 1 -12.1880 0.0000 -3.4747 8.3697 + 2 -13.7274 54.5982 -23.9801 82.8593 + 3 -9.7900 0.0000 -25.4527 26.5294 + 4 -18.1597 0.0000 -34.8991 49.2404 + +Imnorm = 0.00 diff --git a/simple_examples/baseresults/f02ekje.r b/simple_examples/baseresults/f02ekje.r new file mode 100644 index 0000000..925d7cb --- /dev/null +++ b/simple_examples/baseresults/f02ekje.r @@ -0,0 +1,20 @@ + F02EKJ Example Program Results + +Iteration Limit= 500 + Arnoldi basis vectors used: 20 + The following Ritz values (mu) are related to the + true eigenvalues (lambda) by lambda = sigma + 1/mu + + Iteration number 1 + Ritz values converged so far ( 2) and their Ritz estimates: + 1 ( 5.69917E-01, 8.80810E-01) 1.30081E-20 + 2 ( 5.69917E-01, -8.80810E-01) 1.30081E-20 + Next (unconverged) Ritz value: + 3 ( 6.07774E-01, 0.00000E+00) + + The 5 Ritz values of closest to 5.50000E+00 are: + 1 ( 6.01781E+00 , -8.00277E-01 ) + 2 ( 6.01781E+00 , 8.00277E-01 ) + 3 ( 4.34309E+00 , -1.94557E+00 ) + 4 ( 4.34309E+00 , 1.94557E+00 ) + 5 ( 7.14535E+00 , 0.00000E+00 ) diff --git a/simple_examples/baseresults/f02fkje.r b/simple_examples/baseresults/f02fkje.r new file mode 100644 index 0000000..8217134 --- /dev/null +++ b/simple_examples/baseresults/f02fkje.r @@ -0,0 +1,14 @@ + F02FKJ Example Program Results + + Iteration Limit= 500 + + Ritz values and residuals + 1 2 + 1 1.9702E+01 5.6583E-13 + 2 4.9036E+01 7.2456E-13 + 3 4.9036E+01 7.0022E-13 + 4 7.8370E+01 8.8089E-13 + 5 9.7197E+01 8.7693E-13 + 6 9.7197E+01 8.7672E-13 + 7 1.2653E+02 6.8423E-13 + 8 1.2653E+02 9.8310E-13 diff --git a/simple_examples/baseresults/f02wgje.r b/simple_examples/baseresults/f02wgje.r new file mode 100644 index 0000000..b4e345c --- /dev/null +++ b/simple_examples/baseresults/f02wgje.r @@ -0,0 +1,7 @@ + F02WGJ Example Program Results + + Singular Value Residual + 0.00830 2.7E-19 + 0.01223 5.9E-18 + 0.02381 1.2E-17 + 0.11274 7.8E-17 diff --git a/simple_examples/baseresults/f03baje.r b/simple_examples/baseresults/f03baje.r new file mode 100644 index 0000000..c4c40d7 --- /dev/null +++ b/simple_examples/baseresults/f03baje.r @@ -0,0 +1,14 @@ +F03BAJ Example Program Results + + Array A after factorization + 1 2 3 + 1 33.0000 16.0000 72.0000 + 2 -0.7273 1.6364 -4.6364 + 3 -0.2424 -0.0741 0.1111 + +Pivots + 1 2 3 + +D = 0.37500 ID = 4 + +Value of determinant = 6.00000e+00 \ No newline at end of file diff --git a/simple_examples/baseresults/f04amje.r b/simple_examples/baseresults/f04amje.r new file mode 100644 index 0000000..86bd893 --- /dev/null +++ b/simple_examples/baseresults/f04amje.r @@ -0,0 +1,4 @@ +F04AMJ Example Program Results +Solution +1.3010 +0.7935 \ No newline at end of file diff --git a/simple_examples/baseresults/f04baje.r b/simple_examples/baseresults/f04baje.r new file mode 100644 index 0000000..eb52050 --- /dev/null +++ b/simple_examples/baseresults/f04baje.r @@ -0,0 +1,14 @@ +F04BAJ Example Program Results + + Solution + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Estimate of condition number +1.5e+02 + +Esttimate of error bound for computed solutions +1.7e-14 \ No newline at end of file diff --git a/simple_examples/baseresults/f05aaje.r b/simple_examples/baseresults/f05aaje.r new file mode 100644 index 0000000..74b6ae6 --- /dev/null +++ b/simple_examples/baseresults/f05aaje.r @@ -0,0 +1,11 @@ +F05AAJ Example Program Results + +N1 = 2 N2 = 4 + +CC = 0.5822 ICOL = 4 + +Final Vectors +-0.6325 0.3310 -0.5404 +0.3162 -0.2483 0.2119 +-0.6325 -0.0000 0.7735 +0.3162 0.9104 0.2543 \ No newline at end of file diff --git a/simple_examples/baseresults/f06clje.r b/simple_examples/baseresults/f06clje.r new file mode 100644 index 0000000..d167816 --- /dev/null +++ b/simple_examples/baseresults/f06clje.r @@ -0,0 +1,3 @@ + F06CLJ Example Program Results + + (1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/f07aaje.r b/simple_examples/baseresults/f07aaje.r new file mode 100644 index 0000000..086448e --- /dev/null +++ b/simple_examples/baseresults/f07aaje.r @@ -0,0 +1,14 @@ + F07AAJ Example Program Results + + Solution + 1.0000 -1.0000 3.0000 -5.0000 + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 + + Pivot indices + 2 2 3 4 diff --git a/simple_examples/baseresults/f07abje.r b/simple_examples/baseresults/f07abje.r new file mode 100644 index 0000000..922ca67 --- /dev/null +++ b/simple_examples/baseresults/f07abje.r @@ -0,0 +1,23 @@ +F07ABJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Backward errors (machine-dependent) + 7.7e-17 5.8e-17 + +Estimated forward error bounds (machine-dependent) + 2.5e-14 3.4e-14 + +A has been row scaled as diag(R)*A + +Reciprocal condition number estimate of scaled matrix + 1.8e-02 + +Estimate of reciprocal pivot growth factor + 7.4e-01 + diff --git a/simple_examples/baseresults/f07adje.r b/simple_examples/baseresults/f07adje.r new file mode 100644 index 0000000..8aa1615 --- /dev/null +++ b/simple_examples/baseresults/f07adje.r @@ -0,0 +1,10 @@ +F07ADJ Example Program Results + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 +IPIV + 2 2 3 4 diff --git a/simple_examples/baseresults/f07aqje.r b/simple_examples/baseresults/f07aqje.r new file mode 100644 index 0000000..11cdfa0 --- /dev/null +++ b/simple_examples/baseresults/f07aqje.r @@ -0,0 +1,7 @@ + F07AQJ Example Program Results + + Solution + ( 1.0000, 1.0000) ( 2.0000,-3.0000) (-4.0000,-5.0000) ( 0.0000, 6.0000) + + Pivot indices + 3 2 3 4 diff --git a/simple_examples/baseresults/f07faje.r b/simple_examples/baseresults/f07faje.r new file mode 100644 index 0000000..381aa43 --- /dev/null +++ b/simple_examples/baseresults/f07faje.r @@ -0,0 +1,11 @@ + F07FAJ Example Program Results + + Solution + 1.0000 -1.0000 2.0000 -3.0000 + + Cholesky factor U + 1 2 3 4 + 1 2.0396 -1.5297 0.2746 -0.0490 + 2 1.6401 -0.2500 0.6737 + 3 0.7887 0.6617 + 4 0.5347 diff --git a/simple_examples/baseresults/f07fbje.r b/simple_examples/baseresults/f07fbje.r new file mode 100644 index 0000000..38b2bb5 --- /dev/null +++ b/simple_examples/baseresults/f07fbje.r @@ -0,0 +1,19 @@ + F07FBJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 4.0000 + 2 -1.0000 3.0000 + 3 2.0000 2.0000 + 4 -3.0000 1.0000 + + Backward errors (machine-dependent) + 6.7e-17 8.2e-17 + + Estimated forward error bounds (machine-dependent) + 2.3e-14 2.4e-14 + + Estimate of reciprocal condition number + 1.0e-02 + + A has not been equilibrated diff --git a/simple_examples/baseresults/f08btje.r b/simple_examples/baseresults/f08btje.r new file mode 100644 index 0000000..b663c71 --- /dev/null +++ b/simple_examples/baseresults/f08btje.r @@ -0,0 +1,16 @@ + F08BTJ Example Program Results + + Tolerance used to estimate the rank of A + 1.00E-02 + Estimated rank of A + 3 + Least squares solution(s) + + 1 2 + 1 ( 0.0000, 0.0000) ( 0.0000, 0.0000) + 2 ( 2.7020, 8.0911) (-2.2682,-2.9884) + 3 ( 2.8888, 2.5012) ( 0.9779, 1.3565) + 4 ( 2.7100, 0.4791) (-1.3734, 0.2212) + + Square root(s) of the residual sum(s) of squares + 2.51E-01 8.10E-02 diff --git a/simple_examples/baseresults/f08faje.r b/simple_examples/baseresults/f08faje.r new file mode 100644 index 0000000..31df0c1 --- /dev/null +++ b/simple_examples/baseresults/f08faje.r @@ -0,0 +1,16 @@ + F08FAJ Example Program Results + + Eigenvalues + -2.0531 -0.5146 -0.2943 12.8621 + Eigenvectors + 1 2 3 4 + 1 0.7003 -0.5144 -0.2767 0.4103 + 2 0.3592 0.4851 0.6634 0.4422 + 3 -0.1569 0.5420 -0.6504 0.5085 + 4 -0.5965 -0.4543 0.2457 0.6144 + + Error estimate for the eigenvalues + 1.4e-15 + + Error estimates for the eigenvectors + 9.3e-16 6.5e-15 6.5e-15 1.1e-16 diff --git a/simple_examples/baseresults/f08xpje.r b/simple_examples/baseresults/f08xpje.r new file mode 100644 index 0000000..96e35e9 --- /dev/null +++ b/simple_examples/baseresults/f08xpje.r @@ -0,0 +1,8 @@ +F08XPJ Example Program Results + +Number of eigenvalues for which SELCTG is true = 2 +(dimension of deflating subspaces) + +Selected generalized eigenvalues + 1 (2.00, -5.00) + 2 (3.00, -1.00) diff --git a/simple_examples/baseresults/g01alje.r b/simple_examples/baseresults/g01alje.r new file mode 100644 index 0000000..3473f35 --- /dev/null +++ b/simple_examples/baseresults/g01alje.r @@ -0,0 +1,7 @@ +G01ALJ Example Program Results + +Maximum 12.0000 +Upper Hinge (75% quantile) 9.5000 +Median (50% quantile) 6.5000 +Lower Hinge (25% quantile) 2.5000 +Minimum 1.0000 diff --git a/simple_examples/baseresults/g02akje.r b/simple_examples/baseresults/g02akje.r new file mode 100644 index 0000000..a4260ce --- /dev/null +++ b/simple_examples/baseresults/g02akje.r @@ -0,0 +1,14 @@ +G02AKJ Example Program Results + + NCM with rank constraint + 1 2 3 4 + 1 1.0000 -0.9021 0.2448 0.1975 + 2 -0.9021 1.0000 -0.6392 0.2448 + 3 0.2448 -0.6392 1.0000 -0.9021 + 4 0.1975 0.2448 -0.9021 1.0000 + +Number of subproblems solved: 4 + +Squared Frobenius norm of difference: 0.3082 + +Rank error: 0.0000 diff --git a/simple_examples/baseresults/g02bjje.r b/simple_examples/baseresults/g02bjje.r new file mode 100644 index 0000000..053b912 --- /dev/null +++ b/simple_examples/baseresults/g02bjje.r @@ -0,0 +1,38 @@ + G02BJJ Example Program Results + + Number of variables (columns) = 4 + Number of cases (rows) = 5 + + Data matrix is:- + 1 2 3 4 + 1 3.0000 3.0000 1.0000 2.0000 + 2 6.0000 4.0000 -1.0000 4.0000 + 3 9.0000 0.0000 5.0000 9.0000 + 4 12.0000 2.0000 0.0000 0.0000 + 5 -1.0000 5.0000 4.0000 12.0000 + + Variable Mean St.dev. + 4 6.7500 4.5735 + 1 7.5000 3.8730 + 2 3.5000 1.2910 + + Sums of squares and cross-products of deviations + 4 1 2 + 4 62.7500 21.0000 10.0000 + 1 21.0000 45.0000 -6.0000 + 2 10.0000 -6.0000 5.0000 + + Correlation coefficients + 4 1 2 + 4 1.0000 0.9707 0.9449 + 1 0.9707 1.0000 -0.6547 + 2 0.9449 -0.6547 1.0000 + + Minimum number of cases used for any pair of variables: 3 + + Numbers used for each pair are: + 4 1 2 + 4 4.0000 3.0000 3.0000 + 1 3.0000 4.0000 3.0000 + 2 3.0000 3.0000 4.0000 + diff --git a/simple_examples/baseresults/g02brje.r b/simple_examples/baseresults/g02brje.r new file mode 100644 index 0000000..7621bb4 --- /dev/null +++ b/simple_examples/baseresults/g02brje.r @@ -0,0 +1,29 @@ +G02BRJ Example Program Results + +Number of variables (columns) = 3 +Number of case (rows) = 9 + +Data matrix is:- + + + 1 2 3 + 1 1.7000 1.0000 0.5000 + 2 2.8000 4.0000 3.0000 + 3 0.6000 6.0000 2.5000 + 4 1.8000 9.0000 6.0000 + 5 0.9900 4.0000 2.5000 + 6 1.4000 2.0000 5.5000 + 7 1.8000 9.0000 7.5000 + 8 2.5000 7.0000 0.0000 + 9 0.9900 5.0000 3.0000 + +Matrix of rank correlation coefficients: +Upper triangle -- Spearman's +Lower triangle -- Kendall's tau + + 1 2 3 + 1 1.0000 0.2941 0.4058 + 2 0.1429 1.0000 0.7537 + 3 0.2760 0.5521 1.0000 + +Number of cases actually used: 6 diff --git a/simple_examples/baseresults/g02daje.r b/simple_examples/baseresults/g02daje.r new file mode 100644 index 0000000..9c6e2f0 --- /dev/null +++ b/simple_examples/baseresults/g02daje.r @@ -0,0 +1,31 @@ +G02DAJ Example Program Results + +Model not of full rank, rank = 4 +Residual sum of squares = 2.2227e+01 +Degrees of freedom = 8 +R-squared = 7.0042e-01 +Adjusted R-squared = 5.8808e-01 +AIC = 1.5397e+01 + +Variable Parameter estimate Standard error + + 1 3.0557e+01 3.8494e-01 + 2 5.4467e+00 8.3896e-01 + 3 6.7433e+00 8.3896e-01 + 4 1.1047e+01 8.3896e-01 + 5 7.3200e+00 8.3896e-01 + + Obs Residuals H + + 1 -2.3733e+00 3.3333e-01 + 2 1.7433e+00 3.3333e-01 + 3 8.8000e-01 3.3333e-01 + 4 -1.4333e-01 3.3333e-01 + 5 1.4333e-01 3.3333e-01 + 6 -1.4700e+00 3.3333e-01 + 7 -1.8867e+00 3.3333e-01 + 8 5.7667e-01 3.3333e-01 + 9 1.3167e+00 3.3333e-01 + 10 1.7967e+00 3.3333e-01 + 11 -1.1733e+00 3.3333e-01 + 12 5.9000e-01 3.3333e-01 diff --git a/simple_examples/baseresults/g02eeje.r b/simple_examples/baseresults/g02eeje.r new file mode 100644 index 0000000..c66f9b6 --- /dev/null +++ b/simple_examples/baseresults/g02eeje.r @@ -0,0 +1,20 @@ + G02EEJ Example Program Results + + Step 1 + Added variable is TS + Change in residual sum of squares = 4.7126E-01 + F Statistic = 7.38 + + Variables in model: COD TS + + Residual sum of squares = 1.0850E+00 + Degrees of freedom = 17 + + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.1175 0.0600 0.2276 + Step 2 + No further variables added maximum F = 1.59 + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.0979 0.0207 0.0217 diff --git a/simple_examples/baseresults/g02maje.r b/simple_examples/baseresults/g02maje.r new file mode 100644 index 0000000..dd042fa --- /dev/null +++ b/simple_examples/baseresults/g02maje.r @@ -0,0 +1,23 @@ +G02MAJ Example Program Results + + Step Parameter Estimate +------------------------------------------------------ + 1 0.000 0.000 3.125 0.000 0.000 0.000 + 2 0.000 0.000 3.792 0.000 0.000 -0.713 + 3 -0.446 0.000 3.998 0.000 0.000 -1.151 + 4 -0.628 -0.295 4.098 0.000 0.000 -1.466 + 5 -1.060 -1.056 4.110 -0.864 0.000 -1.948 + 6 -1.073 -1.132 4.118 -0.935 -0.059 -1.981 + +alpha: -50.037 + + Step Sum RSS df Cp Ck Step Size +--------------------------------------------------------- + 1 72.446 8929.855 3 13.355 123.227 72.446 + 2 103.385 6404.701 7 7.054 50.781 24.841 + 3 126.243 5258.247 51 5.286 30.836 16.225 + 4 145.277 4657.051 25 5.309 19.319 11.587 + 5 198.223 3959.401 126 5.016 12.266 24.520 + 6 203.529 3954.571 5258 7.000 0.910 2.198 + +sigma^2: 304.198 diff --git a/simple_examples/baseresults/g03gaje.r b/simple_examples/baseresults/g03gaje.r new file mode 100644 index 0000000..37ab236 --- /dev/null +++ b/simple_examples/baseresults/g03gaje.r @@ -0,0 +1,79 @@ + G03GAJ Example Program Results + + + Mixing proportions + 1 2 + 1 0.4798 0.5202 + + Group means + 1 2 + 1 4.0041 3.3350 + 2 3.9949 3.4434 + 3 5.5894 4.9870 + 4 5.4432 5.3602 + + Pooled Variance-covariance matrix + 1 2 3 4 + 1 0.4539 0.2891 0.6075 0.3413 + 2 0.2891 0.2048 0.4101 0.2490 + 3 0.6075 0.4101 1.0648 0.6011 + 4 0.3413 0.2490 0.6011 0.3759 + + Densities + 1 2 + 1 2.5836E-01 1.1853E-02 + 2 3.7065E-07 1.1241E-01 + 3 5.3069E-03 1.8080E-06 + 4 4.2461E-01 2.8584E-05 + 5 5.0387E-02 1.1544E+00 + 6 1.1260E+00 7.2224E-02 + 7 2.0911E+00 2.1224E-02 + 8 5.7856E-03 1.3227E+00 + 9 1.1609E+00 2.9411E-02 + 10 8.9826E-02 2.4260E-05 + 11 3.0170E-01 1.0106E+00 + 12 1.2930E+00 3.5422E-01 + 13 2.8644E-02 6.7851E-07 + 14 2.0759E-02 3.1690E+00 + 15 7.6461E-02 1.5231E+00 + 16 3.0279E-04 8.4017E-01 + 17 5.6101E-01 4.6699E-05 + 18 2.6573E-05 6.4442E-01 + 19 2.1250E+00 5.1006E-02 + 20 8.6822E-04 2.7626E+00 + 21 1.9223E-01 2.3971E+00 + 22 1.2469E-02 2.8179E+00 + 23 1.8389E-02 5.3572E-01 + 24 1.2409E+00 9.6489E-03 + 25 2.1037E-05 4.8674E-02 + + Membership probabilities + 1 2 + 1 9.5018E-01 4.9823E-02 + 2 3.3259E-06 1.0000E+00 + 3 9.9961E-01 3.8664E-04 + 4 9.9992E-01 7.9913E-05 + 5 3.8999E-02 9.6100E-01 + 6 9.3270E-01 6.7295E-02 + 7 9.8881E-01 1.1190E-02 + 8 4.1252E-03 9.9587E-01 + 9 9.7252E-01 2.7479E-02 + 10 9.9969E-01 3.0805E-04 + 11 2.1722E-01 7.8278E-01 + 12 7.6938E-01 2.3062E-01 + 13 9.9997E-01 2.6937E-05 + 14 6.1133E-03 9.9389E-01 + 15 4.4189E-02 9.5581E-01 + 16 3.5006E-04 9.9965E-01 + 17 9.9990E-01 9.7029E-05 + 18 4.0270E-05 9.9996E-01 + 19 9.7380E-01 2.6202E-02 + 20 3.0204E-04 9.9970E-01 + 21 6.9471E-02 9.3053E-01 + 22 4.1603E-03 9.9584E-01 + 23 3.0839E-02 9.6916E-01 + 24 9.9116E-01 8.8421E-03 + 25 4.1534E-04 9.9958E-01 + +No. iterations: 14 +Log-likelihood: -29.6831 diff --git a/simple_examples/baseresults/g05kfje.r b/simple_examples/baseresults/g05kfje.r new file mode 100644 index 0000000..830c10a --- /dev/null +++ b/simple_examples/baseresults/g05kfje.r @@ -0,0 +1,7 @@ +G05KFJ Example Program Results + +0.6364 +0.1065 +0.7460 +0.7983 +0.1046 \ No newline at end of file diff --git a/simple_examples/baseresults/g13awje.r b/simple_examples/baseresults/g13awje.r new file mode 100644 index 0000000..25be8b6 --- /dev/null +++ b/simple_examples/baseresults/g13awje.r @@ -0,0 +1,4 @@ + G13AWJ Example Program Results + +Dickey-Fuller test statistic = -2.540 +associated p-value = 0.013 diff --git a/simple_examples/baseresults/g13meje.r b/simple_examples/baseresults/g13meje.r new file mode 100644 index 0000000..07a391e --- /dev/null +++ b/simple_examples/baseresults/g13meje.r @@ -0,0 +1,39 @@ +G13MEJ Example Program Results + + Iterated + Time EMA + +-------------------------------- + 1 7.5 0.531 + 2 8.2 0.544 + 3 18.1 0.754 + 4 22.8 0.406 + 5 25.8 0.232 + + 6 26.8 0.217 + 7 31.1 0.357 + 8 38.4 0.630 + 9 45.9 0.263 + 10 48.2 0.241 + 11 48.9 0.279 + 12 57.9 0.713 + 13 58.5 0.717 + 14 63.9 0.385 + 15 65.2 0.346 + + 16 66.6 0.330 + 17 67.4 0.315 + 18 69.3 0.409 + 19 69.9 0.459 + 20 73.0 0.377 + 21 75.6 0.411 + 22 77.0 0.536 + 23 84.7 0.632 + 24 86.8 0.538 + 25 88.0 0.444 + 26 88.5 0.401 + 27 91.0 0.331 + 28 93.0 0.495 + 29 93.7 0.585 + 30 94.0 0.612 + diff --git a/simple_examples/baseresults/g13naje.r b/simple_examples/baseresults/g13naje.r new file mode 100644 index 0000000..b87dda8 --- /dev/null +++ b/simple_examples/baseresults/g13naje.r @@ -0,0 +1,11 @@ +G13NAJ Example Program Results + + -- Charge Points -- --- Distribution --- + Number Position Parameters +================================================= + 1 12 0.34 1.00 + 2 32 2.57 1.00 + 3 49 1.45 1.00 + 4 52 -0.48 1.00 + 5 70 1.20 1.00 + 6 100 -0.23 1.00 diff --git a/simple_examples/baseresults/h02bbje.r b/simple_examples/baseresults/h02bbje.r new file mode 100644 index 0000000..64136ef --- /dev/null +++ b/simple_examples/baseresults/h02bbje.r @@ -0,0 +1,79 @@ +H02BBJ Example Program Results + + + *** IP solver + + Parameters + ---------- + + Linear constraints...... 3 First integer solution.. OFF + Variables............... 2 Max depth of the tree... 4 + + Feasibility tolerance... 1.05E-08 Print level............. 10 + Infinite bound size..... 1.00E+20 EPS (machine precision). 1.11E-16 + + Integer feasibility tol. 1.00E-05 Iteration limit......... 50 + Max number of nodes..... NONE + + ** Workspace provided with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + ** Workspace required with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + + + *** Optimum LP solution *** -17.50000 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 FR 3.92857 0.00000 None 0.000 3.929 + V 2 FR 1.42857 0.00000 None 0.000 1.429 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 UL 15.0000 None 15.0000 -1.000 0.000 + L 2 UL 5.00000 None 5.00000 -0.5000 -8.8818E-16 + L 3 FR 14.6429 5.00000 None 0.000 9.643 + + + *** Start of tree search *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 2 1 No Feas Soln 1 3.93 4.00 None 4.00 1 + 3 1 -16.2 1 3.93 0.00 3.00 3.00 1 + 4 3 -15.5 2 1.80 2.00 None 2.00 2 + 5 3 -13.0 2 1.80 0.00 1.00 1.00 2 + *** Integer solution *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 6 4 No Feas Soln 1 2.50 3.00 3.00 3.00 3 + 7 4 -14.8 1 2.50 0.00 2.00 2.00 3 + 8 7 -12.0 CO 2 2.20 3.00 None 3.00 4 + 9 7 -14.0 2 2.20 2.00 2.00 2.00 4 + *** Integer solution *** + + *** End of tree search *** + + + Total of 9 nodes investigated. + + Exit IP solver - Optimum IP solution found. + + Final IP objective value = -14.00000 + + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 UL 2.00000 0.00000 2.00000 -3.000 0.000 + V 2 EQ 2.00000 2.00000 2.00000 -4.000 0.000 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 FR 14.0000 None 15.0000 0.000 1.000 + L 2 FR 0.00000 None 5.00000 0.000 5.000 + L 3 FR 10.0000 5.00000 None 0.000 5.000 diff --git a/simple_examples/baseresults/h02daje.r b/simple_examples/baseresults/h02daje.r new file mode 100644 index 0000000..125c5bf --- /dev/null +++ b/simple_examples/baseresults/h02daje.r @@ -0,0 +1,14 @@ +H02DAJ Example Program Results + + Final Esimate: + 1 + 1 0.3750 + 2 0.0000 + 3 0.5250 + 4 0.1000 + 5 1.0000 + 6 0.0000 + 7 1.0000 + 8 1.0000 +Requested accuracy of QP subproblems 1.0000e-10 +Optimised value: 2.925 diff --git a/simple_examples/baseresults/m01ccje.r b/simple_examples/baseresults/m01ccje.r new file mode 100644 index 0000000..33e1712 --- /dev/null +++ b/simple_examples/baseresults/m01ccje.r @@ -0,0 +1,15 @@ + M01CCJ Example Program Results + + Records sorted on columns 7 to 12 + + C05AZF 2181 + C05AUF 1351 + C02AEF 599 + A02ACF 531 + A02ABF 523 + A02AAF 289 + C05AVF 240 + C05AXF 211 + C05AYF 183 + C02ADF 169 + C05AWF 136 diff --git a/simple_examples/baseresults/nagcomplexexample.r b/simple_examples/baseresults/nagcomplexexample.r new file mode 100644 index 0000000..2040ba1 --- /dev/null +++ b/simple_examples/baseresults/nagcomplexexample.r @@ -0,0 +1,60 @@ +Please read the source of NAGComplexExample.java for a better understanding of how to use NAGComplex + +*****BASICS***** + +Constructing z1 and z2; +z1 = (0.0, 0.0) +z2 = (2.0, 3.0) + +Changing z1 values using NAGComplex.setRe() and NAGComplex.setIm(); +z1 = (3.0, 4.0) + +Copying z2 to z3 using NAGComplex.clone(); +z3 = (2.0, 3.0) +Copying z1 to z4 using static method NAGComplex.clone(NAGComplex z) +z4 = (3.0, 4.0) + +Array created using NAGComplex.createArray(5); +(0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) + +The same array updated using NAGComplex[i].setRe() and NAGComplex[i].setIm(); +(1.0, 9.0) (2.0, 8.0) (3.0, 7.0) (4.0, 6.0) (5.0, 5.0) + +*****ARITHMETIC***** + +z1 = (3.0, 4.0) +z2 = (2.0, 3.0) +z3 = (6.0, -2.0) +z4 = (4.0, -5.0) + +z1 + z2 = (5.0, 7.0) +z3 + z4 = (10.0, -7.0) + +z1 - z2 = (1.0, 1.0) +z3 - z4 = (2.0, 3.0) + +z1 * z2 = (-6.0, 17.0) +z3 * z4 = (14.0, -38.0) + +z1 / z2 = (1.3846153846153846, -0.07692307692307696) +z3 / z4 = (0.829268292682927, 0.5365853658536587) + +-(z1) = (-3.0, -4.0) +-(z2) = (-2.0, -3.0) + +conjugate(z1) = (3.0, -4.0) +conjugate(z2) = (2.0, -3.0) + +z3 == z4? - false +z4 = (6.0, -2.0) +z3 == z4? - true +|z1| = 5.0 +|z2| = 3.6055512754639896 + +arg(z1) = 0.9272952180016122 +arg(z2) = 0.982793723247329 + +z5 = (-5.0, 12.0) +z6 = (-9.0, 40.0) +Sqrt(z5) = (2.0, 3.0) +Sqrt(z6) = (4.0, 5.0) \ No newline at end of file diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r new file mode 100644 index 0000000..76fc07e --- /dev/null +++ b/simple_examples/baseresults/outputexample.r @@ -0,0 +1,10 @@ + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran + Precision: double precision + Product Code: NLL6I27DBL + Mark: 27.2.0 (self-contained) + + This is a 64-bit library using 32-bit integers. + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/s01baje.r b/simple_examples/baseresults/s01baje.r new file mode 100644 index 0000000..b3b20dd --- /dev/null +++ b/simple_examples/baseresults/s01baje.r @@ -0,0 +1,9 @@ +S01BAJ Example Program Results + + X Y + 2.5000e+00 1.2528e+00 + 1.2500e-01 1.1778e-01 + -9.0600e-01 -2.3645e+00 + 1.2900e-03 1.2892e-03 + -7.8300e-06 -7.8300e-06 + 1.0000e-09 1.0000e-09 diff --git a/simple_examples/baseresults/s10aaje.r b/simple_examples/baseresults/s10aaje.r new file mode 100644 index 0000000..eac481e --- /dev/null +++ b/simple_examples/baseresults/s10aaje.r @@ -0,0 +1,7 @@ +S10AAJ Example Program Results + + X Y + -2.000e+01 -1.000e+00 + -5.000e+00 -9.999e-01 + 5.000e-01 4.621e-01 + 5.000e+00 9.999e-01 diff --git a/simple_examples/baseresults/s10abje.r b/simple_examples/baseresults/s10abje.r new file mode 100644 index 0000000..54e3b1c --- /dev/null +++ b/simple_examples/baseresults/s10abje.r @@ -0,0 +1,8 @@ +S10ABJ Example Program Results + + X Y + -1.000e+01 -1.101e+04 + -5.000e-01 -5.211e-01 + 0.000e+00 0.000e+00 + 5.000e-01 5.211e-01 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s10acje.r b/simple_examples/baseresults/s10acje.r new file mode 100644 index 0000000..e71c76b --- /dev/null +++ b/simple_examples/baseresults/s10acje.r @@ -0,0 +1,8 @@ +S10ACJ Example Program Results + + X Y + -1.000e+01 1.101e+04 + -5.000e-01 1.128e+00 + 0.000e+00 1.000e+00 + 5.000e-01 1.128e+00 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s14abje.r b/simple_examples/baseresults/s14abje.r new file mode 100644 index 0000000..86c60ea --- /dev/null +++ b/simple_examples/baseresults/s14abje.r @@ -0,0 +1,12 @@ +S14ABJ Example Program Results + + X Y + 1.000e+00 0.000e+00 + 1.250e+00 -9.827e-02 + 1.500e+00 -1.208e-01 + 1.750e+00 -8.440e-02 + 2.000e+00 0.000e+00 + 5.000e+00 3.178e+00 + 1.000e+01 1.280e+01 + 2.000e+01 3.934e+01 + 1.000e+03 5.905e+03 diff --git a/simple_examples/baseresults/s14acje.r b/simple_examples/baseresults/s14acje.r new file mode 100644 index 0000000..cda0185 --- /dev/null +++ b/simple_examples/baseresults/s14acje.r @@ -0,0 +1,8 @@ +S14ACJ Example Program Results + + X psi(X)-log(X) + + 0.1000 -8.1212 + 0.5000 -1.2704 + 3.6000 -0.1453 + 8.0000 -0.0638 diff --git a/simple_examples/baseresults/s14afje.r b/simple_examples/baseresults/s14afje.r new file mode 100644 index 0000000..68a5fd5 --- /dev/null +++ b/simple_examples/baseresults/s14afje.r @@ -0,0 +1,5 @@ +S14AFJ Example Program Results + + Z K (d^K/dz^K)psi(Z) + + (-1.5, 2.5) 1 (-1.9737e-01, -2.4271e-01) diff --git a/simple_examples/baseresults/s17dcje.r b/simple_examples/baseresults/s17dcje.r new file mode 100644 index 0000000..845aae3 --- /dev/null +++ b/simple_examples/baseresults/s17dcje.r @@ -0,0 +1,10 @@ +S17DCF Example Program Results + +Calling with N = 2 + +FNU Z SCAL CY[0] CY[1] NZ +0.0000 (0.3000, 0.4000) U (-0.4983, 0.6700) (-1.0149, 0.9485) 0 +2.3000 (2.0000, 0.0000) U (-0.7398, 0.0000) (-1.4120, 0.0000) 0 +2.1200 (-1.0000, 0.0000) U (-1.7279, 0.8602) (6.5331, -2.6154) 0 +1.5800 (-2.3000, 5.6000) U (36.4755, -1.5521) (-2.6788, 25.9112) 0 +1.5800 (-2.3000, 5.6000) S (0.1349, -0.0057) (-0.0099, 0.0958) 0 diff --git a/simple_examples/baseresults/s17dgje.r b/simple_examples/baseresults/s17dgje.r new file mode 100644 index 0000000..c26ff48 --- /dev/null +++ b/simple_examples/baseresults/s17dgje.r @@ -0,0 +1,9 @@ + S17DGJ Example Program Results + + DERIV Z SCAL AI NZ + + F ( 0.3000, 0.4000) U ( 0.2716, -0.1002) 0 + F ( 0.2000, 0.0000) U ( 0.3037, 0.0000) 0 + F ( 1.1000, -6.6000) U (-43.6632,-47.9030) 0 + F ( 1.1000, -6.6000) S ( 0.1655, 0.0597) 0 + D ( -1.0000, 0.0000) U ( -0.0102, 0.0000) 0 diff --git a/simple_examples/baseresults/s30aaje.r b/simple_examples/baseresults/s30aaje.r new file mode 100644 index 0000000..32fc477 --- /dev/null +++ b/simple_examples/baseresults/s30aaje.r @@ -0,0 +1,16 @@ +S30AAJ Example Program Results + +Black-Scholes-Merton formula +European Call : + Spot = 55.0000 + Volatility = 0.3000 + Rate = 0.1000 + Dividend = 0.0000 + + Strike Expiry Option Price + 58.0000 0.7000 5.9198 + 58.0000 0.8000 6.5506 + 60.0000 0.7000 5.0809 + 60.0000 0.8000 5.6992 + 62.0000 0.7000 4.3389 + 62.0000 0.8000 4.9379 diff --git a/simple_examples/baseresults/s30acje.r b/simple_examples/baseresults/s30acje.r new file mode 100644 index 0000000..134730e --- /dev/null +++ b/simple_examples/baseresults/s30acje.r @@ -0,0 +1,9 @@ + S30ACJ Example Program Results + + SIGMA IVALID + + 7.834E-01 0 + 7.386E-01 0 + 4.096E-01 0 + 4.085E-01 0 + 4.179E-01 0 diff --git a/simple_examples/baseresults/simpleroutineexample.r b/simple_examples/baseresults/simpleroutineexample.r new file mode 100644 index 0000000..e1f6a4e --- /dev/null +++ b/simple_examples/baseresults/simpleroutineexample.r @@ -0,0 +1,15 @@ + C05AZ Example Program results: + + Iterations + + X = 0.00000 FX= 1.0000e+00 IND = 2 + X = 1.00000 FX= -6.3212e-01 IND = 3 + X = 0.61270 FX= -7.0814e-02 IND = 4 + X = 0.56707 FX= 1.1542e-04 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + X = 0.56713 FX= 1.4727e-05 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/userdefinedfunctionexample1.r b/simple_examples/baseresults/userdefinedfunctionexample1.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample1.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/userdefinedfunctionexample2.r b/simple_examples/baseresults/userdefinedfunctionexample2.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample2.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/x03aaje.r b/simple_examples/baseresults/x03aaje.r new file mode 100644 index 0000000..d2b7138 --- /dev/null +++ b/simple_examples/baseresults/x03aaje.r @@ -0,0 +1,3 @@ +X03AAF Example Program Results + +D1 = -5.0 D2 = 0.0 \ No newline at end of file diff --git a/simple_examples/baseresults/x04cbje.r b/simple_examples/baseresults/x04cbje.r new file mode 100644 index 0000000..6b842ef --- /dev/null +++ b/simple_examples/baseresults/x04cbje.r @@ -0,0 +1,21 @@ +X04CBJ Example Program Results + + Example 1 + 1 2 3 4 5 + 1 11.0000 12.0000 13.0000 14.0000 15.0000 + 2 21.0000 22.0000 23.0000 24.0000 25.0000 + 3 31.0000 32.0000 33.0000 34.0000 35.0000 + + Example 2: + Un Deux Trois Quatre Cinq + Uno 11.00 12.00 13.00 14.00 15.00 + Due 22.00 23.00 24.00 25.00 + Tre 33.00 34.00 35.00 + Quattro 44.00 45.00 + Cinque 55.00 + + A = [ + 11.00 0.00 0.00 0.00 0.00; + 21.00 22.00 0.00 0.00 0.00; + 31.00 32.00 33.00 0.00 0.00; + ]; diff --git a/simple_examples/baseresults/x05abje.r b/simple_examples/baseresults/x05abje.r new file mode 100644 index 0000000..f94235c --- /dev/null +++ b/simple_examples/baseresults/x05abje.r @@ -0,0 +1,2 @@ + X05ABJ Example Program Results +Tue 14th Jul 1789 13:11:48.320 diff --git a/simple_examples/data/c02abje.d b/simple_examples/data/c02abje.d new file mode 100644 index 0000000..3f2dfd1 --- /dev/null +++ b/simple_examples/data/c02abje.d @@ -0,0 +1,14 @@ +C02ABJ Example Program Data + +Example 1: Basic Problem + 6 : Degree, n + 3.5 : Coefficients, a + 1.0 + -7.0 + 12.5 + 2.5 + -17.0 + 32.5 + +Example 2: Polishing Processes + 10 : Degree, n diff --git a/simple_examples/data/c02afje.d b/simple_examples/data/c02afje.d new file mode 100644 index 0000000..0e31bab --- /dev/null +++ b/simple_examples/data/c02afje.d @@ -0,0 +1,19 @@ +C02AFJ Example Program Data + +Example 1 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 + +Example 2 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 diff --git a/simple_examples/data/c02agje.d b/simple_examples/data/c02agje.d new file mode 100644 index 0000000..ada6a96 --- /dev/null +++ b/simple_examples/data/c02agje.d @@ -0,0 +1,9 @@ +C02AGJ Example Program Data + +Example 1 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 + +Example 2 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 diff --git a/simple_examples/data/c02ahje.d b/simple_examples/data/c02ahje.d new file mode 100644 index 0000000..0e1a9ea --- /dev/null +++ b/simple_examples/data/c02ahje.d @@ -0,0 +1,2 @@ +C02AHJ Example Program Data + 1.0 0.0 -3.0 1.0 8.0 1.0 :AR AI BR BI CR CI diff --git a/simple_examples/data/c02ajje.d b/simple_examples/data/c02ajje.d new file mode 100644 index 0000000..c24b295 --- /dev/null +++ b/simple_examples/data/c02ajje.d @@ -0,0 +1,2 @@ +C02AJJ Example Program Data + 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/c02akje.d b/simple_examples/data/c02akje.d new file mode 100644 index 0000000..0b71c64 --- /dev/null +++ b/simple_examples/data/c02akje.d @@ -0,0 +1,2 @@ +C02AKJ Example Program Data + 1.0 3.0 9.0 -13.0 : Values of U, R, S and T diff --git a/simple_examples/data/c02alje.d b/simple_examples/data/c02alje.d new file mode 100644 index 0000000..a519a24 --- /dev/null +++ b/simple_examples/data/c02alje.d @@ -0,0 +1,2 @@ +C02ALJ Example Program Data + 1.0 2.0 6.0 -8.0 -40.0 : Values of E, A, B, C and D diff --git a/simple_examples/data/c02amje.d b/simple_examples/data/c02amje.d new file mode 100644 index 0000000..9bff4dc --- /dev/null +++ b/simple_examples/data/c02amje.d @@ -0,0 +1,5 @@ +C02AMJ Example Program Data + ( 1.0, 0.0) + ( -2.0, 3.0) + ( 5.0, 14.0) + (-40.0, -5.0) : Values of U, R, S and T diff --git a/simple_examples/data/c02anje.d b/simple_examples/data/c02anje.d new file mode 100644 index 0000000..c331b10 --- /dev/null +++ b/simple_examples/data/c02anje.d @@ -0,0 +1,6 @@ +C02ANJ Example Program Data + ( 1.0, 0.0) + ( 0.0, 0.0) + ( 0.0, 16.0) + ( -8.0, 8.0) + (-65.0, 0.0) : Values of E, A, B, C and D diff --git a/simple_examples/data/c05bbje.d b/simple_examples/data/c05bbje.d new file mode 100644 index 0000000..6c78ea9 --- /dev/null +++ b/simple_examples/data/c05bbje.d @@ -0,0 +1,7 @@ +C05BBJ Example Program Data +0 : BRANCH +false : OFFSET +0.5 -1.0 +1.0 2.3 +4.5 -0.1 +6.0 6.0 : Z diff --git a/simple_examples/data/c06fkje.d b/simple_examples/data/c06fkje.d new file mode 100644 index 0000000..e042218 --- /dev/null +++ b/simple_examples/data/c06fkje.d @@ -0,0 +1,11 @@ +C06FKJ Example Program Data +9 : n +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 : xa, ya diff --git a/simple_examples/data/c09aaje.d b/simple_examples/data/c09aaje.d new file mode 100644 index 0000000..8313509 --- /dev/null +++ b/simple_examples/data/c09aaje.d @@ -0,0 +1,11 @@ +C09AAF Example Program Data + 8 : n + Haar Zero : wavnam, mode + 2.0 + 5.0 + 8.0 + 9.0 + 7.0 + 4.0 +-1.0 + 1.0 : x(1:n) diff --git a/simple_examples/data/d03pcje.d b/simple_examples/data/d03pcje.d new file mode 100644 index 0000000..9e78e1f --- /dev/null +++ b/simple_examples/data/d03pcje.d @@ -0,0 +1,6 @@ +D03PCJ Example Program Data +6 20 1 : intpts, npts, itype +0.0 0.4 0.6 0.8 0.9 1.0 : xout(1:intpts) +1.0E-3 1.0 : acc, alpha +1 0 : m, itrace +0.0 0.1E-4 : ts, tout diff --git a/simple_examples/data/e02alje.d b/simple_examples/data/e02alje.d new file mode 100644 index 0000000..b1c9d44 --- /dev/null +++ b/simple_examples/data/e02alje.d @@ -0,0 +1,23 @@ +E02ALJ Example Program Data + 21 5 11 : N, M, NEVAL + 0.00 1.0000000000 + 0.05 1.0512710964 + 0.10 1.1051709181 + 0.15 1.1618342427 + 0.20 1.2214027582 + 0.25 1.2840254167 + 0.30 1.3498588076 + 0.35 1.4190675486 + 0.40 1.4918246976 + 0.45 1.5683121855 + 0.50 1.6487212707 + 0.55 1.7332530179 + 0.60 1.8221188004 + 0.65 1.9155408290 + 0.70 2.0137527075 + 0.75 2.1170000166 + 0.80 2.2255409285 + 0.85 2.3396468519 + 0.90 2.4596031112 + 0.95 2.5857096593 + 1.00 2.7182818285 : X, Y diff --git a/simple_examples/data/e04fcje.d b/simple_examples/data/e04fcje.d new file mode 100644 index 0000000..963a616 --- /dev/null +++ b/simple_examples/data/e04fcje.d @@ -0,0 +1,16 @@ +E04FCF Example Program Data + 0.14 1.0 15.0 1.0 + 0.18 2.0 14.0 2.0 + 0.22 3.0 13.0 3.0 + 0.25 4.0 12.0 4.0 + 0.29 5.0 11.0 5.0 + 0.32 6.0 10.0 6.0 + 0.35 7.0 9.0 7.0 + 0.39 8.0 8.0 8.0 + 0.37 9.0 7.0 7.0 + 0.58 10.0 6.0 6.0 + 0.73 11.0 5.0 5.0 + 0.96 12.0 4.0 4.0 + 1.34 13.0 3.0 3.0 + 2.10 14.0 2.0 2.0 + 4.39 15.0 1.0 1.0 diff --git a/simple_examples/data/e04mxje.d b/simple_examples/data/e04mxje.d new file mode 100644 index 0000000..7d45bf8 --- /dev/null +++ b/simple_examples/data/e04mxje.d @@ -0,0 +1,64 @@ +NAME E04MX.EX +ROWS + L ..ROW1.. + L ..ROW2.. + L ..ROW3.. + N ..COST.. +COLUMNS + ...X1... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X1... ..ROW3.. 1.0 ..COST.. -4.0 + ...X2... ..ROW1.. 1.0 ..ROW2.. 2.0 + ...X2... ..ROW3.. -1.0 ..COST.. -1.0 + ...X3... ..ROW1.. 1.0 ..ROW2.. 3.0 + ...X3... ..ROW3.. 1.0 ..COST.. -1.0 + ...X4... ..ROW1.. 1.0 ..ROW2.. 4.0 + ...X4... ..ROW3.. -1.0 ..COST.. -1.0 + ...X5... ..ROW1.. 1.0 ..ROW2.. -2.0 + ...X5... ..ROW3.. 1.0 ..COST.. -1.0 + ...X6... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X6... ..ROW3.. 1.0 ..COST.. -1.0 + ...X7... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X7... ..ROW3.. 1.0 ..COST.. -1.0 + ...X8... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X8... ..ROW3.. 1.0 ..COST.. -0.1 + ...X9... ..ROW1.. 4.0 ..ROW2.. 1.0 + ...X9... ..ROW3.. 1.0 ..COST.. -0.3 +RHS + RHS1 ..ROW1.. 1.5 + RHS1 ..ROW2.. 1.5 + RHS1 ..ROW3.. 4.0 + RHS1 ..COST.. 1000.0 +RANGES + RANGE1 ..ROW1.. 3.5 + RANGE1 ..ROW2.. 3.5 + RANGE1 ..ROW3.. 6.0 +BOUNDS + LO BOUND ...X1... -2.0 + LO BOUND ...X2... -2.0 + LO BOUND ...X3... -2.0 + LO BOUND ...X4... -2.0 + LO BOUND ...X5... -2.0 + LO BOUND ...X6... -2.0 + LO BOUND ...X7... -2.0 + LO BOUND ...X8... -2.0 + LO BOUND ...X9... -2.0 + UP BOUND ...X1... 2.0 + UP BOUND ...X2... 2.0 + UP BOUND ...X3... 2.0 + UP BOUND ...X4... 2.0 + UP BOUND ...X5... 2.0 + UP BOUND ...X6... 2.0 + UP BOUND ...X7... 2.0 + UP BOUND ...X8... 2.0 + UP BOUND ...X9... 2.0 +QUADOBJ + ...X1... ...X1... 2.00000000E0 ...X2... 1.00000000E0 + ...X1... ...X3... 1.00000000E0 ...X4... 1.00000000E0 + ...X1... ...X5... 1.00000000E0 + ...X2... ...X2... 2.00000000E0 ...X3... 1.00000000E0 + ...X2... ...X4... 1.00000000E0 ...X5... 1.00000000E0 + ...X3... ...X3... 2.00000000E0 ...X4... 1.00000000E0 + ...X3... ...X5... 1.00000000E0 + ...X4... ...X4... 2.00000000E0 ...X5... 1.00000000E0 + ...X5... ...X5... 2.00000000E0 +ENDATA diff --git a/simple_examples/data/e04ncje.d b/simple_examples/data/e04ncje.d new file mode 100644 index 0000000..bdf378b --- /dev/null +++ b/simple_examples/data/e04ncje.d @@ -0,0 +1,21 @@ +E04NCA Example Program Data + 10 9 3 :Values of M, N and NCLIN + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 2.0 1.0 1.0 1.0 1.0 2.0 0.0 0.0 + 1.0 1.0 3.0 1.0 1.0 1.0 -1.0 -1.0 -3.0 + 1.0 1.0 1.0 4.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 3.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 -1.0 + 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 0.0 1.0 1.0 1.0 2.0 2.0 3.0 + 1.0 0.0 1.0 1.0 1.0 1.0 0.0 2.0 2.0 :End of matrix A + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 :End of B + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 + 1.0 2.0 3.0 4.0 -2.0 1.0 1.0 1.0 1.0 + 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 :End of matrix C + 0.0 0.0 -1.0E+25 0.0 0.0 0.0 0.0 0.0 0.0 + 2.0 -1.0E+25 1.0 :End of BL + 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 + 1.0E+25 2.0 4.0 :End of BU + 1.0 0.5 0.3333 0.25 0.2 0.1667 0.1428 0.125 0.1111 :End of X diff --git a/simple_examples/data/e04nfje.d b/simple_examples/data/e04nfje.d new file mode 100644 index 0000000..f2c6165 --- /dev/null +++ b/simple_examples/data/e04nfje.d @@ -0,0 +1,22 @@ +E04NFA Example Program Data + 7 7 :Values of N and NCLIN + -0.02 -0.20 -0.20 -0.20 -0.20 0.04 0.04 :End of CVEC + 1.00 1.00 1.00 1.00 1.00 1.00 1.00 + 0.15 0.04 0.02 0.04 0.02 0.01 0.03 + 0.03 0.05 0.08 0.02 0.06 0.01 0.00 + 0.02 0.04 0.01 0.02 0.02 0.00 0.00 + 0.02 0.03 0.00 0.00 0.01 0.00 0.00 + 0.70 0.75 0.80 0.75 0.80 0.97 0.00 + 0.02 0.06 0.08 0.12 0.02 0.01 0.97 :End of matrix A + -0.01 -0.10 -0.01 -0.04 -0.10 -0.01 -0.01 + -0.13 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 -9.92E-02 -3.0E-03 :End of BL + 0.01 0.15 0.03 0.02 0.05 1.0E+25 1.0E+25 + -0.13 -4.9E-03 -6.4E-03 -3.7E-03 -1.2E-03 1.0E+25 2.0E-03 :End of BU + -0.01 -0.03 0.00 -0.01 -0.10 0.02 0.01 :End of X + 2.00 0.00 0.00 0.00 0.00 0.00 0.00 + 0.00 2.00 0.00 0.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 0.00 0.00 2.00 0.00 0.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 :End of matrix H diff --git a/simple_examples/data/e04nqje.d b/simple_examples/data/e04nqje.d new file mode 100644 index 0000000..a1c9039 --- /dev/null +++ b/simple_examples/data/e04nqje.d @@ -0,0 +1,67 @@ +E04NQF Example Program Data + 7 8 : Values of N and M +48 8 7 'C' 15 : Values of NNZ, IOBJ, NCOLH, START and NNAME + +'...X1...' '...X2...' '...X3...' '...X4...' '...X5...' +'...X6...' '...X7...' '..ROW1..' '..ROW2..' '..ROW3..' +'..ROW4..' '..ROW5..' '..ROW6..' '..ROW7..' '..COST..' : End of array NAMES + + 0.02 7 1 : Sparse matrix A, ordered by increasing column index; + 0.02 5 1 : each row contains ACOL(i), INDA(i), ICOL (= column index) + 0.03 3 1 : The row indices may be in any order. In this example + 1.00 1 1 : row 8 defines the linear objective term transpose(C)*X. + 0.70 6 1 + 0.02 4 1 + 0.15 2 1 + -200.00 8 1 + 0.06 7 2 + 0.75 6 2 + 0.03 5 2 + 0.04 4 2 + 0.05 3 2 + 0.04 2 2 + 1.00 1 2 +-2000.00 8 2 + 0.02 2 3 + 1.00 1 3 + 0.01 4 3 + 0.08 3 3 + 0.08 7 3 + 0.80 6 3 +-2000.00 8 3 + 1.00 1 4 + 0.12 7 4 + 0.02 3 4 + 0.02 4 4 + 0.75 6 4 + 0.04 2 4 +-2000.00 8 4 + 0.01 5 5 + 0.80 6 5 + 0.02 7 5 + 1.00 1 5 + 0.02 2 5 + 0.06 3 5 + 0.02 4 5 +-2000.00 8 5 + 1.00 1 6 + 0.01 2 6 + 0.01 3 6 + 0.97 6 6 + 0.01 7 6 + 400.00 8 6 + 0.97 7 7 + 0.03 2 7 + 1.00 1 7 + 400.00 8 7 : End of matrix A + + 0.0 0.0 4.0E+02 1.0E+02 0.0 0.0 + 0.0 2.0E+03 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 + 1.5E+03 2.5E+02 -1.0E+25 : End of lower bounds array BL + + 2.0E+02 2.5E+03 8.0E+02 7.0E+02 1.5E+03 1.0E+25 + 1.0E+25 2.0E+03 6.0E+01 1.0E+02 4.0E+01 3.0E+01 + 1.0E+25 3.0E+02 1.0E+25 : End of upper bounds array BU + + 0 0 0 0 0 0 0 : Initial array HS + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 : Initial vector X diff --git a/simple_examples/data/e04rsje.d b/simple_examples/data/e04rsje.d new file mode 100644 index 0000000..9540ce2 --- /dev/null +++ b/simple_examples/data/e04rsje.d @@ -0,0 +1,13 @@ +E04RSJ Example Program Data + 3 6 6 : n, nnzq1, nnzq2 + 1 1 1 2 2 3 : irowq0 + 1 2 3 2 3 3 : icolq0 + 0.493 0.382 0.270 0.475 0.448 0.515 : q0 + 1 1 1 2 2 3 : irowq1 + 1 2 3 2 3 3 : icolq1 + 0.737 0.453 1.002 0.316 0.635 1.590 : q1 + 1 2 3 : idxr0 + 0.847 0.08 0.505 : r0 + 1 2 3 : idxr1 + 0.065 0.428 0.097 : r1 + 1.276 : s diff --git a/simple_examples/data/e04rtje.d b/simple_examples/data/e04rtje.d new file mode 100644 index 0000000..f6f5896 --- /dev/null +++ b/simple_examples/data/e04rtje.d @@ -0,0 +1,8 @@ +E04RTJ Example Program Data + 3 2 4 : n, m, nnza + 1 1 2 2 : irowa + 1 2 2 3 : icola + 0.493 0.382 0.270 0.475 : a + 0.2 0.4 : b + -1.0 -1.0 -1.0 : xl + 1.0 1.0 1.0 : xu diff --git a/simple_examples/data/e04saje.opt b/simple_examples/data/e04saje.opt new file mode 100644 index 0000000..098dd78 --- /dev/null +++ b/simple_examples/data/e04saje.opt @@ -0,0 +1,30 @@ +NAME E04SAJE +OBJSENSE + MIN +ROWS + N obj + L g1 + G g2 +COLUMNS + x1 obj 10.0 + x1 g1 -0.1 + x1 g2 -0.06 + x2 obj 20.0 + x2 g1 -0.1 + x2 g2 1.0 + x3 obj 1.0 + x3 g1 1.0 + x3 g2 1.0 +RHS + UVEC g1 1.5 + UVEC g2 1.0 +BOUNDS + LO bound x1 -2.0 + UP bound x1 2.0 + LO bound x2 -2.0 + UP bound x2 2.0 +CSECTION k1 0 QUAD + x3 + x1 + x2 +ENDATA diff --git a/simple_examples/data/e04tcje.d b/simple_examples/data/e04tcje.d new file mode 100644 index 0000000..0d7c25f --- /dev/null +++ b/simple_examples/data/e04tcje.d @@ -0,0 +1,22 @@ +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/f03baje.d b/simple_examples/data/f03baje.d new file mode 100644 index 0000000..8c792dc --- /dev/null +++ b/simple_examples/data/f03baje.d @@ -0,0 +1,5 @@ +F03BAF Example Program Data + 3 : N + 33 16 72 + -24 -10 -57 + -8 -4 -17 : A diff --git a/simple_examples/data/f04amje.d b/simple_examples/data/f04amje.d new file mode 100644 index 0000000..dc69386 --- /dev/null +++ b/simple_examples/data/f04amje.d @@ -0,0 +1,5 @@ +F04AMF Example Program Data + 3 2 : m, n + 1.1 0.9 2.2 + 1.2 1.0 2.3 + 1.0 1.0 2.1 : matrices A and B diff --git a/simple_examples/data/f04baje.d b/simple_examples/data/f04baje.d new file mode 100644 index 0000000..b1df19b --- /dev/null +++ b/simple_examples/data/f04baje.d @@ -0,0 +1,13 @@ +F04BAF Example Program Data + + 4 2 : n, nrhs + + 1.80 2.88 2.05 -0.89 + 5.25 -2.95 -0.95 -3.80 + 1.58 -2.69 -2.90 -1.04 + -1.11 -0.66 -0.59 0.80 : matrix A + + 9.52 18.47 + 24.35 2.25 + 0.77 -13.28 + -6.22 -6.21 : matrix B diff --git a/simple_examples/data/f05aaje.d b/simple_examples/data/f05aaje.d new file mode 100644 index 0000000..cafb7ea --- /dev/null +++ b/simple_examples/data/f05aaje.d @@ -0,0 +1,6 @@ +F05AAF Example Program Data + 4 2 4 + 1 -2 3 1 +-2 1 -2 -1 + 3 -2 1 5 + 4 1 5 3 \ No newline at end of file diff --git a/simple_examples/data/f08btje.d b/simple_examples/data/f08btje.d new file mode 100644 index 0000000..bea5bf4 --- /dev/null +++ b/simple_examples/data/f08btje.d @@ -0,0 +1,15 @@ +F08BTF Example Program Data + + 5 4 2 :Values of M, N and NRHS + + ( 0.47,-0.34) (-0.40, 0.54) ( 0.60, 0.01) ( 0.80,-1.02) + (-0.32,-0.23) (-0.05, 0.20) (-0.26,-0.44) (-0.43, 0.17) + ( 0.35,-0.60) (-0.52,-0.34) ( 0.87,-0.11) (-0.34,-0.09) + ( 0.89, 0.71) (-0.45,-0.45) (-0.02,-0.57) ( 1.14,-0.78) + (-0.19, 0.06) ( 0.11,-0.85) ( 1.44, 0.80) ( 0.07, 1.14) :End of matrix A + + (-1.08,-2.59) ( 2.22, 2.35) + (-2.61,-1.49) ( 1.62,-1.48) + ( 3.13,-3.61) ( 1.65, 3.43) + ( 7.33,-8.01) (-0.98, 3.08) + ( 9.12, 7.63) (-2.84, 2.78) :End of matrix B diff --git a/simple_examples/data/f08xpje.d b/simple_examples/data/f08xpje.d new file mode 100644 index 0000000..39b5c87 --- /dev/null +++ b/simple_examples/data/f08xpje.d @@ -0,0 +1,10 @@ +F08XPJ Example Program Data +4 : Value of N +(-21.10,-22.50) ( 53.50,-50.50) (-34.50,127.50) ( 7.50, 0.50) +( -0.46, -7.78) ( -3.50,-37.50) (-15.50, 58.50) (-10.50, -1.50) +( 4.30, -5.50) ( 39.70,-17.10) (-68.50, 12.50) ( -7.50, -3.50) +( 5.50, 4.40) ( 14.40, 43.30) (-32.50,-46.00) (-19.00,-32.50) : End of A +( 1.00, -5.00) ( 1.60, 1.20) ( -3.00, 0.00) ( 0.00, -1.00) +( 0.80, -0.60) ( 3.00, -5.00) ( -4.00, 3.00) ( -2.40, -3.20) +( 1.00, 0.00) ( 2.40, 1.80) ( -4.00, -5.00) ( 0.00, -3.00) +( 0.00, 1.00) ( -1.80, 2.40) ( 0.00, -4.00) ( 4.00, -5.00) : End of B diff --git a/simple_examples/data/g02bjje.d b/simple_examples/data/g02bjje.d new file mode 100644 index 0000000..eaa8921 --- /dev/null +++ b/simple_examples/data/g02bjje.d @@ -0,0 +1,10 @@ +G02BJF Example Program Data +5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 +12.0 2.0 0.0 0.0 +-1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS +-1.0 0.0 0.0 0.0 :: XMISS +4 1 2 :: KVAR diff --git a/simple_examples/data/g02daje.d b/simple_examples/data/g02daje.d new file mode 100644 index 0000000..4e844ac --- /dev/null +++ b/simple_examples/data/g02daje.d @@ -0,0 +1,15 @@ +G02DAJ Example Program Data +12 4 'U' 'M' +1.0 0.0 0.0 0.0 33.63 +0.0 0.0 0.0 1.0 39.62 +0.0 1.0 0.0 0.0 38.18 +0.0 0.0 1.0 0.0 41.46 +0.0 0.0 0.0 1.0 38.02 +0.0 1.0 0.0 0.0 35.83 +0.0 0.0 0.0 1.0 35.99 +1.0 0.0 0.0 0.0 36.58 +0.0 0.0 1.0 0.0 42.92 +1.0 0.0 0.0 0.0 37.80 +0.0 0.0 1.0 0.0 40.43 +0.0 1.0 0.0 0.0 37.89 +1 1 1 1 diff --git a/simple_examples/data/g02eeje.d b/simple_examples/data/g02eeje.d new file mode 100644 index 0000000..b0c03a7 --- /dev/null +++ b/simple_examples/data/g02eeje.d @@ -0,0 +1,24 @@ +G02EEF Example Program Data + 20 6 'M' 'U' 2.0 :: N,M,MEAN,WEIGHT,FIN + 0.0 1125.0 232.0 7160.0 85.9 8905.0 1.5563 + 7.0 920.0 268.0 8804.0 86.5 7388.0 0.8976 + 15.0 835.0 271.0 8108.0 85.2 5348.0 0.7482 + 22.0 1000.0 237.0 6370.0 83.8 8056.0 0.7160 + 29.0 1150.0 192.0 6441.0 82.1 6960.0 0.3010 + 37.0 990.0 202.0 5154.0 79.2 5690.0 0.3617 + 44.0 840.0 184.0 5896.0 81.2 6932.0 0.1139 + 58.0 650.0 200.0 5336.0 80.6 5400.0 0.1139 + 65.0 640.0 180.0 5041.0 78.4 3177.0 -0.2218 + 72.0 583.0 165.0 5012.0 79.3 4461.0 -0.1549 + 80.0 570.0 151.0 4825.0 78.7 3901.0 0.0000 + 86.0 570.0 171.0 4391.0 78.0 5002.0 0.0000 + 93.0 510.0 243.0 4320.0 72.3 4665.0 -0.0969 + 100.0 555.0 147.0 3709.0 74.9 4642.0 -0.2218 + 107.0 460.0 286.0 3969.0 74.4 4840.0 -0.3979 + 122.0 275.0 198.0 3558.0 72.5 4479.0 -0.1549 + 129.0 510.0 196.0 4361.0 57.7 4200.0 -0.2218 + 151.0 165.0 210.0 3301.0 71.8 3410.0 -0.3979 + 171.0 244.0 327.0 2964.0 72.5 3360.0 -0.5229 + 220.0 79.0 334.0 2777.0 71.9 2599.0 -0.0458 :: End of X,Y + 0 1 1 1 1 2 :: ISX + 'DAY' 'BOD' 'TKN' 'TS ' 'TVS' 'COD' :: VNAME diff --git a/simple_examples/data/g02maje.d b/simple_examples/data/g02maje.d new file mode 100644 index 0000000..b21e21c --- /dev/null +++ b/simple_examples/data/g02maje.d @@ -0,0 +1,23 @@ +G02MAJ Example Program Data +20 6 :: N,M +1 3 1 6 0 :: MTYPE,PRED,PREY,MNSTEP,LISX +10.28 1.77 9.69 15.58 8.23 10.44 -46.47 +9.08 8.99 11.53 6.57 15.89 12.58 -35.80 +17.98 13.10 1.04 10.45 10.12 16.68 -129.22 +14.82 13.79 12.23 7.00 8.14 7.79 -42.44 +17.53 9.41 6.24 3.75 13.12 17.08 -73.51 +7.78 10.38 9.83 2.58 10.13 4.25 -26.61 +11.95 21.71 8.83 11.00 12.59 10.52 -63.90 +14.60 10.09 -2.70 9.89 14.67 6.49 -76.73 +3.63 9.07 12.59 14.09 9.06 8.19 -32.64 +6.35 9.79 9.40 12.79 8.38 16.79 -83.29 +4.66 3.55 16.82 13.83 21.39 13.88 -16.31 +8.32 14.04 17.17 7.93 7.39 -1.09 -5.82 +10.86 13.68 5.75 10.44 10.36 10.06 -47.75 +4.76 4.92 17.83 2.90 7.58 11.97 18.38 +5.05 10.41 9.89 9.04 7.90 13.12 -54.71 +5.41 9.32 5.27 15.53 5.06 19.84 -55.62 +9.77 2.37 9.54 20.23 9.33 8.82 -45.28 +14.28 4.34 14.23 14.95 18.16 11.03 -22.76 +10.17 6.80 3.17 8.57 16.07 15.93 -104.32 +5.39 2.67 6.37 13.56 10.68 7.35 -55.94 :: End of D, Y diff --git a/simple_examples/data/g03gaje.d b/simple_examples/data/g03gaje.d new file mode 100644 index 0000000..ca1c97f --- /dev/null +++ b/simple_examples/data/g03gaje.d @@ -0,0 +1,56 @@ +G03GAF Example Program Data +25 4 4 : N M IP +2 : NG +2 : SOPT +2 : POPT +15 : NITER +2.7 3.2 4.5 4.8 +3.9 3.8 5.9 6.2 +4.8 4.1 6.8 5.5 +3.1 3.5 4.3 4.6 +3.4 3.7 5.1 5.6 +3.1 3.4 4.1 4.7 +4.6 4.4 6.6 6.1 +3.1 3.3 4.0 4.9 +3.8 3.7 4.7 4.9 +5.2 4.9 8.2 6.9 +3.9 3.8 5.2 5.4 +4.1 4.0 5.6 5.6 +5.7 5.1 7.0 6.3 +3.0 3.2 4.5 5.0 +2.9 3.3 4.5 5.1 +3.4 3.3 4.4 5.0 +4.0 4.2 5.2 5.4 +3.0 3.0 4.6 5.0 +4.0 4.1 5.9 5.8 +3.0 3.2 4.4 5.1 +3.6 3.6 5.3 5.4 +3.1 3.2 4.6 5.0 +3.2 3.3 5.4 5.3 +3.0 3.4 4.2 4.7 +3.8 4.0 6.9 6.7 : X +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 : P diff --git a/simple_examples/data/g05kfje.d b/simple_examples/data/g05kfje.d new file mode 100644 index 0000000..b55cba0 --- /dev/null +++ b/simple_examples/data/g05kfje.d @@ -0,0 +1,3 @@ +G05KFF Example Program Data +1 1 1762543 :: GENID,SUBID,SEED(1) +5 :: N diff --git a/simple_examples/data/g13naje.d b/simple_examples/data/g13naje.d new file mode 100644 index 0000000..4da5b32 --- /dev/null +++ b/simple_examples/data/g13naje.d @@ -0,0 +1,14 @@ +G13NAJ Example Program Data +100 :: N +0.00 0.78 -0.02 0.17 0.04 -1.23 0.24 1.70 0.77 0.06 +0.67 0.94 1.99 2.64 2.26 3.72 3.14 2.28 3.78 0.83 +2.80 1.66 1.93 2.71 2.97 3.04 2.29 3.71 1.69 2.76 +1.96 3.17 1.04 1.50 1.12 1.11 1.00 1.84 1.78 2.39 +1.85 0.62 2.16 0.78 1.70 0.63 1.79 1.21 2.20 -1.34 +0.04 -0.14 2.78 1.83 0.98 0.19 0.57 -1.41 2.05 1.17 +0.44 2.32 0.67 0.73 1.17 -0.34 2.95 1.08 2.16 2.27 +-0.14 -0.24 0.27 1.71 -0.04 -1.03 -0.12 -0.67 1.15 -1.10 +-1.37 0.59 0.44 0.63 -0.06 -0.62 0.39 -2.63 -1.63 -0.42 +-0.73 0.85 0.26 0.48 -0.26 -1.77 -1.53 -1.39 1.68 0.43 :: End of Y +1 1 4.6 2 :: CTYPE,IPARAM,BETA,MINSS +1.0 :: PARAM(1) diff --git a/simple_examples/data/m01ccje.d b/simple_examples/data/m01ccje.d new file mode 100644 index 0000000..3a946ab --- /dev/null +++ b/simple_examples/data/m01ccje.d @@ -0,0 +1,13 @@ +M01CCF Example Program Data +11 +A02AAF 289 +A02ABF 523 +A02ACF 531 +C02ADF 169 +C02AEF 599 +C05AUF 1351 +C05AVF 240 +C05AWF 136 +C05AXF 211 +C05AYF 183 +C05AZF 2181 diff --git a/simple_examples/data/s14abje.d b/simple_examples/data/s14abje.d new file mode 100644 index 0000000..083a4f4 --- /dev/null +++ b/simple_examples/data/s14abje.d @@ -0,0 +1,10 @@ +S14ABF Example Program Data + 1.0 + 1.25 + 1.5 + 1.75 + 2.0 + 5.0 + 10.0 + 20.0 + 1000.0 diff --git a/simple_examples/data/s14acje.d b/simple_examples/data/s14acje.d new file mode 100644 index 0000000..64a16c9 --- /dev/null +++ b/simple_examples/data/s14acje.d @@ -0,0 +1,5 @@ +S14ACJ Example Program Data +0.1 +0.5 +3.6 +8.0 diff --git a/simple_examples/data/s14afje.d b/simple_examples/data/s14afje.d new file mode 100644 index 0000000..f658cc5 --- /dev/null +++ b/simple_examples/data/s14afje.d @@ -0,0 +1,2 @@ +S14AFJ Example Program Data +-1.5 2.5 1 : Values of Z and K diff --git a/simple_examples/data/s17dcje.d b/simple_examples/data/s17dcje.d new file mode 100644 index 0000000..fa0d57f --- /dev/null +++ b/simple_examples/data/s17dcje.d @@ -0,0 +1,6 @@ +S17DCJ Example Program Data +0.00 0.3 0.4 'U' +2.30 2.0 0.0 'U' +2.12 -1.0 0.0 'U' +1.58 -2.3 5.6 'U' +1.58 -2.3 5.6 'S' diff --git a/simple_examples/data/s17dgje.d b/simple_examples/data/s17dgje.d new file mode 100644 index 0000000..3e62c29 --- /dev/null +++ b/simple_examples/data/s17dgje.d @@ -0,0 +1,6 @@ +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/s30aaje.d b/simple_examples/data/s30aaje.d new file mode 100644 index 0000000..0248da1 --- /dev/null +++ b/simple_examples/data/s30aaje.d @@ -0,0 +1,9 @@ +S30AAJ Example Program Data +'C' : Call = 'C', Put = 'P' +55.0 0.3 0.1 0.0 : S, SIGMA, R, Q +3 2 : M, N +58.0 +60.0 +62.0 : X(I), I = 1,2,...M +0.7 +0.8 : T(I), I = 1,2,...N diff --git a/simple_examples/data/s30acje.d b/simple_examples/data/s30acje.d new file mode 100644 index 0000000..48117a7 --- /dev/null +++ b/simple_examples/data/s30acje.d @@ -0,0 +1,9 @@ +S30ACJ Example Program Data +'C' : Call = 'C', Put = 'P' +5 1 : Values of n and mode + +4.14 3.89 5.39 5.14 5.04 : p +268.0 268.0 268.0 268.5 269.0 : k +267.5 267.5 267.5 267.5 267.5 : s0 +0.00274 0.00274 0.0164 0.0164 0.0164 : t +0.0166 0.0166 0.0166 0.0166 0.0166 : r diff --git a/simple_examples/data/x03aaje.d b/simple_examples/data/x03aaje.d new file mode 100644 index 0000000..1254b78 --- /dev/null +++ b/simple_examples/data/x03aaje.d @@ -0,0 +1,5 @@ +X03AAJ Example Program Data + -2 -3 7 + 2 -5 3 + -9 1 0 + 8 -4 -2 diff --git a/simple_examples/source/int32/A00AAJE.java b/simple_examples/source/int32/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/source/int32/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/source/int32/A00ACJE.java b/simple_examples/source/int32/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/source/int32/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/source/int32/A00ADJE.java b/simple_examples/source/int32/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/source/int32/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int32/C02AAJE.java b/simple_examples/source/int32/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/source/int32/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/source/int32/C02ABJE.java b/simple_examples/source/int32/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/source/int32/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/source/int32/C02AFJE.java b/simple_examples/source/int32/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/source/int32/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AGJE.java b/simple_examples/source/int32/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/source/int32/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AHJE.java b/simple_examples/source/int32/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/source/int32/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/source/int32/C02AJJE.java b/simple_examples/source/int32/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/source/int32/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/source/int32/C02AKJE.java b/simple_examples/source/int32/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/source/int32/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ALJE.java b/simple_examples/source/int32/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/source/int32/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02AMJE.java b/simple_examples/source/int32/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/source/int32/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ANJE.java b/simple_examples/source/int32/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/source/int32/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C05AUJE.java b/simple_examples/source/int32/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/source/int32/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/source/int32/C05AWJE.java b/simple_examples/source/int32/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/source/int32/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/source/int32/C05AYJE.java b/simple_examples/source/int32/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/source/int32/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int32/C05AZJE.java b/simple_examples/source/int32/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/source/int32/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int32/C05BBJE.java b/simple_examples/source/int32/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/source/int32/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C05MBJE.java b/simple_examples/source/int32/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/source/int32/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int32/C05QBJE.java b/simple_examples/source/int32/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/source/int32/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/source/int32/C06BAJE.java b/simple_examples/source/int32/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/source/int32/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/source/int32/C06FKJE.java b/simple_examples/source/int32/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/source/int32/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C09AAJE.java b/simple_examples/source/int32/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/source/int32/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/D01BDJE.java b/simple_examples/source/int32/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/source/int32/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/source/int32/D01RJJE.java b/simple_examples/source/int32/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/source/int32/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RKJE.java b/simple_examples/source/int32/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/source/int32/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RLJE.java b/simple_examples/source/int32/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/source/int32/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RMJE.java b/simple_examples/source/int32/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/source/int32/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01TCJE.java b/simple_examples/source/int32/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/source/int32/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/source/int32/D02NEJE.java b/simple_examples/source/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/source/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int32/D02TLJE.java b/simple_examples/source/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/source/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/source/int32/D03PCJE.java b/simple_examples/source/int32/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/source/int32/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/source/int32/D03RAJE.java b/simple_examples/source/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/source/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/source/int32/D03RBJE.java b/simple_examples/source/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/source/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/D05BAJE.java b/simple_examples/source/int32/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/source/int32/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/source/int32/D05BEJE.java b/simple_examples/source/int32/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/source/int32/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/source/int32/DTFSMJE.java b/simple_examples/source/int32/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/source/int32/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int32/E01DAJE.java b/simple_examples/source/int32/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/source/int32/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/source/int32/E02ALJE.java b/simple_examples/source/int32/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/source/int32/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/source/int32/E04ABJE.java b/simple_examples/source/int32/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/source/int32/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/source/int32/E04BBJE.java b/simple_examples/source/int32/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/source/int32/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/source/int32/E04CBJE.java b/simple_examples/source/int32/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/source/int32/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/source/int32/E04FCJE.java b/simple_examples/source/int32/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/source/int32/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04FFJE.java b/simple_examples/source/int32/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/source/int32/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GBJE.java b/simple_examples/source/int32/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/source/int32/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GGJE.java b/simple_examples/source/int32/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/source/int32/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/source/int32/E04MTJE.java b/simple_examples/source/int32/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/source/int32/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04MXJE.java b/simple_examples/source/int32/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/source/int32/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/source/int32/E04NCJE.java b/simple_examples/source/int32/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/source/int32/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/source/int32/E04NFJE.java b/simple_examples/source/int32/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/source/int32/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int32/E04NKJE.java b/simple_examples/source/int32/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/source/int32/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/source/int32/E04NQJE.java b/simple_examples/source/int32/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/source/int32/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/source/int32/E04PTJE.java b/simple_examples/source/int32/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/source/int32/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/E04RPJE.java b/simple_examples/source/int32/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/source/int32/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/source/int32/E04RSJE.java b/simple_examples/source/int32/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/source/int32/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/source/int32/E04RTJE.java b/simple_examples/source/int32/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/source/int32/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/source/int32/E04SAJE.java b/simple_examples/source/int32/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/source/int32/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TAJE.java b/simple_examples/source/int32/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/source/int32/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TCJE.java b/simple_examples/source/int32/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/source/int32/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04UCJE.java b/simple_examples/source/int32/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/source/int32/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04YAJE.java b/simple_examples/source/int32/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/source/int32/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/F01ADJE.java b/simple_examples/source/int32/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/source/int32/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CKJE.java b/simple_examples/source/int32/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/source/int32/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CRJE.java b/simple_examples/source/int32/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/source/int32/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/source/int32/F01DGJE.java b/simple_examples/source/int32/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/source/int32/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/source/int32/F01ELJE.java b/simple_examples/source/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/source/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F01EMJE.java b/simple_examples/source/int32/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/source/int32/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/source/int32/F02EKJE.java b/simple_examples/source/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/source/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F02FKJE.java b/simple_examples/source/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/source/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/F02WGJE.java b/simple_examples/source/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/source/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/F03BAJE.java b/simple_examples/source/int32/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/source/int32/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/source/int32/F04AMJE.java b/simple_examples/source/int32/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/source/int32/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/source/int32/F04BAJE.java b/simple_examples/source/int32/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/source/int32/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/F05AAJE.java b/simple_examples/source/int32/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/source/int32/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/F06CLJE.java b/simple_examples/source/int32/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/source/int32/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/source/int32/F07AAJE.java b/simple_examples/source/int32/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/source/int32/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/source/int32/F07ABJE.java b/simple_examples/source/int32/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/source/int32/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/source/int32/F07ADJE.java b/simple_examples/source/int32/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/source/int32/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/source/int32/F07AQJE.java b/simple_examples/source/int32/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/source/int32/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/source/int32/F07FAJE.java b/simple_examples/source/int32/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/source/int32/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/source/int32/F07FBJE.java b/simple_examples/source/int32/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/source/int32/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/source/int32/F08BTJE.java b/simple_examples/source/int32/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/source/int32/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/source/int32/F08FAJE.java b/simple_examples/source/int32/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/source/int32/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/source/int32/F08XPJE.java b/simple_examples/source/int32/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/source/int32/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/source/int32/G01ALJE.java b/simple_examples/source/int32/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/source/int32/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/source/int32/G02AKJE.java b/simple_examples/source/int32/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/source/int32/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/source/int32/G02BJJE.java b/simple_examples/source/int32/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/source/int32/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/source/int32/G02BRJE.java b/simple_examples/source/int32/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/source/int32/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/source/int32/G02DAJE.java b/simple_examples/source/int32/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/source/int32/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/source/int32/G02EEJE.java b/simple_examples/source/int32/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/source/int32/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/source/int32/G02MAJE.java b/simple_examples/source/int32/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/source/int32/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/source/int32/G03GAJE.java b/simple_examples/source/int32/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/source/int32/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/G05KFJE.java b/simple_examples/source/int32/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/source/int32/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/G13AWJE.java b/simple_examples/source/int32/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/source/int32/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/source/int32/G13MEJE.java b/simple_examples/source/int32/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/source/int32/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/source/int32/G13NAJE.java b/simple_examples/source/int32/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/source/int32/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/source/int32/H02BBJE.java b/simple_examples/source/int32/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/source/int32/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/source/int32/H02DAJE.java b/simple_examples/source/int32/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/source/int32/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/source/int32/M01CCJE.java b/simple_examples/source/int32/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/source/int32/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/source/int32/S01BAJE.java b/simple_examples/source/int32/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/source/int32/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10AAJE.java b/simple_examples/source/int32/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/source/int32/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ABJE.java b/simple_examples/source/int32/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/source/int32/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ACJE.java b/simple_examples/source/int32/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/source/int32/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S14ABJE.java b/simple_examples/source/int32/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/source/int32/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S14ACJE.java b/simple_examples/source/int32/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/source/int32/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S14AFJE.java b/simple_examples/source/int32/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/source/int32/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S17DCJE.java b/simple_examples/source/int32/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/source/int32/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S17DGJE.java b/simple_examples/source/int32/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/source/int32/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/source/int32/S30AAJE.java b/simple_examples/source/int32/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/source/int32/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/source/int32/S30ACJE.java b/simple_examples/source/int32/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/source/int32/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/source/int32/X03AAJE.java b/simple_examples/source/int32/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/source/int32/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/source/int32/X04CBJE.java b/simple_examples/source/int32/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/source/int32/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/source/int32/X05ABJE.java b/simple_examples/source/int32/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/source/int32/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java new file mode 100644 index 0000000..490c163 --- /dev/null +++ b/simple_examples/source/int64/A00AAJE.java @@ -0,0 +1,14 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AA; +import com.nag.routines.Routine; + +public class A00AAJE { + + public static void main (String[] args) throws NAGBadIntegerException { + Routine.init(); + A00AA a00aa = new A00AA(); + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + } + +} diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java new file mode 100644 index 0000000..8250321 --- /dev/null +++ b/simple_examples/source/int64/A00ADJE.java @@ -0,0 +1,113 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AD; +import com.nag.routines.Routine; +import java.util.Arrays; + +public class A00ADJE { + + /* Parameters */ + public static final int MSGLEN = 15; + + /** A00ADJ Example Program */ + public static void main (String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + int i; + long mkmaj, mkmin; + boolean licval; + String fcomp = getBlankString(80), hdware = getBlankString(80), + impl = getBlankString(80), opsys = getBlankString(80), + pcode = getBlankString(80), prec = getBlankString(80), + vend = getBlankString(80); + /* Local Arrays */ + int[] itime = new int[7]; + String[] msg = new String[MSGLEN]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); + + Routine.init(); + System.out.println(" A00ADJ Example Program Results\n"); + + A00AD a00ad = new A00AD(); + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + /* Print implementation details */ + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length + * + * @param len the required length of the String + * @returns a String of spaces of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java new file mode 100644 index 0000000..a3bd5f1 --- /dev/null +++ b/simple_examples/source/int64/C05AYJE.java @@ -0,0 +1,45 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AY; +import com.nag.routines.Routine; + + +public class C05AYJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + long ifail = 0; + long[] iuser = new long[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + Routine.init(); + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch ((int)ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java new file mode 100644 index 0000000..bec1b03 --- /dev/null +++ b/simple_examples/source/int64/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AZ; +import com.nag.routines.Routine; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class C05AZJE { + + public static void main (String[] args)throws NAGBadIntegerException{ + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + long ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + Routine.init(); + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + + if(ind == 0){ + keepOn = false; + } + else{ + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + } + + + + switch ((int)ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java new file mode 100644 index 0000000..08dd454 --- /dev/null +++ b/simple_examples/source/int64/C05MBJE.java @@ -0,0 +1,104 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ Example Program Text + * @author joed + * @since 27.0 + */ + /* ** There have been at least 200*(n+1) calls to fcn. + ** Consider restarting the calculation from the point held in x. + ** ABNORMAL EXIT from NAG Library routine + ** NAG soft failure - control returned +*/ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ Example Main Program + */ + public static void main(String[] args) throws NAGBadIntegerException { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + long astart, ifail, m; + int i; + double[] fvec, x; + double[] ruser = new double[1]; + long[] iuser = new long[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Initialise NAG for Java + Routine.init(); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail==0 || ifail==8 || ifail==9) { + if (ifail==0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java new file mode 100644 index 0000000..d7a6435 --- /dev/null +++ b/simple_examples/source/int64/C05QBJE.java @@ -0,0 +1,178 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; + +/** + * + * @author ludovic + */ +public class C05QBJE { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws NAGBadIntegerException { + try { + Routine.init(); + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + long[] IUSER = new long[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = (int)c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + + break; + } + + } catch (NAGBadIntegerException ex) { + System.err.println("Something went wrong!\n" + ex.getMessage()); + } + + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private long N, IFLAG; + private double[] X, FVEC, RUSER; + private long[] IUSER; + + //@Override + public void setN(long N) { + this.N = N; + } + + //@Override + public long getN() { + return N; + } + + //@Override + public void setX(double[] X) { + this.X = X; + } + + //@Override + public double[] getX() { + return X; + } + + //@Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + //@Override + public double[] getFVEC() { + return FVEC; + } + + //@Override + public void setIUSER(long[] IUSER) { + this.IUSER = IUSER; + } + + //@Override + public long[] getIUSER() { + return IUSER; + } + + //@Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + //@Override + public double[] getRUSER() { + return RUSER; + } + + //@Override + public void setIFLAG(long IFLAG) { + this.IFLAG = IFLAG; + } + + //@Override + public long getIFLAG() { + return IFLAG; + } + + //@Override + public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class D01BDJE_FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + + } + +} diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java new file mode 100644 index 0000000..b32ae64 --- /dev/null +++ b/simple_examples/source/int64/D02NEJE.java @@ -0,0 +1,393 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; + + +/** + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) throws NAGBadIntegerException { + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + long ifail, itask, maxord, ijac, itol, licom, neq, lcom; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + long ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + * Fortran array definition: + * a(dimX, *) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static long getIdx(long x, long y, long dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + long neq, long ml, long mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + long md, ms, pd_dim1; + + pd_dim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; + pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[(int)getIdx(md, 3, pd_dim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; + pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; + pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + long neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java new file mode 100644 index 0000000..d1feabb --- /dev/null +++ b/simple_examples/source/int64/DTFSMJE.java @@ -0,0 +1,61 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * Adapted from f06wbfe.f90 + * + * @author joed + * + */ +public class DTFSMJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + double alpha = 4.21; + long ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + + // Init NAG Java + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + Routine.init(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[(int)(m*m)]; + for (int i=0; i=i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[((int)(m*(m+1)))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java new file mode 100644 index 0000000..89a89e4 --- /dev/null +++ b/simple_examples/source/int64/E01DAJE.java @@ -0,0 +1,177 @@ +/* + * E01DA Example Program - NAG Copyright 2016 + */ + import com.nag.exceptions.NAGBadIntegerException; + import com.nag.routines.E01.E01DA; + import com.nag.routines.E02.E02DF; + import com.nag.routines.Routine; + +public class E01DAJE { + + public static void main (String[] args)throws NAGBadIntegerException { + Routine.init(); + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = (int)e01da.getIFAIL(); + switch (ifail) + { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) + { + if (i <= mx) + System.out.printf("%4d %9.4f", i+1, lamda[i]); + else + System.out.printf(" "); + if (i <= my) + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + else + System.out.printf("\n"); + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) + { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) + System.out.printf("\n"); + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = (int)e01da.getPX(); + py = (int)e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px,4*ny+py); + if (4*nx+px>4*ny+py) + liwrk = ny + py - 4; + else + liwrk = nx + px - 4; + double tx[] = new double[nx]; + double ty[] = new double[ny]; + double ff[] = new double[nx*ny]; + wrk = new double[lwrk]; + long iwrk[] = new long[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new long[(int)(datafile.n + datafile.nclin)]; + ax = new double[(int)Math.max(1, datafile.nclin)]; + iwork = new long[(int)liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[(int)(datafile.n + datafile.nclin)]; + work = new double[(int)lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[(int)lcwsav]; + cwsav[0] = " "; + long[] iwsav = new long[(int)liwsav]; + boolean[] lwsav = new boolean[(int)llwsav]; + double[] rwsav = new double[(int)lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + long[] iuser = new long[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + + super.eval(); + + } + + } + + public static class DataFile { + + public String filename; + public long n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } else { + sda = 1; + + } + ldh = n; + + cvec = new double[(int)n]; + a = new double[(int)(lda * sda)]; + bl = new double[(int)(n + nclin)]; + bu = new double[(int)(n + nclin)]; + x = new double[(int)n]; + h = new double[(int)(ldh * n)]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java new file mode 100644 index 0000000..20ad573 --- /dev/null +++ b/simple_examples/source/int64/E04UCJE.java @@ -0,0 +1,207 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.Routine; +import java.util.Arrays; + +/** + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + double objf; + long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; + long[] istate, iwork; + long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; + boolean[] lwsav = new boolean[(int)LLWSAV]; + String[] cwsav = new String[(int)LCWSAV]; + Arrays.fill(cwsav, " "); + + System.out.println(" E04UCJ Example Program Results"); + Routine.init(); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new long[(int)(n + nclin + ncnln)]; + iwork = new long[(int)liwork]; + c = new double[(int)(Math.max(1, ncnln))]; + cjac = new double[(int)(ldcj * sdcjac)]; + clamda = new double[(int)(n + nclin + ncnln)]; + objgrd = new double[(int)n]; + r = new double[(int)(ldr * n)]; + work = new double[(int)lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[(int)LDCJ] = X[1] + X[1]; + CJAC[(int)(2*LDCJ)] = X[2] + X[2]; + CJAC[(int)(3*LDCJ)] = X[3] + X[3]; + } + + } + + if (NEEDC[1]>0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; + CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; + CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java new file mode 100644 index 0000000..d8f152c --- /dev/null +++ b/simple_examples/source/int64/F02EKJE.java @@ -0,0 +1,230 @@ +emacimport java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.Routine; +import com.nag.types.*; + + +/** + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) throws NAGBadIntegerException { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + // Initialise wrapper library + Routine.init(); + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval ( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW(){ + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/withdrawn/D02TKJE.java b/simple_examples/source/withdrawn/D02TKJE.java new file mode 100644 index 0000000..16e9e9b --- /dev/null +++ b/simple_examples/source/withdrawn/D02TKJE.java @@ -0,0 +1,290 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.D02.D02TK; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import com.nag.routines.Routine; + + +/** + * @author joed + */ +public class D02TKJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) throws NAGBadIntegerException { + D02TK d02tk = new D02TK(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; + double[] mesh, tol, work, y; + int[] icomm, ipmesh; + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02TKJ Example Program Results"); + System.out.println(); + + // Values from d02tkfe.d + ncol = 7; + nmesh = 11; + mxmesh = 51; + + licomm = 23 + NEQ + mxmesh; + lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + work = new double[lrcomm]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + icomm = new int[licomm]; + + // Values from d02tkfe.d + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Initial integrator for given problem. + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, + lrcomm, icomm, licomm, ifail + ); + + // Values from d02tkfe.d + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tk.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, + ifail + ); + ifail = d02tk.getIFAIL(); + if (ifail == 1) break; + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) break; + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) System.out.printf("\n"); + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); + ifail = d02ty.getIFAIL(); + if (ifail != 0) { + System.err.println( + "D02TY failed with error code " + ifail + ); + break; + } + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) break; + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TX failed with error code " + ifail); + } + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + * Fortran array definition: + * a(dimX, 0:*) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + * Fortran array definition: + * a(dimX, dimY, 0:*) + * + * Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TK.Abstract_D02TK_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TK.Abstract_D02TK_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TK.Abstract_D02TK_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} From 5194182122aba243b5766966309bfece9ce3354d Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:19:55 +0000 Subject: [PATCH 121/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 9d2fb26a180af98082ecb33796fbb397cdeae001 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:20:36 +0000 Subject: [PATCH 122/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From 9411913b1abce6dc165c98c98345a22b8cdfe7e4 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:21:30 +0000 Subject: [PATCH 123/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 3fca50d6a1d9a0d1932fb8ba590f658d0add02b0 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:25:04 +0000 Subject: [PATCH 124/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From 59ce755cffc633539d489a33c118894c24757a01 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:26:03 +0000 Subject: [PATCH 125/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 65528ee7c97943112afc20fa2132aea224ccb651 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 14:26:43 +0000 Subject: [PATCH 126/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From f432268e4236c219b5b46b3fe40924ec86ce99bb Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 15:09:11 +0000 Subject: [PATCH 127/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 10c1373b94f87b32f5c05ee951a2bb473bdfe301 Mon Sep 17 00:00:00 2001 From: Christos Date: Fri, 15 Jan 2021 17:36:04 +0200 Subject: [PATCH 128/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 64b8173099ba17dbcb70fc056e00bc7e0eda51c3 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Fri, 15 Jan 2021 15:51:47 +0000 Subject: [PATCH 129/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From 3b2145b7f30ca0c5bd0f284886f193c797a414f6 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Mon, 18 Jan 2021 09:28:04 +0000 Subject: [PATCH 130/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 From 10533431e7c39db2c24d3d70ee542bd0822bdd1f Mon Sep 17 00:00:00 2001 From: Mat Cross Date: Mon, 18 Jan 2021 09:35:00 +0000 Subject: [PATCH 131/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From b5d6003f035a2fc7cfb7676f7288805d775d8882 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Mon, 18 Jan 2021 09:39:48 +0000 Subject: [PATCH 132/196] Simple Examples Synced --- simple_examples/baseresults/a00aaje.r | 10 + simple_examples/baseresults/a00acje.r | 3 + simple_examples/baseresults/a00adje.r | 17 + simple_examples/baseresults/c02aaje.r | 19 + simple_examples/baseresults/c02abje.r | 12 + simple_examples/baseresults/c02afje.r | 28 ++ simple_examples/baseresults/c02agje.r | 27 ++ simple_examples/baseresults/c02ahje.r | 6 + simple_examples/baseresults/c02ajje.r | 6 + simple_examples/baseresults/c02akje.r | 8 + simple_examples/baseresults/c02alje.r | 9 + simple_examples/baseresults/c02amje.r | 8 + simple_examples/baseresults/c02anje.r | 9 + simple_examples/baseresults/c05auje.r | 4 + simple_examples/baseresults/c05awje.r | 4 + simple_examples/baseresults/c05ayje.r | 3 + simple_examples/baseresults/c05azje.r | 15 + simple_examples/baseresults/c05bbje.r | 10 + simple_examples/baseresults/c05mbje.r | 8 + simple_examples/baseresults/c05qbje.r | 8 + simple_examples/baseresults/c06baje.r | 15 + simple_examples/baseresults/c06fkje.r | 13 + simple_examples/baseresults/c09aaje.r | 18 + .../baseresults/complexargumentexample.r | 1 + simple_examples/baseresults/d01bdje.r | 9 + simple_examples/baseresults/d02neje.r | 25 ++ simple_examples/baseresults/d02tkje.r | 113 +++++ simple_examples/baseresults/d02tlje.r | 113 +++++ simple_examples/baseresults/d03pcje.r | 28 ++ simple_examples/baseresults/d03raje.r | 409 +++++++++++++++++ simple_examples/baseresults/d03rbje.r | 59 +++ simple_examples/baseresults/d05baje.r | 12 + simple_examples/baseresults/d05beje.r | 46 ++ simple_examples/baseresults/dtfsmje.r | 10 + simple_examples/baseresults/e01daje.r | 25 ++ simple_examples/baseresults/e02alje.r | 24 + simple_examples/baseresults/e04abje.r | 6 + simple_examples/baseresults/e04bbje.r | 7 + simple_examples/baseresults/e04cbje.r | 4 + simple_examples/baseresults/e04fcje.r | 22 + simple_examples/baseresults/e04ffje.r | 73 +++ simple_examples/baseresults/e04gbje.r | 22 + simple_examples/baseresults/e04ggje.r | 44 ++ simple_examples/baseresults/e04mtje.r | 162 +++++++ simple_examples/baseresults/e04mxje.r | 38 ++ simple_examples/baseresults/e04ncje.r | 23 + simple_examples/baseresults/e04nfje.r | 66 +++ simple_examples/baseresults/e04nkje.r | 26 ++ simple_examples/baseresults/e04nqje.r | 6 + simple_examples/baseresults/e04ptje.r | 39 ++ simple_examples/baseresults/e04rpje.r | 105 +++++ simple_examples/baseresults/e04rsje.r | 35 ++ simple_examples/baseresults/e04rtje.r | 35 ++ simple_examples/baseresults/e04saje.r | 33 ++ simple_examples/baseresults/e04taje.r | 39 ++ simple_examples/baseresults/e04tcje.r | 58 +++ simple_examples/baseresults/e04uc_example.r | 95 ++++ simple_examples/baseresults/e04ucje.r | 22 + simple_examples/baseresults/e04yaje.r | 25 ++ simple_examples/baseresults/f01adje.r | 9 + simple_examples/baseresults/f01ckje.r | 5 + simple_examples/baseresults/f01crje.r | 6 + simple_examples/baseresults/f01dgje.r | 8 + simple_examples/baseresults/f01elje.r | 10 + simple_examples/baseresults/f01emje.r | 10 + simple_examples/baseresults/f02ekje.r | 20 + simple_examples/baseresults/f02fkje.r | 14 + simple_examples/baseresults/f02wgje.r | 7 + simple_examples/baseresults/f03baje.r | 14 + simple_examples/baseresults/f04amje.r | 4 + simple_examples/baseresults/f04baje.r | 14 + simple_examples/baseresults/f05aaje.r | 11 + simple_examples/baseresults/f06clje.r | 3 + simple_examples/baseresults/f07aaje.r | 14 + simple_examples/baseresults/f07abje.r | 23 + simple_examples/baseresults/f07adje.r | 10 + simple_examples/baseresults/f07aqje.r | 7 + simple_examples/baseresults/f07faje.r | 11 + simple_examples/baseresults/f07fbje.r | 19 + simple_examples/baseresults/f08btje.r | 16 + simple_examples/baseresults/f08faje.r | 16 + simple_examples/baseresults/f08xpje.r | 8 + simple_examples/baseresults/g01alje.r | 7 + simple_examples/baseresults/g02akje.r | 14 + simple_examples/baseresults/g02bjje.r | 38 ++ simple_examples/baseresults/g02brje.r | 29 ++ simple_examples/baseresults/g02daje.r | 31 ++ simple_examples/baseresults/g02eeje.r | 20 + simple_examples/baseresults/g02maje.r | 23 + simple_examples/baseresults/g03gaje.r | 79 ++++ simple_examples/baseresults/g05kfje.r | 7 + simple_examples/baseresults/g13awje.r | 4 + simple_examples/baseresults/g13meje.r | 39 ++ simple_examples/baseresults/g13naje.r | 11 + simple_examples/baseresults/h02bbje.r | 79 ++++ simple_examples/baseresults/h02daje.r | 14 + simple_examples/baseresults/m01ccje.r | 15 + .../baseresults/nagcomplexexample.r | 60 +++ simple_examples/baseresults/outputexample.r | 10 + simple_examples/baseresults/s01baje.r | 9 + simple_examples/baseresults/s10aaje.r | 7 + simple_examples/baseresults/s10abje.r | 8 + simple_examples/baseresults/s10acje.r | 8 + simple_examples/baseresults/s14abje.r | 12 + simple_examples/baseresults/s14acje.r | 8 + simple_examples/baseresults/s14afje.r | 5 + simple_examples/baseresults/s17dcje.r | 10 + simple_examples/baseresults/s17dgje.r | 9 + simple_examples/baseresults/s30aaje.r | 16 + simple_examples/baseresults/s30acje.r | 9 + .../baseresults/simpleroutineexample.r | 15 + .../baseresults/userdefinedfunctionexample1.r | 1 + .../baseresults/userdefinedfunctionexample2.r | 1 + simple_examples/baseresults/x03aaje.r | 3 + simple_examples/baseresults/x04cbje.r | 21 + simple_examples/baseresults/x05abje.r | 2 + simple_examples/data/c02abje.d | 14 + simple_examples/data/c02afje.d | 19 + simple_examples/data/c02agje.d | 9 + simple_examples/data/c02ahje.d | 2 + simple_examples/data/c02ajje.d | 2 + simple_examples/data/c02akje.d | 2 + simple_examples/data/c02alje.d | 2 + simple_examples/data/c02amje.d | 5 + simple_examples/data/c02anje.d | 6 + simple_examples/data/c05bbje.d | 7 + simple_examples/data/c06fkje.d | 11 + simple_examples/data/c09aaje.d | 11 + simple_examples/data/d03pcje.d | 6 + simple_examples/data/e02alje.d | 23 + simple_examples/data/e04fcje.d | 16 + simple_examples/data/e04mxje.d | 64 +++ simple_examples/data/e04ncje.d | 21 + simple_examples/data/e04nfje.d | 22 + simple_examples/data/e04nqje.d | 67 +++ simple_examples/data/e04rsje.d | 13 + simple_examples/data/e04rtje.d | 8 + simple_examples/data/e04saje.opt | 30 ++ simple_examples/data/e04tcje.d | 22 + simple_examples/data/f03baje.d | 5 + simple_examples/data/f04amje.d | 5 + simple_examples/data/f04baje.d | 13 + simple_examples/data/f05aaje.d | 6 + simple_examples/data/f08btje.d | 15 + simple_examples/data/f08xpje.d | 10 + simple_examples/data/g02bjje.d | 10 + simple_examples/data/g02daje.d | 15 + simple_examples/data/g02eeje.d | 24 + simple_examples/data/g02maje.d | 23 + simple_examples/data/g03gaje.d | 56 +++ simple_examples/data/g05kfje.d | 3 + simple_examples/data/g13naje.d | 14 + simple_examples/data/m01ccje.d | 13 + simple_examples/data/mytemp | 0 simple_examples/data/s14abje.d | 10 + simple_examples/data/s14acje.d | 5 + simple_examples/data/s14afje.d | 2 + simple_examples/data/s17dcje.d | 6 + simple_examples/data/s17dgje.d | 6 + simple_examples/data/s30aaje.d | 9 + simple_examples/data/s30acje.d | 9 + simple_examples/data/x03aaje.d | 5 + simple_examples/source/int32/A00AAJE.java | 16 + simple_examples/source/int32/A00ACJE.java | 29 ++ simple_examples/source/int32/A00ADJE.java | 107 +++++ simple_examples/source/int32/C02AAJE.java | 174 ++++++++ simple_examples/source/int32/C02ABJE.java | 217 +++++++++ simple_examples/source/int32/C02AFJE.java | 271 +++++++++++ simple_examples/source/int32/C02AGJE.java | 262 +++++++++++ simple_examples/source/int32/C02AHJE.java | 61 +++ simple_examples/source/int32/C02AJJE.java | 65 +++ simple_examples/source/int32/C02AKJE.java | 62 +++ simple_examples/source/int32/C02ALJE.java | 64 +++ simple_examples/source/int32/C02AMJE.java | 75 ++++ simple_examples/source/int32/C02ANJE.java | 80 ++++ simple_examples/source/int32/C05AUJE.java | 67 +++ simple_examples/source/int32/C05AWJE.java | 59 +++ simple_examples/source/int32/C05AYJE.java | 44 ++ simple_examples/source/int32/C05AZJE.java | 65 +++ simple_examples/source/int32/C05BBJE.java | 89 ++++ simple_examples/source/int32/C05MBJE.java | 95 ++++ simple_examples/source/int32/C05QBJE.java | 167 +++++++ simple_examples/source/int32/C06BAJE.java | 56 +++ simple_examples/source/int32/C06FKJE.java | 91 ++++ simple_examples/source/int32/C09AAJE.java | 158 +++++++ simple_examples/source/int32/D01BDJE.java | 58 +++ simple_examples/source/int32/D01RJJE.java | 184 ++++++++ simple_examples/source/int32/D01RKJE.java | 173 ++++++++ simple_examples/source/int32/D01RLJE.java | 196 ++++++++ simple_examples/source/int32/D01RMJE.java | 163 +++++++ simple_examples/source/int32/D01TCJE.java | 45 ++ simple_examples/source/int32/D02NEJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D02TLJE.java | 290 ++++++++++++ simple_examples/source/int32/D03PCJE.java | 217 +++++++++ simple_examples/source/int32/D03RAJE.java | 307 +++++++++++++ simple_examples/source/int32/D03RBJE.java | 388 ++++++++++++++++ simple_examples/source/int32/D05BAJE.java | 111 +++++ simple_examples/source/int32/D05BEJE.java | 185 ++++++++ simple_examples/source/int32/DTFSMJE.java | 54 +++ simple_examples/source/int32/E01DAJE.java | 182 ++++++++ simple_examples/source/int32/E02ALJE.java | 101 +++++ simple_examples/source/int32/E04ABJE.java | 76 ++++ simple_examples/source/int32/E04BBJE.java | 81 ++++ simple_examples/source/int32/E04CBJE.java | 90 ++++ simple_examples/source/int32/E04FCJE.java | 420 ++++++++++++++++++ simple_examples/source/int32/E04FFJE.java | 140 ++++++ simple_examples/source/int32/E04GBJE.java | 183 ++++++++ simple_examples/source/int32/E04GGJE.java | 219 +++++++++ simple_examples/source/int32/E04MTJE.java | 132 ++++++ simple_examples/source/int32/E04MXJE.java | 292 ++++++++++++ simple_examples/source/int32/E04NCJE.java | 246 ++++++++++ simple_examples/source/int32/E04NFJE.java | 234 ++++++++++ simple_examples/source/int32/E04NKJE.java | 295 ++++++++++++ simple_examples/source/int32/E04NQJE.java | 384 ++++++++++++++++ simple_examples/source/int32/E04PTJE.java | 344 ++++++++++++++ simple_examples/source/int32/E04RPJE.java | 199 +++++++++ simple_examples/source/int32/E04RSJE.java | 229 ++++++++++ simple_examples/source/int32/E04RTJE.java | 225 ++++++++++ simple_examples/source/int32/E04SAJE.java | 104 +++++ simple_examples/source/int32/E04TAJE.java | 188 ++++++++ simple_examples/source/int32/E04TCJE.java | 263 +++++++++++ simple_examples/source/int32/E04UCJE.java | 211 +++++++++ simple_examples/source/int32/E04YAJE.java | 112 +++++ simple_examples/source/int32/F01ADJE.java | 39 ++ simple_examples/source/int32/F01CKJE.java | 60 +++ simple_examples/source/int32/F01CRJE.java | 47 ++ simple_examples/source/int32/F01DGJE.java | 72 +++ simple_examples/source/int32/F01ELJE.java | 89 ++++ simple_examples/source/int32/F01EMJE.java | 106 +++++ simple_examples/source/int32/F02EKJE.java | 227 ++++++++++ simple_examples/source/int32/F02FKJE.java | 230 ++++++++++ simple_examples/source/int32/F02WGJE.java | 132 ++++++ simple_examples/source/int32/F03BAJE.java | 108 +++++ simple_examples/source/int32/F04AMJE.java | 114 +++++ simple_examples/source/int32/F04BAJE.java | 144 ++++++ simple_examples/source/int32/F05AAJE.java | 99 +++++ simple_examples/source/int32/F06CLJE.java | 40 ++ simple_examples/source/int32/F07AAJE.java | 90 ++++ simple_examples/source/int32/F07ABJE.java | 134 ++++++ simple_examples/source/int32/F07ADJE.java | 72 +++ simple_examples/source/int32/F07AQJE.java | 99 +++++ simple_examples/source/int32/F07FAJE.java | 79 ++++ simple_examples/source/int32/F07FBJE.java | 122 +++++ simple_examples/source/int32/F08BTJE.java | 228 ++++++++++ simple_examples/source/int32/F08FAJE.java | 113 +++++ simple_examples/source/int32/F08XPJE.java | 297 +++++++++++++ simple_examples/source/int32/G01ALJE.java | 55 +++ simple_examples/source/int32/G02AKJE.java | 68 +++ simple_examples/source/int32/G02BJJE.java | 303 +++++++++++++ simple_examples/source/int32/G02BRJE.java | 134 ++++++ simple_examples/source/int32/G02DAJE.java | 187 ++++++++ simple_examples/source/int32/G02EEJE.java | 184 ++++++++ simple_examples/source/int32/G02MAJE.java | 130 ++++++ simple_examples/source/int32/G03GAJE.java | 355 +++++++++++++++ simple_examples/source/int32/G05KFJE.java | 105 +++++ simple_examples/source/int32/G13AWJE.java | 31 ++ simple_examples/source/int32/G13MEJE.java | 160 +++++++ simple_examples/source/int32/G13NAJE.java | 123 +++++ simple_examples/source/int32/H02BBJE.java | 92 ++++ simple_examples/source/int32/H02DAJE.java | 228 ++++++++++ simple_examples/source/int32/M01CCJE.java | 42 ++ simple_examples/source/int32/S01BAJE.java | 39 ++ simple_examples/source/int32/S10AAJE.java | 40 ++ simple_examples/source/int32/S10ABJE.java | 41 ++ simple_examples/source/int32/S10ACJE.java | 41 ++ simple_examples/source/int32/S14ABJE.java | 71 +++ simple_examples/source/int32/S14ACJE.java | 68 +++ simple_examples/source/int32/S14AFJE.java | 80 ++++ simple_examples/source/int32/S17DCJE.java | 69 +++ simple_examples/source/int32/S17DGJE.java | 61 +++ simple_examples/source/int32/S30AAJE.java | 109 +++++ simple_examples/source/int32/S30ACJE.java | 129 ++++++ simple_examples/source/int32/X03AAJE.java | 87 ++++ simple_examples/source/int32/X04CBJE.java | 53 +++ simple_examples/source/int32/X05ABJE.java | 25 ++ simple_examples/source/int64/A00AAJE.java | 14 + simple_examples/source/int64/A00ADJE.java | 113 +++++ simple_examples/source/int64/C05AYJE.java | 45 ++ simple_examples/source/int64/C05AZJE.java | 65 +++ simple_examples/source/int64/C05MBJE.java | 104 +++++ simple_examples/source/int64/C05QBJE.java | 178 ++++++++ simple_examples/source/int64/D01BDJE.java | 57 +++ simple_examples/source/int64/D02NEJE.java | 393 ++++++++++++++++ simple_examples/source/int64/DTFSMJE.java | 61 +++ simple_examples/source/int64/E01DAJE.java | 177 ++++++++ simple_examples/source/int64/E04FCJE.java | 415 +++++++++++++++++ simple_examples/source/int64/E04MTJE.java | 134 ++++++ simple_examples/source/int64/E04NFJE.java | 223 ++++++++++ simple_examples/source/int64/E04UCJE.java | 207 +++++++++ simple_examples/source/int64/F02EKJE.java | 230 ++++++++++ simple_examples/source/withdrawn/D02TKJE.java | 290 ++++++++++++ 291 files changed, 22288 insertions(+) create mode 100644 simple_examples/baseresults/a00aaje.r create mode 100644 simple_examples/baseresults/a00acje.r create mode 100644 simple_examples/baseresults/a00adje.r create mode 100644 simple_examples/baseresults/c02aaje.r create mode 100644 simple_examples/baseresults/c02abje.r create mode 100644 simple_examples/baseresults/c02afje.r create mode 100644 simple_examples/baseresults/c02agje.r create mode 100644 simple_examples/baseresults/c02ahje.r create mode 100644 simple_examples/baseresults/c02ajje.r create mode 100644 simple_examples/baseresults/c02akje.r create mode 100644 simple_examples/baseresults/c02alje.r create mode 100644 simple_examples/baseresults/c02amje.r create mode 100644 simple_examples/baseresults/c02anje.r create mode 100644 simple_examples/baseresults/c05auje.r create mode 100644 simple_examples/baseresults/c05awje.r create mode 100644 simple_examples/baseresults/c05ayje.r create mode 100644 simple_examples/baseresults/c05azje.r create mode 100644 simple_examples/baseresults/c05bbje.r create mode 100644 simple_examples/baseresults/c05mbje.r create mode 100644 simple_examples/baseresults/c05qbje.r create mode 100644 simple_examples/baseresults/c06baje.r create mode 100644 simple_examples/baseresults/c06fkje.r create mode 100644 simple_examples/baseresults/c09aaje.r create mode 100644 simple_examples/baseresults/complexargumentexample.r create mode 100644 simple_examples/baseresults/d01bdje.r create mode 100644 simple_examples/baseresults/d02neje.r create mode 100644 simple_examples/baseresults/d02tkje.r create mode 100644 simple_examples/baseresults/d02tlje.r create mode 100644 simple_examples/baseresults/d03pcje.r create mode 100644 simple_examples/baseresults/d03raje.r create mode 100644 simple_examples/baseresults/d03rbje.r create mode 100644 simple_examples/baseresults/d05baje.r create mode 100644 simple_examples/baseresults/d05beje.r create mode 100644 simple_examples/baseresults/dtfsmje.r create mode 100644 simple_examples/baseresults/e01daje.r create mode 100644 simple_examples/baseresults/e02alje.r create mode 100644 simple_examples/baseresults/e04abje.r create mode 100644 simple_examples/baseresults/e04bbje.r create mode 100644 simple_examples/baseresults/e04cbje.r create mode 100644 simple_examples/baseresults/e04fcje.r create mode 100644 simple_examples/baseresults/e04ffje.r create mode 100644 simple_examples/baseresults/e04gbje.r create mode 100644 simple_examples/baseresults/e04ggje.r create mode 100644 simple_examples/baseresults/e04mtje.r create mode 100644 simple_examples/baseresults/e04mxje.r create mode 100644 simple_examples/baseresults/e04ncje.r create mode 100644 simple_examples/baseresults/e04nfje.r create mode 100644 simple_examples/baseresults/e04nkje.r create mode 100644 simple_examples/baseresults/e04nqje.r create mode 100644 simple_examples/baseresults/e04ptje.r create mode 100644 simple_examples/baseresults/e04rpje.r create mode 100644 simple_examples/baseresults/e04rsje.r create mode 100644 simple_examples/baseresults/e04rtje.r create mode 100644 simple_examples/baseresults/e04saje.r create mode 100644 simple_examples/baseresults/e04taje.r create mode 100644 simple_examples/baseresults/e04tcje.r create mode 100644 simple_examples/baseresults/e04uc_example.r create mode 100644 simple_examples/baseresults/e04ucje.r create mode 100644 simple_examples/baseresults/e04yaje.r create mode 100644 simple_examples/baseresults/f01adje.r create mode 100644 simple_examples/baseresults/f01ckje.r create mode 100644 simple_examples/baseresults/f01crje.r create mode 100644 simple_examples/baseresults/f01dgje.r create mode 100644 simple_examples/baseresults/f01elje.r create mode 100644 simple_examples/baseresults/f01emje.r create mode 100644 simple_examples/baseresults/f02ekje.r create mode 100644 simple_examples/baseresults/f02fkje.r create mode 100644 simple_examples/baseresults/f02wgje.r create mode 100644 simple_examples/baseresults/f03baje.r create mode 100644 simple_examples/baseresults/f04amje.r create mode 100644 simple_examples/baseresults/f04baje.r create mode 100644 simple_examples/baseresults/f05aaje.r create mode 100644 simple_examples/baseresults/f06clje.r create mode 100644 simple_examples/baseresults/f07aaje.r create mode 100644 simple_examples/baseresults/f07abje.r create mode 100644 simple_examples/baseresults/f07adje.r create mode 100644 simple_examples/baseresults/f07aqje.r create mode 100644 simple_examples/baseresults/f07faje.r create mode 100644 simple_examples/baseresults/f07fbje.r create mode 100644 simple_examples/baseresults/f08btje.r create mode 100644 simple_examples/baseresults/f08faje.r create mode 100644 simple_examples/baseresults/f08xpje.r create mode 100644 simple_examples/baseresults/g01alje.r create mode 100644 simple_examples/baseresults/g02akje.r create mode 100644 simple_examples/baseresults/g02bjje.r create mode 100644 simple_examples/baseresults/g02brje.r create mode 100644 simple_examples/baseresults/g02daje.r create mode 100644 simple_examples/baseresults/g02eeje.r create mode 100644 simple_examples/baseresults/g02maje.r create mode 100644 simple_examples/baseresults/g03gaje.r create mode 100644 simple_examples/baseresults/g05kfje.r create mode 100644 simple_examples/baseresults/g13awje.r create mode 100644 simple_examples/baseresults/g13meje.r create mode 100644 simple_examples/baseresults/g13naje.r create mode 100644 simple_examples/baseresults/h02bbje.r create mode 100644 simple_examples/baseresults/h02daje.r create mode 100644 simple_examples/baseresults/m01ccje.r create mode 100644 simple_examples/baseresults/nagcomplexexample.r create mode 100644 simple_examples/baseresults/outputexample.r create mode 100644 simple_examples/baseresults/s01baje.r create mode 100644 simple_examples/baseresults/s10aaje.r create mode 100644 simple_examples/baseresults/s10abje.r create mode 100644 simple_examples/baseresults/s10acje.r create mode 100644 simple_examples/baseresults/s14abje.r create mode 100644 simple_examples/baseresults/s14acje.r create mode 100644 simple_examples/baseresults/s14afje.r create mode 100644 simple_examples/baseresults/s17dcje.r create mode 100644 simple_examples/baseresults/s17dgje.r create mode 100644 simple_examples/baseresults/s30aaje.r create mode 100644 simple_examples/baseresults/s30acje.r create mode 100644 simple_examples/baseresults/simpleroutineexample.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample1.r create mode 100644 simple_examples/baseresults/userdefinedfunctionexample2.r create mode 100644 simple_examples/baseresults/x03aaje.r create mode 100644 simple_examples/baseresults/x04cbje.r create mode 100644 simple_examples/baseresults/x05abje.r create mode 100644 simple_examples/data/c02abje.d create mode 100644 simple_examples/data/c02afje.d create mode 100644 simple_examples/data/c02agje.d create mode 100644 simple_examples/data/c02ahje.d create mode 100644 simple_examples/data/c02ajje.d create mode 100644 simple_examples/data/c02akje.d create mode 100644 simple_examples/data/c02alje.d create mode 100644 simple_examples/data/c02amje.d create mode 100644 simple_examples/data/c02anje.d create mode 100644 simple_examples/data/c05bbje.d create mode 100644 simple_examples/data/c06fkje.d create mode 100644 simple_examples/data/c09aaje.d create mode 100644 simple_examples/data/d03pcje.d create mode 100644 simple_examples/data/e02alje.d create mode 100644 simple_examples/data/e04fcje.d create mode 100644 simple_examples/data/e04mxje.d create mode 100644 simple_examples/data/e04ncje.d create mode 100644 simple_examples/data/e04nfje.d create mode 100644 simple_examples/data/e04nqje.d create mode 100644 simple_examples/data/e04rsje.d create mode 100644 simple_examples/data/e04rtje.d create mode 100644 simple_examples/data/e04saje.opt create mode 100644 simple_examples/data/e04tcje.d create mode 100644 simple_examples/data/f03baje.d create mode 100644 simple_examples/data/f04amje.d create mode 100644 simple_examples/data/f04baje.d create mode 100644 simple_examples/data/f05aaje.d create mode 100644 simple_examples/data/f08btje.d create mode 100644 simple_examples/data/f08xpje.d create mode 100644 simple_examples/data/g02bjje.d create mode 100644 simple_examples/data/g02daje.d create mode 100644 simple_examples/data/g02eeje.d create mode 100644 simple_examples/data/g02maje.d create mode 100644 simple_examples/data/g03gaje.d create mode 100644 simple_examples/data/g05kfje.d create mode 100644 simple_examples/data/g13naje.d create mode 100644 simple_examples/data/m01ccje.d create mode 100644 simple_examples/data/mytemp create mode 100644 simple_examples/data/s14abje.d create mode 100644 simple_examples/data/s14acje.d create mode 100644 simple_examples/data/s14afje.d create mode 100644 simple_examples/data/s17dcje.d create mode 100644 simple_examples/data/s17dgje.d create mode 100644 simple_examples/data/s30aaje.d create mode 100644 simple_examples/data/s30acje.d create mode 100644 simple_examples/data/x03aaje.d create mode 100644 simple_examples/source/int32/A00AAJE.java create mode 100644 simple_examples/source/int32/A00ACJE.java create mode 100644 simple_examples/source/int32/A00ADJE.java create mode 100644 simple_examples/source/int32/C02AAJE.java create mode 100644 simple_examples/source/int32/C02ABJE.java create mode 100644 simple_examples/source/int32/C02AFJE.java create mode 100644 simple_examples/source/int32/C02AGJE.java create mode 100644 simple_examples/source/int32/C02AHJE.java create mode 100644 simple_examples/source/int32/C02AJJE.java create mode 100644 simple_examples/source/int32/C02AKJE.java create mode 100644 simple_examples/source/int32/C02ALJE.java create mode 100644 simple_examples/source/int32/C02AMJE.java create mode 100644 simple_examples/source/int32/C02ANJE.java create mode 100644 simple_examples/source/int32/C05AUJE.java create mode 100644 simple_examples/source/int32/C05AWJE.java create mode 100644 simple_examples/source/int32/C05AYJE.java create mode 100644 simple_examples/source/int32/C05AZJE.java create mode 100644 simple_examples/source/int32/C05BBJE.java create mode 100644 simple_examples/source/int32/C05MBJE.java create mode 100644 simple_examples/source/int32/C05QBJE.java create mode 100644 simple_examples/source/int32/C06BAJE.java create mode 100644 simple_examples/source/int32/C06FKJE.java create mode 100644 simple_examples/source/int32/C09AAJE.java create mode 100644 simple_examples/source/int32/D01BDJE.java create mode 100644 simple_examples/source/int32/D01RJJE.java create mode 100644 simple_examples/source/int32/D01RKJE.java create mode 100644 simple_examples/source/int32/D01RLJE.java create mode 100644 simple_examples/source/int32/D01RMJE.java create mode 100644 simple_examples/source/int32/D01TCJE.java create mode 100644 simple_examples/source/int32/D02NEJE.java create mode 100644 simple_examples/source/int32/D02TLJE.java create mode 100644 simple_examples/source/int32/D03PCJE.java create mode 100644 simple_examples/source/int32/D03RAJE.java create mode 100644 simple_examples/source/int32/D03RBJE.java create mode 100644 simple_examples/source/int32/D05BAJE.java create mode 100644 simple_examples/source/int32/D05BEJE.java create mode 100644 simple_examples/source/int32/DTFSMJE.java create mode 100644 simple_examples/source/int32/E01DAJE.java create mode 100644 simple_examples/source/int32/E02ALJE.java create mode 100644 simple_examples/source/int32/E04ABJE.java create mode 100644 simple_examples/source/int32/E04BBJE.java create mode 100644 simple_examples/source/int32/E04CBJE.java create mode 100644 simple_examples/source/int32/E04FCJE.java create mode 100644 simple_examples/source/int32/E04FFJE.java create mode 100644 simple_examples/source/int32/E04GBJE.java create mode 100644 simple_examples/source/int32/E04GGJE.java create mode 100644 simple_examples/source/int32/E04MTJE.java create mode 100644 simple_examples/source/int32/E04MXJE.java create mode 100644 simple_examples/source/int32/E04NCJE.java create mode 100644 simple_examples/source/int32/E04NFJE.java create mode 100644 simple_examples/source/int32/E04NKJE.java create mode 100644 simple_examples/source/int32/E04NQJE.java create mode 100644 simple_examples/source/int32/E04PTJE.java create mode 100644 simple_examples/source/int32/E04RPJE.java create mode 100644 simple_examples/source/int32/E04RSJE.java create mode 100644 simple_examples/source/int32/E04RTJE.java create mode 100644 simple_examples/source/int32/E04SAJE.java create mode 100644 simple_examples/source/int32/E04TAJE.java create mode 100644 simple_examples/source/int32/E04TCJE.java create mode 100644 simple_examples/source/int32/E04UCJE.java create mode 100644 simple_examples/source/int32/E04YAJE.java create mode 100644 simple_examples/source/int32/F01ADJE.java create mode 100644 simple_examples/source/int32/F01CKJE.java create mode 100644 simple_examples/source/int32/F01CRJE.java create mode 100644 simple_examples/source/int32/F01DGJE.java create mode 100644 simple_examples/source/int32/F01ELJE.java create mode 100644 simple_examples/source/int32/F01EMJE.java create mode 100644 simple_examples/source/int32/F02EKJE.java create mode 100644 simple_examples/source/int32/F02FKJE.java create mode 100644 simple_examples/source/int32/F02WGJE.java create mode 100644 simple_examples/source/int32/F03BAJE.java create mode 100644 simple_examples/source/int32/F04AMJE.java create mode 100644 simple_examples/source/int32/F04BAJE.java create mode 100644 simple_examples/source/int32/F05AAJE.java create mode 100644 simple_examples/source/int32/F06CLJE.java create mode 100644 simple_examples/source/int32/F07AAJE.java create mode 100644 simple_examples/source/int32/F07ABJE.java create mode 100644 simple_examples/source/int32/F07ADJE.java create mode 100644 simple_examples/source/int32/F07AQJE.java create mode 100644 simple_examples/source/int32/F07FAJE.java create mode 100644 simple_examples/source/int32/F07FBJE.java create mode 100644 simple_examples/source/int32/F08BTJE.java create mode 100644 simple_examples/source/int32/F08FAJE.java create mode 100644 simple_examples/source/int32/F08XPJE.java create mode 100644 simple_examples/source/int32/G01ALJE.java create mode 100644 simple_examples/source/int32/G02AKJE.java create mode 100644 simple_examples/source/int32/G02BJJE.java create mode 100644 simple_examples/source/int32/G02BRJE.java create mode 100644 simple_examples/source/int32/G02DAJE.java create mode 100644 simple_examples/source/int32/G02EEJE.java create mode 100644 simple_examples/source/int32/G02MAJE.java create mode 100644 simple_examples/source/int32/G03GAJE.java create mode 100644 simple_examples/source/int32/G05KFJE.java create mode 100644 simple_examples/source/int32/G13AWJE.java create mode 100644 simple_examples/source/int32/G13MEJE.java create mode 100644 simple_examples/source/int32/G13NAJE.java create mode 100644 simple_examples/source/int32/H02BBJE.java create mode 100644 simple_examples/source/int32/H02DAJE.java create mode 100644 simple_examples/source/int32/M01CCJE.java create mode 100644 simple_examples/source/int32/S01BAJE.java create mode 100644 simple_examples/source/int32/S10AAJE.java create mode 100644 simple_examples/source/int32/S10ABJE.java create mode 100644 simple_examples/source/int32/S10ACJE.java create mode 100644 simple_examples/source/int32/S14ABJE.java create mode 100644 simple_examples/source/int32/S14ACJE.java create mode 100644 simple_examples/source/int32/S14AFJE.java create mode 100644 simple_examples/source/int32/S17DCJE.java create mode 100644 simple_examples/source/int32/S17DGJE.java create mode 100644 simple_examples/source/int32/S30AAJE.java create mode 100644 simple_examples/source/int32/S30ACJE.java create mode 100644 simple_examples/source/int32/X03AAJE.java create mode 100644 simple_examples/source/int32/X04CBJE.java create mode 100644 simple_examples/source/int32/X05ABJE.java create mode 100644 simple_examples/source/int64/A00AAJE.java create mode 100644 simple_examples/source/int64/A00ADJE.java create mode 100644 simple_examples/source/int64/C05AYJE.java create mode 100644 simple_examples/source/int64/C05AZJE.java create mode 100644 simple_examples/source/int64/C05MBJE.java create mode 100644 simple_examples/source/int64/C05QBJE.java create mode 100644 simple_examples/source/int64/D01BDJE.java create mode 100644 simple_examples/source/int64/D02NEJE.java create mode 100644 simple_examples/source/int64/DTFSMJE.java create mode 100644 simple_examples/source/int64/E01DAJE.java create mode 100644 simple_examples/source/int64/E04FCJE.java create mode 100644 simple_examples/source/int64/E04MTJE.java create mode 100644 simple_examples/source/int64/E04NFJE.java create mode 100644 simple_examples/source/int64/E04UCJE.java create mode 100644 simple_examples/source/int64/F02EKJE.java create mode 100644 simple_examples/source/withdrawn/D02TKJE.java diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r new file mode 100644 index 0000000..adcba2f --- /dev/null +++ b/simple_examples/baseresults/a00aaje.r @@ -0,0 +1,10 @@ + A00AAJ Example Program Results + + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: double precision + Product Code: CLL6I262CL + Mark: 27.2.0 (self-contained) + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/a00acje.r b/simple_examples/baseresults/a00acje.r new file mode 100644 index 0000000..0012531 --- /dev/null +++ b/simple_examples/baseresults/a00acje.r @@ -0,0 +1,3 @@ + A00ACJ Example Program Results + + A valid licence key is available diff --git a/simple_examples/baseresults/a00adje.r b/simple_examples/baseresults/a00adje.r new file mode 100644 index 0000000..5fb1839 --- /dev/null +++ b/simple_examples/baseresults/a00adje.r @@ -0,0 +1,17 @@ + A00ADJ Example Program Results + +*** Start of NAG Library implementation details *** + +Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) + Precision: Fortran double precision + Product code: CLL6I262CL + Mark: 26.2 + Vendor Library: None +Applicable to: + hardware: x86_64 + operating system: Linux 2.6.32-696.6.3.el6.x86_64 + Fortran compiler: Intel ifort Version 18.0.1.163 20171018 +and compatible systems. + Licence query: Successful + +*** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/c02aaje.r b/simple_examples/baseresults/c02aaje.r new file mode 100644 index 0000000..fa3083b --- /dev/null +++ b/simple_examples/baseresults/c02aaje.r @@ -0,0 +1,19 @@ + C02AAJ Example Program Results + + Example 1: Basic Problem + + i z conv berr cond + --------------------------------------------------- + 1 6.53E-03, 7.42E-03 3 9.25E-18 4.84E+00 + 2 -6.93E-03, -7.44E-03 2 0.00E+00 4.95E+00 + 3 -2.43E+01, -4.86E+00 3 8.41E-18 1.13E+01 + 4 1.47E+01, -1.66E+01 3 1.07E-17 9.99E+00 + 5 5.25E+00, 2.27E+01 3 2.08E-17 1.06E+01 + + Example 2: Polishing Processes + + polish relerr fwderr + ---------------------------- + 0 3.18E-10 1.15E-04 + 1 6.16E-11 8.49E-06 + 2 1.11E-16 1.11E-16 diff --git a/simple_examples/baseresults/c02abje.r b/simple_examples/baseresults/c02abje.r new file mode 100644 index 0000000..01b29cd --- /dev/null +++ b/simple_examples/baseresults/c02abje.r @@ -0,0 +1,12 @@ + C02ABJ Example Program Results + + Basic Problem + + i z conv berr cond + ----------------------------------------------------- + 1 ( 1.15E+00, 7.36E-01) 3 5.37E-18 1.34E+01 + 2 ( -1.67E+00, 3.25E-01) 3 6.34E-18 2.20E+01 + 3 ( 3.79E-01, -1.25E+00) 3 2.98E-18 1.02E+01 + 4 ( -1.67E+00, -3.25E-01) 3 4.57E-18 2.20E+01 + 5 ( 1.15E+00, -7.36E-01) 3 1.04E-17 1.34E+01 + 6 ( 3.79E-01, 1.25E+00) 2 1.66E-18 1.02E+01 diff --git a/simple_examples/baseresults/c02afje.r b/simple_examples/baseresults/c02afje.r new file mode 100644 index 0000000..386d4fe --- /dev/null +++ b/simple_examples/baseresults/c02afje.r @@ -0,0 +1,28 @@ + C02AFJ Example Program Results + + + Example 1 + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -2.4328E+01 -4.8555E+00*i + z = 5.2487E+00 +2.2736E+01*i + z = 1.4653E+01 -1.6569E+01*i + z = -6.9264E-03 -7.4434E-03*i + z = 6.5264E-03 +7.4232E-03*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -2.4328E+01 -4.8555E+00*i 5.7E-16 + z = 5.2487E+00 +2.2736E+01*i 1.5E-16 + z = 1.4653E+01 -1.6569E+01*i 4.8E-16 + z = -6.9264E-03 -7.4434E-03*i 1.1E-16 + z = 6.5264E-03 +7.4232E-03*i 1.8E-16 diff --git a/simple_examples/baseresults/c02agje.r b/simple_examples/baseresults/c02agje.r new file mode 100644 index 0000000..8e10c18 --- /dev/null +++ b/simple_examples/baseresults/c02agje.r @@ -0,0 +1,27 @@ + C02AGJ Example Program Results + + + Example 1 + + + Degree of polynomial = 5 + + Computed roots of polynomial + + z = -1.4918E+00 + z = 5.5169E-01 +/- 1.2533E+00*i + z = -8.0579E-01 +/- 1.2229E+00*i + + + Example 2 + + Degree of polynomial = 5 + + Computed roots of polynomial Error estimates + (machine-dependent) + + z = -1.4918E+00 +0.0000E+00*i 7.4E-16 + z = 5.5169E-01 +1.2533E+00*i 1.1E-16 + z = 5.5169E-01 -1.2533E+00*i 1.1E-16 + z = -8.0579E-01 +1.2229E+00*i 3.0E-16 + z = -8.0579E-01 -1.2229E+00*i 3.0E-16 diff --git a/simple_examples/baseresults/c02ahje.r b/simple_examples/baseresults/c02ahje.r new file mode 100644 index 0000000..e3efc97 --- /dev/null +++ b/simple_examples/baseresults/c02ahje.r @@ -0,0 +1,6 @@ + C02AHJ Example Program Results + + Roots of quadratic equation + + z = 1.0000E+00 +2.0000E+00*i + z = 2.0000E+00 -3.0000E+00*i diff --git a/simple_examples/baseresults/c02ajje.r b/simple_examples/baseresults/c02ajje.r new file mode 100644 index 0000000..944fa06 --- /dev/null +++ b/simple_examples/baseresults/c02ajje.r @@ -0,0 +1,6 @@ + C02AJJ Example Program Results + + Roots of quadratic equation + + z = 2.0000E+00 + z = -5.0000E+00 diff --git a/simple_examples/baseresults/c02akje.r b/simple_examples/baseresults/c02akje.r new file mode 100644 index 0000000..34b3e74 --- /dev/null +++ b/simple_examples/baseresults/c02akje.r @@ -0,0 +1,8 @@ + C02AKJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = 1.0000E+00 +0.0000E+00*i 1.0E-15 + z = -2.0000E+00 +3.0000E+00*i 1.0E-15 + z = -2.0000E+00 -3.0000E+00*i 1.0E-15 diff --git a/simple_examples/baseresults/c02alje.r b/simple_examples/baseresults/c02alje.r new file mode 100644 index 0000000..ff49a36 --- /dev/null +++ b/simple_examples/baseresults/c02alje.r @@ -0,0 +1,9 @@ + C02ALJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 2.0000E+00 +0.0000E+00*i 1.2E-15 + z = -2.0000E+00 +0.0000E+00*i 1.1E-15 + z = -1.0000E+00 +3.0000E+00*i 1.1E-15 + z = -1.0000E+00 -3.0000E+00*i 1.1E-15 diff --git a/simple_examples/baseresults/c02amje.r b/simple_examples/baseresults/c02amje.r new file mode 100644 index 0000000..c2c70b4 --- /dev/null +++ b/simple_examples/baseresults/c02amje.r @@ -0,0 +1,8 @@ + C02AMJ Example Program Results + + Roots of cubic equation Error estimates + (machine-dependent) + + z = -2.0000E+00 +3.0000E+00*i 1.3E-15 + z = 1.0000E+00 -2.0000E+00*i 2.2E-15 + z = 3.0000E+00 -4.0000E+00*i 2.1E-15 diff --git a/simple_examples/baseresults/c02anje.r b/simple_examples/baseresults/c02anje.r new file mode 100644 index 0000000..4361b7e --- /dev/null +++ b/simple_examples/baseresults/c02anje.r @@ -0,0 +1,9 @@ + C02ANJ Example Program Results + + Roots of quartic equation Error estimates + (machine-dependent) + + z = 3.0000E+00 -2.0000E+00*i 1.8E-15 + z = 1.0000E+00 -2.0000E+00*i 1.8E-15 + z = -2.0000E+00 +1.0000E+00*i 1.8E-15 + z = -2.0000E+00 +3.0000E+00*i 1.8E-15 diff --git a/simple_examples/baseresults/c05auje.r b/simple_examples/baseresults/c05auje.r new file mode 100644 index 0000000..1c8bb18 --- /dev/null +++ b/simple_examples/baseresults/c05auje.r @@ -0,0 +1,4 @@ +C05AUJ Example Program Results + +Root is : 0.56714 +Interval searched is : [ 0.50000, 0.90000] diff --git a/simple_examples/baseresults/c05awje.r b/simple_examples/baseresults/c05awje.r new file mode 100644 index 0000000..0868382 --- /dev/null +++ b/simple_examples/baseresults/c05awje.r @@ -0,0 +1,4 @@ +C05AWJ Example Program Results + +With eps = 1.00e-03 root = 0.56715 +With eps = 1.00e-04 root = 0.56715 diff --git a/simple_examples/baseresults/c05ayje.r b/simple_examples/baseresults/c05ayje.r new file mode 100644 index 0000000..50a0010 --- /dev/null +++ b/simple_examples/baseresults/c05ayje.r @@ -0,0 +1,3 @@ +C05AYJ Example Program Results + +Zero at x = 0.56714 diff --git a/simple_examples/baseresults/c05azje.r b/simple_examples/baseresults/c05azje.r new file mode 100644 index 0000000..1d3b6bc --- /dev/null +++ b/simple_examples/baseresults/c05azje.r @@ -0,0 +1,15 @@ + C05AZJ Example Program Results + + Iterations + + X = 0.00000 FX = 1.0000E+00 IND = 2 + X = 1.00000 FX = -6.3212E-01 IND = 3 + X = 0.61270 FX = -7.0814E-02 IND = 4 + X = 0.56707 FX = 1.1542E-04 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + X = 0.56713 FX = 1.4727E-05 IND = 4 + X = 0.56714 FX = -9.4481E-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/c05bbje.r b/simple_examples/baseresults/c05bbje.r new file mode 100644 index 0000000..a963b94 --- /dev/null +++ b/simple_examples/baseresults/c05bbje.r @@ -0,0 +1,10 @@ +C05BBJ Example Program Results +Branch = 0 +Offset = false + + Z W(Z) RESID IFAIL + +(5.00000e-01, -1.00000e+00) (5.16511e-01, -4.22053e-01) 5.55112e-17 0 +(1.00000e+00, 2.30000e+00) (8.73606e-01, 5.76978e-01) 1.11022e-16 0 +(4.50000e+00, -1.00000e-01) (1.26735e+00, -1.24194e-02) 0.00000e+00 0 +(6.00000e+00, 6.00000e+00) (1.61492e+00, 4.90515e-01) 1.25607e-15 0 diff --git a/simple_examples/baseresults/c05mbje.r b/simple_examples/baseresults/c05mbje.r new file mode 100644 index 0000000..49cdab8 --- /dev/null +++ b/simple_examples/baseresults/c05mbje.r @@ -0,0 +1,8 @@ +C05MBJ Example Program Results + + +Final 2-norm of the residuals = 2.4765e-08 + +Final approximate solution + + 0.7682 0.7862 0.6948 0.6180 diff --git a/simple_examples/baseresults/c05qbje.r b/simple_examples/baseresults/c05qbje.r new file mode 100644 index 0000000..e161a18 --- /dev/null +++ b/simple_examples/baseresults/c05qbje.r @@ -0,0 +1,8 @@ + C05QBJ Example Program Results + + Final 2-norm of the residuals = 1.1926E-08 + + Final approximate solution + -0.5707 -0.6816 -0.7017 + -0.7042 -0.7014 -0.6919 + -0.6658 -0.5960 -0.4164 diff --git a/simple_examples/baseresults/c06baje.r b/simple_examples/baseresults/c06baje.r new file mode 100644 index 0000000..7049ba9 --- /dev/null +++ b/simple_examples/baseresults/c06baje.r @@ -0,0 +1,15 @@ +C06BAJ Example Program Results + + Estimated Actual +I SEQN RESULT abs error error + +1 1.0000 1.0000 - 1.78e-01 +2 0.7500 0.7500 - -7.25e-02 +3 0.8611 0.8269 - 4.46e-03 +4 0.7986 0.8211 2.56e-01 -1.36e-03 +5 0.8386 0.8226 7.84e-02 1.23e-04 +6 0.8108 0.8224 5.97e-03 -3.26e-05 +7 0.8312 0.8225 1.52e-03 3.50e-06 +8 0.8156 0.8225 1.60e-04 -8.51e-07 +9 0.8280 0.8225 3.70e-05 1.01e-07 +10 0.8180 0.8225 4.48e-06 -2.32e-08 \ No newline at end of file diff --git a/simple_examples/baseresults/c06fkje.r b/simple_examples/baseresults/c06fkje.r new file mode 100644 index 0000000..8ef60db --- /dev/null +++ b/simple_examples/baseresults/c06fkje.r @@ -0,0 +1,13 @@ +C06FKJ Example Program Results + + Covolution Correlation + +0 0.50000 2.00000 +1 1.00000 1.50000 +2 1.50000 1.00000 +3 2.00000 0.50000 +4 2.00000 0.00000 +5 1.50000 0.50000 +6 1.00000 1.00000 +7 0.50000 1.50000 +8 0.00000 2.00000 diff --git a/simple_examples/baseresults/c09aaje.r b/simple_examples/baseresults/c09aaje.r new file mode 100644 index 0000000..950c020 --- /dev/null +++ b/simple_examples/baseresults/c09aaje.r @@ -0,0 +1,18 @@ +C09AAJ Example Program Results + +Parameters read from file :: + Wavelet : Haar End mode : Zero N = 8 +Input data X : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 + +Length of wavelet filter : 2 +Number of Levels : 3 +Number of coefficients in each level: + 1 1 2 4 +Total number of wavelength coefficients : 8 + +Wavelet coefficients C: +12.374 4.596 -5.000 5.500 -2.121 -0.707 2.121 -1.414 + +Reconstruction Y : +2.000 5.000 8.000 9.000 7.000 4.000 -1.000 1.000 \ No newline at end of file diff --git a/simple_examples/baseresults/complexargumentexample.r b/simple_examples/baseresults/complexargumentexample.r new file mode 100644 index 0000000..19fc96c --- /dev/null +++ b/simple_examples/baseresults/complexargumentexample.r @@ -0,0 +1 @@ +(1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/d01bdje.r b/simple_examples/baseresults/d01bdje.r new file mode 100644 index 0000000..23c78d1 --- /dev/null +++ b/simple_examples/baseresults/d01bdje.r @@ -0,0 +1,9 @@ + D01BDJ Example Program Results + + A - lower limit of integration = 0.0000 + B - upper limit of integration = 1.0000 + EPSABS - absolute accuracy requested = 0.00E+00 + EPSREL - relative accuracy requested = 1.00E-04 + + RESULT - approximation to the integral = -0.03183 + ABSERR - estimate to the absolute error = 1.34E-11 diff --git a/simple_examples/baseresults/d02neje.r b/simple_examples/baseresults/d02neje.r new file mode 100644 index 0000000..b735aaf --- /dev/null +++ b/simple_examples/baseresults/d02neje.r @@ -0,0 +1,25 @@ + D02NEJ Example Program Results + + D02NEF Example 1 + + t Y(1) Y(2) Y(3) + 0.0000 1.000000 0.000000 0.000000 + 0.0200 0.999204 0.000036 0.000760 + 0.0400 0.998415 0.000036 0.001549 + 0.0600 0.997631 0.000036 0.002333 + 0.0800 0.996852 0.000036 0.003112 + 0.1000 0.996080 0.000036 0.003884 + + The integrator completed task, ITASK = 3 + + D02NEF Example 2 + + t y(1) + 0.0000 2.000000 + 0.2000 2.038016 + 0.4000 2.078379 + 0.6000 2.121462 + 0.8000 2.167736 + 1.0000 2.217821 + + The integrator completed task, ITASK = 3 diff --git a/simple_examples/baseresults/d02tkje.r b/simple_examples/baseresults/d02tkje.r new file mode 100644 index 0000000..4029a48 --- /dev/null +++ b/simple_examples/baseresults/d02tkje.r @@ -0,0 +1,113 @@ + D02TKJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d02tlje.r b/simple_examples/baseresults/d02tlje.r new file mode 100644 index 0000000..b56a57d --- /dev/null +++ b/simple_examples/baseresults/d02tlje.r @@ -0,0 +1,113 @@ + D02TLJ Example Program Results + + + Tolerance = 1.0E-04 R = 1.000E+06 + + Used a mesh of 21 points + Maximum error = 6.16E-10 in interval 20 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 5.000E-02 3(2) 1.000E-01 4(3) 1.500E-01 + 5(2) 2.000E-01 6(3) 2.500E-01 7(2) 3.000E-01 8(3) 3.500E-01 + 9(2) 4.000E-01 10(3) 4.500E-01 11(2) 5.000E-01 12(3) 5.500E-01 + 13(2) 6.000E-01 14(3) 6.500E-01 15(2) 7.000E-01 16(3) 7.500E-01 + 17(2) 8.000E-01 18(3) 8.500E-01 19(2) 9.000E-01 20(3) 9.500E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.050 0.0070 0.1805 0.4416 + 0.100 0.0141 0.0977 0.1886 + 0.150 0.0171 0.0252 0.0952 + 0.200 0.0172 -0.0165 0.0595 + 0.250 0.0157 -0.0400 0.0427 + 0.300 0.0133 -0.0540 0.0322 + 0.350 0.0104 -0.0628 0.0236 + 0.400 0.0071 -0.0683 0.0156 + 0.450 0.0036 -0.0714 0.0078 + 0.500 0.0000 -0.0724 0.0000 + 0.550 -0.0036 -0.0714 -0.0078 + 0.600 -0.0071 -0.0683 -0.0156 + 0.650 -0.0104 -0.0628 -0.0236 + 0.700 -0.0133 -0.0540 -0.0322 + 0.750 -0.0157 -0.0400 -0.0427 + 0.800 -0.0172 -0.0165 -0.0595 + 0.850 -0.0171 0.0252 -0.0952 + 0.900 -0.0141 0.0977 -0.1886 + 0.950 -0.0070 0.1805 -0.4416 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+08 + + Used a mesh of 21 points + Maximum error = 4.49E-09 in interval 6 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 1.757E-02 3(2) 3.515E-02 4(3) 5.203E-02 + 5(2) 6.891E-02 6(3) 8.593E-02 7(2) 1.030E-01 8(3) 1.351E-01 + 9(2) 1.672E-01 10(3) 2.306E-01 11(2) 2.939E-01 12(3) 4.713E-01 + 13(2) 6.486E-01 14(3) 7.455E-01 15(2) 8.423E-01 16(3) 8.824E-01 + 17(2) 9.225E-01 18(3) 9.449E-01 19(2) 9.673E-01 20(3) 9.836E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.018 0.0025 0.1713 0.3923 + 0.035 0.0047 0.0824 0.1381 + 0.052 0.0056 0.0267 0.0521 + 0.069 0.0058 0.0025 0.0213 + 0.086 0.0057 -0.0073 0.0097 + 0.103 0.0056 -0.0113 0.0053 + 0.135 0.0052 -0.0135 0.0027 + 0.167 0.0047 -0.0140 0.0020 + 0.231 0.0038 -0.0142 0.0015 + 0.294 0.0029 -0.0142 0.0012 + 0.471 0.0004 -0.0143 0.0002 + 0.649 -0.0021 -0.0143 -0.0008 + 0.745 -0.0035 -0.0142 -0.0014 + 0.842 -0.0049 -0.0139 -0.0022 + 0.882 -0.0054 -0.0127 -0.0036 + 0.922 -0.0058 -0.0036 -0.0141 + 0.945 -0.0057 0.0205 -0.0439 + 0.967 -0.0045 0.0937 -0.1592 + 0.984 -0.0023 0.1753 -0.4208 + 1.000 -0.0000 0.0000 -1.0000 + + Tolerance = 1.0E-04 R = 1.000E+10 + + Used a mesh of 21 points + Maximum error = 3.13E-06 in interval 7 for component 3 + + + Mesh points: + 1(1) 0.000E+00 2(3) 6.256E-03 3(2) 1.251E-02 4(3) 1.851E-02 + 5(2) 2.450E-02 6(3) 3.076E-02 7(2) 3.702E-02 8(3) 4.997E-02 + 9(2) 6.292E-02 10(3) 9.424E-02 11(2) 1.256E-01 12(3) 4.190E-01 + 13(2) 7.125E-01 14(3) 8.246E-01 15(2) 9.368E-01 16(3) 9.544E-01 + 17(2) 9.719E-01 18(3) 9.803E-01 19(2) 9.886E-01 20(3) 9.943E-01 + 21(1) 1.000E+00 + + x f f' g + 0.000 0.0000 0.0000 1.0000 + 0.006 0.0009 0.1623 0.3422 + 0.013 0.0016 0.0665 0.1021 + 0.019 0.0018 0.0204 0.0318 + 0.025 0.0019 0.0041 0.0099 + 0.031 0.0019 -0.0014 0.0028 + 0.037 0.0019 -0.0031 0.0007 + 0.050 0.0019 -0.0038 -0.0002 + 0.063 0.0018 -0.0038 -0.0003 + 0.094 0.0017 -0.0039 -0.0003 + 0.126 0.0016 -0.0039 -0.0002 + 0.419 0.0004 -0.0041 -0.0001 + 0.712 -0.0008 -0.0042 0.0001 + 0.825 -0.0013 -0.0043 0.0002 + 0.937 -0.0018 -0.0043 0.0003 + 0.954 -0.0019 -0.0042 0.0001 + 0.972 -0.0019 -0.0003 -0.0049 + 0.980 -0.0019 0.0152 -0.0252 + 0.989 -0.0015 0.0809 -0.1279 + 0.994 -0.0008 0.1699 -0.3814 + 1.000 0.0000 -0.0000 -1.0000 diff --git a/simple_examples/baseresults/d03pcje.r b/simple_examples/baseresults/d03pcje.r new file mode 100644 index 0000000..154a2d9 --- /dev/null +++ b/simple_examples/baseresults/d03pcje.r @@ -0,0 +1,28 @@ +D03PCJ Example Program Results +Accuracy requirement = 1.00000e-03 + Parameter ALPHA = 1.000e+00 +T / X 0.0000 0.4000 0.6000 0.8000 0.9000 1.0000 + +0.0001 U(1) 0.0000 0.8008 1.1988 1.5990 1.7958 1.8485 + U(2) 0.9997 0.9995 0.9994 0.9988 0.9663 -0.0000 + + +0.0010 U(1) 0.0000 0.7982 1.1940 1.5841 1.7179 1.6734 + U(2) 0.9969 0.9952 0.9937 0.9484 0.6385 -0.0000 + + +0.0100 U(1) 0.0000 0.7676 1.1239 1.3547 1.3635 1.2830 + U(2) 0.9627 0.9495 0.8754 0.5537 0.2908 -0.0000 + + +0.1000 U(1) 0.0000 0.3908 0.5007 0.5297 0.5120 0.4744 + U(2) 0.5468 0.4299 0.2995 0.1479 0.0724 -0.0000 + + +1.0000 U(1) 0.0000 0.0007 0.0008 0.0008 0.0008 0.0007 + U(2) 0.0010 0.0007 0.0005 0.0002 0.0001 -0.0000 + +Number of Integration steps in time 78 +Number of residual evaluations of resulting ODE system 378 +Number of Jacobian evaluations 25 +Number of iterations of nonlinear solver 190 diff --git a/simple_examples/baseresults/d03raje.r b/simple_examples/baseresults/d03raje.r new file mode 100644 index 0000000..59cf403 --- /dev/null +++ b/simple_examples/baseresults/d03raje.r @@ -0,0 +1,409 @@ + D03RAJ Example Program Results + + Statistics: + Time = 0.2400 + Total number of accepted timesteps = 77 + Total number of rejected timesteps = 0 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 600 80 200 200 + + Maximum number of + Newton iters Lin sys iters + At level + 1 2 3 + + Solution at every 4th grid point in level 2 at time 0.2500: + + x y approx u + + 6.7500E-01 0.000E+00 2.000E+00 + 7.2500E-01 0.000E+00 1.980E+00 + 7.7500E-01 0.000E+00 1.342E+00 + 8.2500E-01 0.000E+00 1.190E+00 + 7.1250E-01 1.250E-02 1.996E+00 + 7.6250E-01 1.250E-02 1.468E+00 + 8.1250E-01 1.250E-02 1.213E+00 + 7.0000E-01 2.500E-02 1.999E+00 + 7.5000E-01 2.500E-02 1.625E+00 + 8.0000E-01 2.500E-02 1.240E+00 + 6.8750E-01 3.750E-02 2.000E+00 + 7.3750E-01 3.750E-02 1.870E+00 + 7.8750E-01 3.750E-02 1.283E+00 + 6.7500E-01 5.000E-02 2.000E+00 + 7.2500E-01 5.000E-02 1.980E+00 + 7.7500E-01 5.000E-02 1.342E+00 + 8.2500E-01 5.000E-02 1.190E+00 + 7.1250E-01 6.250E-02 1.996E+00 + 7.6250E-01 6.250E-02 1.468E+00 + 8.1250E-01 6.250E-02 1.213E+00 + 7.0000E-01 7.500E-02 1.999E+00 + 7.5000E-01 7.500E-02 1.625E+00 + 8.0000E-01 7.500E-02 1.240E+00 + 6.8750E-01 8.750E-02 2.000E+00 + 7.3750E-01 8.750E-02 1.870E+00 + 7.8750E-01 8.750E-02 1.283E+00 + 6.7500E-01 1.000E-01 2.000E+00 + 7.2500E-01 1.000E-01 1.980E+00 + 7.7500E-01 1.000E-01 1.342E+00 + 8.2500E-01 1.000E-01 1.190E+00 + 7.1250E-01 1.125E-01 1.996E+00 + 7.6250E-01 1.125E-01 1.468E+00 + 8.1250E-01 1.125E-01 1.213E+00 + 7.0000E-01 1.250E-01 1.999E+00 + 7.5000E-01 1.250E-01 1.625E+00 + 8.0000E-01 1.250E-01 1.240E+00 + 6.8750E-01 1.375E-01 2.000E+00 + 7.3750E-01 1.375E-01 1.870E+00 + 7.8750E-01 1.375E-01 1.283E+00 + 6.7500E-01 1.500E-01 2.000E+00 + 7.2500E-01 1.500E-01 1.980E+00 + 7.7500E-01 1.500E-01 1.341E+00 + 8.2500E-01 1.500E-01 1.190E+00 + 7.1250E-01 1.625E-01 1.995E+00 + 7.6250E-01 1.625E-01 1.467E+00 + 8.1250E-01 1.625E-01 1.213E+00 + 7.0000E-01 1.750E-01 1.999E+00 + 7.5000E-01 1.750E-01 1.624E+00 + 8.0000E-01 1.750E-01 1.240E+00 + 6.8750E-01 1.875E-01 2.000E+00 + 7.3750E-01 1.875E-01 1.869E+00 + 7.8750E-01 1.875E-01 1.282E+00 + 6.7500E-01 2.000E-01 2.000E+00 + 7.2500E-01 2.000E-01 1.980E+00 + 7.7500E-01 2.000E-01 1.341E+00 + 8.2500E-01 2.000E-01 1.189E+00 + 7.1250E-01 2.125E-01 1.995E+00 + 7.6250E-01 2.125E-01 1.465E+00 + 8.1250E-01 2.125E-01 1.212E+00 + 7.0000E-01 2.250E-01 1.999E+00 + 7.5000E-01 2.250E-01 1.621E+00 + 8.0000E-01 2.250E-01 1.240E+00 + 6.8750E-01 2.375E-01 2.000E+00 + 7.3750E-01 2.375E-01 1.869E+00 + 7.8750E-01 2.375E-01 1.282E+00 + 6.7500E-01 2.500E-01 2.000E+00 + 7.2500E-01 2.500E-01 1.980E+00 + 7.7500E-01 2.500E-01 1.340E+00 + 8.2500E-01 2.500E-01 1.189E+00 + 7.1250E-01 2.625E-01 1.995E+00 + 7.6250E-01 2.625E-01 1.462E+00 + 8.1250E-01 2.625E-01 1.212E+00 + 7.0000E-01 2.750E-01 1.999E+00 + 7.5000E-01 2.750E-01 1.616E+00 + 8.0000E-01 2.750E-01 1.239E+00 + 6.8750E-01 2.875E-01 2.000E+00 + 7.3750E-01 2.875E-01 1.866E+00 + 7.8750E-01 2.875E-01 1.281E+00 + 6.7500E-01 3.000E-01 2.000E+00 + 7.2500E-01 3.000E-01 1.979E+00 + 7.7500E-01 3.000E-01 1.337E+00 + 8.2500E-01 3.000E-01 1.189E+00 + 7.1250E-01 3.125E-01 1.995E+00 + 7.6250E-01 3.125E-01 1.455E+00 + 8.1250E-01 3.125E-01 1.212E+00 + 7.0000E-01 3.250E-01 1.999E+00 + 7.5000E-01 3.250E-01 1.605E+00 + 8.0000E-01 3.250E-01 1.239E+00 + 6.8750E-01 3.375E-01 2.000E+00 + 7.3750E-01 3.375E-01 1.862E+00 + 7.8750E-01 3.375E-01 1.279E+00 + 6.7500E-01 3.500E-01 2.000E+00 + 7.2500E-01 3.500E-01 1.977E+00 + 7.7500E-01 3.500E-01 1.332E+00 + 8.2500E-01 3.500E-01 1.189E+00 + 7.1250E-01 3.625E-01 1.993E+00 + 7.6250E-01 3.625E-01 1.442E+00 + 8.1250E-01 3.625E-01 1.211E+00 + 7.0000E-01 3.750E-01 1.999E+00 + 7.5000E-01 3.750E-01 1.585E+00 + 8.0000E-01 3.750E-01 1.236E+00 + 6.8750E-01 3.875E-01 2.000E+00 + 7.3750E-01 3.875E-01 1.849E+00 + 7.8750E-01 3.875E-01 1.274E+00 + 6.7500E-01 4.000E-01 2.000E+00 + 7.2500E-01 4.000E-01 1.972E+00 + 7.7500E-01 4.000E-01 1.324E+00 + 8.2500E-01 4.000E-01 1.187E+00 + 7.1250E-01 4.125E-01 1.990E+00 + 7.6250E-01 4.125E-01 1.420E+00 + 8.1250E-01 4.125E-01 1.209E+00 + 7.0000E-01 4.250E-01 1.997E+00 + 7.5000E-01 4.250E-01 1.549E+00 + 8.0000E-01 4.250E-01 1.233E+00 + 6.8750E-01 4.375E-01 1.999E+00 + 7.3750E-01 4.375E-01 1.813E+00 + 7.8750E-01 4.375E-01 1.267E+00 + 6.7500E-01 4.500E-01 2.000E+00 + 7.2500E-01 4.500E-01 1.952E+00 + 7.7500E-01 4.500E-01 1.310E+00 + 8.2500E-01 4.500E-01 1.185E+00 + 7.1250E-01 4.625E-01 1.976E+00 + 7.6250E-01 4.625E-01 1.387E+00 + 8.1250E-01 4.625E-01 1.206E+00 + 6.7500E-01 4.750E-01 2.000E+00 + 7.2500E-01 4.750E-01 1.924E+00 + 7.7500E-01 4.750E-01 1.301E+00 + 8.2500E-01 4.750E-01 1.184E+00 + 6.8750E-01 4.875E-01 1.999E+00 + 7.3750E-01 4.875E-01 1.714E+00 + 7.8750E-01 4.875E-01 1.257E+00 + 6.5000E-01 5.000E-01 2.000E+00 + 7.0000E-01 5.000E-01 1.991E+00 + 7.5000E-01 5.000E-01 1.454E+00 + 8.0000E-01 5.000E-01 1.224E+00 + 6.6250E-01 5.125E-01 2.000E+00 + 7.1250E-01 5.125E-01 1.932E+00 + 7.6250E-01 5.125E-01 1.346E+00 + 6.5000E-01 5.250E-01 2.000E+00 + 7.0000E-01 5.250E-01 1.986E+00 + 7.5000E-01 5.250E-01 1.414E+00 + 8.0000E-01 5.250E-01 1.219E+00 + 6.8750E-01 5.375E-01 1.996E+00 + 7.3750E-01 5.375E-01 1.545E+00 + 7.8750E-01 5.375E-01 1.243E+00 + 6.5000E-01 5.500E-01 2.000E+00 + 7.0000E-01 5.500E-01 1.978E+00 + 7.5000E-01 5.500E-01 1.373E+00 + 8.0000E-01 5.500E-01 1.214E+00 + 6.6250E-01 5.625E-01 1.999E+00 + 7.1250E-01 5.625E-01 1.843E+00 + 7.6250E-01 5.625E-01 1.302E+00 + 6.2500E-01 5.750E-01 2.000E+00 + 6.7500E-01 5.750E-01 1.995E+00 + 7.2500E-01 5.750E-01 1.545E+00 + 7.7500E-01 5.750E-01 1.256E+00 + 6.3750E-01 5.875E-01 2.000E+00 + 6.8750E-01 5.875E-01 1.954E+00 + 7.3750E-01 5.875E-01 1.392E+00 + 7.8750E-01 5.875E-01 1.226E+00 + 6.2500E-01 6.000E-01 2.000E+00 + 6.7500E-01 6.000E-01 1.984E+00 + 7.2500E-01 6.000E-01 1.443E+00 + 7.7500E-01 6.000E-01 1.243E+00 + 6.1250E-01 6.125E-01 2.000E+00 + 6.6250E-01 6.125E-01 1.988E+00 + 7.1250E-01 6.125E-01 1.531E+00 + 7.6250E-01 6.125E-01 1.263E+00 + 5.5000E-01 6.250E-01 2.000E+00 + 6.0000E-01 6.250E-01 2.000E+00 + 6.5000E-01 6.250E-01 1.993E+00 + 7.0000E-01 6.250E-01 1.577E+00 + 7.5000E-01 6.250E-01 1.280E+00 + 8.0000E-01 6.250E-01 1.194E+00 + 5.8750E-01 6.375E-01 2.000E+00 + 6.3750E-01 6.375E-01 1.992E+00 + 6.8750E-01 6.375E-01 1.672E+00 + 7.3750E-01 6.375E-01 1.300E+00 + 4.7500E-01 6.500E-01 2.000E+00 + 5.2500E-01 6.500E-01 2.000E+00 + 5.7500E-01 6.500E-01 2.000E+00 + 6.2500E-01 6.500E-01 1.993E+00 + 6.7500E-01 6.500E-01 1.680E+00 + 7.2500E-01 6.500E-01 1.314E+00 + 7.7500E-01 6.500E-01 1.218E+00 + 5.1250E-01 6.625E-01 2.000E+00 + 5.6250E-01 6.625E-01 1.999E+00 + 6.1250E-01 6.625E-01 1.988E+00 + 6.6250E-01 6.625E-01 1.721E+00 + 7.1250E-01 6.625E-01 1.331E+00 + 7.6250E-01 6.625E-01 1.229E+00 + 2.5000E-02 6.750E-01 2.000E+00 + 7.5000E-02 6.750E-01 2.000E+00 + 1.2500E-01 6.750E-01 2.000E+00 + 1.7500E-01 6.750E-01 2.000E+00 + 2.2500E-01 6.750E-01 2.000E+00 + 2.7500E-01 6.750E-01 2.000E+00 + 3.2500E-01 6.750E-01 2.000E+00 + 3.7500E-01 6.750E-01 2.000E+00 + 4.2500E-01 6.750E-01 2.000E+00 + 4.7500E-01 6.750E-01 2.000E+00 + 5.2500E-01 6.750E-01 2.000E+00 + 5.7500E-01 6.750E-01 1.995E+00 + 6.2500E-01 6.750E-01 1.932E+00 + 6.7500E-01 6.750E-01 1.447E+00 + 7.2500E-01 6.750E-01 1.277E+00 + 7.7500E-01 6.750E-01 1.205E+00 + 3.7500E-02 6.875E-01 2.000E+00 + 8.7500E-02 6.875E-01 2.000E+00 + 1.3750E-01 6.875E-01 2.000E+00 + 1.8750E-01 6.875E-01 2.000E+00 + 2.3750E-01 6.875E-01 2.000E+00 + 2.8750E-01 6.875E-01 2.000E+00 + 3.3750E-01 6.875E-01 2.000E+00 + 3.8750E-01 6.875E-01 2.000E+00 + 4.3750E-01 6.875E-01 1.999E+00 + 4.8750E-01 6.875E-01 1.999E+00 + 5.3750E-01 6.875E-01 1.996E+00 + 5.8750E-01 6.875E-01 1.954E+00 + 6.3750E-01 6.875E-01 1.672E+00 + 6.8750E-01 6.875E-01 1.343E+00 + 7.3750E-01 6.875E-01 1.244E+00 + 2.5000E-02 7.000E-01 1.999E+00 + 7.5000E-02 7.000E-01 1.999E+00 + 1.2500E-01 7.000E-01 1.999E+00 + 1.7500E-01 7.000E-01 1.999E+00 + 2.2500E-01 7.000E-01 1.999E+00 + 2.7500E-01 7.000E-01 1.999E+00 + 3.2500E-01 7.000E-01 1.999E+00 + 3.7500E-01 7.000E-01 1.999E+00 + 4.2500E-01 7.000E-01 1.997E+00 + 4.7500E-01 7.000E-01 1.994E+00 + 5.2500E-01 7.000E-01 1.986E+00 + 5.7500E-01 7.000E-01 1.941E+00 + 6.2500E-01 7.000E-01 1.577E+00 + 6.7500E-01 7.000E-01 1.336E+00 + 7.2500E-01 7.000E-01 1.247E+00 + 1.2500E-02 7.125E-01 1.996E+00 + 6.2500E-02 7.125E-01 1.996E+00 + 1.1250E-01 7.125E-01 1.995E+00 + 1.6250E-01 7.125E-01 1.995E+00 + 2.1250E-01 7.125E-01 1.995E+00 + 2.6250E-01 7.125E-01 1.995E+00 + 3.1250E-01 7.125E-01 1.995E+00 + 3.6250E-01 7.125E-01 1.993E+00 + 4.1250E-01 7.125E-01 1.990E+00 + 4.6250E-01 7.125E-01 1.976E+00 + 5.1250E-01 7.125E-01 1.932E+00 + 5.6250E-01 7.125E-01 1.843E+00 + 6.1250E-01 7.125E-01 1.531E+00 + 6.6250E-01 7.125E-01 1.331E+00 + 7.1250E-01 7.125E-01 1.250E+00 + 2.5000E-02 7.250E-01 1.980E+00 + 7.5000E-02 7.250E-01 1.980E+00 + 1.2500E-01 7.250E-01 1.980E+00 + 1.7500E-01 7.250E-01 1.980E+00 + 2.2500E-01 7.250E-01 1.980E+00 + 2.7500E-01 7.250E-01 1.979E+00 + 3.2500E-01 7.250E-01 1.978E+00 + 3.7500E-01 7.250E-01 1.975E+00 + 4.2500E-01 7.250E-01 1.965E+00 + 4.7500E-01 7.250E-01 1.924E+00 + 5.2500E-01 7.250E-01 1.772E+00 + 5.7500E-01 7.250E-01 1.545E+00 + 6.2500E-01 7.250E-01 1.366E+00 + 6.7500E-01 7.250E-01 1.277E+00 + 7.2500E-01 7.250E-01 1.222E+00 + 3.7500E-02 7.375E-01 1.870E+00 + 8.7500E-02 7.375E-01 1.870E+00 + 1.3750E-01 7.375E-01 1.870E+00 + 1.8750E-01 7.375E-01 1.869E+00 + 2.3750E-01 7.375E-01 1.868E+00 + 2.8750E-01 7.375E-01 1.866E+00 + 3.3750E-01 7.375E-01 1.862E+00 + 3.8750E-01 7.375E-01 1.849E+00 + 4.3750E-01 7.375E-01 1.813E+00 + 4.8750E-01 7.375E-01 1.714E+00 + 5.3750E-01 7.375E-01 1.545E+00 + 5.8750E-01 7.375E-01 1.392E+00 + 6.3750E-01 7.375E-01 1.300E+00 + 6.8750E-01 7.375E-01 1.244E+00 + 2.5000E-02 7.500E-01 1.625E+00 + 7.5000E-02 7.500E-01 1.625E+00 + 1.2500E-01 7.500E-01 1.625E+00 + 1.7500E-01 7.500E-01 1.624E+00 + 2.2500E-01 7.500E-01 1.621E+00 + 2.7500E-01 7.500E-01 1.616E+00 + 3.2500E-01 7.500E-01 1.605E+00 + 3.7500E-01 7.500E-01 1.585E+00 + 4.2500E-01 7.500E-01 1.549E+00 + 4.7500E-01 7.500E-01 1.491E+00 + 5.2500E-01 7.500E-01 1.414E+00 + 5.7500E-01 7.500E-01 1.337E+00 + 6.2500E-01 7.500E-01 1.280E+00 + 6.7500E-01 7.500E-01 1.237E+00 + 1.2500E-02 7.625E-01 1.468E+00 + 6.2500E-02 7.625E-01 1.468E+00 + 1.1250E-01 7.625E-01 1.468E+00 + 1.6250E-01 7.625E-01 1.467E+00 + 2.1250E-01 7.625E-01 1.465E+00 + 2.6250E-01 7.625E-01 1.462E+00 + 3.1250E-01 7.625E-01 1.455E+00 + 3.6250E-01 7.625E-01 1.442E+00 + 4.1250E-01 7.625E-01 1.420E+00 + 4.6250E-01 7.625E-01 1.387E+00 + 5.1250E-01 7.625E-01 1.345E+00 + 5.6250E-01 7.625E-01 1.302E+00 + 6.1250E-01 7.625E-01 1.263E+00 + 6.6250E-01 7.625E-01 1.229E+00 + 2.5000E-02 7.750E-01 1.342E+00 + 7.5000E-02 7.750E-01 1.342E+00 + 1.2500E-01 7.750E-01 1.342E+00 + 1.7500E-01 7.750E-01 1.341E+00 + 2.2500E-01 7.750E-01 1.340E+00 + 2.7500E-01 7.750E-01 1.339E+00 + 3.2500E-01 7.750E-01 1.335E+00 + 3.7500E-01 7.750E-01 1.329E+00 + 4.2500E-01 7.750E-01 1.317E+00 + 4.7500E-01 7.750E-01 1.301E+00 + 5.2500E-01 7.750E-01 1.280E+00 + 5.7500E-01 7.750E-01 1.256E+00 + 6.2500E-01 7.750E-01 1.231E+00 + 6.7500E-01 7.750E-01 1.205E+00 + 3.7500E-02 7.875E-01 1.283E+00 + 8.7500E-02 7.875E-01 1.283E+00 + 1.3750E-01 7.875E-01 1.283E+00 + 1.8750E-01 7.875E-01 1.282E+00 + 2.3750E-01 7.875E-01 1.282E+00 + 2.8750E-01 7.875E-01 1.281E+00 + 3.3750E-01 7.875E-01 1.279E+00 + 3.8750E-01 7.875E-01 1.274E+00 + 4.3750E-01 7.875E-01 1.267E+00 + 4.8750E-01 7.875E-01 1.257E+00 + 5.3750E-01 7.875E-01 1.243E+00 + 5.8750E-01 7.875E-01 1.226E+00 + 0.0000E+00 8.000E-01 1.240E+00 + 5.0000E-02 8.000E-01 1.240E+00 + 1.0000E-01 8.000E-01 1.240E+00 + 1.5000E-01 8.000E-01 1.240E+00 + 2.0000E-01 8.000E-01 1.240E+00 + 2.5000E-01 8.000E-01 1.240E+00 + 3.0000E-01 8.000E-01 1.239E+00 + 3.5000E-01 8.000E-01 1.238E+00 + 4.0000E-01 8.000E-01 1.235E+00 + 4.5000E-01 8.000E-01 1.230E+00 + 5.0000E-01 8.000E-01 1.224E+00 + 5.5000E-01 8.000E-01 1.214E+00 + 6.0000E-01 8.000E-01 1.202E+00 + 1.2500E-02 8.125E-01 1.213E+00 + 6.2500E-02 8.125E-01 1.213E+00 + 1.1250E-01 8.125E-01 1.213E+00 + 1.6250E-01 8.125E-01 1.213E+00 + 2.1250E-01 8.125E-01 1.212E+00 + 2.6250E-01 8.125E-01 1.212E+00 + 3.1250E-01 8.125E-01 1.212E+00 + 3.6250E-01 8.125E-01 1.211E+00 + 4.1250E-01 8.125E-01 1.209E+00 + 4.6250E-01 8.125E-01 1.206E+00 + 0.0000E+00 8.250E-01 1.190E+00 + 5.0000E-02 8.250E-01 1.190E+00 + 1.0000E-01 8.250E-01 1.190E+00 + 1.5000E-01 8.250E-01 1.190E+00 + 2.0000E-01 8.250E-01 1.189E+00 + 2.5000E-01 8.250E-01 1.189E+00 + 3.0000E-01 8.250E-01 1.189E+00 + 3.5000E-01 8.250E-01 1.189E+00 + 4.0000E-01 8.250E-01 1.187E+00 + 4.5000E-01 8.250E-01 1.185E+00 + 5.0000E-01 8.250E-01 1.182E+00 + + Statistics: + Time = 0.2500 + Total number of accepted timesteps = 161 + Total number of rejected timesteps = 2 + + Total number (rounded) of + Residual Jacobian Newton Lin sys + evals evals iters iters + At level + 1 1000 200 400 400 + 2 200 20 50 50 + + Maximum number of + Newton iters Lin sys iters + At level + 1 4 3 + 2 4 1 diff --git a/simple_examples/baseresults/d03rbje.r b/simple_examples/baseresults/d03rbje.r new file mode 100644 index 0000000..f49a127 --- /dev/null +++ b/simple_examples/baseresults/d03rbje.r @@ -0,0 +1,59 @@ + D03RBJ Example Program Results + + Solution at every 2nd grid point in level 1 at time 1.0000: + + x y approx u exact u approx v exact v + + 0.00 0.00 0.50 0.50 1.00 1.00 + 0.20 0.00 0.50 0.50 1.00 1.00 + 0.10 0.10 0.50 0.50 1.00 1.00 + 0.30 0.10 0.50 0.50 1.00 1.00 + 0.50 0.10 0.50 0.50 1.00 1.00 + 0.70 0.10 0.50 0.50 1.00 1.00 + 0.90 0.10 0.50 0.50 1.00 1.00 + 0.00 0.20 0.50 0.50 1.00 1.00 + 0.20 0.20 0.50 0.50 1.00 1.00 + 0.40 0.20 0.50 0.50 1.00 1.00 + 0.60 0.20 0.50 0.50 1.00 1.00 + 0.80 0.20 0.50 0.50 1.00 1.00 + 1.00 0.20 0.50 0.50 1.00 1.00 + 0.10 0.30 0.50 0.50 1.00 1.00 + 0.30 0.30 0.50 0.50 1.00 1.00 + 0.50 0.30 0.50 0.50 1.00 1.00 + 0.70 0.30 0.50 0.50 1.00 1.00 + 0.90 0.30 0.50 0.50 1.00 1.00 + 0.00 0.40 0.75 0.75 0.75 0.75 + 0.20 0.40 0.50 0.50 1.00 1.00 + 0.40 0.40 0.50 0.50 1.00 1.00 + 0.80 0.40 0.50 0.50 1.00 1.00 + 1.00 0.40 0.50 0.50 1.00 1.00 + 0.10 0.50 0.75 0.75 0.75 0.75 + 0.30 0.50 0.50 0.50 1.00 1.00 + 0.50 0.50 0.50 0.50 1.00 1.00 + 0.70 0.50 0.50 0.50 1.00 1.00 + 0.90 0.50 0.50 0.50 1.00 1.00 + 0.00 0.60 0.75 0.75 0.75 0.75 + 0.20 0.60 0.75 0.75 0.75 0.75 + 0.40 0.60 0.50 0.50 1.00 1.00 + 0.60 0.60 0.50 0.50 1.00 1.00 + 0.80 0.60 0.50 0.50 1.00 1.00 + 1.00 0.60 0.50 0.50 1.00 1.00 + 0.10 0.70 0.75 0.75 0.75 0.75 + 0.30 0.70 0.75 0.75 0.75 0.75 + 0.50 0.70 0.50 0.50 1.00 1.00 + 0.70 0.70 0.50 0.50 1.00 1.00 + 0.90 0.70 0.50 0.50 1.00 1.00 + 0.00 0.80 0.75 0.75 0.75 0.75 + 0.20 0.80 0.75 0.75 0.75 0.75 + 0.40 0.80 0.75 0.75 0.75 0.75 + 0.60 0.80 0.50 0.50 1.00 1.00 + 0.80 0.80 0.50 0.50 1.00 1.00 + 0.10 0.90 0.75 0.75 0.75 0.75 + 0.30 0.90 0.75 0.75 0.75 0.75 + 0.50 0.90 0.75 0.75 0.75 0.75 + 0.70 0.90 0.50 0.50 1.00 1.00 + 0.00 1.00 0.75 0.75 0.75 0.75 + 0.20 1.00 0.75 0.75 0.75 0.75 + 0.40 1.00 0.75 0.75 0.75 0.75 + 0.60 1.00 0.75 0.75 0.75 0.75 + 0.80 1.00 0.50 0.50 1.00 1.00 diff --git a/simple_examples/baseresults/d05baje.r b/simple_examples/baseresults/d05baje.r new file mode 100644 index 0000000..0833ea2 --- /dev/null +++ b/simple_examples/baseresults/d05baje.r @@ -0,0 +1,12 @@ +D05BAJ Example Program Results + +Size of workplace = 486 +Tolerance = 1.0000e-03 + +T Approx. Sol. True Sol. Est. Error Actual Error +3.33 1.80037 1.80033 8.03776e-05 2.38466e-05 +6.67 2.23916 2.23911 1.77740e-04 2.34772e-05 +10.00 2.54310 2.54304 2.45949e-04 2.24564e-05 +13.33 2.77587 2.77581 3.05737e-04 2.17430e-05 +16.67 2.96456 2.96450 3.61698e-04 2.13821e-05 +20.00 3.12324 3.12317 4.17127e-04 2.13102e-05 diff --git a/simple_examples/baseresults/d05beje.r b/simple_examples/baseresults/d05beje.r new file mode 100644 index 0000000..95731f4 --- /dev/null +++ b/simple_examples/baseresults/d05beje.r @@ -0,0 +1,46 @@ +D05BEJ Example Program Results + +Example 1 + +The stepsize h = 0.1000 + + T Approximate + Solution + + 0.5000 0.1191 + 1.0000 0.0528 + 1.5000 0.0265 + 2.0000 0.0146 + 2.5000 0.0086 + 3.0000 0.0052 + 3.5000 0.0033 + 4.0000 0.0022 + 4.5000 0.0014 + 5.0000 0.0010 + 5.5000 0.0007 + 6.0000 0.0004 + 6.5000 0.0003 + 7.0000 0.0002 + +The maximum absolute error, 2.86e-03, occured at T = 0.1000 with solution 0.0326 + + +Example 2 + +The stepsize h = 0.0714 + + T Approximate + Solution + + 0.5000 0.6667 + 1.0000 0.5000 + 1.5000 0.4000 + 2.0000 0.3333 + 2.5000 0.2857 + 3.0000 0.2500 + 3.5000 0.2222 + 4.0000 0.2000 + 4.5000 0.1818 + 5.0000 0.1667 + +The maximum absolute error, 3.17e-06, occured at T = 0.0714 with solution 0.9333 \ No newline at end of file diff --git a/simple_examples/baseresults/dtfsmje.r b/simple_examples/baseresults/dtfsmje.r new file mode 100644 index 0000000..761a9ed --- /dev/null +++ b/simple_examples/baseresults/dtfsmje.r @@ -0,0 +1,10 @@ + DTFSMJ Example Program Results + + The Solution + 1 2 3 4 + 1 13.5562 5.7677 9.7251 1.2209 + 2 -10.1040 -1.9787 -8.9252 -4.4205 + 3 -0.8280 0.2386 2.0348 2.0769 + 4 2.8488 -7.1745 -3.7925 -2.9505 + 5 -3.9321 0.8652 -1.4082 3.1217 + 6 -2.3127 1.8398 2.0152 1.5198 diff --git a/simple_examples/baseresults/e01daje.r b/simple_examples/baseresults/e01daje.r new file mode 100644 index 0000000..a9c2ddb --- /dev/null +++ b/simple_examples/baseresults/e01daje.r @@ -0,0 +1,25 @@ + E01DAJ Example Program Results + + I Knot LAMDA(I) J Knot MU(j) + 4 1.0000 4 0.0000 + 5 1.3000 5 0.4000 + 6 1.5000 6 0.7000 + 7 1.6000 7 1.0000 + 8 2.0000 + + The B-Spline coefficients: + 1.0000 1.1333 1.3667 1.7000 1.9000 2.0000 1.2000 1.3333 + 1.5667 1.9000 2.1000 2.2000 1.5833 1.7167 1.9500 2.2833 + 2.4833 2.5833 2.1433 2.2767 2.5100 2.8433 3.0433 3.1433 + 2.8667 3.0000 3.2333 3.5667 3.7667 3.8667 3.4667 3.6000 + 3.8333 4.1667 4.3667 4.4667 4.0000 4.1333 4.3667 4.7000 + 4.9000 5.0000 + + Spline evaluated on a regular mesh (X across, Y down): + 1.00 1.20 1.40 1.60 1.80 2.00 + 0.00 1.000 1.440 1.960 2.560 3.240 4.000 + 0.20 1.200 1.640 2.160 2.760 3.440 4.200 + 0.40 1.400 1.840 2.360 2.960 3.640 4.400 + 0.60 1.600 2.040 2.560 3.160 3.840 4.600 + 0.80 1.800 2.240 2.760 3.360 4.040 4.800 + 1.00 2.000 2.440 2.960 3.560 4.240 5.000 diff --git a/simple_examples/baseresults/e02alje.r b/simple_examples/baseresults/e02alje.r new file mode 100644 index 0000000..6dfc758 --- /dev/null +++ b/simple_examples/baseresults/e02alje.r @@ -0,0 +1,24 @@ +E02ALJ Example Program Results + + Polynomial coefficients + 1.0000e+00 + 1.0001e+00 + 4.9909e-01 + 1.7042e-01 + 3.4784e-02 + 1.3909e-02 + + Reference deviation = 1.09e-06 + + X Fit exp(x) Residual + 0.00 1.0000 1.0000 -1.09e-06 + 0.10 1.1052 1.1052 9.74e-07 + 0.20 1.2214 1.2214 -7.44e-07 + 0.30 1.3499 1.3499 -9.18e-07 + 0.40 1.4918 1.4918 2.99e-07 + 0.50 1.6487 1.6487 1.09e-06 + 0.60 1.8221 1.8221 4.59e-07 + 0.70 2.0138 2.0138 -8.16e-07 + 0.80 2.2255 2.2255 -8.42e-07 + 0.90 2.4596 2.4596 8.75e-07 + 1.00 2.7183 2.7183 -1.09e-06 diff --git a/simple_examples/baseresults/e04abje.r b/simple_examples/baseresults/e04abje.r new file mode 100644 index 0000000..18b685b --- /dev/null +++ b/simple_examples/baseresults/e04abje.r @@ -0,0 +1,6 @@ +E04ABJ Example Program Results + +The minimum lies in the interval 4.49340940 to 4.49340951 +Its estimated position is 4.49340945, +where the function value is -0.2172 +10 function evaluations were required diff --git a/simple_examples/baseresults/e04bbje.r b/simple_examples/baseresults/e04bbje.r new file mode 100644 index 0000000..86a41ba --- /dev/null +++ b/simple_examples/baseresults/e04bbje.r @@ -0,0 +1,7 @@ +E04BBJ Example Program Results + +The minimum lies in the interval 4.49340946 to 4.49340952 +Its estimated position is 4.49340946, +where the function value is -0.2172 +and the gradient is -3.8e-16 (machine dependent) +6 function evaluations were required diff --git a/simple_examples/baseresults/e04cbje.r b/simple_examples/baseresults/e04cbje.r new file mode 100644 index 0000000..67cd53d --- /dev/null +++ b/simple_examples/baseresults/e04cbje.r @@ -0,0 +1,4 @@ +E04CBJ Example Program Results + +The final function value is 0.0000 +at the point 0.5000 -0.9999 diff --git a/simple_examples/baseresults/e04fcje.r b/simple_examples/baseresults/e04fcje.r new file mode 100644 index 0000000..bd90f04 --- /dev/null +++ b/simple_examples/baseresults/e04fcje.r @@ -0,0 +1,22 @@ + E04FCJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The estimated gradient is -1.607e-09 -7.436e-11 6.130e-10 + (machine dependent) + and the residuals are + -5.9e-03 + -2.7e-04 + 2.7e-04 + 6.5e-03 + -8.2e-04 + -1.3e-03 + -4.5e-03 + -2.0e-02 + 8.2e-02 + -1.8e-02 + -1.5e-02 + -1.5e-02 + -1.1e-02 + -4.2e-03 + 6.8e-03 diff --git a/simple_examples/baseresults/e04ffje.r b/simple_examples/baseresults/e04ffje.r new file mode 100644 index 0000000..a772ab7 --- /dev/null +++ b/simple_examples/baseresults/e04ffje.r @@ -0,0 +1,73 @@ + E04FFJ Example Program Results + + --------------------------------------------------- + E04F(G|F)), Derivative free solver for data fitting + (nonlinear least-squares problems) + --------------------------------------------------- + + Problem statistics + Number of variables 4 + Number of unconstrained variables 2 + Number of fixed variables 0 + Starting interpolation points 5 + Total interpolation points 5 + Number of residuals 11 + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Print Solution = All * U + Monitoring File = -1 * d + Monitoring Level = 4 * d + Dfo Print Frequency = 1 * d + Dfo Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Dfo Initial Interp Points = Coordinate * d + Dfo Max Objective Calls = 500 * d + Dfo Max Soft Restarts = 5 * d + Dfo Max Unsucc Soft Restarts = 3 * d + Dfo Maximum Slow Steps = 20 * d + Dfo Noise Level = 0.00000E+00 * d + Dfo Noisy Problem = No * d + Dfo Number Initial Points = 0 * d + Dfo Number Interp Points = 0 * d + Dfo Number Soft Restarts Pts = 3 * d + Dfo Random Seed = -1 * d + Dfo Starting Trust Region = 1.00000E-01 * d + Dfo Trust Region Slow Tol = 1.02648E-04 * d + Dfo Trust Region Tolerance = 5.00000E-06 * U + Dfo Version = Latest * d + Dfls Small Residuals Tol = 1.08158E-12 * d + End of Options + ---------------------------------------- + step | obj rho | nf | + ---------------------------------------- + 1 | 1.72E-03 1.00E-01 | 6 | + 2 | 6.41E-04 1.00E-01 | 7 | + 3 | 4.52E-04 1.00E-01 | 8 | + 4 | 4.05E-04 1.00E-02 | 9 | + 5 | 4.04E-04 1.00E-02 | 10 | + 6 | 4.03E-04 1.00E-02 | 14 | + 7 | 4.02E-04 1.00E-02 | 15 | + 8 | 4.02E-04 1.00E-03 | 20 | + 9 | 4.02E-04 7.07E-05 | 21 | + 10 | 4.02E-04 7.07E-05 | 23 | s + ---------------------------------------- + Status: Converged, small trust region size + + Value of the objective 4.02423E-04 + Number of objective function evaluations 27 + Number of steps 10 + + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.81300E-01 inf + 2 2.00000E-01 5.90128E-01 1.00000E+00 + 3 -inf 2.56929E-01 inf + 4 3.00000E-01 3.00000E-01 inf diff --git a/simple_examples/baseresults/e04gbje.r b/simple_examples/baseresults/e04gbje.r new file mode 100644 index 0000000..6e9e25e --- /dev/null +++ b/simple_examples/baseresults/e04gbje.r @@ -0,0 +1,22 @@ + E04GBJ Example Program Results + + On exit, the sum of squares is 0.0082 + at the point 0.0824 1.1330 2.3437 + The corresponding gradient is 1.199E-09 -1.865E-11 1.807E-11 + (machine dependent) + and the residuals are + -5.9E-03 + -2.7E-04 + 2.7E-04 + 6.5E-03 + -8.2E-04 + -1.3E-03 + -4.5E-03 + -2.0E-02 + 8.2E-02 + -1.8E-02 + -1.5E-02 + -1.5E-02 + -1.1E-02 + -4.2E-03 + 6.8E-03 diff --git a/simple_examples/baseresults/e04ggje.r b/simple_examples/baseresults/e04ggje.r new file mode 100644 index 0000000..b5dd970 --- /dev/null +++ b/simple_examples/baseresults/e04ggje.r @@ -0,0 +1,44 @@ + E04GGJ Example Program Results + + E04GG, Nonlinear least squares method for bound-constrained problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + + Infinite Bound Size = 1.00000E+20 * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Bxnl Model = Gauss-newton * U + Bxnl Nlls Method = Galahad * d + Bxnl Glob Method = Reg * U + Bxnl Reg Order = Auto * d + Bxnl Tn Method = Min-1-var * d + Bxnl Basereg Type = None * d + Bxnl Basereg Pow = 2.00000E+00 * d + Bxnl Basereg Term = 1.00000E-02 * d + Bxnl Iteration Limit = 1000 * d + Bxnl Monitor Frequency = 0 * d + Bxnl Print Header = 30 * d + Bxnl Save Covariance Matrix = No * d + Bxnl Stop Abs Tol Fun = 1.05367E-08 * d + Bxnl Stop Abs Tol Grd = 1.05737E-05 * d + Bxnl Stop Rel Tol Fun = 1.05367E-08 * d + Bxnl Stop Rel Tol Grd = 1.05367E-08 * d + Bxnl Stop Step Tol = 2.22045E-16 * d + Bxnl Use Second Derivatives = Yes * U + Bxnl Use Weights = No * d + End of Options + + Status: converged, an optimal solution was found + Value of the objective 2.17328E-06 + Norm of projected gradient 1.51989E-08 + Norm of scaled projected gradient 7.29019E-06 + Norm of step 4.98107E-04 + +Solver stored solution iterate in the handle +X: 4.45E-01 1.87E+00 3.07E+00 4.64E+00 -9.98E-01 4.64E+00 diff --git a/simple_examples/baseresults/e04mtje.r b/simple_examples/baseresults/e04mtje.r new file mode 100644 index 0000000..033d40f --- /dev/null +++ b/simple_examples/baseresults/e04mtje.r @@ -0,0 +1,162 @@ + E04MTJ Example Program Results + +++++++++++ Use the Primal-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | optim | feas | compl | mu | mcc | I + ------------------------------------------------------------------------------ + 0 -7.86591E-02 1.71637E-02 1.27E+00 1.06E+00 8.89E-02 1.5E-01 + 1 5.74135E-03 -2.24369E-02 6.11E-16 1.75E-01 2.25E-02 2.8E-02 0 + 2 1.96803E-02 1.37067E-02 5.06E-16 2.28E-02 2.91E-03 3.4E-03 0 + 3 2.15232E-02 1.96162E-02 7.00E-15 9.24E-03 1.44E-03 1.7E-03 0 + 4 2.30321E-02 2.28676E-02 1.15E-15 2.21E-03 2.97E-04 3.4E-04 0 + 5 2.35658E-02 2.35803E-02 1.32E-15 1.02E-04 8.41E-06 9.6E-06 0 + 6 2.35965E-02 2.35965E-02 1.64E-15 7.02E-08 6.35E-09 7.2E-09 0 +Iteration 7 + monit() reports good approximate solution (tol = 1.20E-08): + 7 2.35965E-02 2.35965E-02 1.35E-15 3.52E-11 3.18E-12 3.6E-12 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 4.168797E-15 + Relative primal infeasibility 1.350467E-15 + Absolute dual infeasibility 5.084353E-11 + Relative dual infeasibility 3.518607E-11 + Absolute complementarity gap 2.685778E-11 + Relative complementarity gap 3.175366E-12 + Iterations 7 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.51391E-11 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 3.42902E-11 inf 0.00000E+00 + 7 -1.00000E-02 8.61040E-12 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 4.00339E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.54305E-08 + 4 -inf 0.00000E+00 -3.70000E-03 3.80136E-10 + 5 -inf 0.00000E+00 -1.20000E-03 4.72629E-11 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 + +++++++++++ Use the Self-Dual algorithm ++++++++++ + + ---------------------------------------------- + E04MT, Interior point method for LP problems + ---------------------------------------------- + + Original Problem Statistics + + Number of variables 7 + Number of constraints 7 + Free variables 0 + Number of nonzeros 41 + + + Presolved Problem Statistics + + Number of variables 13 + Number of constraints 7 + Free variables 0 + Number of nonzeros 47 + + + ------------------------------------------------------------------------------ + it| pobj | dobj | p.inf | d.inf | d.gap | tau | mcc | I + ------------------------------------------------------------------------------ + 0 -6.39941E-01 4.94000E-02 1.07E+01 2.69E+00 5.54E+00 1.0E+00 + 1 -8.56025E-02 -1.26938E-02 2.07E-01 2.07E-01 2.07E-01 1.7E+00 0 + 2 4.09196E-03 1.24373E-02 4.00E-02 4.00E-02 4.00E-02 2.8E+00 0 + 3 1.92404E-02 2.03658E-02 6.64E-03 6.64E-03 6.64E-03 3.2E+00 1 + 4 1.99631E-02 2.07574E-02 3.23E-03 3.23E-03 3.23E-03 2.3E+00 1 + 5 2.03834E-02 2.11141E-02 1.68E-03 1.68E-03 1.68E-03 1.4E+00 0 + 6 2.22419E-02 2.25057E-02 5.73E-04 5.73E-04 5.73E-04 1.4E+00 1 + 7 2.35051E-02 2.35294E-02 6.58E-05 6.58E-05 6.58E-05 1.4E+00 6 + 8 2.35936E-02 2.35941E-02 1.19E-06 1.19E-06 1.19E-06 1.4E+00 0 +Iteration 9 + monit() reports good approximate solution (tol = 1.20E-08): + 9 2.35965E-02 2.35965E-02 5.37E-10 5.37E-10 5.37E-10 1.4E+00 0 +Iteration 10 + monit() reports good approximate solution (tol = 1.20E-08): + 10 2.35965E-02 2.35965E-02 2.68E-13 2.68E-13 2.68E-13 1.4E+00 0 + ------------------------------------------------------------------------------ + Status: converged, an optimal solution found + ------------------------------------------------------------------------------ + Final primal objective value 2.359648E-02 + Final dual objective value 2.359648E-02 + Absolute primal infeasibility 2.853383E-12 + Relative primal infeasibility 2.677658E-13 + Absolute dual infeasibility 1.485749E-12 + Relative dual infeasibility 2.679654E-13 + Absolute complementarity gap 7.228861E-13 + Relative complementarity gap 2.683908E-13 + Iterations 10 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E-02 -1.00000E-02 1.00000E-02 + 2 -1.00000E-01 -1.00000E-01 1.50000E-01 + 3 -1.00000E-02 3.00000E-02 3.00000E-02 + 4 -4.00000E-02 2.00000E-02 2.00000E-02 + 5 -1.00000E-01 -6.74853E-02 5.00000E-02 + 6 -1.00000E-02 -2.28013E-03 inf + 7 -1.00000E-02 -2.34528E-04 inf + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E-02 3.30098E-01 1.00000E-02 0.00000E+00 + 2 -1.00000E-01 1.43844E-02 1.50000E-01 0.00000E+00 + 3 -1.00000E-02 0.00000E+00 3.00000E-02 9.09967E-02 + 4 -4.00000E-02 0.00000E+00 2.00000E-02 7.66124E-02 + 5 -1.00000E-01 3.66960E-12 5.00000E-02 0.00000E+00 + 6 -1.00000E-02 2.47652E-11 inf 0.00000E+00 + 7 -1.00000E-02 7.82645E-13 inf 0.00000E+00 + + Constraints dual variables: + idx Lower bound Value Upper bound Value + 1 -1.30000E-01 0.00000E+00 -1.30000E-01 1.43111E+00 + 2 -inf 0.00000E+00 -4.90000E-03 1.07904E-10 + 3 -inf 0.00000E+00 -6.40000E-03 1.14799E-09 + 4 -inf 0.00000E+00 -3.70000E-03 4.09190E-12 + 5 -inf 0.00000E+00 -1.20000E-03 1.52421E-12 + 6 -9.92000E-02 1.50098E+00 inf 0.00000E+00 + 7 -3.00000E-03 1.51661E+00 2.00000E-03 0.00000E+00 diff --git a/simple_examples/baseresults/e04mxje.r b/simple_examples/baseresults/e04mxje.r new file mode 100644 index 0000000..1928db4 --- /dev/null +++ b/simple_examples/baseresults/e04mxje.r @@ -0,0 +1,38 @@ + E04MXJ Example Program Results + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Query mode - Ignoring NAME data. + Line 2: Found ROWS indicator line + Query mode - Counting ROWS data. + Line 7: Found COLUMNS indicator line + Query mode - Counting COLUMNS data. + Line 26: Found RHS indicator line + Query mode - Ignoring RHS data. + Line 31: Found RANGES indicator line + Query mode - Ignoring RANGES data. + Line 35: Found BOUNDS indicator line + Query mode - Counting BOUNDS data. + Line 54: Found QUADOBJ indicator line + Query mode - Counting QUADOBJ data. + Query mode - End of QUADOBJ data. Exit + + MPSX INPUT LISTING + ------------------ + Searching for indicator line + Line 1: Found NAME indicator line + Line 2: Found ROWS indicator line + Line 7: Found COLUMNS indicator line + Line 26: Found RHS indicator line + Line 31: Found RANGES indicator line + Line 35: Found BOUNDS indicator line + Line 54: Found QUADOBJ indicator line + Line 64: Found ENDATA indicator line + + Problem contains 9 variables and 4 linear constraints + + Final objective value = -8.068E+00 + Optimal X = + 2.00 -0.23 -0.27 -0.30 -0.10 2.00 2.00 -1.78 -0.46 diff --git a/simple_examples/baseresults/e04ncje.r b/simple_examples/baseresults/e04ncje.r new file mode 100644 index 0000000..65a6326 --- /dev/null +++ b/simple_examples/baseresults/e04ncje.r @@ -0,0 +1,23 @@ + E04NCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 0.000E+00 1.572E-01 + V 2 0 4.153E-02 0.000E+00 + V 3 0 5.872E-01 0.000E+00 + V 4 1 0.000E+00 8.782E-01 + V 5 0 9.964E-02 0.000E+00 + V 6 1 0.000E+00 1.473E-01 + V 7 0 4.906E-02 0.000E+00 + V 8 1 0.000E+00 8.603E-01 + V 9 0 3.056E-01 0.000E+00 + + + L Con Istate Value Lagr Mult + + L 1 1 2.000E+00 3.777E-01 + L 2 2 2.000E+00 -5.791E-02 + L 3 1 1.000E+00 1.075E-01 + + + Final objective value = 8.134E-02 diff --git a/simple_examples/baseresults/e04nfje.r b/simple_examples/baseresults/e04nfje.r new file mode 100644 index 0000000..13101d2 --- /dev/null +++ b/simple_examples/baseresults/e04nfje.r @@ -0,0 +1,66 @@ + E04NFJ Example Program Results + + *** e04nf + + Parameters + ---------- + + Problem type........... QP2 + + Linear constraints..... 7 Feasibility tolerance.. 1.05E-08 + Variables.............. 7 Optimality tolerance... 1.05E-08 + Hessian rows........... 7 Rank tolerance......... 1.11E-14 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + + Check frequency........ 50 Expand frequency....... 5 + Minimum sum of infeas.. NO Crash tolerance........ 1.00E-02 + + Max degrees of freedom. 7 Print level............ 10 + Feasibility phase itns. 70 Monitoring file........ -1 + Optimality phase itns. 70 + + Workspace provided is IWORK( 17), WORK( 189). + To solve problem we need IWORK( 17), WORK( 189). + + + Itn Step Ninf Sinf/Objective Norm Gz + 0 0.0E+00 3 1.038000E-01 0.0E+00 + 1 4.1E-02 1 3.000000E-02 0.0E+00 + 2 4.2E-02 0 0.000000E+00 0.0E+00 + Itn 2 -- Feasible point found. + 2 0.0E+00 0 4.580000E-02 0.0E+00 + 3 1.3E-01 0 4.161596E-02 0.0E+00 + 4 1.0E+00 0 3.936227E-02 4.2E-17 + 5 4.1E-01 0 3.758935E-02 1.2E-02 + 6 1.0E+00 0 3.755377E-02 1.0E-17 + 7 1.0E+00 0 3.703165E-02 3.8E-17 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL -1.000000E-02 -1.000000E-02 1.000000E-02 0.4700 . + V 2 FR -6.986465E-02 -0.100000 0.150000 . 3.0135E-02 + V 3 FR 1.825915E-02 -1.000000E-02 3.000000E-02 . 1.1741E-02 + V 4 FR -2.426081E-02 -4.000000E-02 2.000000E-02 . 1.5739E-02 + V 5 FR -6.200564E-02 -0.100000 5.000000E-02 . 3.7994E-02 + V 6 FR 1.380544E-02 -1.000000E-02 None . 2.3805E-02 + V 7 FR 4.066496E-03 -1.000000E-02 None . 1.4066E-02 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 EQ -0.130000 -0.130000 -0.130000 -1.908 -5.5511E-17 + L 2 FR -5.879898E-03 None -4.900000E-03 . 9.7990E-04 + L 3 UL -6.400000E-03 None -6.400000E-03 -0.3144 8.6736E-19 + L 4 FR -4.537323E-03 None -3.700000E-03 . 8.3732E-04 + L 5 FR -2.915996E-03 None -1.200000E-03 . 1.7160E-03 + L 6 LL -9.920000E-02 -9.920000E-02 None 1.955 . + L 7 LL -3.000000E-03 -3.000000E-03 2.000000E-03 1.972 4.3368E-18 + + Exit e04nf - Optimal QP solution. + + Final QP objective value = 0.3703165E-01 + + Exit from QP problem after 7 iterations. diff --git a/simple_examples/baseresults/e04nkje.r b/simple_examples/baseresults/e04nkje.r new file mode 100644 index 0000000..bbfdea9 --- /dev/null +++ b/simple_examples/baseresults/e04nkje.r @@ -0,0 +1,26 @@ +E04NKJ Example Program Results + + Variable Istate Value Lagr Mult + + ...X1... 0 0.00000 2361 + ...X2... 3 349.399 -3.657e-12 + ...X3... 2 648.853 -5.924e-12 + ...X4... 2 172.847 1.949e-12 + ...X5... 3 407.521 0.000 + ...X6... 3 271.356 -3.280e-12 + ...X7... 3 150.023 -1.413e-12 + + + Constrnt Istate Value Lagr Mult + + ..ROW1.. 0 2000.00 -1.290e+04 + ..ROW2.. 3 49.2316 0.000 + ..ROW3.. 1 100.000 -2325 + ..ROW4.. 3 32.0719 0.000 + ..ROW5.. 3 14.5572 0.000 + ..ROW6.. 0 1500.00 1.445e+04 + ..ROW7.. 0 250.000 1.458e+04 + ..COST.. 3 -2.98869e+06 -1.000 + + +Final objetive value = -1847785 diff --git a/simple_examples/baseresults/e04nqje.r b/simple_examples/baseresults/e04nqje.r new file mode 100644 index 0000000..8515ce8 --- /dev/null +++ b/simple_examples/baseresults/e04nqje.r @@ -0,0 +1,6 @@ + E04NQJ Example Program Results + + QP problem contains 7 variables and 8 linear constraints + + Final objective value = -1.848E+06 + Optimal X = 0.00 349.40 648.85 172.85 407.52 271.36 150.02 diff --git a/simple_examples/baseresults/e04ptje.r b/simple_examples/baseresults/e04ptje.r new file mode 100644 index 0000000..24d78ba --- /dev/null +++ b/simple_examples/baseresults/e04ptje.r @@ -0,0 +1,39 @@ +E04PTJ Example Program Results + + + ------------------------------------------------ + E04PT, Interior point method for SOCP problems + ------------------------------------------------ + + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + +monit() reports good approximate solution (tol = 1.00E-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 1 1.174E+00 + 2 -4.257E+00 + 3 9.814E-01 diff --git a/simple_examples/baseresults/e04rpje.r b/simple_examples/baseresults/e04rpje.r new file mode 100644 index 0000000..93e29fb --- /dev/null +++ b/simple_examples/baseresults/e04rpje.r @@ -0,0 +1,105 @@ +E04RPJ Example Program Results + +Passing SDP problem to solver + + Overview + Status: Problem and option settings are editable. + No of variables: 5 + Objective function: linear + Simple bounds: not defined yet + Linear constraints: not defined yet + Nonlinear constraints: not defined yet + Cone constraints: not defined yet + Matrix constraints: 2 + Matrix constraints + IDblk = 1, size = 2 x 2, polynomial of order 2 + IDblk = 2, size = 2 x 2, linear + E04SV, NLP-SDP Solver (Pennon) + ------------------------------ + Number of variables 5 [eliminated 0] + simple linear nonlin + (Standard) inequalities 0 0 0 + (Standard) equalities 0 0 + Matrix inequalities 1 1 [dense 2, sparse 0] + [max dimension 2] + + Begin of Options + Print File = 6 * d + Print Level = 2 * d + Print Options = Yes * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + + Dimacs Measures = No * S + Hessian Density = Dense * S + Init Value P = 1.00000E+00 * d + Init Value Pmat = 1.00000E+00 * d + Initial P = Automatic * d + Initial U = Automatic * d + Initial X = User * d + Inner Iteration Limit = 100 * d + Inner Stop Criteria = Heuristic * d + Inner Stop Tolerance = 1.00000E-02 * d + Linesearch Mode = Goldstein * S + Outer Iteration Limit = 100 * d + P Min = 1.05367E-08 * d + P Update Speed = 12 * d + Pmat Min = 1.05367E-08 * d + Preference = Speed * d + Presolve Block Detect = Yes * d + Stop Criteria = Soft * d + Stop Tolerance 1 = 1.00000E-06 * d + Stop Tolerance 2 = 1.00000E-07 * d + Stop Tolerance Feasibility = 1.00000E-07 * d + Transform Constraints = No * S + U Update Restriction = 5.00000E-01 * d + Umat Update Restriction = 3.00000E-01 * d + End of Options + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 0 0.00000E+00 1.82E+01 1.00E+00 4.00E+00 2.00E+00 0 + 1 4.11823E+00 3.85E-03 0.00E+00 1.73E+00 2.00E+00 6 + 2 2.58252E+00 5.36E-03 0.00E+00 4.93E-01 9.04E-01 4 + 3 2.06132E+00 1.02E-03 0.00E+00 7.70E-02 4.08E-01 4 + 4 2.00050E+00 3.00E-03 8.91E-03 1.78E-02 1.85E-01 3 + 5 1.99929E+00 1.55E-03 3.16E-03 3.65E-03 8.34E-02 2 + 6 1.99985E+00 1.03E-04 3.16E-04 7.19E-04 3.77E-02 4 + 7 1.99997E+00 7.04E-04 5.76E-05 1.41E-04 1.70E-02 1 + 8 2.00000E+00 1.32E-04 6.52E-06 2.76E-05 7.70E-03 1 + 9 2.00000E+00 8.49E-06 7.86E-07 5.37E-06 3.48E-03 1 + 10 2.00000E+00 5.88E-07 1.06E-07 1.04E-06 1.57E-03 1 + 11 2.00000E+00 5.55E-08 4.87E-08 2.02E-07 7.11E-04 1 + 12 2.00000E+00 5.34E-09 5.37E-09 3.93E-08 3.21E-04 1 + 13 2.00000E+00 5.03E-10 5.45E-09 7.62E-09 1.45E-04 1 + 14 2.00000E+00 4.45E-11 5.55E-09 1.48E-09 6.56E-05 1 + -------------------------------------------------------------- + it| objective | optim | feas | compl | pen min |inner + -------------------------------------------------------------- + 15 2.00000E+00 4.36E-12 5.67E-09 2.87E-10 2.96E-05 1 + 16 2.00000E+00 1.61E-11 5.82E-09 5.57E-11 1.34E-05 1 + 17 2.00000E+00 3.13E-11 6.00E-09 1.08E-11 6.06E-06 1 + 18 2.00000E+00 8.65E-11 6.22E-09 2.10E-12 2.74E-06 1 + 19 2.00000E+00 1.31E-10 6.48E-09 4.07E-13 1.24E-06 1 + -------------------------------------------------------------- + Status: converged, an optimal solution found + -------------------------------------------------------------- + Final objective value 2.000000E+00 + Relative precision 8.141636E-16 + Optimality 1.310533E-10 + Feasibility 6.484489E-09 + Complementarity 4.066867E-13 + Iteration counts + Outer iterations 19 + Inner iterations 36 + Linesearch steps 56 + Evaluation counts + Augm. Lagr. values 76 + Augm. Lagr. gradient 56 + Augm. Lagr. hessian 36 + -------------------------------------------------------------- \ No newline at end of file diff --git a/simple_examples/baseresults/e04rsje.r b/simple_examples/baseresults/e04rsje.r new file mode 100644 index 0000000..170a9e9 --- /dev/null +++ b/simple_examples/baseresults/e04rsje.r @@ -0,0 +1,35 @@ + E04RSJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 2.571350E+00 + Final dual objective value 2.571350E+00 + Optimal X: + x_idx Value + 0 1.174e+00 + 1 -4.257e+00 + 2 9.814e-01 diff --git a/simple_examples/baseresults/e04rtje.r b/simple_examples/baseresults/e04rtje.r new file mode 100644 index 0000000..65ffe25 --- /dev/null +++ b/simple_examples/baseresults/e04rtje.r @@ -0,0 +1,35 @@ + E04RTJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + + monit() reports good approximate solution (tol = 1.00e-07) + Status: converged, an optimal solution found + Final primal objective value 1.313004E-01 + Final dual objective value 1.313004E-01 + Optimal X: + x_idx Value + 0 1.000e+00 + 1 -9.722e-01 + 2 9.722e-01 diff --git a/simple_examples/baseresults/e04saje.r b/simple_examples/baseresults/e04saje.r new file mode 100644 index 0000000..c10990a --- /dev/null +++ b/simple_examples/baseresults/e04saje.r @@ -0,0 +1,33 @@ + E04SAJ Example Program Results + E04PT, Interior point method for SOCP problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = No * d + Monitoring File = -1 * d + Monitoring Level = 4 * d + Socp Monitor Frequency = 0 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + + Socp Iteration Limit = 100 * d + Socp Max Iterative Refinement = 9 * d + Socp Presolve = Yes * d + Socp Scaling = None * d + Socp Stop Tolerance = 1.05367E-08 * d + Socp Stop Tolerance 2 = 1.05367E-08 * d + Socp System Formulation = Auto * d + End of Options + + Status: converged, an optimal solution found + Final primal objective value -1.951817E+01 + Final dual objective value -1.951817E+01 + Optimal X: + x_idx Value + 0 -1.26819e+00 + 1 -4.08429e-01 + 2 1.33234e+00 diff --git a/simple_examples/baseresults/e04taje.r b/simple_examples/baseresults/e04taje.r new file mode 100644 index 0000000..a6cf135 --- /dev/null +++ b/simple_examples/baseresults/e04taje.r @@ -0,0 +1,39 @@ + E04TAJ Example Program Results + + Solve the first LP + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.500000E+02 + Final dual objective value 8.500000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.00000E+02 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + + The new variable has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 9.000000E+02 + Final dual objective value 9.000000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 5.00000E+01 inf + 2 0.00000E+00 1.00000E+02 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 + + The new constraint has been added, solve the handle again + + E04MT, Interior point method for LP problems + Status: converged, an optimal solution found + Final primal objective value 8.750000E+02 + Final dual objective value 8.750000E+02 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 1.50000E+02 inf + 2 0.00000E+00 5.00000E+01 1.00000E+02 + 3 0.00000E+00 5.00000E+01 5.00000E+01 diff --git a/simple_examples/baseresults/e04tcje.r b/simple_examples/baseresults/e04tcje.r new file mode 100644 index 0000000..cd501a1 --- /dev/null +++ b/simple_examples/baseresults/e04tcje.r @@ -0,0 +1,58 @@ + E04TCJ Example Program Results + + First solve the problem with the outliers + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 1.05037E+00 + Norm of gradient 8.78014E-06 + Norm of scaled gradient 6.05781E-06 + Norm of step 1.47886E-01 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.61301E-01 inf + 2 -inf 9.10227E-01 inf + 3 -inf 3.42138E-03 inf + 4 -inf -6.08965E+00 inf + 5 -inf 6.24881E-04 inf + -------------------------------------------------------- + + Now remove the outlier residuals from the problem handle + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 5.96811E-02 + Norm of gradient 1.19914E-06 + Norm of scaled gradient 3.47087E-06 + Norm of step 3.49256E-06 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 3.53888E-01 inf + 2 -inf 1.06575E+00 inf + 3 -inf 1.91383E-03 inf + 4 -inf 2.17299E-01 inf + 5 -inf 5.17660E+00 inf + -------------------------------------------------------- + + Assuming the outliers points are measured again + we can enable the residuals and adjust the values + + -------------------------------------------------------- + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 6.51802E-02 + Norm of gradient 2.57338E-07 + Norm of scaled gradient 7.12740E-07 + Norm of step 1.56251E-05 + + Primal variables: + idx Lower bound Value Upper bound + 1 3.00000E-01 3.00000E-01 3.00000E-01 + 2 -inf 1.06039E+00 inf + 3 -inf 2.11765E-02 inf + 4 -inf 2.11749E-01 inf + 5 -inf 5.16415E+00 inf diff --git a/simple_examples/baseresults/e04uc_example.r b/simple_examples/baseresults/e04uc_example.r new file mode 100644 index 0000000..abde1c6 --- /dev/null +++ b/simple_examples/baseresults/e04uc_example.r @@ -0,0 +1,95 @@ + E04UC_Example Example Program Results + + *** e04uc + + Parameters + ---------- + + Linear constraints..... 1 Variables.............. 4 + Nonlinear constraints.. 2 + + Infinite bound size.... 1.00E+20 COLD start............. + Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 + Step limit............. 2.00E+00 Hessian................ NO + + Linear feasibility..... 1.05E-08 Crash tolerance........ 1.00E-02 + Nonlinear feasibility.. 1.05E-08 Optimality tolerance... 3.26E-12 + Line search tolerance.. 9.00E-01 Function precision..... 4.37E-15 + + Derivative level....... 3 Monitoring file........ -1 + Verify level........... 0 + + Major iterations limit. 50 Major print level...... 10 + Minor iterations limit. 50 Minor print level...... 0 + + Start point + 1.000000E+00 5.000000E+00 5.000000E+00 1.000000E+00 + + Workspace provided is IWORK( 17), WORK( 185). + To solve problem we need IWORK( 17), WORK( 185). + + + Verification of the constraint gradients. + ----------------------------------------- + + The constraint Jacobian seems to be ok. + + The largest relative error was 2.29E-07 in constraint 2 + + + + Verification of the objective gradients. + ---------------------------------------- + + The objective gradients seem to be ok. + + Directional derivative of the objective 8.15250000E-01 + Difference approximation 8.15249734E-01 + + + Maj Mnr Step Merit Function Norm Gz Violtn Cond Hz + 0 4 0.0E+00 1.738281E+01 7.1E-01 1.2E+01 1.0E+00 + 1 1 1.0E+00 1.703169E+01 4.6E-02 1.9E+00 1.0E+00 + 2 1 1.0E+00 1.701442E+01 2.1E-02 8.8E-02 1.0E+00 + 3 1 1.0E+00 1.701402E+01 3.1E-04 5.4E-04 1.0E+00 + 4 1 1.0E+00 1.701402E+01 7.0E-06 9.9E-08 1.0E+00 + 5 1 1.0E+00 1.701402E+01 1.1E-08 4.6E-11 1.0E+00 + + Exit from NP problem after 5 major iterations, + 9 minor iterations. + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Slack + + V 1 LL 1.00000 1.00000 5.00000 1.088 . + V 2 FR 4.74300 1.00000 5.00000 . 0.2570 + V 3 FR 3.82115 1.00000 5.00000 . 1.179 + V 4 FR 1.37941 1.00000 5.00000 . 0.3794 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Slack + + L 1 FR 10.9436 None 20.0000 . 9.056 + + + N Con State Value Lower Bound Upper Bound Lagr Mult Slack + + N 1 UL 40.0000 None 40.0000 -0.1615 -3.5264E-11 + N 2 LL 25.0000 25.0000 None 0.5523 -2.8791E-11 + + Exit e04uc - Optimal solution found. + + Final objective value = 17.01402 + + Varbl Istate Value Lagr Mult + + V 0 1 1.000000 1.0879 + V 1 0 4.743000 0.0000 + V 2 0 3.821150 0.0000 + V 3 0 1.379408 0.0000 + + L Con Istate Value Lagr Mult + + L 0 0 10.943558 0.0000 + + Final objective value = 17.0140173 diff --git a/simple_examples/baseresults/e04ucje.r b/simple_examples/baseresults/e04ucje.r new file mode 100644 index 0000000..c024cfc --- /dev/null +++ b/simple_examples/baseresults/e04ucje.r @@ -0,0 +1,22 @@ + E04UCJ Example Program Results + + Varbl Istate Value Lagr Mult + + V 1 1 1.00000 1.088 + V 2 0 4.74300 0.000 + V 3 0 3.82115 0.000 + V 4 0 1.37941 0.000 + + + L Con Istate Value Lagr Mult + + L 1 0 10.9436 0.000 + + + N Con Istate Value Lagr Mult + + N 1 2 40.0000 -0.1615 + N 2 1 25.0000 0.5523 + + + Final objective value = 17.01402 diff --git a/simple_examples/baseresults/e04yaje.r b/simple_examples/baseresults/e04yaje.r new file mode 100644 index 0000000..463bd7f --- /dev/null +++ b/simple_examples/baseresults/e04yaje.r @@ -0,0 +1,25 @@ + E04YAJ Example Program Results + +The test point is + 0.19000 -1.34000 0.88000 + +1st derivatives are consistent with residual values + +At the test point, LSQFUN gives + + Residuals 1st derivatives + -2.029E-03 1.000E+00 -4.061E-02 -2.707E-03 + -1.076E-01 1.000E+00 -9.689E-02 -1.384E-02 + -2.330E-01 1.000E+00 -1.785E-01 -4.120E-02 + -3.785E-01 1.000E+00 -3.043E-01 -1.014E-01 + -5.836E-01 1.000E+00 -5.144E-01 -2.338E-01 + -8.689E-01 1.000E+00 -9.100E-01 -5.460E-01 + -1.346E+00 1.000E+00 -1.810E+00 -1.408E+00 + -2.374E+00 1.000E+00 -4.726E+00 -4.726E+00 + -2.975E+00 1.000E+00 -6.076E+00 -6.076E+00 + -4.013E+00 1.000E+00 -7.876E+00 -7.876E+00 + -5.323E+00 1.000E+00 -1.040E+01 -1.040E+01 + -7.292E+00 1.000E+00 -1.418E+01 -1.418E+01 + -1.057E+01 1.000E+00 -2.048E+01 -2.048E+01 + -1.713E+01 1.000E+00 -3.308E+01 -3.308E+01 + -3.681E+01 1.000E+00 -7.089E+01 -7.089E+01 diff --git a/simple_examples/baseresults/f01adje.r b/simple_examples/baseresults/f01adje.r new file mode 100644 index 0000000..c8570bc --- /dev/null +++ b/simple_examples/baseresults/f01adje.r @@ -0,0 +1,9 @@ + F01ADJ Example Program Results + + Lower triangle of inverse + 1 2 3 4 + 1 + 2 68.0000 + 3 -41.0000 25.0000 + 4 -17.0000 10.0000 5.0000 + 5 10.0000 -6.0000 -3.0000 2.0000 diff --git a/simple_examples/baseresults/f01ckje.r b/simple_examples/baseresults/f01ckje.r new file mode 100644 index 0000000..3264e43 --- /dev/null +++ b/simple_examples/baseresults/f01ckje.r @@ -0,0 +1,5 @@ + F01CKJ Example Program Results + + Matrix A + 5.0 8.0 + 8.0 14.0 diff --git a/simple_examples/baseresults/f01crje.r b/simple_examples/baseresults/f01crje.r new file mode 100644 index 0000000..0b33f3a --- /dev/null +++ b/simple_examples/baseresults/f01crje.r @@ -0,0 +1,6 @@ + F01CRJ Example Program Results + + 1.0 4.0 7.0 10.0 13.0 16.0 19.0 + 2.0 5.0 8.0 11.0 14.0 17.0 20.0 + 3.0 6.0 9.0 12.0 15.0 18.0 21.0 + diff --git a/simple_examples/baseresults/f01dgje.r b/simple_examples/baseresults/f01dgje.r new file mode 100644 index 0000000..85c8df1 --- /dev/null +++ b/simple_examples/baseresults/f01dgje.r @@ -0,0 +1,8 @@ +F01DGJ Example Program Results + + Solution matrix B + 1 2 3 4 + 1 2.1000 1.2600 2.4000 1.2600 + 2 3.2200 9.5480 6.5360 5.3320 + 3 9.3800 17.7240 20.7640 14.5920 + 4 2.6600 20.8600 11.6240 28.5400 diff --git a/simple_examples/baseresults/f01elje.r b/simple_examples/baseresults/f01elje.r new file mode 100644 index 0000000..06a7a20 --- /dev/null +++ b/simple_examples/baseresults/f01elje.r @@ -0,0 +1,10 @@ + F01ELJ Example Program Results + + F(A) = COS(2A) + 1 2 3 4 + 1 -0.1704 -1.1597 -0.1878 -0.7307 + 2 -0.3950 -0.4410 0.7606 0.0655 + 3 -0.0950 -0.0717 0.0619 -0.4351 + 4 -0.1034 0.6424 -1.3964 0.1042 + +Imnorm = 0.0 diff --git a/simple_examples/baseresults/f01emje.r b/simple_examples/baseresults/f01emje.r new file mode 100644 index 0000000..d805f3c --- /dev/null +++ b/simple_examples/baseresults/f01emje.r @@ -0,0 +1,10 @@ +F01EMJ Example Program Results + + F(A) = EXP(2A) + 1 2 3 4 + 1 -12.1880 0.0000 -3.4747 8.3697 + 2 -13.7274 54.5982 -23.9801 82.8593 + 3 -9.7900 0.0000 -25.4527 26.5294 + 4 -18.1597 0.0000 -34.8991 49.2404 + +Imnorm = 0.00 diff --git a/simple_examples/baseresults/f02ekje.r b/simple_examples/baseresults/f02ekje.r new file mode 100644 index 0000000..925d7cb --- /dev/null +++ b/simple_examples/baseresults/f02ekje.r @@ -0,0 +1,20 @@ + F02EKJ Example Program Results + +Iteration Limit= 500 + Arnoldi basis vectors used: 20 + The following Ritz values (mu) are related to the + true eigenvalues (lambda) by lambda = sigma + 1/mu + + Iteration number 1 + Ritz values converged so far ( 2) and their Ritz estimates: + 1 ( 5.69917E-01, 8.80810E-01) 1.30081E-20 + 2 ( 5.69917E-01, -8.80810E-01) 1.30081E-20 + Next (unconverged) Ritz value: + 3 ( 6.07774E-01, 0.00000E+00) + + The 5 Ritz values of closest to 5.50000E+00 are: + 1 ( 6.01781E+00 , -8.00277E-01 ) + 2 ( 6.01781E+00 , 8.00277E-01 ) + 3 ( 4.34309E+00 , -1.94557E+00 ) + 4 ( 4.34309E+00 , 1.94557E+00 ) + 5 ( 7.14535E+00 , 0.00000E+00 ) diff --git a/simple_examples/baseresults/f02fkje.r b/simple_examples/baseresults/f02fkje.r new file mode 100644 index 0000000..8217134 --- /dev/null +++ b/simple_examples/baseresults/f02fkje.r @@ -0,0 +1,14 @@ + F02FKJ Example Program Results + + Iteration Limit= 500 + + Ritz values and residuals + 1 2 + 1 1.9702E+01 5.6583E-13 + 2 4.9036E+01 7.2456E-13 + 3 4.9036E+01 7.0022E-13 + 4 7.8370E+01 8.8089E-13 + 5 9.7197E+01 8.7693E-13 + 6 9.7197E+01 8.7672E-13 + 7 1.2653E+02 6.8423E-13 + 8 1.2653E+02 9.8310E-13 diff --git a/simple_examples/baseresults/f02wgje.r b/simple_examples/baseresults/f02wgje.r new file mode 100644 index 0000000..b4e345c --- /dev/null +++ b/simple_examples/baseresults/f02wgje.r @@ -0,0 +1,7 @@ + F02WGJ Example Program Results + + Singular Value Residual + 0.00830 2.7E-19 + 0.01223 5.9E-18 + 0.02381 1.2E-17 + 0.11274 7.8E-17 diff --git a/simple_examples/baseresults/f03baje.r b/simple_examples/baseresults/f03baje.r new file mode 100644 index 0000000..c4c40d7 --- /dev/null +++ b/simple_examples/baseresults/f03baje.r @@ -0,0 +1,14 @@ +F03BAJ Example Program Results + + Array A after factorization + 1 2 3 + 1 33.0000 16.0000 72.0000 + 2 -0.7273 1.6364 -4.6364 + 3 -0.2424 -0.0741 0.1111 + +Pivots + 1 2 3 + +D = 0.37500 ID = 4 + +Value of determinant = 6.00000e+00 \ No newline at end of file diff --git a/simple_examples/baseresults/f04amje.r b/simple_examples/baseresults/f04amje.r new file mode 100644 index 0000000..86bd893 --- /dev/null +++ b/simple_examples/baseresults/f04amje.r @@ -0,0 +1,4 @@ +F04AMJ Example Program Results +Solution +1.3010 +0.7935 \ No newline at end of file diff --git a/simple_examples/baseresults/f04baje.r b/simple_examples/baseresults/f04baje.r new file mode 100644 index 0000000..eb52050 --- /dev/null +++ b/simple_examples/baseresults/f04baje.r @@ -0,0 +1,14 @@ +F04BAJ Example Program Results + + Solution + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Estimate of condition number +1.5e+02 + +Esttimate of error bound for computed solutions +1.7e-14 \ No newline at end of file diff --git a/simple_examples/baseresults/f05aaje.r b/simple_examples/baseresults/f05aaje.r new file mode 100644 index 0000000..74b6ae6 --- /dev/null +++ b/simple_examples/baseresults/f05aaje.r @@ -0,0 +1,11 @@ +F05AAJ Example Program Results + +N1 = 2 N2 = 4 + +CC = 0.5822 ICOL = 4 + +Final Vectors +-0.6325 0.3310 -0.5404 +0.3162 -0.2483 0.2119 +-0.6325 -0.0000 0.7735 +0.3162 0.9104 0.2543 \ No newline at end of file diff --git a/simple_examples/baseresults/f06clje.r b/simple_examples/baseresults/f06clje.r new file mode 100644 index 0000000..d167816 --- /dev/null +++ b/simple_examples/baseresults/f06clje.r @@ -0,0 +1,3 @@ + F06CLJ Example Program Results + + (1.0, 1.0)/(2.0, 2.0) = (0.5, 0.0) diff --git a/simple_examples/baseresults/f07aaje.r b/simple_examples/baseresults/f07aaje.r new file mode 100644 index 0000000..086448e --- /dev/null +++ b/simple_examples/baseresults/f07aaje.r @@ -0,0 +1,14 @@ + F07AAJ Example Program Results + + Solution + 1.0000 -1.0000 3.0000 -5.0000 + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 + + Pivot indices + 2 2 3 4 diff --git a/simple_examples/baseresults/f07abje.r b/simple_examples/baseresults/f07abje.r new file mode 100644 index 0000000..922ca67 --- /dev/null +++ b/simple_examples/baseresults/f07abje.r @@ -0,0 +1,23 @@ +F07ABJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 3.0000 + 2 -1.0000 2.0000 + 3 3.0000 4.0000 + 4 -5.0000 1.0000 + +Backward errors (machine-dependent) + 7.7e-17 5.8e-17 + +Estimated forward error bounds (machine-dependent) + 2.5e-14 3.4e-14 + +A has been row scaled as diag(R)*A + +Reciprocal condition number estimate of scaled matrix + 1.8e-02 + +Estimate of reciprocal pivot growth factor + 7.4e-01 + diff --git a/simple_examples/baseresults/f07adje.r b/simple_examples/baseresults/f07adje.r new file mode 100644 index 0000000..8aa1615 --- /dev/null +++ b/simple_examples/baseresults/f07adje.r @@ -0,0 +1,10 @@ +F07ADJ Example Program Results + + Details of factorization + 1 2 3 4 + 1 5.2500 -2.9500 -0.9500 -3.8000 + 2 0.3429 3.8914 2.3757 0.4129 + 3 0.3010 -0.4631 -1.5139 0.2948 + 4 -0.2114 -0.3299 0.0047 0.1314 +IPIV + 2 2 3 4 diff --git a/simple_examples/baseresults/f07aqje.r b/simple_examples/baseresults/f07aqje.r new file mode 100644 index 0000000..11cdfa0 --- /dev/null +++ b/simple_examples/baseresults/f07aqje.r @@ -0,0 +1,7 @@ + F07AQJ Example Program Results + + Solution + ( 1.0000, 1.0000) ( 2.0000,-3.0000) (-4.0000,-5.0000) ( 0.0000, 6.0000) + + Pivot indices + 3 2 3 4 diff --git a/simple_examples/baseresults/f07faje.r b/simple_examples/baseresults/f07faje.r new file mode 100644 index 0000000..381aa43 --- /dev/null +++ b/simple_examples/baseresults/f07faje.r @@ -0,0 +1,11 @@ + F07FAJ Example Program Results + + Solution + 1.0000 -1.0000 2.0000 -3.0000 + + Cholesky factor U + 1 2 3 4 + 1 2.0396 -1.5297 0.2746 -0.0490 + 2 1.6401 -0.2500 0.6737 + 3 0.7887 0.6617 + 4 0.5347 diff --git a/simple_examples/baseresults/f07fbje.r b/simple_examples/baseresults/f07fbje.r new file mode 100644 index 0000000..38b2bb5 --- /dev/null +++ b/simple_examples/baseresults/f07fbje.r @@ -0,0 +1,19 @@ + F07FBJ Example Program Results + + Solution(s) + 1 2 + 1 1.0000 4.0000 + 2 -1.0000 3.0000 + 3 2.0000 2.0000 + 4 -3.0000 1.0000 + + Backward errors (machine-dependent) + 6.7e-17 8.2e-17 + + Estimated forward error bounds (machine-dependent) + 2.3e-14 2.4e-14 + + Estimate of reciprocal condition number + 1.0e-02 + + A has not been equilibrated diff --git a/simple_examples/baseresults/f08btje.r b/simple_examples/baseresults/f08btje.r new file mode 100644 index 0000000..b663c71 --- /dev/null +++ b/simple_examples/baseresults/f08btje.r @@ -0,0 +1,16 @@ + F08BTJ Example Program Results + + Tolerance used to estimate the rank of A + 1.00E-02 + Estimated rank of A + 3 + Least squares solution(s) + + 1 2 + 1 ( 0.0000, 0.0000) ( 0.0000, 0.0000) + 2 ( 2.7020, 8.0911) (-2.2682,-2.9884) + 3 ( 2.8888, 2.5012) ( 0.9779, 1.3565) + 4 ( 2.7100, 0.4791) (-1.3734, 0.2212) + + Square root(s) of the residual sum(s) of squares + 2.51E-01 8.10E-02 diff --git a/simple_examples/baseresults/f08faje.r b/simple_examples/baseresults/f08faje.r new file mode 100644 index 0000000..31df0c1 --- /dev/null +++ b/simple_examples/baseresults/f08faje.r @@ -0,0 +1,16 @@ + F08FAJ Example Program Results + + Eigenvalues + -2.0531 -0.5146 -0.2943 12.8621 + Eigenvectors + 1 2 3 4 + 1 0.7003 -0.5144 -0.2767 0.4103 + 2 0.3592 0.4851 0.6634 0.4422 + 3 -0.1569 0.5420 -0.6504 0.5085 + 4 -0.5965 -0.4543 0.2457 0.6144 + + Error estimate for the eigenvalues + 1.4e-15 + + Error estimates for the eigenvectors + 9.3e-16 6.5e-15 6.5e-15 1.1e-16 diff --git a/simple_examples/baseresults/f08xpje.r b/simple_examples/baseresults/f08xpje.r new file mode 100644 index 0000000..96e35e9 --- /dev/null +++ b/simple_examples/baseresults/f08xpje.r @@ -0,0 +1,8 @@ +F08XPJ Example Program Results + +Number of eigenvalues for which SELCTG is true = 2 +(dimension of deflating subspaces) + +Selected generalized eigenvalues + 1 (2.00, -5.00) + 2 (3.00, -1.00) diff --git a/simple_examples/baseresults/g01alje.r b/simple_examples/baseresults/g01alje.r new file mode 100644 index 0000000..3473f35 --- /dev/null +++ b/simple_examples/baseresults/g01alje.r @@ -0,0 +1,7 @@ +G01ALJ Example Program Results + +Maximum 12.0000 +Upper Hinge (75% quantile) 9.5000 +Median (50% quantile) 6.5000 +Lower Hinge (25% quantile) 2.5000 +Minimum 1.0000 diff --git a/simple_examples/baseresults/g02akje.r b/simple_examples/baseresults/g02akje.r new file mode 100644 index 0000000..a4260ce --- /dev/null +++ b/simple_examples/baseresults/g02akje.r @@ -0,0 +1,14 @@ +G02AKJ Example Program Results + + NCM with rank constraint + 1 2 3 4 + 1 1.0000 -0.9021 0.2448 0.1975 + 2 -0.9021 1.0000 -0.6392 0.2448 + 3 0.2448 -0.6392 1.0000 -0.9021 + 4 0.1975 0.2448 -0.9021 1.0000 + +Number of subproblems solved: 4 + +Squared Frobenius norm of difference: 0.3082 + +Rank error: 0.0000 diff --git a/simple_examples/baseresults/g02bjje.r b/simple_examples/baseresults/g02bjje.r new file mode 100644 index 0000000..053b912 --- /dev/null +++ b/simple_examples/baseresults/g02bjje.r @@ -0,0 +1,38 @@ + G02BJJ Example Program Results + + Number of variables (columns) = 4 + Number of cases (rows) = 5 + + Data matrix is:- + 1 2 3 4 + 1 3.0000 3.0000 1.0000 2.0000 + 2 6.0000 4.0000 -1.0000 4.0000 + 3 9.0000 0.0000 5.0000 9.0000 + 4 12.0000 2.0000 0.0000 0.0000 + 5 -1.0000 5.0000 4.0000 12.0000 + + Variable Mean St.dev. + 4 6.7500 4.5735 + 1 7.5000 3.8730 + 2 3.5000 1.2910 + + Sums of squares and cross-products of deviations + 4 1 2 + 4 62.7500 21.0000 10.0000 + 1 21.0000 45.0000 -6.0000 + 2 10.0000 -6.0000 5.0000 + + Correlation coefficients + 4 1 2 + 4 1.0000 0.9707 0.9449 + 1 0.9707 1.0000 -0.6547 + 2 0.9449 -0.6547 1.0000 + + Minimum number of cases used for any pair of variables: 3 + + Numbers used for each pair are: + 4 1 2 + 4 4.0000 3.0000 3.0000 + 1 3.0000 4.0000 3.0000 + 2 3.0000 3.0000 4.0000 + diff --git a/simple_examples/baseresults/g02brje.r b/simple_examples/baseresults/g02brje.r new file mode 100644 index 0000000..7621bb4 --- /dev/null +++ b/simple_examples/baseresults/g02brje.r @@ -0,0 +1,29 @@ +G02BRJ Example Program Results + +Number of variables (columns) = 3 +Number of case (rows) = 9 + +Data matrix is:- + + + 1 2 3 + 1 1.7000 1.0000 0.5000 + 2 2.8000 4.0000 3.0000 + 3 0.6000 6.0000 2.5000 + 4 1.8000 9.0000 6.0000 + 5 0.9900 4.0000 2.5000 + 6 1.4000 2.0000 5.5000 + 7 1.8000 9.0000 7.5000 + 8 2.5000 7.0000 0.0000 + 9 0.9900 5.0000 3.0000 + +Matrix of rank correlation coefficients: +Upper triangle -- Spearman's +Lower triangle -- Kendall's tau + + 1 2 3 + 1 1.0000 0.2941 0.4058 + 2 0.1429 1.0000 0.7537 + 3 0.2760 0.5521 1.0000 + +Number of cases actually used: 6 diff --git a/simple_examples/baseresults/g02daje.r b/simple_examples/baseresults/g02daje.r new file mode 100644 index 0000000..9c6e2f0 --- /dev/null +++ b/simple_examples/baseresults/g02daje.r @@ -0,0 +1,31 @@ +G02DAJ Example Program Results + +Model not of full rank, rank = 4 +Residual sum of squares = 2.2227e+01 +Degrees of freedom = 8 +R-squared = 7.0042e-01 +Adjusted R-squared = 5.8808e-01 +AIC = 1.5397e+01 + +Variable Parameter estimate Standard error + + 1 3.0557e+01 3.8494e-01 + 2 5.4467e+00 8.3896e-01 + 3 6.7433e+00 8.3896e-01 + 4 1.1047e+01 8.3896e-01 + 5 7.3200e+00 8.3896e-01 + + Obs Residuals H + + 1 -2.3733e+00 3.3333e-01 + 2 1.7433e+00 3.3333e-01 + 3 8.8000e-01 3.3333e-01 + 4 -1.4333e-01 3.3333e-01 + 5 1.4333e-01 3.3333e-01 + 6 -1.4700e+00 3.3333e-01 + 7 -1.8867e+00 3.3333e-01 + 8 5.7667e-01 3.3333e-01 + 9 1.3167e+00 3.3333e-01 + 10 1.7967e+00 3.3333e-01 + 11 -1.1733e+00 3.3333e-01 + 12 5.9000e-01 3.3333e-01 diff --git a/simple_examples/baseresults/g02eeje.r b/simple_examples/baseresults/g02eeje.r new file mode 100644 index 0000000..c66f9b6 --- /dev/null +++ b/simple_examples/baseresults/g02eeje.r @@ -0,0 +1,20 @@ + G02EEJ Example Program Results + + Step 1 + Added variable is TS + Change in residual sum of squares = 4.7126E-01 + F Statistic = 7.38 + + Variables in model: COD TS + + Residual sum of squares = 1.0850E+00 + Degrees of freedom = 17 + + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.1175 0.0600 0.2276 + Step 2 + No further variables added maximum F = 1.59 + Free variables: TKN BOD TVS + Change in residual sums of squares for free variables: + 0.0979 0.0207 0.0217 diff --git a/simple_examples/baseresults/g02maje.r b/simple_examples/baseresults/g02maje.r new file mode 100644 index 0000000..dd042fa --- /dev/null +++ b/simple_examples/baseresults/g02maje.r @@ -0,0 +1,23 @@ +G02MAJ Example Program Results + + Step Parameter Estimate +------------------------------------------------------ + 1 0.000 0.000 3.125 0.000 0.000 0.000 + 2 0.000 0.000 3.792 0.000 0.000 -0.713 + 3 -0.446 0.000 3.998 0.000 0.000 -1.151 + 4 -0.628 -0.295 4.098 0.000 0.000 -1.466 + 5 -1.060 -1.056 4.110 -0.864 0.000 -1.948 + 6 -1.073 -1.132 4.118 -0.935 -0.059 -1.981 + +alpha: -50.037 + + Step Sum RSS df Cp Ck Step Size +--------------------------------------------------------- + 1 72.446 8929.855 3 13.355 123.227 72.446 + 2 103.385 6404.701 7 7.054 50.781 24.841 + 3 126.243 5258.247 51 5.286 30.836 16.225 + 4 145.277 4657.051 25 5.309 19.319 11.587 + 5 198.223 3959.401 126 5.016 12.266 24.520 + 6 203.529 3954.571 5258 7.000 0.910 2.198 + +sigma^2: 304.198 diff --git a/simple_examples/baseresults/g03gaje.r b/simple_examples/baseresults/g03gaje.r new file mode 100644 index 0000000..37ab236 --- /dev/null +++ b/simple_examples/baseresults/g03gaje.r @@ -0,0 +1,79 @@ + G03GAJ Example Program Results + + + Mixing proportions + 1 2 + 1 0.4798 0.5202 + + Group means + 1 2 + 1 4.0041 3.3350 + 2 3.9949 3.4434 + 3 5.5894 4.9870 + 4 5.4432 5.3602 + + Pooled Variance-covariance matrix + 1 2 3 4 + 1 0.4539 0.2891 0.6075 0.3413 + 2 0.2891 0.2048 0.4101 0.2490 + 3 0.6075 0.4101 1.0648 0.6011 + 4 0.3413 0.2490 0.6011 0.3759 + + Densities + 1 2 + 1 2.5836E-01 1.1853E-02 + 2 3.7065E-07 1.1241E-01 + 3 5.3069E-03 1.8080E-06 + 4 4.2461E-01 2.8584E-05 + 5 5.0387E-02 1.1544E+00 + 6 1.1260E+00 7.2224E-02 + 7 2.0911E+00 2.1224E-02 + 8 5.7856E-03 1.3227E+00 + 9 1.1609E+00 2.9411E-02 + 10 8.9826E-02 2.4260E-05 + 11 3.0170E-01 1.0106E+00 + 12 1.2930E+00 3.5422E-01 + 13 2.8644E-02 6.7851E-07 + 14 2.0759E-02 3.1690E+00 + 15 7.6461E-02 1.5231E+00 + 16 3.0279E-04 8.4017E-01 + 17 5.6101E-01 4.6699E-05 + 18 2.6573E-05 6.4442E-01 + 19 2.1250E+00 5.1006E-02 + 20 8.6822E-04 2.7626E+00 + 21 1.9223E-01 2.3971E+00 + 22 1.2469E-02 2.8179E+00 + 23 1.8389E-02 5.3572E-01 + 24 1.2409E+00 9.6489E-03 + 25 2.1037E-05 4.8674E-02 + + Membership probabilities + 1 2 + 1 9.5018E-01 4.9823E-02 + 2 3.3259E-06 1.0000E+00 + 3 9.9961E-01 3.8664E-04 + 4 9.9992E-01 7.9913E-05 + 5 3.8999E-02 9.6100E-01 + 6 9.3270E-01 6.7295E-02 + 7 9.8881E-01 1.1190E-02 + 8 4.1252E-03 9.9587E-01 + 9 9.7252E-01 2.7479E-02 + 10 9.9969E-01 3.0805E-04 + 11 2.1722E-01 7.8278E-01 + 12 7.6938E-01 2.3062E-01 + 13 9.9997E-01 2.6937E-05 + 14 6.1133E-03 9.9389E-01 + 15 4.4189E-02 9.5581E-01 + 16 3.5006E-04 9.9965E-01 + 17 9.9990E-01 9.7029E-05 + 18 4.0270E-05 9.9996E-01 + 19 9.7380E-01 2.6202E-02 + 20 3.0204E-04 9.9970E-01 + 21 6.9471E-02 9.3053E-01 + 22 4.1603E-03 9.9584E-01 + 23 3.0839E-02 9.6916E-01 + 24 9.9116E-01 8.8421E-03 + 25 4.1534E-04 9.9958E-01 + +No. iterations: 14 +Log-likelihood: -29.6831 diff --git a/simple_examples/baseresults/g05kfje.r b/simple_examples/baseresults/g05kfje.r new file mode 100644 index 0000000..830c10a --- /dev/null +++ b/simple_examples/baseresults/g05kfje.r @@ -0,0 +1,7 @@ +G05KFJ Example Program Results + +0.6364 +0.1065 +0.7460 +0.7983 +0.1046 \ No newline at end of file diff --git a/simple_examples/baseresults/g13awje.r b/simple_examples/baseresults/g13awje.r new file mode 100644 index 0000000..25be8b6 --- /dev/null +++ b/simple_examples/baseresults/g13awje.r @@ -0,0 +1,4 @@ + G13AWJ Example Program Results + +Dickey-Fuller test statistic = -2.540 +associated p-value = 0.013 diff --git a/simple_examples/baseresults/g13meje.r b/simple_examples/baseresults/g13meje.r new file mode 100644 index 0000000..07a391e --- /dev/null +++ b/simple_examples/baseresults/g13meje.r @@ -0,0 +1,39 @@ +G13MEJ Example Program Results + + Iterated + Time EMA + +-------------------------------- + 1 7.5 0.531 + 2 8.2 0.544 + 3 18.1 0.754 + 4 22.8 0.406 + 5 25.8 0.232 + + 6 26.8 0.217 + 7 31.1 0.357 + 8 38.4 0.630 + 9 45.9 0.263 + 10 48.2 0.241 + 11 48.9 0.279 + 12 57.9 0.713 + 13 58.5 0.717 + 14 63.9 0.385 + 15 65.2 0.346 + + 16 66.6 0.330 + 17 67.4 0.315 + 18 69.3 0.409 + 19 69.9 0.459 + 20 73.0 0.377 + 21 75.6 0.411 + 22 77.0 0.536 + 23 84.7 0.632 + 24 86.8 0.538 + 25 88.0 0.444 + 26 88.5 0.401 + 27 91.0 0.331 + 28 93.0 0.495 + 29 93.7 0.585 + 30 94.0 0.612 + diff --git a/simple_examples/baseresults/g13naje.r b/simple_examples/baseresults/g13naje.r new file mode 100644 index 0000000..b87dda8 --- /dev/null +++ b/simple_examples/baseresults/g13naje.r @@ -0,0 +1,11 @@ +G13NAJ Example Program Results + + -- Charge Points -- --- Distribution --- + Number Position Parameters +================================================= + 1 12 0.34 1.00 + 2 32 2.57 1.00 + 3 49 1.45 1.00 + 4 52 -0.48 1.00 + 5 70 1.20 1.00 + 6 100 -0.23 1.00 diff --git a/simple_examples/baseresults/h02bbje.r b/simple_examples/baseresults/h02bbje.r new file mode 100644 index 0000000..64136ef --- /dev/null +++ b/simple_examples/baseresults/h02bbje.r @@ -0,0 +1,79 @@ +H02BBJ Example Program Results + + + *** IP solver + + Parameters + ---------- + + Linear constraints...... 3 First integer solution.. OFF + Variables............... 2 Max depth of the tree... 4 + + Feasibility tolerance... 1.05E-08 Print level............. 10 + Infinite bound size..... 1.00E+20 EPS (machine precision). 1.11E-16 + + Integer feasibility tol. 1.00E-05 Iteration limit......... 50 + Max number of nodes..... NONE + + ** Workspace provided with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + ** Workspace required with MAXDPT = 4: LRWORK = 84 LIWORK = 137 + + + *** Optimum LP solution *** -17.50000 + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 FR 3.92857 0.00000 None 0.000 3.929 + V 2 FR 1.42857 0.00000 None 0.000 1.429 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 UL 15.0000 None 15.0000 -1.000 0.000 + L 2 UL 5.00000 None 5.00000 -0.5000 -8.8818E-16 + L 3 FR 14.6429 5.00000 None 0.000 9.643 + + + *** Start of tree search *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 2 1 No Feas Soln 1 3.93 4.00 None 4.00 1 + 3 1 -16.2 1 3.93 0.00 3.00 3.00 1 + 4 3 -15.5 2 1.80 2.00 None 2.00 2 + 5 3 -13.0 2 1.80 0.00 1.00 1.00 2 + *** Integer solution *** + + + Node Parent Obj Varbl Value Lower Upper Value Depth + No Node Value Chosen Before Bound Bound After + 6 4 No Feas Soln 1 2.50 3.00 3.00 3.00 3 + 7 4 -14.8 1 2.50 0.00 2.00 2.00 3 + 8 7 -12.0 CO 2 2.20 3.00 None 3.00 4 + 9 7 -14.0 2 2.20 2.00 2.00 2.00 4 + *** Integer solution *** + + *** End of tree search *** + + + Total of 9 nodes investigated. + + Exit IP solver - Optimum IP solution found. + + Final IP objective value = -14.00000 + + + + Varbl State Value Lower Bound Upper Bound Lagr Mult Residual + + V 1 UL 2.00000 0.00000 2.00000 -3.000 0.000 + V 2 EQ 2.00000 2.00000 2.00000 -4.000 0.000 + + + L Con State Value Lower Bound Upper Bound Lagr Mult Residual + + L 1 FR 14.0000 None 15.0000 0.000 1.000 + L 2 FR 0.00000 None 5.00000 0.000 5.000 + L 3 FR 10.0000 5.00000 None 0.000 5.000 diff --git a/simple_examples/baseresults/h02daje.r b/simple_examples/baseresults/h02daje.r new file mode 100644 index 0000000..125c5bf --- /dev/null +++ b/simple_examples/baseresults/h02daje.r @@ -0,0 +1,14 @@ +H02DAJ Example Program Results + + Final Esimate: + 1 + 1 0.3750 + 2 0.0000 + 3 0.5250 + 4 0.1000 + 5 1.0000 + 6 0.0000 + 7 1.0000 + 8 1.0000 +Requested accuracy of QP subproblems 1.0000e-10 +Optimised value: 2.925 diff --git a/simple_examples/baseresults/m01ccje.r b/simple_examples/baseresults/m01ccje.r new file mode 100644 index 0000000..33e1712 --- /dev/null +++ b/simple_examples/baseresults/m01ccje.r @@ -0,0 +1,15 @@ + M01CCJ Example Program Results + + Records sorted on columns 7 to 12 + + C05AZF 2181 + C05AUF 1351 + C02AEF 599 + A02ACF 531 + A02ABF 523 + A02AAF 289 + C05AVF 240 + C05AXF 211 + C05AYF 183 + C02ADF 169 + C05AWF 136 diff --git a/simple_examples/baseresults/nagcomplexexample.r b/simple_examples/baseresults/nagcomplexexample.r new file mode 100644 index 0000000..2040ba1 --- /dev/null +++ b/simple_examples/baseresults/nagcomplexexample.r @@ -0,0 +1,60 @@ +Please read the source of NAGComplexExample.java for a better understanding of how to use NAGComplex + +*****BASICS***** + +Constructing z1 and z2; +z1 = (0.0, 0.0) +z2 = (2.0, 3.0) + +Changing z1 values using NAGComplex.setRe() and NAGComplex.setIm(); +z1 = (3.0, 4.0) + +Copying z2 to z3 using NAGComplex.clone(); +z3 = (2.0, 3.0) +Copying z1 to z4 using static method NAGComplex.clone(NAGComplex z) +z4 = (3.0, 4.0) + +Array created using NAGComplex.createArray(5); +(0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) (0.0, 0.0) + +The same array updated using NAGComplex[i].setRe() and NAGComplex[i].setIm(); +(1.0, 9.0) (2.0, 8.0) (3.0, 7.0) (4.0, 6.0) (5.0, 5.0) + +*****ARITHMETIC***** + +z1 = (3.0, 4.0) +z2 = (2.0, 3.0) +z3 = (6.0, -2.0) +z4 = (4.0, -5.0) + +z1 + z2 = (5.0, 7.0) +z3 + z4 = (10.0, -7.0) + +z1 - z2 = (1.0, 1.0) +z3 - z4 = (2.0, 3.0) + +z1 * z2 = (-6.0, 17.0) +z3 * z4 = (14.0, -38.0) + +z1 / z2 = (1.3846153846153846, -0.07692307692307696) +z3 / z4 = (0.829268292682927, 0.5365853658536587) + +-(z1) = (-3.0, -4.0) +-(z2) = (-2.0, -3.0) + +conjugate(z1) = (3.0, -4.0) +conjugate(z2) = (2.0, -3.0) + +z3 == z4? - false +z4 = (6.0, -2.0) +z3 == z4? - true +|z1| = 5.0 +|z2| = 3.6055512754639896 + +arg(z1) = 0.9272952180016122 +arg(z2) = 0.982793723247329 + +z5 = (-5.0, 12.0) +z6 = (-9.0, 40.0) +Sqrt(z5) = (2.0, 3.0) +Sqrt(z6) = (4.0, 5.0) \ No newline at end of file diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r new file mode 100644 index 0000000..76fc07e --- /dev/null +++ b/simple_examples/baseresults/outputexample.r @@ -0,0 +1,10 @@ + *** Start of NAG Library implementation details *** + + Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran + Precision: double precision + Product Code: NLL6I27DBL + Mark: 27.2.0 (self-contained) + + This is a 64-bit library using 32-bit integers. + + *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/s01baje.r b/simple_examples/baseresults/s01baje.r new file mode 100644 index 0000000..b3b20dd --- /dev/null +++ b/simple_examples/baseresults/s01baje.r @@ -0,0 +1,9 @@ +S01BAJ Example Program Results + + X Y + 2.5000e+00 1.2528e+00 + 1.2500e-01 1.1778e-01 + -9.0600e-01 -2.3645e+00 + 1.2900e-03 1.2892e-03 + -7.8300e-06 -7.8300e-06 + 1.0000e-09 1.0000e-09 diff --git a/simple_examples/baseresults/s10aaje.r b/simple_examples/baseresults/s10aaje.r new file mode 100644 index 0000000..eac481e --- /dev/null +++ b/simple_examples/baseresults/s10aaje.r @@ -0,0 +1,7 @@ +S10AAJ Example Program Results + + X Y + -2.000e+01 -1.000e+00 + -5.000e+00 -9.999e-01 + 5.000e-01 4.621e-01 + 5.000e+00 9.999e-01 diff --git a/simple_examples/baseresults/s10abje.r b/simple_examples/baseresults/s10abje.r new file mode 100644 index 0000000..54e3b1c --- /dev/null +++ b/simple_examples/baseresults/s10abje.r @@ -0,0 +1,8 @@ +S10ABJ Example Program Results + + X Y + -1.000e+01 -1.101e+04 + -5.000e-01 -5.211e-01 + 0.000e+00 0.000e+00 + 5.000e-01 5.211e-01 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s10acje.r b/simple_examples/baseresults/s10acje.r new file mode 100644 index 0000000..e71c76b --- /dev/null +++ b/simple_examples/baseresults/s10acje.r @@ -0,0 +1,8 @@ +S10ACJ Example Program Results + + X Y + -1.000e+01 1.101e+04 + -5.000e-01 1.128e+00 + 0.000e+00 1.000e+00 + 5.000e-01 1.128e+00 + 2.500e+01 3.600e+10 diff --git a/simple_examples/baseresults/s14abje.r b/simple_examples/baseresults/s14abje.r new file mode 100644 index 0000000..86c60ea --- /dev/null +++ b/simple_examples/baseresults/s14abje.r @@ -0,0 +1,12 @@ +S14ABJ Example Program Results + + X Y + 1.000e+00 0.000e+00 + 1.250e+00 -9.827e-02 + 1.500e+00 -1.208e-01 + 1.750e+00 -8.440e-02 + 2.000e+00 0.000e+00 + 5.000e+00 3.178e+00 + 1.000e+01 1.280e+01 + 2.000e+01 3.934e+01 + 1.000e+03 5.905e+03 diff --git a/simple_examples/baseresults/s14acje.r b/simple_examples/baseresults/s14acje.r new file mode 100644 index 0000000..cda0185 --- /dev/null +++ b/simple_examples/baseresults/s14acje.r @@ -0,0 +1,8 @@ +S14ACJ Example Program Results + + X psi(X)-log(X) + + 0.1000 -8.1212 + 0.5000 -1.2704 + 3.6000 -0.1453 + 8.0000 -0.0638 diff --git a/simple_examples/baseresults/s14afje.r b/simple_examples/baseresults/s14afje.r new file mode 100644 index 0000000..68a5fd5 --- /dev/null +++ b/simple_examples/baseresults/s14afje.r @@ -0,0 +1,5 @@ +S14AFJ Example Program Results + + Z K (d^K/dz^K)psi(Z) + + (-1.5, 2.5) 1 (-1.9737e-01, -2.4271e-01) diff --git a/simple_examples/baseresults/s17dcje.r b/simple_examples/baseresults/s17dcje.r new file mode 100644 index 0000000..845aae3 --- /dev/null +++ b/simple_examples/baseresults/s17dcje.r @@ -0,0 +1,10 @@ +S17DCF Example Program Results + +Calling with N = 2 + +FNU Z SCAL CY[0] CY[1] NZ +0.0000 (0.3000, 0.4000) U (-0.4983, 0.6700) (-1.0149, 0.9485) 0 +2.3000 (2.0000, 0.0000) U (-0.7398, 0.0000) (-1.4120, 0.0000) 0 +2.1200 (-1.0000, 0.0000) U (-1.7279, 0.8602) (6.5331, -2.6154) 0 +1.5800 (-2.3000, 5.6000) U (36.4755, -1.5521) (-2.6788, 25.9112) 0 +1.5800 (-2.3000, 5.6000) S (0.1349, -0.0057) (-0.0099, 0.0958) 0 diff --git a/simple_examples/baseresults/s17dgje.r b/simple_examples/baseresults/s17dgje.r new file mode 100644 index 0000000..c26ff48 --- /dev/null +++ b/simple_examples/baseresults/s17dgje.r @@ -0,0 +1,9 @@ + S17DGJ Example Program Results + + DERIV Z SCAL AI NZ + + F ( 0.3000, 0.4000) U ( 0.2716, -0.1002) 0 + F ( 0.2000, 0.0000) U ( 0.3037, 0.0000) 0 + F ( 1.1000, -6.6000) U (-43.6632,-47.9030) 0 + F ( 1.1000, -6.6000) S ( 0.1655, 0.0597) 0 + D ( -1.0000, 0.0000) U ( -0.0102, 0.0000) 0 diff --git a/simple_examples/baseresults/s30aaje.r b/simple_examples/baseresults/s30aaje.r new file mode 100644 index 0000000..32fc477 --- /dev/null +++ b/simple_examples/baseresults/s30aaje.r @@ -0,0 +1,16 @@ +S30AAJ Example Program Results + +Black-Scholes-Merton formula +European Call : + Spot = 55.0000 + Volatility = 0.3000 + Rate = 0.1000 + Dividend = 0.0000 + + Strike Expiry Option Price + 58.0000 0.7000 5.9198 + 58.0000 0.8000 6.5506 + 60.0000 0.7000 5.0809 + 60.0000 0.8000 5.6992 + 62.0000 0.7000 4.3389 + 62.0000 0.8000 4.9379 diff --git a/simple_examples/baseresults/s30acje.r b/simple_examples/baseresults/s30acje.r new file mode 100644 index 0000000..134730e --- /dev/null +++ b/simple_examples/baseresults/s30acje.r @@ -0,0 +1,9 @@ + S30ACJ Example Program Results + + SIGMA IVALID + + 7.834E-01 0 + 7.386E-01 0 + 4.096E-01 0 + 4.085E-01 0 + 4.179E-01 0 diff --git a/simple_examples/baseresults/simpleroutineexample.r b/simple_examples/baseresults/simpleroutineexample.r new file mode 100644 index 0000000..e1f6a4e --- /dev/null +++ b/simple_examples/baseresults/simpleroutineexample.r @@ -0,0 +1,15 @@ + C05AZ Example Program results: + + Iterations + + X = 0.00000 FX= 1.0000e+00 IND = 2 + X = 1.00000 FX= -6.3212e-01 IND = 3 + X = 0.61270 FX= -7.0814e-02 IND = 4 + X = 0.56707 FX= 1.1542e-04 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + X = 0.56713 FX= 1.4727e-05 IND = 4 + X = 0.56714 FX= -9.4481e-07 IND = 4 + + Solution + + X = 0.56714 Y = 0.56713 diff --git a/simple_examples/baseresults/userdefinedfunctionexample1.r b/simple_examples/baseresults/userdefinedfunctionexample1.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample1.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/userdefinedfunctionexample2.r b/simple_examples/baseresults/userdefinedfunctionexample2.r new file mode 100644 index 0000000..c2fd510 --- /dev/null +++ b/simple_examples/baseresults/userdefinedfunctionexample2.r @@ -0,0 +1 @@ +The result is -0.03183098861837909 diff --git a/simple_examples/baseresults/x03aaje.r b/simple_examples/baseresults/x03aaje.r new file mode 100644 index 0000000..d2b7138 --- /dev/null +++ b/simple_examples/baseresults/x03aaje.r @@ -0,0 +1,3 @@ +X03AAF Example Program Results + +D1 = -5.0 D2 = 0.0 \ No newline at end of file diff --git a/simple_examples/baseresults/x04cbje.r b/simple_examples/baseresults/x04cbje.r new file mode 100644 index 0000000..6b842ef --- /dev/null +++ b/simple_examples/baseresults/x04cbje.r @@ -0,0 +1,21 @@ +X04CBJ Example Program Results + + Example 1 + 1 2 3 4 5 + 1 11.0000 12.0000 13.0000 14.0000 15.0000 + 2 21.0000 22.0000 23.0000 24.0000 25.0000 + 3 31.0000 32.0000 33.0000 34.0000 35.0000 + + Example 2: + Un Deux Trois Quatre Cinq + Uno 11.00 12.00 13.00 14.00 15.00 + Due 22.00 23.00 24.00 25.00 + Tre 33.00 34.00 35.00 + Quattro 44.00 45.00 + Cinque 55.00 + + A = [ + 11.00 0.00 0.00 0.00 0.00; + 21.00 22.00 0.00 0.00 0.00; + 31.00 32.00 33.00 0.00 0.00; + ]; diff --git a/simple_examples/baseresults/x05abje.r b/simple_examples/baseresults/x05abje.r new file mode 100644 index 0000000..f94235c --- /dev/null +++ b/simple_examples/baseresults/x05abje.r @@ -0,0 +1,2 @@ + X05ABJ Example Program Results +Tue 14th Jul 1789 13:11:48.320 diff --git a/simple_examples/data/c02abje.d b/simple_examples/data/c02abje.d new file mode 100644 index 0000000..3f2dfd1 --- /dev/null +++ b/simple_examples/data/c02abje.d @@ -0,0 +1,14 @@ +C02ABJ Example Program Data + +Example 1: Basic Problem + 6 : Degree, n + 3.5 : Coefficients, a + 1.0 + -7.0 + 12.5 + 2.5 + -17.0 + 32.5 + +Example 2: Polishing Processes + 10 : Degree, n diff --git a/simple_examples/data/c02afje.d b/simple_examples/data/c02afje.d new file mode 100644 index 0000000..0e31bab --- /dev/null +++ b/simple_examples/data/c02afje.d @@ -0,0 +1,19 @@ +C02AFJ Example Program Data + +Example 1 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 + +Example 2 + 5 + 5.0 6.0 + 30.0 20.0 + -0.2 -6.0 + 50.0 100000.0 + -2.0 40.0 + 10.0 1.0 diff --git a/simple_examples/data/c02agje.d b/simple_examples/data/c02agje.d new file mode 100644 index 0000000..ada6a96 --- /dev/null +++ b/simple_examples/data/c02agje.d @@ -0,0 +1,9 @@ +C02AGJ Example Program Data + +Example 1 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 + +Example 2 + 5 + 1.0 2.0 3.0 4.0 5.0 6.0 diff --git a/simple_examples/data/c02ahje.d b/simple_examples/data/c02ahje.d new file mode 100644 index 0000000..0e1a9ea --- /dev/null +++ b/simple_examples/data/c02ahje.d @@ -0,0 +1,2 @@ +C02AHJ Example Program Data + 1.0 0.0 -3.0 1.0 8.0 1.0 :AR AI BR BI CR CI diff --git a/simple_examples/data/c02ajje.d b/simple_examples/data/c02ajje.d new file mode 100644 index 0000000..c24b295 --- /dev/null +++ b/simple_examples/data/c02ajje.d @@ -0,0 +1,2 @@ +C02AJJ Example Program Data + 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/c02akje.d b/simple_examples/data/c02akje.d new file mode 100644 index 0000000..0b71c64 --- /dev/null +++ b/simple_examples/data/c02akje.d @@ -0,0 +1,2 @@ +C02AKJ Example Program Data + 1.0 3.0 9.0 -13.0 : Values of U, R, S and T diff --git a/simple_examples/data/c02alje.d b/simple_examples/data/c02alje.d new file mode 100644 index 0000000..a519a24 --- /dev/null +++ b/simple_examples/data/c02alje.d @@ -0,0 +1,2 @@ +C02ALJ Example Program Data + 1.0 2.0 6.0 -8.0 -40.0 : Values of E, A, B, C and D diff --git a/simple_examples/data/c02amje.d b/simple_examples/data/c02amje.d new file mode 100644 index 0000000..9bff4dc --- /dev/null +++ b/simple_examples/data/c02amje.d @@ -0,0 +1,5 @@ +C02AMJ Example Program Data + ( 1.0, 0.0) + ( -2.0, 3.0) + ( 5.0, 14.0) + (-40.0, -5.0) : Values of U, R, S and T diff --git a/simple_examples/data/c02anje.d b/simple_examples/data/c02anje.d new file mode 100644 index 0000000..c331b10 --- /dev/null +++ b/simple_examples/data/c02anje.d @@ -0,0 +1,6 @@ +C02ANJ Example Program Data + ( 1.0, 0.0) + ( 0.0, 0.0) + ( 0.0, 16.0) + ( -8.0, 8.0) + (-65.0, 0.0) : Values of E, A, B, C and D diff --git a/simple_examples/data/c05bbje.d b/simple_examples/data/c05bbje.d new file mode 100644 index 0000000..6c78ea9 --- /dev/null +++ b/simple_examples/data/c05bbje.d @@ -0,0 +1,7 @@ +C05BBJ Example Program Data +0 : BRANCH +false : OFFSET +0.5 -1.0 +1.0 2.3 +4.5 -0.1 +6.0 6.0 : Z diff --git a/simple_examples/data/c06fkje.d b/simple_examples/data/c06fkje.d new file mode 100644 index 0000000..e042218 --- /dev/null +++ b/simple_examples/data/c06fkje.d @@ -0,0 +1,11 @@ +C06FKJ Example Program Data +9 : n +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.50 +1.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 +0.00 0.00 : xa, ya diff --git a/simple_examples/data/c09aaje.d b/simple_examples/data/c09aaje.d new file mode 100644 index 0000000..8313509 --- /dev/null +++ b/simple_examples/data/c09aaje.d @@ -0,0 +1,11 @@ +C09AAF Example Program Data + 8 : n + Haar Zero : wavnam, mode + 2.0 + 5.0 + 8.0 + 9.0 + 7.0 + 4.0 +-1.0 + 1.0 : x(1:n) diff --git a/simple_examples/data/d03pcje.d b/simple_examples/data/d03pcje.d new file mode 100644 index 0000000..9e78e1f --- /dev/null +++ b/simple_examples/data/d03pcje.d @@ -0,0 +1,6 @@ +D03PCJ Example Program Data +6 20 1 : intpts, npts, itype +0.0 0.4 0.6 0.8 0.9 1.0 : xout(1:intpts) +1.0E-3 1.0 : acc, alpha +1 0 : m, itrace +0.0 0.1E-4 : ts, tout diff --git a/simple_examples/data/e02alje.d b/simple_examples/data/e02alje.d new file mode 100644 index 0000000..b1c9d44 --- /dev/null +++ b/simple_examples/data/e02alje.d @@ -0,0 +1,23 @@ +E02ALJ Example Program Data + 21 5 11 : N, M, NEVAL + 0.00 1.0000000000 + 0.05 1.0512710964 + 0.10 1.1051709181 + 0.15 1.1618342427 + 0.20 1.2214027582 + 0.25 1.2840254167 + 0.30 1.3498588076 + 0.35 1.4190675486 + 0.40 1.4918246976 + 0.45 1.5683121855 + 0.50 1.6487212707 + 0.55 1.7332530179 + 0.60 1.8221188004 + 0.65 1.9155408290 + 0.70 2.0137527075 + 0.75 2.1170000166 + 0.80 2.2255409285 + 0.85 2.3396468519 + 0.90 2.4596031112 + 0.95 2.5857096593 + 1.00 2.7182818285 : X, Y diff --git a/simple_examples/data/e04fcje.d b/simple_examples/data/e04fcje.d new file mode 100644 index 0000000..963a616 --- /dev/null +++ b/simple_examples/data/e04fcje.d @@ -0,0 +1,16 @@ +E04FCF Example Program Data + 0.14 1.0 15.0 1.0 + 0.18 2.0 14.0 2.0 + 0.22 3.0 13.0 3.0 + 0.25 4.0 12.0 4.0 + 0.29 5.0 11.0 5.0 + 0.32 6.0 10.0 6.0 + 0.35 7.0 9.0 7.0 + 0.39 8.0 8.0 8.0 + 0.37 9.0 7.0 7.0 + 0.58 10.0 6.0 6.0 + 0.73 11.0 5.0 5.0 + 0.96 12.0 4.0 4.0 + 1.34 13.0 3.0 3.0 + 2.10 14.0 2.0 2.0 + 4.39 15.0 1.0 1.0 diff --git a/simple_examples/data/e04mxje.d b/simple_examples/data/e04mxje.d new file mode 100644 index 0000000..7d45bf8 --- /dev/null +++ b/simple_examples/data/e04mxje.d @@ -0,0 +1,64 @@ +NAME E04MX.EX +ROWS + L ..ROW1.. + L ..ROW2.. + L ..ROW3.. + N ..COST.. +COLUMNS + ...X1... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X1... ..ROW3.. 1.0 ..COST.. -4.0 + ...X2... ..ROW1.. 1.0 ..ROW2.. 2.0 + ...X2... ..ROW3.. -1.0 ..COST.. -1.0 + ...X3... ..ROW1.. 1.0 ..ROW2.. 3.0 + ...X3... ..ROW3.. 1.0 ..COST.. -1.0 + ...X4... ..ROW1.. 1.0 ..ROW2.. 4.0 + ...X4... ..ROW3.. -1.0 ..COST.. -1.0 + ...X5... ..ROW1.. 1.0 ..ROW2.. -2.0 + ...X5... ..ROW3.. 1.0 ..COST.. -1.0 + ...X6... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X6... ..ROW3.. 1.0 ..COST.. -1.0 + ...X7... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X7... ..ROW3.. 1.0 ..COST.. -1.0 + ...X8... ..ROW1.. 1.0 ..ROW2.. 1.0 + ...X8... ..ROW3.. 1.0 ..COST.. -0.1 + ...X9... ..ROW1.. 4.0 ..ROW2.. 1.0 + ...X9... ..ROW3.. 1.0 ..COST.. -0.3 +RHS + RHS1 ..ROW1.. 1.5 + RHS1 ..ROW2.. 1.5 + RHS1 ..ROW3.. 4.0 + RHS1 ..COST.. 1000.0 +RANGES + RANGE1 ..ROW1.. 3.5 + RANGE1 ..ROW2.. 3.5 + RANGE1 ..ROW3.. 6.0 +BOUNDS + LO BOUND ...X1... -2.0 + LO BOUND ...X2... -2.0 + LO BOUND ...X3... -2.0 + LO BOUND ...X4... -2.0 + LO BOUND ...X5... -2.0 + LO BOUND ...X6... -2.0 + LO BOUND ...X7... -2.0 + LO BOUND ...X8... -2.0 + LO BOUND ...X9... -2.0 + UP BOUND ...X1... 2.0 + UP BOUND ...X2... 2.0 + UP BOUND ...X3... 2.0 + UP BOUND ...X4... 2.0 + UP BOUND ...X5... 2.0 + UP BOUND ...X6... 2.0 + UP BOUND ...X7... 2.0 + UP BOUND ...X8... 2.0 + UP BOUND ...X9... 2.0 +QUADOBJ + ...X1... ...X1... 2.00000000E0 ...X2... 1.00000000E0 + ...X1... ...X3... 1.00000000E0 ...X4... 1.00000000E0 + ...X1... ...X5... 1.00000000E0 + ...X2... ...X2... 2.00000000E0 ...X3... 1.00000000E0 + ...X2... ...X4... 1.00000000E0 ...X5... 1.00000000E0 + ...X3... ...X3... 2.00000000E0 ...X4... 1.00000000E0 + ...X3... ...X5... 1.00000000E0 + ...X4... ...X4... 2.00000000E0 ...X5... 1.00000000E0 + ...X5... ...X5... 2.00000000E0 +ENDATA diff --git a/simple_examples/data/e04ncje.d b/simple_examples/data/e04ncje.d new file mode 100644 index 0000000..bdf378b --- /dev/null +++ b/simple_examples/data/e04ncje.d @@ -0,0 +1,21 @@ +E04NCA Example Program Data + 10 9 3 :Values of M, N and NCLIN + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 2.0 1.0 1.0 1.0 1.0 2.0 0.0 0.0 + 1.0 1.0 3.0 1.0 1.0 1.0 -1.0 -1.0 -3.0 + 1.0 1.0 1.0 4.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 3.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 2.0 1.0 1.0 0.0 0.0 0.0 -1.0 + 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 0.0 1.0 1.0 1.0 2.0 2.0 3.0 + 1.0 0.0 1.0 1.0 1.0 1.0 0.0 2.0 2.0 :End of matrix A + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 :End of B + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 4.0 + 1.0 2.0 3.0 4.0 -2.0 1.0 1.0 1.0 1.0 + 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 1.0 1.0 :End of matrix C + 0.0 0.0 -1.0E+25 0.0 0.0 0.0 0.0 0.0 0.0 + 2.0 -1.0E+25 1.0 :End of BL + 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 + 1.0E+25 2.0 4.0 :End of BU + 1.0 0.5 0.3333 0.25 0.2 0.1667 0.1428 0.125 0.1111 :End of X diff --git a/simple_examples/data/e04nfje.d b/simple_examples/data/e04nfje.d new file mode 100644 index 0000000..f2c6165 --- /dev/null +++ b/simple_examples/data/e04nfje.d @@ -0,0 +1,22 @@ +E04NFA Example Program Data + 7 7 :Values of N and NCLIN + -0.02 -0.20 -0.20 -0.20 -0.20 0.04 0.04 :End of CVEC + 1.00 1.00 1.00 1.00 1.00 1.00 1.00 + 0.15 0.04 0.02 0.04 0.02 0.01 0.03 + 0.03 0.05 0.08 0.02 0.06 0.01 0.00 + 0.02 0.04 0.01 0.02 0.02 0.00 0.00 + 0.02 0.03 0.00 0.00 0.01 0.00 0.00 + 0.70 0.75 0.80 0.75 0.80 0.97 0.00 + 0.02 0.06 0.08 0.12 0.02 0.01 0.97 :End of matrix A + -0.01 -0.10 -0.01 -0.04 -0.10 -0.01 -0.01 + -0.13 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 -9.92E-02 -3.0E-03 :End of BL + 0.01 0.15 0.03 0.02 0.05 1.0E+25 1.0E+25 + -0.13 -4.9E-03 -6.4E-03 -3.7E-03 -1.2E-03 1.0E+25 2.0E-03 :End of BU + -0.01 -0.03 0.00 -0.01 -0.10 0.02 0.01 :End of X + 2.00 0.00 0.00 0.00 0.00 0.00 0.00 + 0.00 2.00 0.00 0.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 2.00 2.00 0.00 0.00 0.00 + 0.00 0.00 0.00 0.00 2.00 0.00 0.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 + 0.00 0.00 0.00 0.00 0.00 -2.00 -2.00 :End of matrix H diff --git a/simple_examples/data/e04nqje.d b/simple_examples/data/e04nqje.d new file mode 100644 index 0000000..a1c9039 --- /dev/null +++ b/simple_examples/data/e04nqje.d @@ -0,0 +1,67 @@ +E04NQF Example Program Data + 7 8 : Values of N and M +48 8 7 'C' 15 : Values of NNZ, IOBJ, NCOLH, START and NNAME + +'...X1...' '...X2...' '...X3...' '...X4...' '...X5...' +'...X6...' '...X7...' '..ROW1..' '..ROW2..' '..ROW3..' +'..ROW4..' '..ROW5..' '..ROW6..' '..ROW7..' '..COST..' : End of array NAMES + + 0.02 7 1 : Sparse matrix A, ordered by increasing column index; + 0.02 5 1 : each row contains ACOL(i), INDA(i), ICOL (= column index) + 0.03 3 1 : The row indices may be in any order. In this example + 1.00 1 1 : row 8 defines the linear objective term transpose(C)*X. + 0.70 6 1 + 0.02 4 1 + 0.15 2 1 + -200.00 8 1 + 0.06 7 2 + 0.75 6 2 + 0.03 5 2 + 0.04 4 2 + 0.05 3 2 + 0.04 2 2 + 1.00 1 2 +-2000.00 8 2 + 0.02 2 3 + 1.00 1 3 + 0.01 4 3 + 0.08 3 3 + 0.08 7 3 + 0.80 6 3 +-2000.00 8 3 + 1.00 1 4 + 0.12 7 4 + 0.02 3 4 + 0.02 4 4 + 0.75 6 4 + 0.04 2 4 +-2000.00 8 4 + 0.01 5 5 + 0.80 6 5 + 0.02 7 5 + 1.00 1 5 + 0.02 2 5 + 0.06 3 5 + 0.02 4 5 +-2000.00 8 5 + 1.00 1 6 + 0.01 2 6 + 0.01 3 6 + 0.97 6 6 + 0.01 7 6 + 400.00 8 6 + 0.97 7 7 + 0.03 2 7 + 1.00 1 7 + 400.00 8 7 : End of matrix A + + 0.0 0.0 4.0E+02 1.0E+02 0.0 0.0 + 0.0 2.0E+03 -1.0E+25 -1.0E+25 -1.0E+25 -1.0E+25 + 1.5E+03 2.5E+02 -1.0E+25 : End of lower bounds array BL + + 2.0E+02 2.5E+03 8.0E+02 7.0E+02 1.5E+03 1.0E+25 + 1.0E+25 2.0E+03 6.0E+01 1.0E+02 4.0E+01 3.0E+01 + 1.0E+25 3.0E+02 1.0E+25 : End of upper bounds array BU + + 0 0 0 0 0 0 0 : Initial array HS + 0.0 0.0 0.0 0.0 0.0 0.0 0.0 : Initial vector X diff --git a/simple_examples/data/e04rsje.d b/simple_examples/data/e04rsje.d new file mode 100644 index 0000000..9540ce2 --- /dev/null +++ b/simple_examples/data/e04rsje.d @@ -0,0 +1,13 @@ +E04RSJ Example Program Data + 3 6 6 : n, nnzq1, nnzq2 + 1 1 1 2 2 3 : irowq0 + 1 2 3 2 3 3 : icolq0 + 0.493 0.382 0.270 0.475 0.448 0.515 : q0 + 1 1 1 2 2 3 : irowq1 + 1 2 3 2 3 3 : icolq1 + 0.737 0.453 1.002 0.316 0.635 1.590 : q1 + 1 2 3 : idxr0 + 0.847 0.08 0.505 : r0 + 1 2 3 : idxr1 + 0.065 0.428 0.097 : r1 + 1.276 : s diff --git a/simple_examples/data/e04rtje.d b/simple_examples/data/e04rtje.d new file mode 100644 index 0000000..f6f5896 --- /dev/null +++ b/simple_examples/data/e04rtje.d @@ -0,0 +1,8 @@ +E04RTJ Example Program Data + 3 2 4 : n, m, nnza + 1 1 2 2 : irowa + 1 2 2 3 : icola + 0.493 0.382 0.270 0.475 : a + 0.2 0.4 : b + -1.0 -1.0 -1.0 : xl + 1.0 1.0 1.0 : xu diff --git a/simple_examples/data/e04saje.opt b/simple_examples/data/e04saje.opt new file mode 100644 index 0000000..098dd78 --- /dev/null +++ b/simple_examples/data/e04saje.opt @@ -0,0 +1,30 @@ +NAME E04SAJE +OBJSENSE + MIN +ROWS + N obj + L g1 + G g2 +COLUMNS + x1 obj 10.0 + x1 g1 -0.1 + x1 g2 -0.06 + x2 obj 20.0 + x2 g1 -0.1 + x2 g2 1.0 + x3 obj 1.0 + x3 g1 1.0 + x3 g2 1.0 +RHS + UVEC g1 1.5 + UVEC g2 1.0 +BOUNDS + LO bound x1 -2.0 + UP bound x1 2.0 + LO bound x2 -2.0 + UP bound x2 2.0 +CSECTION k1 0 QUAD + x3 + x1 + x2 +ENDATA diff --git a/simple_examples/data/e04tcje.d b/simple_examples/data/e04tcje.d new file mode 100644 index 0000000..0d7c25f --- /dev/null +++ b/simple_examples/data/e04tcje.d @@ -0,0 +1,22 @@ +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/f03baje.d b/simple_examples/data/f03baje.d new file mode 100644 index 0000000..8c792dc --- /dev/null +++ b/simple_examples/data/f03baje.d @@ -0,0 +1,5 @@ +F03BAF Example Program Data + 3 : N + 33 16 72 + -24 -10 -57 + -8 -4 -17 : A diff --git a/simple_examples/data/f04amje.d b/simple_examples/data/f04amje.d new file mode 100644 index 0000000..dc69386 --- /dev/null +++ b/simple_examples/data/f04amje.d @@ -0,0 +1,5 @@ +F04AMF Example Program Data + 3 2 : m, n + 1.1 0.9 2.2 + 1.2 1.0 2.3 + 1.0 1.0 2.1 : matrices A and B diff --git a/simple_examples/data/f04baje.d b/simple_examples/data/f04baje.d new file mode 100644 index 0000000..b1df19b --- /dev/null +++ b/simple_examples/data/f04baje.d @@ -0,0 +1,13 @@ +F04BAF Example Program Data + + 4 2 : n, nrhs + + 1.80 2.88 2.05 -0.89 + 5.25 -2.95 -0.95 -3.80 + 1.58 -2.69 -2.90 -1.04 + -1.11 -0.66 -0.59 0.80 : matrix A + + 9.52 18.47 + 24.35 2.25 + 0.77 -13.28 + -6.22 -6.21 : matrix B diff --git a/simple_examples/data/f05aaje.d b/simple_examples/data/f05aaje.d new file mode 100644 index 0000000..cafb7ea --- /dev/null +++ b/simple_examples/data/f05aaje.d @@ -0,0 +1,6 @@ +F05AAF Example Program Data + 4 2 4 + 1 -2 3 1 +-2 1 -2 -1 + 3 -2 1 5 + 4 1 5 3 \ No newline at end of file diff --git a/simple_examples/data/f08btje.d b/simple_examples/data/f08btje.d new file mode 100644 index 0000000..bea5bf4 --- /dev/null +++ b/simple_examples/data/f08btje.d @@ -0,0 +1,15 @@ +F08BTF Example Program Data + + 5 4 2 :Values of M, N and NRHS + + ( 0.47,-0.34) (-0.40, 0.54) ( 0.60, 0.01) ( 0.80,-1.02) + (-0.32,-0.23) (-0.05, 0.20) (-0.26,-0.44) (-0.43, 0.17) + ( 0.35,-0.60) (-0.52,-0.34) ( 0.87,-0.11) (-0.34,-0.09) + ( 0.89, 0.71) (-0.45,-0.45) (-0.02,-0.57) ( 1.14,-0.78) + (-0.19, 0.06) ( 0.11,-0.85) ( 1.44, 0.80) ( 0.07, 1.14) :End of matrix A + + (-1.08,-2.59) ( 2.22, 2.35) + (-2.61,-1.49) ( 1.62,-1.48) + ( 3.13,-3.61) ( 1.65, 3.43) + ( 7.33,-8.01) (-0.98, 3.08) + ( 9.12, 7.63) (-2.84, 2.78) :End of matrix B diff --git a/simple_examples/data/f08xpje.d b/simple_examples/data/f08xpje.d new file mode 100644 index 0000000..39b5c87 --- /dev/null +++ b/simple_examples/data/f08xpje.d @@ -0,0 +1,10 @@ +F08XPJ Example Program Data +4 : Value of N +(-21.10,-22.50) ( 53.50,-50.50) (-34.50,127.50) ( 7.50, 0.50) +( -0.46, -7.78) ( -3.50,-37.50) (-15.50, 58.50) (-10.50, -1.50) +( 4.30, -5.50) ( 39.70,-17.10) (-68.50, 12.50) ( -7.50, -3.50) +( 5.50, 4.40) ( 14.40, 43.30) (-32.50,-46.00) (-19.00,-32.50) : End of A +( 1.00, -5.00) ( 1.60, 1.20) ( -3.00, 0.00) ( 0.00, -1.00) +( 0.80, -0.60) ( 3.00, -5.00) ( -4.00, 3.00) ( -2.40, -3.20) +( 1.00, 0.00) ( 2.40, 1.80) ( -4.00, -5.00) ( 0.00, -3.00) +( 0.00, 1.00) ( -1.80, 2.40) ( 0.00, -4.00) ( 4.00, -5.00) : End of B diff --git a/simple_examples/data/g02bjje.d b/simple_examples/data/g02bjje.d new file mode 100644 index 0000000..eaa8921 --- /dev/null +++ b/simple_examples/data/g02bjje.d @@ -0,0 +1,10 @@ +G02BJF Example Program Data +5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 +12.0 2.0 0.0 0.0 +-1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS +-1.0 0.0 0.0 0.0 :: XMISS +4 1 2 :: KVAR diff --git a/simple_examples/data/g02daje.d b/simple_examples/data/g02daje.d new file mode 100644 index 0000000..4e844ac --- /dev/null +++ b/simple_examples/data/g02daje.d @@ -0,0 +1,15 @@ +G02DAJ Example Program Data +12 4 'U' 'M' +1.0 0.0 0.0 0.0 33.63 +0.0 0.0 0.0 1.0 39.62 +0.0 1.0 0.0 0.0 38.18 +0.0 0.0 1.0 0.0 41.46 +0.0 0.0 0.0 1.0 38.02 +0.0 1.0 0.0 0.0 35.83 +0.0 0.0 0.0 1.0 35.99 +1.0 0.0 0.0 0.0 36.58 +0.0 0.0 1.0 0.0 42.92 +1.0 0.0 0.0 0.0 37.80 +0.0 0.0 1.0 0.0 40.43 +0.0 1.0 0.0 0.0 37.89 +1 1 1 1 diff --git a/simple_examples/data/g02eeje.d b/simple_examples/data/g02eeje.d new file mode 100644 index 0000000..b0c03a7 --- /dev/null +++ b/simple_examples/data/g02eeje.d @@ -0,0 +1,24 @@ +G02EEF Example Program Data + 20 6 'M' 'U' 2.0 :: N,M,MEAN,WEIGHT,FIN + 0.0 1125.0 232.0 7160.0 85.9 8905.0 1.5563 + 7.0 920.0 268.0 8804.0 86.5 7388.0 0.8976 + 15.0 835.0 271.0 8108.0 85.2 5348.0 0.7482 + 22.0 1000.0 237.0 6370.0 83.8 8056.0 0.7160 + 29.0 1150.0 192.0 6441.0 82.1 6960.0 0.3010 + 37.0 990.0 202.0 5154.0 79.2 5690.0 0.3617 + 44.0 840.0 184.0 5896.0 81.2 6932.0 0.1139 + 58.0 650.0 200.0 5336.0 80.6 5400.0 0.1139 + 65.0 640.0 180.0 5041.0 78.4 3177.0 -0.2218 + 72.0 583.0 165.0 5012.0 79.3 4461.0 -0.1549 + 80.0 570.0 151.0 4825.0 78.7 3901.0 0.0000 + 86.0 570.0 171.0 4391.0 78.0 5002.0 0.0000 + 93.0 510.0 243.0 4320.0 72.3 4665.0 -0.0969 + 100.0 555.0 147.0 3709.0 74.9 4642.0 -0.2218 + 107.0 460.0 286.0 3969.0 74.4 4840.0 -0.3979 + 122.0 275.0 198.0 3558.0 72.5 4479.0 -0.1549 + 129.0 510.0 196.0 4361.0 57.7 4200.0 -0.2218 + 151.0 165.0 210.0 3301.0 71.8 3410.0 -0.3979 + 171.0 244.0 327.0 2964.0 72.5 3360.0 -0.5229 + 220.0 79.0 334.0 2777.0 71.9 2599.0 -0.0458 :: End of X,Y + 0 1 1 1 1 2 :: ISX + 'DAY' 'BOD' 'TKN' 'TS ' 'TVS' 'COD' :: VNAME diff --git a/simple_examples/data/g02maje.d b/simple_examples/data/g02maje.d new file mode 100644 index 0000000..b21e21c --- /dev/null +++ b/simple_examples/data/g02maje.d @@ -0,0 +1,23 @@ +G02MAJ Example Program Data +20 6 :: N,M +1 3 1 6 0 :: MTYPE,PRED,PREY,MNSTEP,LISX +10.28 1.77 9.69 15.58 8.23 10.44 -46.47 +9.08 8.99 11.53 6.57 15.89 12.58 -35.80 +17.98 13.10 1.04 10.45 10.12 16.68 -129.22 +14.82 13.79 12.23 7.00 8.14 7.79 -42.44 +17.53 9.41 6.24 3.75 13.12 17.08 -73.51 +7.78 10.38 9.83 2.58 10.13 4.25 -26.61 +11.95 21.71 8.83 11.00 12.59 10.52 -63.90 +14.60 10.09 -2.70 9.89 14.67 6.49 -76.73 +3.63 9.07 12.59 14.09 9.06 8.19 -32.64 +6.35 9.79 9.40 12.79 8.38 16.79 -83.29 +4.66 3.55 16.82 13.83 21.39 13.88 -16.31 +8.32 14.04 17.17 7.93 7.39 -1.09 -5.82 +10.86 13.68 5.75 10.44 10.36 10.06 -47.75 +4.76 4.92 17.83 2.90 7.58 11.97 18.38 +5.05 10.41 9.89 9.04 7.90 13.12 -54.71 +5.41 9.32 5.27 15.53 5.06 19.84 -55.62 +9.77 2.37 9.54 20.23 9.33 8.82 -45.28 +14.28 4.34 14.23 14.95 18.16 11.03 -22.76 +10.17 6.80 3.17 8.57 16.07 15.93 -104.32 +5.39 2.67 6.37 13.56 10.68 7.35 -55.94 :: End of D, Y diff --git a/simple_examples/data/g03gaje.d b/simple_examples/data/g03gaje.d new file mode 100644 index 0000000..ca1c97f --- /dev/null +++ b/simple_examples/data/g03gaje.d @@ -0,0 +1,56 @@ +G03GAF Example Program Data +25 4 4 : N M IP +2 : NG +2 : SOPT +2 : POPT +15 : NITER +2.7 3.2 4.5 4.8 +3.9 3.8 5.9 6.2 +4.8 4.1 6.8 5.5 +3.1 3.5 4.3 4.6 +3.4 3.7 5.1 5.6 +3.1 3.4 4.1 4.7 +4.6 4.4 6.6 6.1 +3.1 3.3 4.0 4.9 +3.8 3.7 4.7 4.9 +5.2 4.9 8.2 6.9 +3.9 3.8 5.2 5.4 +4.1 4.0 5.6 5.6 +5.7 5.1 7.0 6.3 +3.0 3.2 4.5 5.0 +2.9 3.3 4.5 5.1 +3.4 3.3 4.4 5.0 +4.0 4.2 5.2 5.4 +3.0 3.0 4.6 5.0 +4.0 4.1 5.9 5.8 +3.0 3.2 4.4 5.1 +3.6 3.6 5.3 5.4 +3.1 3.2 4.6 5.0 +3.2 3.3 5.4 5.3 +3.0 3.4 4.2 4.7 +3.8 4.0 6.9 6.7 : X +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +1.0 0.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 +0.0 1.0 : P diff --git a/simple_examples/data/g05kfje.d b/simple_examples/data/g05kfje.d new file mode 100644 index 0000000..b55cba0 --- /dev/null +++ b/simple_examples/data/g05kfje.d @@ -0,0 +1,3 @@ +G05KFF Example Program Data +1 1 1762543 :: GENID,SUBID,SEED(1) +5 :: N diff --git a/simple_examples/data/g13naje.d b/simple_examples/data/g13naje.d new file mode 100644 index 0000000..4da5b32 --- /dev/null +++ b/simple_examples/data/g13naje.d @@ -0,0 +1,14 @@ +G13NAJ Example Program Data +100 :: N +0.00 0.78 -0.02 0.17 0.04 -1.23 0.24 1.70 0.77 0.06 +0.67 0.94 1.99 2.64 2.26 3.72 3.14 2.28 3.78 0.83 +2.80 1.66 1.93 2.71 2.97 3.04 2.29 3.71 1.69 2.76 +1.96 3.17 1.04 1.50 1.12 1.11 1.00 1.84 1.78 2.39 +1.85 0.62 2.16 0.78 1.70 0.63 1.79 1.21 2.20 -1.34 +0.04 -0.14 2.78 1.83 0.98 0.19 0.57 -1.41 2.05 1.17 +0.44 2.32 0.67 0.73 1.17 -0.34 2.95 1.08 2.16 2.27 +-0.14 -0.24 0.27 1.71 -0.04 -1.03 -0.12 -0.67 1.15 -1.10 +-1.37 0.59 0.44 0.63 -0.06 -0.62 0.39 -2.63 -1.63 -0.42 +-0.73 0.85 0.26 0.48 -0.26 -1.77 -1.53 -1.39 1.68 0.43 :: End of Y +1 1 4.6 2 :: CTYPE,IPARAM,BETA,MINSS +1.0 :: PARAM(1) diff --git a/simple_examples/data/m01ccje.d b/simple_examples/data/m01ccje.d new file mode 100644 index 0000000..3a946ab --- /dev/null +++ b/simple_examples/data/m01ccje.d @@ -0,0 +1,13 @@ +M01CCF Example Program Data +11 +A02AAF 289 +A02ABF 523 +A02ACF 531 +C02ADF 169 +C02AEF 599 +C05AUF 1351 +C05AVF 240 +C05AWF 136 +C05AXF 211 +C05AYF 183 +C05AZF 2181 diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp new file mode 100644 index 0000000..e69de29 diff --git a/simple_examples/data/s14abje.d b/simple_examples/data/s14abje.d new file mode 100644 index 0000000..083a4f4 --- /dev/null +++ b/simple_examples/data/s14abje.d @@ -0,0 +1,10 @@ +S14ABF Example Program Data + 1.0 + 1.25 + 1.5 + 1.75 + 2.0 + 5.0 + 10.0 + 20.0 + 1000.0 diff --git a/simple_examples/data/s14acje.d b/simple_examples/data/s14acje.d new file mode 100644 index 0000000..64a16c9 --- /dev/null +++ b/simple_examples/data/s14acje.d @@ -0,0 +1,5 @@ +S14ACJ Example Program Data +0.1 +0.5 +3.6 +8.0 diff --git a/simple_examples/data/s14afje.d b/simple_examples/data/s14afje.d new file mode 100644 index 0000000..f658cc5 --- /dev/null +++ b/simple_examples/data/s14afje.d @@ -0,0 +1,2 @@ +S14AFJ Example Program Data +-1.5 2.5 1 : Values of Z and K diff --git a/simple_examples/data/s17dcje.d b/simple_examples/data/s17dcje.d new file mode 100644 index 0000000..fa0d57f --- /dev/null +++ b/simple_examples/data/s17dcje.d @@ -0,0 +1,6 @@ +S17DCJ Example Program Data +0.00 0.3 0.4 'U' +2.30 2.0 0.0 'U' +2.12 -1.0 0.0 'U' +1.58 -2.3 5.6 'U' +1.58 -2.3 5.6 'S' diff --git a/simple_examples/data/s17dgje.d b/simple_examples/data/s17dgje.d new file mode 100644 index 0000000..3e62c29 --- /dev/null +++ b/simple_examples/data/s17dgje.d @@ -0,0 +1,6 @@ +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/s30aaje.d b/simple_examples/data/s30aaje.d new file mode 100644 index 0000000..0248da1 --- /dev/null +++ b/simple_examples/data/s30aaje.d @@ -0,0 +1,9 @@ +S30AAJ Example Program Data +'C' : Call = 'C', Put = 'P' +55.0 0.3 0.1 0.0 : S, SIGMA, R, Q +3 2 : M, N +58.0 +60.0 +62.0 : X(I), I = 1,2,...M +0.7 +0.8 : T(I), I = 1,2,...N diff --git a/simple_examples/data/s30acje.d b/simple_examples/data/s30acje.d new file mode 100644 index 0000000..48117a7 --- /dev/null +++ b/simple_examples/data/s30acje.d @@ -0,0 +1,9 @@ +S30ACJ Example Program Data +'C' : Call = 'C', Put = 'P' +5 1 : Values of n and mode + +4.14 3.89 5.39 5.14 5.04 : p +268.0 268.0 268.0 268.5 269.0 : k +267.5 267.5 267.5 267.5 267.5 : s0 +0.00274 0.00274 0.0164 0.0164 0.0164 : t +0.0166 0.0166 0.0166 0.0166 0.0166 : r diff --git a/simple_examples/data/x03aaje.d b/simple_examples/data/x03aaje.d new file mode 100644 index 0000000..1254b78 --- /dev/null +++ b/simple_examples/data/x03aaje.d @@ -0,0 +1,5 @@ +X03AAJ Example Program Data + -2 -3 7 + 2 -5 3 + -9 1 0 + 8 -4 -2 diff --git a/simple_examples/source/int32/A00AAJE.java b/simple_examples/source/int32/A00AAJE.java new file mode 100644 index 0000000..65b6c18 --- /dev/null +++ b/simple_examples/source/int32/A00AAJE.java @@ -0,0 +1,16 @@ +import com.nag.routines.A00.A00AA; + +/** + * A00AA example program text. + */ +public class A00AAJE { + + public static void main(String[] args) { + A00AA a00aa = new A00AA(); + + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + + } + +} diff --git a/simple_examples/source/int32/A00ACJE.java b/simple_examples/source/int32/A00ACJE.java new file mode 100644 index 0000000..7f44ba3 --- /dev/null +++ b/simple_examples/source/int32/A00ACJE.java @@ -0,0 +1,29 @@ +import com.nag.routines.A00.A00AC; + +/** + * A00AC example program text. + * @author Mo + */ +public class A00ACJE { + + public static void main(String[] args) { + A00AC a00ac = new A00AC(); + boolean lmok; + + System.out.println(" A00ACJ Example Program Results\n"); + System.out.println(); + + a00ac.eval(); + + lmok = a00ac.eval(); + + if (lmok) { + System.out.println("A valid licence key is available"); + } + else { + System.out.println("No valid licence key was found"); + } + + } + +} diff --git a/simple_examples/source/int32/A00ADJE.java b/simple_examples/source/int32/A00ADJE.java new file mode 100644 index 0000000..139c8b9 --- /dev/null +++ b/simple_examples/source/int32/A00ADJE.java @@ -0,0 +1,107 @@ +import com.nag.routines.A00.A00AD; +import com.nag.routines.X05.X05AA; +import java.util.Arrays; + +/** + * A00AD example program text. + */ +public class A00ADJE { + + public static void main(String[] args) { + + A00AD a00ad = new A00AD(); + X05AA x05aa = new X05AA(); + int i, mkmaj, mkmin; + boolean licval; + String fcomp, hdware, impl, opsys, pcode, prec, vend; + int[] itime = new int[7]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + + System.out.println(" A00ADJ Example Program Results\n"); + + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + + // Output scalars must be retrieved manually + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + // Print implementation details + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int32/C02AAJE.java b/simple_examples/source/int32/C02AAJE.java new file mode 100644 index 0000000..1abc528 --- /dev/null +++ b/simple_examples/source/int32/C02AAJE.java @@ -0,0 +1,174 @@ +import com.nag.routines.C02.C02AA; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.types.NAGComplex; +import java.util.Arrays; + +/** + * C02AA example program text. + * @author joed + * @since 27.1.0.0 + */ +public class C02AAJE { + + public static void main(String[] args) { + + System.out.println(" C02AAJ Example Program Results"); + + Routine.setComplex(new NAGComplex()); + exampleBasic(); + examplePolishing(); + + System.out.println(); + + } + + /** Demonstrate a basic problem. */ + public static void exampleBasic() { + + C02AA c02aa = new C02AA(); + int ifail, itmax, n, polish; + NAGComplex[] a, z; + double[] berr, cond; + int[] conv; + + System.out.println(); + System.out.println("Example 1: Basic Problem"); + System.out.println(); + + // Set polynomial degree and instantiate arrays + n = 5; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Set polynomial coefficients + a[0] = new NAGComplex(5.0, 6.0); + a[1] = new NAGComplex(30.0, 20.0); + a[2] = new NAGComplex(-0.2, -6.0); + a[3] = new NAGComplex(50.0, 100000.0); + a[4] = new NAGComplex(-2.0, 40.0); + a[5] = new NAGComplex(10.0, 1.0); + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond "); + System.out.println(" ---------------------------------------------------"); + for (int i = 0; i < n; i++) { + System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, + z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + + } + + /** Compare polishing processes on a Wilkinson-style polynomial. */ + public static void examplePolishing() { + + C02AA c02aa = new C02AA(); + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + NAGComplex pz; + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int ifail, itmax, k, n, polish; + NAGComplex[] a, z, zact; + double[] berr, cond; + int[] conv; + boolean[] matched; + + System.out.println(); + System.out.println("Example 2: Polishing Processes"); + System.out.println(); + + // Set polynomial degree and instantiate + n = 10; + a = new NAGComplex[n+1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = new NAGComplex[n]; + zact = new NAGComplex[n]; + + // Set known roots and (instantiate z) + for (int i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) i+1, 0.0); + z[i] = new NAGComplex(); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (int i = 0; i < n; i++) { + a[i] = new NAGComplex(); + } + a[n] = new NAGComplex(1.0, 0.0); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[j] = a[j+1].subtract(a[j].multiply(zact[i])); + } + a[n] = a[n].negate().multiply(zact[i]); + } + + System.out.println(" polish relerr fwderr "); + System.out.println(" ----------------------------"); + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + for (polish = 0; polish <= 2; polish++) { + + // Find roots + ifail = 0; + c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); + + /* Calculate the maximum relative errors of the roots, and the maximum + * forward error evaluating the polynomial at those roots. Errors are + * capped at machine precision. */ + maxrelerr = maxfwderr = eps; + Arrays.fill(matched, false); + + for (int i = 0; i < n; i++) { + + // Evaluate polynomial at this root + pz = a[0].clone(); + for (int j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(a[j]); + } + + // Match to an expected root + k = 0; + err = rmax; + for (int j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + + } + +} diff --git a/simple_examples/source/int32/C02ABJE.java b/simple_examples/source/int32/C02ABJE.java new file mode 100644 index 0000000..fad5ebb --- /dev/null +++ b/simple_examples/source/int32/C02ABJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.C02.C02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AB + */ +public class C02ABJE { + + public static void main(String[] args) { + + final boolean polish_example = false; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" C02ABJ Example Program Results"); + + ex1_basic(args); + if (polish_example) { + ex2_polishing(args); + } + } + + public static void ex1_basic(String[] args) { + + int i, ifail, itmax, n = 0, polish; + + NAGComplex[] z = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + + System.out.println("\n Basic Problem\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + String line = reader.readLine(); + line = reader.readLine(); + line = reader.readLine(); + + // Read polynomial degree and allocate + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + z = NAGComplex.createArray(n); + + // Read polynomial coefficients + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[i] = Double.parseDouble(sVal[0]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find roots of the polynomial + itmax = 30; + polish = 1; + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); + + // Print output + System.out.println(" i z conv berr cond"); + System.out.println(" -----------------------------------------------------"); + for (i = 0; i < n; i++) { + System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); + } + } + + public static void ex2_polishing(String[] args) { + NAGComplex pz = new NAGComplex(); + double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; + int i, ifail, itmax, j, k, n = 0, polish; + + NAGComplex[] z = null, zact = null; + double[] a = null, berr = null, cond = null; + int[] conv = null; + boolean[] matched = null; + + System.out.println("\n Polishing Processes\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i <= 12; i++) { + reader.readLine(); + } + + // Read polynomial degree and allocate + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n + 1]; + berr = new double[n]; + cond = new double[n]; + conv = new int[n]; + matched = new boolean[n]; + z = NAGComplex.createArray(n); + zact = NAGComplex.createArray(n); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Set known roots + for (i = 0; i < n; i++) { + zact[i] = new NAGComplex((double) (i + 1), 0.0); + } + + // Multiply out (z-1)(z-2)...(z-n) for coefficients + for (i = 0; i < n; i++) { + a[i] = 0.0; + } + a[n] = 1.0; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + a[j] = a[j + 1] - a[j] * zact[i].getRe(); + } + a[n] = -a[n] * zact[i].getRe(); + } + + System.out.println(" polish relerr fwderr"); + System.out.println(" ----------------------------"); + + // Use different polish modes + X02AJ x02aj = new X02AJ(); + X02AL x02al = new X02AL(); + for (polish = 0; polish <= 2; polish++) { + + itmax = 30; + eps = x02aj.eval(); + rmax = x02al.eval(); + + // Find roots + ifail = 0; + C02AB c02ab = new C02AB(); + c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); + + // Calculate the maximum relative errors of the roots, and the maximum + // forward error evaluating the polynomial at those roots. Errors are + // capped at machine precision. + maxrelerr = eps; + maxfwderr = eps; + Arrays.fill(matched, false); + + for (i = 0; i < n; i++) { + // Evaluate polynomial at this root + pz = new NAGComplex(a[0], 0.0); + for (j = 1; j <= n; j++) { + pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); + } + + // Match to an expected root + k = 0; + err = rmax; + for (j = 0; j < n; j++) { + if (!matched[j]) { + delta = z[i].subtract(zact[j]).abs(); + if (delta <= err) { + err = delta; + k = j; + } + } + } + + // Mark as matched and update max errors + matched[k] = true; + relerr = err/zact[k].abs(); + fwderr = pz.abs(); + maxrelerr = Math.max(maxrelerr, relerr); + maxfwderr = Math.max(maxfwderr, fwderr); + } + + // Print output + System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); + + } + } +} diff --git a/simple_examples/source/int32/C02AFJE.java b/simple_examples/source/int32/C02AFJE.java new file mode 100644 index 0000000..6043be7 --- /dev/null +++ b/simple_examples/source/int32/C02AFJE.java @@ -0,0 +1,271 @@ +import com.nag.routines.C02.C02AF; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AF + */ +public class C02AFJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AFJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + + int i, ifail, n = 0; + + double[][] a = null, z = null; + double[] w = null; + + System.out.println("\n\n Example 1"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[2][n + 1]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); + } + + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[][] a = null, abar = null, z = null, zbar = null; + double[] r = null, w = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 12; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[2][n + 1]; + abar = new double[2][n + 1]; + r = new double[n]; + w = new double[4 * (n + 1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + for (i = 0; i <= n; i++) { + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + a[0][i] = Double.parseDouble(sVal[0]); + a[1][i] = Double.parseDouble(sVal[1]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AF c02af = new C02AF(); + double[] a1d = convert2DTo1D(a); + double[] z1d = convert2DTo1D(z); + c02af.eval(a1d, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar = 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[0][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[0][i] = f * a[0][i]; + + if (a[1][i] != 0.0E0) { + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + + } else { + + if (a[1][i] != 0.0E0) { + f = 1.0E0 + epsbar; + epsbar = -epsbar; + abar[1][i] = f * a[1][i]; + } else { + abar[1][i] = 0.0E0; + } + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] abar1d = convert2DTo1D(abar); + double[] zbar1d = convert2DTo1D(zbar); + c02af.eval(abar1d, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][j], zbar[1][j]); + deltac = Math.abs(r1 - r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0E0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j*n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j*n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AGJE.java b/simple_examples/source/int32/C02AGJE.java new file mode 100644 index 0000000..c58e524 --- /dev/null +++ b/simple_examples/source/int32/C02AGJE.java @@ -0,0 +1,262 @@ +import com.nag.routines.C02.C02AG; +import com.nag.routines.A02.A02AB; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X02.X02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * C02AG + */ +public class C02AGJE { + + public static final boolean scal = true; + + public static void main(String[] args) { + + System.out.println(" C02AGJ Example Program Results"); + + ex1(args); + + ex2(args); + } + + public static void ex1(String[] args) { + double zi, zr; + int i, ifail, n = 0, nroot; + + double[] a = null, w = null; + double[][] z = null; + + System.out.println("\n\n Example 1\n"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading in data file + reader.readLine(); + reader.readLine(); + reader.readLine(); + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + a = new double[n + 1]; + w = new double[2 * (n + 1)]; + z = new double[2][n]; + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d, w, ifail); + + z = convert1DTo2D(z1d, 2); + + System.out.println(" Computed roots of polynomial"); + System.out.println(); + + nroot = 0; + + while (nroot < n) { + zr = z[0][nroot]; + zi = z[1][nroot]; + if (zi == 0.0E0) { + System.out.printf(" z = %12.4E\n", zr); + nroot += 1; + } else { + System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); + nroot += 2; + } + } + } + + public static void ex2(String[] args) { + + double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; + int i, ifail, j, jmin = 0, n = 0; + + double[] a = null, abar = null, r = null, w = null; + double[][] z = null, zbar = null; + int[] m = null; + + System.out.println("\n\n Example 2"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + // Skip heading and previous example in data file + for (i = 0; i < 7; i++) { + reader.readLine(); + } + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + + a = new double[n+1]; + abar = new double[n+1]; + r = new double[n]; + w = new double[2 * (n+1)]; + z = new double[2][n]; + zbar = new double[2][n]; + m = new int[n]; + + // Read in the coefficients of the original polynomial. + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i <= n; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute the roots of the original polynomial. + ifail = 0; + C02AG c02ag = new C02AG(); + double[] z1d = convert2DTo1D(z); + c02ag.eval(a, n, scal, z1d ,w, ifail); + + z = convert1DTo2D(z1d, 2); + + // Form the coefficients of the perturbed polynomial. + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + epsbar= 3.0 * eps; + + for (i = 0; i <= n; i++) { + if (a[i] != 0.0) { + f = 1.0 + epsbar; + epsbar = -epsbar; + abar[i] = f * a[i]; + } else { + abar[i] = 0.0E0; + } + } + + // Compute the roots of the perturbed polynomial. + ifail = 0; + double[] zbar1d = convert2DTo1D(zbar); + c02ag.eval(abar, n, scal, zbar1d, w, ifail); + + zbar = convert1DTo2D(zbar1d, 2); + + // Perform error analysis. + + // Initialize markers to 0 (unmarked). + Arrays.fill(m, 0); + + X02AL x02al = new X02AL(); + rmax = x02al.eval(); + + // Loop over all unperturbed roots (stored in Z). + A02AB a02ab = new A02AB(); + for (i = 0; i < n; i++) { + deltai = rmax; + r1 = a02ab.eval(z[0][i], z[1][i]); + + // Loop over all perturbed roots (stored in ZBAR). + for (j = 0; j < n; j++) { + // Compare the current unperturbed root to all unmarked + // perturbed roots. + + if (m[j] == 0) { + r2 = a02ab.eval(zbar[0][i], zbar[1][i]); + deltac = Math.abs(r1-r2); + + if (deltac < deltai) { + deltai = deltac; + jmin = j; + } + } + } + + // Mark the selected perturbed root. + m[jmin] = 1; + + // Compute the relative error. + if (r1 != 0.0E0) { + r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); + di = Math.min(r1, r3); + r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); + } else { + r[i] = 0.0; + } + } + + System.out.println(); + System.out.printf(" Degree of polynomial = %4d\n", n); + System.out.println(); + System.out.println(" Computed roots of polynomial Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); + } + } + + public static double[] convert2DTo1D(double[][] a) { + double[] b = new double[a.length * a[0].length]; + int n = a.length; + + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + b[i + j * n] = a[i][j]; + } + } + + return b; + } + + public static double[][] convert1DTo2D(double[] a, int n) { + double[][] b = new double[n][a.length / n]; + + for (int i = 0; i < b.length; i++) { + for (int j = 0; j < b[0].length; j++) { + b[i][j] = a[i + j * n]; + } + } + + return b; + } +} diff --git a/simple_examples/source/int32/C02AHJE.java b/simple_examples/source/int32/C02AHJE.java new file mode 100644 index 0000000..b1e12cd --- /dev/null +++ b/simple_examples/source/int32/C02AHJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.C02.C02AH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AH + */ +public class C02AHJE { + + public static void main(String[] args) { + + double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AHJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + ar = Double.parseDouble(sVal[0]); + ai = Double.parseDouble(sVal[1]); + br = Double.parseDouble(sVal[2]); + bi = Double.parseDouble(sVal[3]); + cr = Double.parseDouble(sVal[4]); + ci = Double.parseDouble(sVal[5]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AH c02ah = new C02AH(); + c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); + ifail = c02ah.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); + System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); + } + } +} diff --git a/simple_examples/source/int32/C02AJJE.java b/simple_examples/source/int32/C02AJJE.java new file mode 100644 index 0000000..64e3a5e --- /dev/null +++ b/simple_examples/source/int32/C02AJJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C02.C02AJ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AJ + */ +public class C02AJJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0; + int ifail; + + double[] zlg = new double[2]; + double[] zsm = new double[2]; + + System.out.println(" C02AJJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + a = Double.parseDouble(sVal[0]); + b = Double.parseDouble(sVal[1]); + c = Double.parseDouble(sVal[2]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = -1; + C02AJ c02aj = new C02AJ(); + c02aj.eval(a, b, c, zsm, zlg, ifail); + ifail = c02aj.getIFAIL(); + + if (ifail == 0) { + System.out.println("\n Roots of quadratic equation\n"); + + if (zsm[1] == 0.0E0) { + // 2 real roots. + System.out.printf(" z = %12.4E\n", zsm[0]); + System.out.printf(" z = %12.4E\n", zlg[0]); + } else { + // 2 complex roots. + System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); + } + } + } +} diff --git a/simple_examples/source/int32/C02AKJE.java b/simple_examples/source/int32/C02AKJE.java new file mode 100644 index 0000000..4a0579f --- /dev/null +++ b/simple_examples/source/int32/C02AKJE.java @@ -0,0 +1,62 @@ +import com.nag.routines.C02.C02AK; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AK + */ +public class C02AKJE { + + public static void main(String[] args) { + + double r = 0, s = 0, t = 0, u = 0; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AKJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + u = Double.parseDouble(sVal[0]); + r = Double.parseDouble(sVal[1]); + s = Double.parseDouble(sVal[2]); + t = Double.parseDouble(sVal[3]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AK c02ak = new C02AK(); + c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ALJE.java b/simple_examples/source/int32/C02ALJE.java new file mode 100644 index 0000000..4f9eac9 --- /dev/null +++ b/simple_examples/source/int32/C02ALJE.java @@ -0,0 +1,64 @@ +import com.nag.routines.C02.C02AL; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AL + */ +public class C02ALJE { + + public static void main(String[] args) { + + double a = 0, b = 0, c = 0, d = 0, e = 0; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ALJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + e = Double.parseDouble(sVal[0]); + a = Double.parseDouble(sVal[1]); + b = Double.parseDouble(sVal[2]); + c = Double.parseDouble(sVal[3]); + d = Double.parseDouble(sVal[4]); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AL c02al = new C02AL(); + c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02al.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02AMJE.java b/simple_examples/source/int32/C02AMJE.java new file mode 100644 index 0000000..f1fffa4 --- /dev/null +++ b/simple_examples/source/int32/C02AMJE.java @@ -0,0 +1,75 @@ +import com.nag.routines.C02.C02AM; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AM + */ +public class C02AMJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex r = null, s = null, t = null, u = null; + int i, ifail; + + double[] errest = new double[3]; + double[] zeroi = new double[3]; + double[] zeror = new double[3]; + + System.out.println(" C02AMJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 0; + C02AM c02am = new C02AM(); + c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); + + System.out.println(); + System.out.println(" Roots of cubic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 3; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C02ANJE.java b/simple_examples/source/int32/C02ANJE.java new file mode 100644 index 0000000..dc865e2 --- /dev/null +++ b/simple_examples/source/int32/C02ANJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.C02.C02AN; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C02AN + */ +public class C02ANJE { + + public static void main(String[] args) { + + Routine.setComplex(new NAGComplex()); + + NAGComplex a = null, b = null, c = null, d = null, e = null; + int i, ifail; + + double[] errest = new double[4]; + double[] zeroi = new double[4]; + double[] zeror = new double[4]; + + System.out.println(" C02ANJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + reader.readLine(); // Skip heading in data file + + String line = reader.readLine().replaceAll("[(),]", ""); + String[] sVal = line.trim().split("\\s+"); + e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + line = reader.readLine().replaceAll("[(),]", ""); + sVal = line.trim().split("\\s+"); + d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); + + } catch (FileNotFoundException e_exception) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e_exception) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); + } + + ifail = 0; + C02AN c02an = new C02AN(); + c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); + ifail = c02an.getIFAIL(); + + System.out.println(); + System.out.println(" Roots of quartic equation Error estimates"); + System.out.println(" (machine-dependent)"); + System.out.println(); + + for (i = 0; i < 4; i++) { + System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); + } + } +} diff --git a/simple_examples/source/int32/C05AUJE.java b/simple_examples/source/int32/C05AUJE.java new file mode 100644 index 0000000..d2b09b1 --- /dev/null +++ b/simple_examples/source/int32/C05AUJE.java @@ -0,0 +1,67 @@ +import com.nag.routines.C05.C05AU; + +/** + * C05AUJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05AUJE{ + + /** + * C05AUJ main program + */ + public static void main(String[] args){ + double a = 0, b = 0, eps, eta, h, x; //placeholders + int ifail; + double[] ruser; + int[] iuser; + + ruser = new double[1]; //need to initialise before passing to wrapper + iuser = new int[1]; + + System.out.println("C05AUJ Example Program Results"); + + x = 1; + h = 0.1; + eps = 0.00001; + eta = 0; + + //Instance of class f to pass to wrapper + f f1 = new f(); + + ifail = -1; + C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); + c05au.eval(); + + //update values + x = c05au.getX(); + a = c05au.getA(); + b = c05au.getB(); + ifail = c05au.getIFAIL(); + + System.out.println(); + + switch(ifail){ + case 0: + System.out.printf("Root is : \t%.5f\n", x); + System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); + break; + case 3: + case 4: + System.out.printf("Final value = %.5f\n", x); + break; + } + } + + /** + * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. + * eval() must be implemented by the user. + * @return x - e^x + */ + public static class f extends C05AU.Abstract_C05AU_F{ + public double eval(){ + return(this.X - Math.exp(-this.X)); + } + } +} + diff --git a/simple_examples/source/int32/C05AWJE.java b/simple_examples/source/int32/C05AWJE.java new file mode 100644 index 0000000..6ea3c9f --- /dev/null +++ b/simple_examples/source/int32/C05AWJE.java @@ -0,0 +1,59 @@ +import com.nag.routines.C05.C05AW; + +public class C05AWJE{ + + public static void main(String[] args){ + double eps, eta, x; + int ifail, nfmax; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("C05AWJ Example Program Results"); + System.out.println(); + + boolean finished = false; + for(int i = 3; i <= 4; i++){ + eps = Math.pow(10, -i); + x = 1; + eta = 0; + nfmax = 200; + + ifail = -1; + f f1 = new f(); + C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); + c05aw.eval(); + + ifail = c05aw.getIFAIL(); + x = c05aw.getX(); + eps = c05aw.getEPS(); + + switch(ifail){ + case(0): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + case(-1): + //exit loop + finished = true; + break; + case(3): + case(4): + System.out.printf("With eps = %.2e root = %.5f\n", eps, x); + break; + } + if(finished){ + break; + } + } + } + + public static class f extends C05AW.Abstract_C05AW_F{ + public double eval(){ + return(Math.exp(-X) - X); + } + } +} + + diff --git a/simple_examples/source/int32/C05AYJE.java b/simple_examples/source/int32/C05AYJE.java new file mode 100644 index 0000000..c9ee43b --- /dev/null +++ b/simple_examples/source/int32/C05AYJE.java @@ -0,0 +1,44 @@ +import com.nag.routines.C05.C05AY; + +/** + * C05AY example program text. + */ +public class C05AYJE { + + public static void main(String[] args) { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + int ifail = 0; + int[] iuser = new int[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch (ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int32/C05AZJE.java b/simple_examples/source/int32/C05AZJE.java new file mode 100644 index 0000000..7c3e27e --- /dev/null +++ b/simple_examples/source/int32/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.routines.C05.C05AZ; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * C05AZ example program text. + */ +public class C05AZJE { + + public static void main(String[] args) { + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + int ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + if (ind == 0) { + keepOn = false; + } + else { + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + + } + + switch (ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int32/C05BBJE.java b/simple_examples/source/int32/C05BBJE.java new file mode 100644 index 0000000..4723773 --- /dev/null +++ b/simple_examples/source/int32/C05BBJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.C05.C05BB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C05BBJ Example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C05BBJE{ + + /** + * C05BBJE main program text + */ + public static void main(String[] args){ + NAGComplex w, z; + double resid = 0; + int branch = 0, ifail = 0; //placeholder + boolean offset = false; //placeholder + + //need to initialise first + z = new NAGComplex(); + w = new NAGComplex(); + + System.out.println("C05BBJ Example Program Results"); + + if(args.length != 1){ + System.out.println("Please specify path to data file as input"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + branch = Integer.parseInt(sVal[0]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + offset = Boolean.parseBoolean(sVal[0]); + + System.out.printf("Branch = %d\n", branch); + System.out.printf("Offset = %b\n", offset); + + System.out.println(); + System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + sVal = line.split("\\s+"); + + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + + ifail = -1; + C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); + c05bb.eval(); + + z = (NAGComplex) c05bb.getZ(); + w = (NAGComplex) c05bb.getW(); + resid = c05bb.getRESID(); + ifail = c05bb.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C05MBJE.java b/simple_examples/source/int32/C05MBJE.java new file mode 100644 index 0000000..9b46ff5 --- /dev/null +++ b/simple_examples/source/int32/C05MBJE.java @@ -0,0 +1,95 @@ +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ example program text. + * + * @author joed + * @since 27.0.0.0 + * + */ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ example main program. + */ + public static void main(String[] args) { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + int astart, i, ifail, m; + double[] fvec, x; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail == 0 || ifail == 8 || ifail == 9) { + if (ifail == 0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int32/C05QBJE.java b/simple_examples/source/int32/C05QBJE.java new file mode 100644 index 0000000..4b93405 --- /dev/null +++ b/simple_examples/source/int32/C05QBJE.java @@ -0,0 +1,167 @@ +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05QB example program text. + * @author ludovic + */ +public class C05QBJE { + + public static void main(String[] args) { + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + int[] IUSER = new int[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if (count == 3) { + System.out.println(); + count = 0; + } + } + break; + } + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private int N, IFLAG; + private double[] X, FVEC, RUSER; + private int[] IUSER; + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { + + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for (int i = 1; i < N; ++i) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + for (int i = 0; i < N-1; ++i) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + } + + } + + } + +} diff --git a/simple_examples/source/int32/C06BAJE.java b/simple_examples/source/int32/C06BAJE.java new file mode 100644 index 0000000..541d4d3 --- /dev/null +++ b/simple_examples/source/int32/C06BAJE.java @@ -0,0 +1,56 @@ +import com.nag.routines.C06.C06BA; +import com.nag.routines.X01.X01AA; + +/** + * C06BAJ example program text. + * @author willa + */ +public class C06BAJE{ + + public static void main(String[] args){ + int lwork = 16, nout = 6; + int ifail, ncall; + double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; + double[] work; + + C06BA c06ba = new C06BA(); + work = new double[lwork]; + + System.out.println("C06BAJ Example Program Results"); + System.out.println(); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + + ans = Math.pow(pi, 2)/12.0; + ncall = 0; + sig = 1.0; + seqn = 0.0; + System.out.println("\t\t\t Estimated\t Actual"); + System.out.println("I\t SEQN \t RESULT\t abs error\t error"); + System.out.println(); + + for(int i = 0; i < 10; i++){ + r = (double) i + 1; + seqn = seqn + sig/Math.pow(r, 2); + + ifail = 0; + c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); + + //update variables + ncall = c06ba.getNCALL(); + result = c06ba.getRESULT(); + abserr = c06ba.getABSERR(); + + error = result - ans; + sig = -sig; + + if(i <= 2){ + System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); + } + else{ + System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); + } + } + } +} diff --git a/simple_examples/source/int32/C06FKJE.java b/simple_examples/source/int32/C06FKJE.java new file mode 100644 index 0000000..58db62f --- /dev/null +++ b/simple_examples/source/int32/C06FKJE.java @@ -0,0 +1,91 @@ +import com.nag.routines.C06.C06FK; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C06FKJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class C06FKJE{ + + /** + * C06FKJE main program + */ + public static void main(String[] args){ + int ifail = 0, n = 0; //placeholder + double[] work, xa, xb, ya, yb; + + work = new double[0]; + xa = new double[0]; + xb = new double[0]; + ya = new double[0]; + yb = new double[0]; //placeholders + + System.out.println("C06FKJ Example Program Results"); + System.out.println(); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + //Break when the end of the file is reached + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + work = new double[n]; + xa = new double[n]; + xb = new double[n]; + ya = new double[n]; + yb = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + xa[i] = Double.parseDouble(sVal[0]); + xb[i] = xa[i]; + ya[i] = Double.parseDouble(sVal[1]); + yb[i] = ya[i]; + } + + ifail = 0; + + C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); + c06fk1.eval(); + xa = c06fk1.getX(); + C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); + c06fk2.eval(); + xb = c06fk2.getX(); + + System.out.printf("\tCovolution \tCorrelation\n"); + System.out.println(); + + for(int i = 0; i < n; i++){ + System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/C09AAJE.java b/simple_examples/source/int32/C09AAJE.java new file mode 100644 index 0000000..48c38b6 --- /dev/null +++ b/simple_examples/source/int32/C09AAJE.java @@ -0,0 +1,158 @@ +import com.nag.routines.C09.C09AA; +import com.nag.routines.C09.C09CC; +import com.nag.routines.C09.C09CD; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * C09AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class C09AAJE{ + + /** + * C09AAJ example main program + */ + public static void main(String[] args){ + int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders + String mode = "", wavnam = "", wtrans; //placeholders + int[] dwtlev, icomm; + double[] c, x, y; + + x = new double[0]; y = new double[0]; //placeholders + + //print error message if no data file given + if(args.length != 1){ + C09AAJE.usage(); + } + + icomm = new int[100]; + + System.out.println("C09AAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + wavnam = sVal[1]; + mode = sVal[2]; + + x = new double[n]; + y = new double[n]; + + System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); + + System.out.println("Input data \tX : "); + for(int i = 0; i < n; i++){ + line = reader.readLine(); + //Avoid errors with data file format and negative numbers + line = " " + line; + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + System.out.printf("%.3f\t", x[i]); + } + System.out.printf("\n"); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //Query wavelet filter dimensions + //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' + wtrans = "Multilevel"; + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); + c09aa.eval(); + + nwc = c09aa.getNWC(); + nwlmax = c09aa.getNWLMAX(); + lenc = nwc; + c = new double[lenc]; + dwtlev = new int[nwlmax + 1]; + + icomm = c09aa.getICOMM(); + ifail = 0; + //Perform discrete wavelet transform + C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); + c09cc.eval(); + + nf = c09aa.getNF(); + nwlmax = c09cc.getNWL(); + dwtlev = c09cc.getDWTLEV(); + c = c09cc.getC(); + + System.out.println(); + System.out.printf("Length of wavelet filter : \t%d\n", nf); + System.out.printf("Number of Levels : \t%d\n", nwlmax); + System.out.printf("Number of coefficients in each level: \n\t\t"); + for(int i = 0; i <= nwlmax; i++){ + System.out.printf("%d\t ", dwtlev[i]); + } + System.out.printf("\n"); + System.out.printf("Total number of wavelength coefficients : %d\n", nwc); + nnz = arraySum(dwtlev); + System.out.println(); + System.out.println("Wavelet coefficients C:"); + for(int i = 0; i < nnz; i++){ + System.out.printf("%.3f ", c[i]); + } + System.out.printf("\n"); + + //Reconstruct original data + ny = n; + + ifail = 0; + lenc = c09cc.getLENC(); + icomm = c09cc.getICOMM(); + C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); + c09cd.eval(); + + y = c09cd.getY(); + System.out.println(); + System.out.printf("Reconstruction \tY : \n"); + for(int i = 0; i < ny; i++){ + System.out.printf("%.3f ", y[i]); + } + System.out.printf("\n"); + } + + /** + * Finds the sum of all integers in an array + * @param a + * Array to sum + * @return total + */ + private static int arraySum(int[] a){ + int tot = 0; + for(int i = 0; i < a.length; i++){ + tot += a[i]; + } + return tot; + } + + /** + * No arguments supplied when exmaple runs + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/D01BDJE.java b/simple_examples/source/int32/D01BDJE.java new file mode 100644 index 0000000..8659cc4 --- /dev/null +++ b/simple_examples/source/int32/D01BDJE.java @@ -0,0 +1,58 @@ +import com.nag.routines.D01.D01BD; + +/** + * D01BD example program text. + */ +public class D01BDJE { + + public static void main(String[] args) { + + double a = 0.0, b = 1.0; + double epsabs = 0.0, epsrel = 0.0001; + double result = Double.NaN; + double abserr = Double.NaN; + FUN fun = new FUN(); + D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); + + d01bd.eval(); + result = d01bd.getRESULT(); + abserr = d01bd.getABSERR(); + + System.out.println(" D01BDJ Example Program Results"); + + System.out.println(); + System.out.printf(" A - lower limit of integration = %10.4f\n",a); + System.out.printf(" B - upper limit of integration = %10.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.println(); + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.println(); + + if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + } + +} diff --git a/simple_examples/source/int32/D01RJJE.java b/simple_examples/source/int32/D01RJJE.java new file mode 100644 index 0000000..9eee98a --- /dev/null +++ b/simple_examples/source/int32/D01RJJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.D01.D01RJ; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RJ example program text. + * @author Mo + */ +public class D01RJJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RJJ Example Program Results"); + + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + /* pass constant to f through ruser */ + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RJ d01rj = new D01RJ(); + ifail = -1; + d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rj.getRESULT(); + abserr = d01rj.getABSERR(); + ifail = d01rj.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); + System.out.println(); + } + + } + + } + + public static class F implements D01RJ.D01RJ_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int i = 0; i < NX; i++) { + if (X[i] == 1.0) { + /* An undefined result will be generated. */ + /* Set iflag to force an immediate exit */ + IFLAG = -1; + /* Store chosen value of iflag in iuser */ + IUSER[0] = IFLAG; + } + } + if (IFLAG != -1) { + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j])/ + Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RKJE.java b/simple_examples/source/int32/D01RKJE.java new file mode 100644 index 0000000..20c0501 --- /dev/null +++ b/simple_examples/source/int32/D01RKJE.java @@ -0,0 +1,173 @@ +import com.nag.routines.D01.D01RK; +import com.nag.routines.X01.X01AA; +import java.util.Arrays; + +/** + * D01RK example program text. + * @author Mo + */ +public class D01RKJE { + + public static void main(String[] args) { + + double pi = 0.0; + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, key, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RKJ Example Program Results"); + + key = 6; + X01AA x01aa = new X01AA(pi); + pi = x01aa.eval(); + a = 0.0; + b = 2.0*pi; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {4.0*Math.pow(pi,2)}; + cpuser = 0L; + + D01RK d01rk = new D01RK(); + ifail = -1; + d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rk.getRESULT(); + abserr = d01rk.getABSERR(); + ifail = d01rk.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RK.D01RK_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int i = 0; i < NX; i++) { + FV[i] = 0.0; + } + + for (int j = 0; j < NX; j++) { + FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RLJE.java b/simple_examples/source/int32/D01RLJE.java new file mode 100644 index 0000000..c8a6d0e --- /dev/null +++ b/simple_examples/source/int32/D01RLJE.java @@ -0,0 +1,196 @@ +import com.nag.routines.D01.D01RL; +import java.util.Arrays; + +/** + * D01RL example program text. + * @author Mo + */ +public class D01RLJE { + + public static void main(String[] args) { + + double a, b, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] points, rinfo, ruser; + int [] iinfo, iuser; + int ifail, liinfo, lrinfo, maxsub, npts; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RLJ Example Program Results"); + + epsabs = 0.0; + epsrel = 0.0001; + a = 0.0; + b = 1.0; + npts = 1; + maxsub = 20; + liinfo = 2*Math.max(maxsub,npts) + npts + 4; + lrinfo = 4*Math.max(maxsub,npts) + npts + 6; + + points = new double[npts]; + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[21]; + + points[0] = 1.0/7.0; + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RL d01rl = new D01RL(); + ifail = -1; + d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + points = d01rl.getPOINTS(); + result = d01rl.getRESULT(); + abserr = d01rl.getABSERR(); + ifail = d01rl.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",a); + System.out.printf(" B - upper limit of integration = %9.4f\n",b); + System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F"); + System.out.println(); + } + + } + + } + + public static class F implements D01RL.D01RL_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + /*for (int i = 0; i < NX; i++) {*/ + /*FV[i] = 0.0;*/ + /*}*/ + + for (int i = 0; i < NX; i++) { + FV[i] = Math.abs(X[i] - 1.0/7.0); + } + + for (int i = 0; i < NX; i++) { + if (FV[i] == 0.0) { + /* A singular point will be hit. */ + /* Record offending abscissae and abort computation. */ + IFLAG = 0; + for (int k = 0; k < NX; k++) { + if (FV[k] == 0.0) { + IFLAG = IFLAG + 1; + RUSER[IFLAG-1] = X[k]; + } + } + /* Store value of iflag in iuser */ + IUSER[0] = IFLAG; + /* signal abort by setting iflag<0 */ + IFLAG = -IFLAG; + } + } + if (IFLAG == 0) { + /* Safe to evaluate. */ + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/Math.sqrt(FV[j]); + } + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01RMJE.java b/simple_examples/source/int32/D01RMJE.java new file mode 100644 index 0000000..6e80b2b --- /dev/null +++ b/simple_examples/source/int32/D01RMJE.java @@ -0,0 +1,163 @@ +import com.nag.routines.D01.D01RM; +import java.util.Arrays; + +/** + * D01RM example program text. + * @author Mo + */ +public class D01RMJE { + + public static void main(String[] args) { + + double bound, epsabs, epsrel; + double result = Double.NaN; + double abserr = Double.NaN; + double[] rinfo, ruser; + int [] iinfo, iuser; + int ifail, inf, liinfo, lrinfo, maxsub; + long cpuser; // c_ptr + F f = new F(); + + /* Header */ + System.out.println(" D01RMJ Example Program Results"); + + bound = 0.0; + inf = 1; + epsabs = 0.0; + epsrel = 0.0001; + maxsub = 20; + lrinfo = 4*maxsub; + liinfo = Math.max(maxsub,4); + + rinfo = new double[lrinfo]; + iinfo = new int[liinfo]; + iuser = new int[0]; + ruser = new double[0]; + + iuser = new int[] {0}; + ruser = new double[] {0.0}; + cpuser = 0L; + + D01RM d01rm = new D01RM(); + ifail = -1; + d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, + rinfo, iinfo, iuser, ruser, cpuser, ifail); + result = d01rm.getRESULT(); + abserr = d01rm.getABSERR(); + ifail = d01rm.getIFAIL(); + + if (ifail >= 0) { + System.out.println(); + System.out.printf(" A - lower limit of integration = %9.4f\n",bound); + System.out.println(" B - upper limit of integration = infinity\n"); + System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); + System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); + System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); + System.out.println(); + if (ifail <= 5) { + System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); + System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); + System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); + System.out.println(); + } + else if (ifail == -1) { + /* User requested exit */ + System.out.printf(" Exit requested from F \n"); + System.out.println(); + } + + } + + } + + public static class F implements D01RM.D01RM_F { + + private int NX, IFLAG; + private double[] X, FV, RUSER; + private int[] IUSER; + private long CPUSER; + + @Override + public void setX(double[] X) { + this.X = X; + } + + @Override + public double[] getX() { + return X; + } + + @Override + public void setNX(int NX) { + this.NX = NX; + } + + @Override + public int getNX() { + return NX; + } + + @Override + public void setFV(double[] FV) { + this.FV = FV; + } + + @Override + public double[] getFV() { + return FV; + } + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setIUSER(int[] IUSER) { + this.IUSER = IUSER; + } + + @Override + public int[] getIUSER() { + return IUSER; + } + + @Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + @Override + public double[] getRUSER() { + return RUSER; + } + + @Override + public void setCPUSER(long CPUSER) { + this.CPUSER = CPUSER; + } + + @Override + public long getCPUSER() { + return CPUSER; + } + + @Override + public void eval(double[] X, int NX, double[] FV, int IFLAG, + int[] IUSER, double[] RUSER, long CPUSER) { + + for (int j = 0; j < NX; j++) { + FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); + } + return; + + } + + } + +} diff --git a/simple_examples/source/int32/D01TCJE.java b/simple_examples/source/int32/D01TCJE.java new file mode 100644 index 0000000..cde8428 --- /dev/null +++ b/simple_examples/source/int32/D01TCJE.java @@ -0,0 +1,45 @@ +import com.nag.routines.D01.D01TC; +import java.util.Arrays; + +/** + * D01TC example program text. + * @author Mo + */ +public class D01TCJE { + + public static void main(String[] args) { + + double a, b, c, d; + double[] abscis, weight; + int n, ifail, itype; + + /* Header */ + System.out.println(" D01TCJ Example Program Results"); + + n = 7; + a = 0.0; + b = 1.0; + c = 0.0; + d = 0.0; + itype = -3; + + abscis = new double[n]; + weight = new double[n]; + + D01TC d01tc = new D01TC(); + ifail = 0; + d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); + abscis= d01tc.getABSCIS(); + weight = d01tc.getWEIGHT(); + + System.out.println(); + System.out.printf(" Laguerre formula, %2d points\n",n); + System.out.println(); + System.out.println(" Abscissae Weights\n"); + for (int j = 0; j < n; j++) { + System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); + } + + } + +} diff --git a/simple_examples/source/int32/D02NEJE.java b/simple_examples/source/int32/D02NEJE.java new file mode 100644 index 0000000..34a5b25 --- /dev/null +++ b/simple_examples/source/int32/D02NEJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; +import java.util.Arrays; + +/** + * D02NE example program text. + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) { + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + int ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + int[] icom, iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[neq]; + com = new double[lcom]; + rtol = new double[neq]; + y = new double[neq]; + ydot = new double[neq]; + icom = new int[licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + int neq, int ml, int mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + int md, ms, pdDim1; + + pdDim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; + pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[getIdx(md, 3, pdDim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[getIdx(ms, 1, pdDim1)] = ALPHA; + pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; + pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + int neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + int ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int32/D02TLJE.java b/simple_examples/source/int32/D02TLJE.java new file mode 100644 index 0000000..601b3ce --- /dev/null +++ b/simple_examples/source/int32/D02TLJE.java @@ -0,0 +1,290 @@ +import com.nag.routines.D02.D02TL; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import java.util.Arrays; + +/** + * D02TL example program text. + * @author joed + */ +public class D02TLJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) { + + D02TL d02tl = new D02TL(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, + nmesh; + double[] mesh, rcomm, tol, y, ruser = new double[1]; + int[] icomm, ipmesh, iuser = new int[2]; + + System.out.println(" D02TLJ Example Program Results"); + System.out.println(); + + ncol = 7; + nmesh = 11; + mxmesh = 51; + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Workspace query to get size of rcomm and icomm + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, + 0, iuser, 2, ifail + ); + ifail = d02tv.getIFAIL(); + lrcomm = iuser[0]; + licomm = iuser[1]; + rcomm = new double[lrcomm]; + icomm = new int[licomm]; + + // Initialise integrator for given problem + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, + lrcomm, icomm, licomm, ifail + ); + ifail = d02tv.getIFAIL(); + + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tl.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, + iuser, ruser, ifail + ); + ifail = d02tl.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TL failed with error code " + ifail); + } + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) { + break; + } + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); + ifail = d02ty.getIFAIL(); + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) { + break; + } + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + *

    Fortran array definition: + * a(dimX, 0:*) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + *

    Fortran array definition: + * a(dimX, dimY, 0:*) + * + *

    Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TL.Abstract_D02TL_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TL.Abstract_D02TL_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TL.Abstract_D02TL_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} diff --git a/simple_examples/source/int32/D03PCJE.java b/simple_examples/source/int32/D03PCJE.java new file mode 100644 index 0000000..4901e2e --- /dev/null +++ b/simple_examples/source/int32/D03PCJE.java @@ -0,0 +1,217 @@ +import com.nag.routines.D03.D03PC; +import com.nag.routines.D03.D03PZ; +import com.nag.routines.X01.X01AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.StringBuilder; + +/** + * D03PCJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D03PCJE{ + + /** + * D03PCJE main program + */ + public static void main(String[] args){ + int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; + double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; + int[] isave, iuser, iwsav; + double[] rsave, u, uout, x, xout, ruser, rwsav; + boolean[] lwsav; + String[] cwsav; + + xout = new double[0]; // placeholders + ruser = new double[1]; + rwsav = new double[1100]; + iuser = new int[1]; + iwsav = new int[505]; + lwsav = new boolean[100]; + cwsav = new String[10]; + + System.out.println("D03PCJ Example Program Results"); + + //Specify path to data file + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + intpts = Integer.parseInt(sVal[0]); + npts = Integer.parseInt(sVal[1]); + itype = Integer.parseInt(sVal[2]); + + xout = new double[intpts]; + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < intpts; i++){ + xout[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.split("\\s+"); + acc = Double.parseDouble(sVal[0]); + alpha = Double.parseDouble(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + itrace = Integer.parseInt(sVal[1]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + ts = Double.parseDouble(sVal[0]); + tout = Double.parseDouble(sVal[1]); + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + neqn = npde * npts; + lisave = neqn + 24; + nwk = (10 + (6 * npde)) * neqn; + lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; + + rsave = new double[lrsave]; + u = new double[npde * npts]; + uout = new double[npde * intpts * itype]; + x = new double[npts]; + isave = new int[lisave]; + ruser[0] = alpha; + ind = 0; + itask = 1; + + X01AA x01aa = new X01AA(); + pi = x01aa.eval(); + piby2 = 0.5 * pi; + hx = piby2/(double)(npts - 1); + x[0] = 0.0; + x[npts - 1] = 1.0; + for(int i = 1; i < (npts - 1); i++){ + x[i] = Math.sin(hx * (double)(i)); + } + + u = uinit(x, npts, iuser, ruser); + + //Character (80) :: cwsav(10) + //Surely a better way of doing this? + for(int i = 0; i < 10; i++){ + StringBuilder builder = new StringBuilder(""); + for(int j = 0; j < 80; j++){ + builder.append(" "); + } + cwsav[i] = builder.toString(); + } + + for(int i = 0; i <5; i++){ + tout = 10 * tout; + + ifail = 0; + pdedef pdedef1 = new pdedef(); + bndary bndary1 = new bndary(); + D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, + isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, + rwsav, ifail); + d03pc.eval(); + + //update ind + ind = d03pc.getIND(); + + if(i == 0){ + System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); + System.out.printf("T / X "); + for(int j = 0; j < xout.length; j++){ + System.out.printf("\t%.4f", xout[j]); + } + System.out.printf("\n"); + } + System.out.println(); + + //Interpolate at required spatial points + ifail = 0; + + D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); + d03pz.eval(); + + System.out.printf("%.4f \tU(1)", tout); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2]); + } + System.out.printf("\n"); + System.out.printf("\tU(2)"); + for(int j = 0; j < intpts; j++){ + System.out.printf("\t%.4f ", uout[j * 2 + 1]); + } + System.out.printf("\n"); + System.out.println(); + } + + System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); + System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); + System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); + System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); + } + + /** + * PDE initial condition + */ + public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ + double alpha = ruser[0]; + double[] u = new double[2 * npts]; + for(int i = 0; i < npts; i++){ + u[2 * i] = 2 * alpha * x[i]; + u[(2 * i) + 1] = 1; + } + return u; + } + + public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ + public void eval(){ + double alpha = this.RUSER[0]; + this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); + this.Q[1] = 0; + this.R[0] = this.X * this.UX[0]; + this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); + this.P[0] = 0; + this.P[1] = 0; + this.P[2] = 0; + this.P[3] = 1 - (this.X * this.X); + } + } + + public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ + public void eval(){ + if(this.IBND == 0){ + this.BETA[0] = 0; + this.BETA[1] = 1; + this.GAMMA[0] = this.U[0]; + this.GAMMA[1] = -this.U[0] * this.U[1]; + } + else{ + this.BETA[0] = 1; + this.BETA[1] = 0; + this.GAMMA[0] = -this.U[0]; + this.GAMMA[1] = this.U[1]; + } + } + } + +} + + + diff --git a/simple_examples/source/int32/D03RAJE.java b/simple_examples/source/int32/D03RAJE.java new file mode 100644 index 0000000..88d49aa --- /dev/null +++ b/simple_examples/source/int32/D03RAJE.java @@ -0,0 +1,307 @@ +import com.nag.routines.D03.D03RA; +import com.nag.routines.D03.D03RA.D03RA_BNDARY; +import com.nag.routines.D03.D03RA.D03RA_MONITR; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; +import java.util.Arrays; + +/** + * D03RA example program text. + * @author joed + */ +public class D03RAJE { + + public static final double ALPHA = 50.0; + public static final double BETA = 300.0; + public static final double XMAX = 1.0; + public static final double XMIN = 0.0; + public static final double YMAX = 1.0; + public static final double YMIN = 0.0; + public static final int ITRACE = 0; + public static final int NPDE = 1; + + public static D03RA d03ra = new D03RA(); + public static PDEDEF pdedef = new PDEDEF(); + public static BNDRY bndry = new BNDRY(); + public static PDEIV pdeiv = new PDEIV(); + public static MONIT monit = new MONIT(); + public static MONITDUMMY monitDummy = new MONITDUMMY(); + + public static void main(String[] args) { + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; + double[] dt, twant, optr, rwk; + int[] wklens, iwk, opti = new int[4]; + boolean[] lwk; + + // Run examples + System.out.println(" D03RAJ Example Program Results"); + System.out.println(); + + npts = 2000; + npde = NPDE; + + dt = new double[] {0.1e-2, 0.0, 0.0}; + twant = new double[] {0.24, 0.25}; + ts = 0.0; + + ind = 10; + nx = 41; + ny = 41; + tols = 0.5; + tolt = 0.01; + Arrays.fill(opti, 0); + opti[0] = 6; + maxlev = Math.max(opti[0], 3); + + wklens = computeWkspaceLens(maxlev, npde, npts); + lenrwk = wklens[0]; + leniwk = wklens[1]; + lenlwk = wklens[2]; + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + + optr = new double[3 * npde]; + Arrays.fill(optr, 1.0); + + for (int i = 0; i < 2; i++) { + tout = twant[i]; + ifail = 0; + if (i == 0) { + // Dummy monitor used to avoid output on first call + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, + rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + else { + d03ra.eval( + npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, + tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, + lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail + ); + } + + ind = d03ra.getIND(); + ifail = d03ra.getIFAIL(); + ts = d03ra.getTS(); + + printStatistics(ts, iwk, maxlev); + + } + + } + + public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { + + public void eval() { + Arrays.fill(this.U, 1.0); + } + + } + + public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { + + private static final double ACTIV_ENERGY = 20.0; + private static final double DIFFUSION = 0.1; + private static final double HEAT_RELEASE = 1.0; + private static final double REACTION_RATE = 5.0; + + public void eval() { + + double damkohler; + + damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) + / (HEAT_RELEASE * ACTIV_ENERGY); + + for (int col = 0; col < this.NPDE; col++) { + for (int row = 0; row < this.NPTS; row++) { + int idx = (col * this.NPTS) + row; + this.RES[idx] = this.UT[idx] + - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) + - (damkohler + * (1.0e0 + HEAT_RELEASE - this.U[idx]) + * Math.exp(-ACTIV_ENERGY / this.U[idx])); + } + } + + } + + } + + public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { + + public void eval() { + X02AJ x02aj = new X02AJ(); + double tol; + + // X02AJ returns machine precision + tol = 10.0 * x02aj.eval(); + + for (int i = 0; i < this.NBPTS; i++) { + int j = this.LBND[i] - 1; + + if (Math.abs(this.X[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UX[idx]; + } + } + else if (Math.abs(this.X[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + else if (Math.abs(this.Y[j]) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.UY[idx]; + } + } + else if (Math.abs(this.Y[j] - 1.0) <= tol) { + for (int col = 0; col < this.NPDE; col++) { + int idx = (col * this.NPTS) + j; + this.RES[idx] = this.U[idx] - 1.0; + } + } + } + + } + + } + + public static class MONIT extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + int ipsol, k, level, npts; + + if (TLAST) { + // Print solution + level = this.NLEV - 1; + npts = this.NGPTS[level]; + ipsol = this.LSOL[level]; + k = 0; + for (int i = 0; i < level; i++) { + k += this.NGPTS[i]; + } + + System.out.printf( + " Solution at every 4th grid point in level%10d" + + " at time %8.4f:%n%n", this.NLEV, this.T + ); + System.out.println( + " x y approx u\n" + ); + for (int i = 0; i < npts; i += 4) { + double ix = this.XPTS[k + i]; + double iy = this.YPTS[k + i]; + double isol = this.SOL[ipsol + i]; + System.out.printf( + " %11.4E %11.3E %11.3E%n", + ix, iy, isol + ); + } + System.out.println(); + + } + + } + + } + + public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { + + public void eval() { + return; + } + + } + + public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { + int lenrwk, leniwk, lenlwk; + + lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) + + (2 * maxpts); + leniwk = (2 * maxpts * (14 + (5 * maxlev))) + + (7 * maxlev) + 2; + lenlwk = (2 * maxpts) + 400; + + return new int[] {lenrwk, leniwk, lenlwk}; + + } + + public static void printStatistics(double ts, int[] iwk, int maxlev) { + int[] istats = new int[4]; + + System.out.printf(" Statistics:%n"); + System.out.printf(" Time = %8.4f%n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d%n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d%n", iwk[1] + ); + System.out.printf( + "%n" + + " Total number (rounded) of%n" + + " Residual Jacobian Newton Lin sys%n" + + " evals evals iters iters%n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j + 2] != 0) { + int idx = 0; + for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { + istats[idx++] = iwk[i]; + } + istats = roundStatisics(istats); + System.out.printf("%8d", j + 1); + for (int i = 0; i < 4; i++) { + System.out.printf("%10d", istats[i]); + } + System.out.printf("%n"); + } + } + + System.out.printf( + "%n" + + " Maximum number of %n" + + " Newton iters Lin sys iters %n" + + " At level %n" + ); + + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf("%8d", j+1); + System.out.printf("%14d", iwk[j+2+(4*maxlev)]); + System.out.printf("%14d", iwk[j+2+(5*maxlev)]); + System.out.printf("%n"); + } + } + System.out.println(); + + } + + public static int[] roundStatisics(int[] istat) { + double lt; + int k; + + lt = Math.log(10.0); + for (int i = 0; i < istat.length; i++) { + // istat = 0 leads to div by 0 error, doesn't need rounding anyway + if (istat[i] != 0) { + k = (int) (Math.log((double) istat[i]) / lt); + k = (int) Math.pow(10, k); + istat[i] = k * ((istat[i] + k/2)/k); + } + } + + return istat; + + } + +} diff --git a/simple_examples/source/int32/D03RBJE.java b/simple_examples/source/int32/D03RBJE.java new file mode 100644 index 0000000..9b1b482 --- /dev/null +++ b/simple_examples/source/int32/D03RBJE.java @@ -0,0 +1,388 @@ +import com.nag.routines.D03.D03RB; +import com.nag.routines.D03.D03RZ; +import java.util.Arrays; + +/** + * D03RB example program text. + * @author joed + */ +public class D03RBJE { + + public static final int ITRACE = -1; + public static final int NPDE = 2; + public static final double[] TWANT = {0.25, 1.0}; + + public static boolean do_monitr; + public static int print_stats = 0; + + public static BNDARY bndary = new BNDARY(); + public static INIDOM inidom = new INIDOM(); + public static MONITR monitr = new MONITR(); + public static PDEDEF pdedef = new PDEDEF(); + public static PDEIV pdeiv = new PDEIV(); + + public static void main(String[] args) { + D03RB d03rb = new D03RB(); + double tols, tolt, tout, ts; + int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; + boolean[] lwk; + double[] optr, rwk, dt = new double[3]; + int[] iwk, opti = new int[4]; + + System.out.println(" D03RBJ Example Program Results"); + + npts = 3000; + mxlev = 7; + + leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; + lenlwk = 20 * npts; + lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); + + rwk = new double[lenrwk]; + iwk = new int[leniwk]; + lwk = new boolean[lenlwk]; + optr = new double[3 * NPDE]; + + // Specify that we are starting the integration in time + // (ind = 0 normally). + ind = 10; + + ts = 0.0; + dt[0] = 0.001; + dt[1] = 1.0E-7; + dt[2] = 0.0; + tols = 0.1; + tolt = 0.05; + opti[0] = mxlev; + maxlev = opti[0]; + Arrays.fill(opti, 1, 4, 0); + Arrays.fill(optr, 1.0); + + // Call main routine + for (int iout = 1; iout <= 2; iout++) { + do_monitr = (iout == 2); + tout = TWANT[iout - 1]; + + ifail = 0; + d03rb.eval( + NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, + monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, + ITRACE, ind, ifail + ); + ind = d03rb.getIND(); + ifail = d03rb.getIFAIL(); + ts = d03rb.getTS(); + + if (print_stats != 0) { + System.out.printf(" Statistics:\n"); + System.out.printf(" Time = %8.4f\n", ts); + System.out.printf( + " Total number of accepted timesteps =%5d\n", iwk[0] + ); + System.out.printf( + " Total number of rejected timesteps =%5d\n", iwk[1] + ); + System.out.println( + " Total number of " + + " maximum number of " + ); + System.out.println( + " Residual Jacobian Newton Newton " + ); + System.out.println( + " evals evals iters iters " + ); + System.out.println(" Level "); + + maxlev = opti[0]; + for (int j = 0; j < maxlev; j++) { + if (iwk[j+2] != 0) { + System.out.printf( + "%4d%10d%10d%10d%10d\n", + j+1, + iwk[j + 2 + 0*maxlev], + iwk[j + 2 + 1*maxlev], + iwk[j + 2 + 2*maxlev], + iwk[j + 2 + 4*maxlev] + ); + } + } + System.out.println(); + + } + + } + + } + + public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { + + public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { + this.setNPTS(NPTS); + this.setNPDE(NPDE); + this.setT(T); + this.setX(X); + this.setY(Y); + this.setU(U); + this.eval(); + } + + public void eval() { + double eps = 0.001, a; + + for (int i = 1; i <= this.NPTS; i++) { + a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); + if (a <= 0.0) { + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.U[getIdx(i, 1, this.NPTS)] + = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + this.U[getIdx(i, 2, this.NPTS)] + = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); + } + } + + } + + } + + public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { + + public void eval() { + int ifail, leniwk; + int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; + int[] iwk = new int[122]; + String[] pgrid = new String[11]; + + for (int i = 0; i < 11; i++) { + pgrid[i] = " "; + } + + icold = new int[]{ + 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, + 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, + 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, + 5,6,7,8,0,1,2,3,4,5,6,7,8 + }; + + ilbndd = new int[]{ + 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, + 21,32 + }; + + irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; + + lbndd = new int[]{ + 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, + 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, + 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, + 3,7,71,78,14,31,51,54,34 + }; + + llbndd = new int[]{ + 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, + 67,68,69,70,71,72 + }; + + lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; + + this.NX = 11; + this.NY = 11; + + // Check MAXPTS against rough estimate of NPTS. + this.NPTS = this.NX * this.NY; + if (this.MAXPTS < this.NPTS) { + this.IERR = -1; + return; + } + + this.XMIN = 0.0; + this.YMIN = 0.0; + this.XMAX = 1.0; + this.YMAX = 1.0; + + this.NROWS = 11; + this.NPTS = 105; + this.NBNDS = 28; + this.NBPTS = 72; + + for (int i = 0; i < this.NROWS; i++) { + this.LROW[i] = lrowd[i]; + this.IROW[i] = irowd[i]; + } + + for (int i = 0; i < this.NBNDS; i++) { + this.LLBND[i] = llbndd[i]; + this.ILBND[i] = ilbndd[i]; + } + + for (int i = 0; i < this.NBPTS; i++) { + this.LBND[i] = lbndd[i]; + } + + for (int i = 0; i < this.NPTS; i++) { + this.ICOL[i] = icold[i]; + } + + } + + } + + public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { + + public void eval() { + + double eps = 1E-3; + int n = this.NPTS; // For concise getIdx calls + + for (int i = 1; i <= n; i++) { + this.RES[getIdx(i, 1, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] + + eps * (this.UXX[getIdx(i, 1, n)] + + this.UYY[getIdx(i, 1, n)]); + this.RES[getIdx(i, 2, n)] + = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] + - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] + + eps * (this.UXX[getIdx(i, 2, n)] + + this.UYY[getIdx(i, 2, n)]); + this.RES[getIdx(i, 1, n)] + = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + } + + } + + } + + public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { + + public void eval() { + + double a, eps = 1E-3; + int i, n = this.NPTS; + + for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { + i = this.LBND[k - 1]; + a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) + / (32.0 * eps); + + if (a <= 0.0) { + this.RES[getIdx(i, 1, n)] + = 0.75 - 0.25 / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + 0.25 / (1.0 + Math.exp(a)); + } + else { + a = -a; + this.RES[getIdx(i, 1, n)] + = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + this.RES[getIdx(i, 2, n)] + = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); + } + + this.RES[getIdx(i, 1, n)] + = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; + this.RES[getIdx(i, 2, n)] + = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; + + } + + } + + } + + public static class MONITR extends D03RB.Abstract_D03RB_MONITR { + + public void eval() { + + D03RZ d03rz = new D03RZ(); + double aprxU, exctU, aprxV, exctV; + int maxpts = 6000; + int ifail, ipsol, npts; + double[] uex = new double[105*2], x = new double[maxpts], + y = new double[maxpts]; + + for (int level = 0; level < this.NLEV; level++) { + + if (!this.TLAST) { + break; + } + + ipsol = this.LSOL[level]; + + // Get grid information + ifail = -1; + npts = 0; + d03rz.eval( + level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, + this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, + ifail + ); + ifail = d03rz.getIFAIL(); + npts = d03rz.getNPTS(); + + if (ifail != 0) { + this.IERR = 1; + break; + } + + // Skip printing? + if (!do_monitr || (level != 0)) { + continue; + } + + // Get exact solution + pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); + + System.out.println(); + System.out.printf( + " Solution at every 2nd grid point in level %d at" + + " time %8.4f:\n\n", level + 1, this.T + ); + System.out.print( + " x y approx u exact u approx v" + + " exact v\n\n" + ); + + ipsol = this.LSOL[level]; + + for (int i = 0; i < npts; i += 2) { + aprxU = this.SOL[ipsol + i]; + exctU = uex[getIdx(i+1, 1, npts)]; + aprxV = this.SOL[ipsol + npts + i]; + exctV = uex[getIdx(i+1, 2, npts)]; + System.out.printf( + " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", + x[i], y[i], aprxU, exctU, aprxV, exctV + ); + } + System.out.println(); + + } + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/D05BAJE.java b/simple_examples/source/int32/D05BAJE.java new file mode 100644 index 0000000..7a8caf7 --- /dev/null +++ b/simple_examples/source/int32/D05BAJE.java @@ -0,0 +1,111 @@ +import com.nag.routines.D05.D05BA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BAJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class D05BAJE{ + + /** + * D05BAJE main program + */ + public static void main(String[] args){ + double alim, h, hi, si, thresh, tlim, tol; + int ifail, iorder, lwk, nmesh = 6; + String method; + double[] errest, yn, work; + + errest = new double[nmesh]; + yn = new double[nmesh]; + + System.out.println("D05BAJ Example Program Results"); + + method = "A"; + iorder = 6; + alim = 0; + tlim = 20; + h = (tlim - alim) / (double) nmesh; + tol = 0.001; + X02AJ x02aj = new X02AJ(); + thresh = x02aj.eval(); + lwk = 10 * nmesh + 6; + work = new double[lwk]; + + //Loop until the supplied workspace is big enough + //breakflag used to exit loop + boolean breakflag = false; + while(true){ + ifail = 1; + + ck ck1 = new ck(); + cf cf1 = new cf(); + cg cg1 = new cg(); + + D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, + tol, thresh, work, lwk, ifail); + d05ba.eval(); + + //update + ifail = d05ba.getIFAIL(); + lwk = d05ba.getLWK(); + work = d05ba.getWORK(); + + switch(ifail){ + case 5: + lwk = (int) work[0]; + work = new double[lwk]; + break; + case 6: + lwk = (int) work[0]; + work = new double[lwk]; + break; + default: + breakflag = true; + } + + if(breakflag == true){ + break; + } + } + + if(ifail != 0){ + System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); + } + + System.out.println(); + System.out.printf("Size of workplace = %d\n", lwk); + System.out.printf("Tolerance = %.4e\n", tol); + System.out.println(); + System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); + for(int i = 0; i < nmesh; i++){ + hi = (double) (i + 1) * h; + si = sol(hi); + System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); + } + } + + private static double sol(double t){ + return Math.log(t + Math.exp(1)); + } + + public static class ck extends D05BA.Abstract_D05BA_CK{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cf extends D05BA.Abstract_D05BA_CF{ + public double eval(){ + return Math.exp(-this.T); + } + } + + public static class cg extends D05BA.Abstract_D05BA_CG{ + public double eval(){ + return (this.Y + Math.exp(-this.Y)); + } + } +} + diff --git a/simple_examples/source/int32/D05BEJE.java b/simple_examples/source/int32/D05BEJE.java new file mode 100644 index 0000000..f98bea3 --- /dev/null +++ b/simple_examples/source/int32/D05BEJE.java @@ -0,0 +1,185 @@ +import com.nag.routines.D05.D05BE; +import com.nag.routines.X01.X01AA; +import com.nag.routines.X02.X02AJ; + +/** + * D05BEJ example program text. + * @author willa + */ +public class D05BEJE{ + + private static final int iorder = 4; + private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); + private static final int nout = 6; + private static final int lct = nmesh / 32 + 1; + private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; + + public static void main(String[] args){ + double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; + int ifail; + double[] work, yn; + int[] nct; + + work = new double[lwk]; + yn = new double[nmesh]; + nct = new int[lct]; + + System.out.println("D05BEJ Example Program Results"); + + X02AJ x02aj = new X02AJ(); + tlim = 7; + tolnl = Math.sqrt(x02aj.eval()); + h = tlim /(double) (nmesh - 1); + yn[0] = 0; + + ifail = 0; + + D05BE d05be = new D05BE(); + ck1 k1 = new ck1(); + cf1 f1 = new cf1(); + cg1 g1 = new cg1(); + d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 1"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 1; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol1(hi1)); + + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 4) && (i % 5 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + System.out.println(); + + tlim = 5; + h = tlim /(double) (nmesh - 1); + yn[0] = 1; + + ifail = 0; + + ck2 k2 = new ck2(); + cf2 f2 = new cf2(); + cg2 g2 = new cg2(); + d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); + + //UPDATE + yn = d05be.getYN(); + + System.out.println(); + System.out.println("Example 2"); + System.out.println(); + System.out.printf("The stepsize h = %.4f\n", h); + System.out.println(); + System.out.println("\tT\tApproximate"); + System.out.println("\t\tSolution"); + System.out.println(); + + errmax = 0; + + for(int i = 0; i < nmesh; i++){ + hi1 = (double) i * h; + err = Math.abs(yn[i] - sol2(hi1)); + if(err > errmax){ + errmax = err; + t = hi1; + soln = yn[i]; + } + + if((i > 6) && (i % 7 == 0)){ + System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); + } + } + + System.out.println(); + System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); + } + + private static double sol1(double t){ + double c, pi, t1, x = 0; + + //x is dummy variable + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + t; + c = 1 / Math.sqrt(2 * pi); + + return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); + } + + private static double sol2(double t){ + return (1 / (1 + t)); + } + + private static class ck1 extends D05BE.Abstract_D05BE_CK{ + public double eval(){ + return (Math.exp(-0.5 * this.T)); + } + } + + private static class ck2 extends D05BE.Abstract_D05BE_CK{ + double pi, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + return Math.sqrt(pi); + } + } + + private static class cf1 extends D05BE.Abstract_D05BE_CF{ + double a, pi, t1, x = 0; + + public double eval(){ + X01AA x01aa = new X01AA(x); + pi = x01aa.eval(); + + t1 = 1 + this.T; + a = 1 / Math.sqrt(pi * this.T); + return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); + } + } + + private static class cf2 extends D05BE.Abstract_D05BE_CF{ + double st1; + + public double eval(){ + st1 = Math.sqrt(1 + this.T); + return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); + } + } + + private static class cg1 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } + + private static class cg2 extends D05BE.Abstract_D05BE_CG{ + public double eval(){ + return this.Y; + } + } +} diff --git a/simple_examples/source/int32/DTFSMJE.java b/simple_examples/source/int32/DTFSMJE.java new file mode 100644 index 0000000..a88b114 --- /dev/null +++ b/simple_examples/source/int32/DTFSMJE.java @@ -0,0 +1,54 @@ +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; + +/** + * DTFSM example program text. Adapted from f06wbfe.f90 + * @author joed + */ +public class DTFSMJE { + + public static void main(String[] args) { + + double alpha = 4.21; + int ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[m*m]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < m; j++) { + a[i*m+j] = (j >= i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[(m*(m+1))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int32/E01DAJE.java b/simple_examples/source/int32/E01DAJE.java new file mode 100644 index 0000000..10c008f --- /dev/null +++ b/simple_examples/source/int32/E01DAJE.java @@ -0,0 +1,182 @@ +import com.nag.routines.E01.E01DA; +import com.nag.routines.E02.E02DF; + +/** + * E01DA example program text. + */ +public class E01DAJE { + + public static void main(String[] args) { + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = e01da.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) { + if (i <= mx) { + System.out.printf("%4d %9.4f", i+1, lamda[i]); + } + else { + System.out.printf(" "); + } + if (i <= my) { + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + } + else { + System.out.printf("\n"); + } + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) { + System.out.printf("\n"); + } + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = e01da.getPX(); + py = e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px, 4*ny+py); + if (4*nx+px > 4*ny+py) { + liwrk = ny + py - 4; + } + else { + liwrk = nx + px - 4; + } + double[] tx = new double[nx]; + double[] ty = new double[ny]; + double[] ff = new double[nx*ny]; + wrk = new double[lwrk]; + int[] iwrk = new int[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i < nx-1; i++) { + tx[i] = tx[i-1] + step; + } + tx[nx-1] = xhi; + + step = (yhi-ylo)/(ny-1); + ty[0] = ylo; + for (int i = 1; i < ny-1; i++) { + ty[i] = ty[i-1] + step; + } + ty[ny-1] = yhi; + + /* Evaluate the spline. */ + E02DF e02df = new E02DF(); + ifail = 0; + e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); + + ifail = e02df.getIFAIL(); + switch (ifail) { + case 0: + System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); + System.out.printf(" "); + for (int i = 0; i < nx; ++i) { + System.out.printf(" %5.2f ", tx[i]); + } + System.out.printf("\n"); + for (int i = 0; i < ny; ++i) { + System.out.printf(" %5.2f ", ty[i]); + for (int j = 0; j < nx; ++j) { + System.out.printf(" %8.3f", ff[ny*j+i]); + } + System.out.printf("\n"); + } + break; + default: + System.out.printf("\n Error detected by E02DF: %d\n", ifail); + } + + } + +} diff --git a/simple_examples/source/int32/E02ALJE.java b/simple_examples/source/int32/E02ALJE.java new file mode 100644 index 0000000..372f125 --- /dev/null +++ b/simple_examples/source/int32/E02ALJE.java @@ -0,0 +1,101 @@ +import com.nag.routines.E02.E02AL; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E02ALJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E02ALJE{ + + /** + * E02ALJ Example main program + */ + public static void main(String[] args){ + double dxx, ref = 0, s, t, xx; + int ifail, n = 0, m = 0, neval = 0; //placeholders + double[] a, x, y; + + a = new double[0]; + x = new double[0]; + y = new double[0]; //placeholders + + System.out.println("E02ALJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + m = Integer.parseInt(sVal[2]); + neval = Integer.parseInt(sVal[3]); + + a = new double[m + 1]; + x = new double[n]; + y = new double[n]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[1]); + y[i] = Double.parseDouble(sVal[2]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + ifail = 0; + E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); + e02al.eval(); + + //update + ref = e02al.getREF(); + x = e02al.getX(); + y = e02al.getY(); + + + System.out.println(); + System.out.printf(" Polynomial coefficients\n"); + for(int i = 0; i <= m; i++){ + System.out.printf("\t%.4e\n", a[i]); + } + System.out.println(); + System.out.printf(" Reference deviation = %.2e\n", ref); + System.out.println(); + System.out.printf("\tX\tFit\texp(x)\tResidual\n"); + + dxx = 1/(double)(neval - 1); + + for(int j = 0; j < neval; j++){ + xx = (double) j * dxx; + + s = a[m]; + + for(int i = m - 1; i >=0; i--){ + s = s * xx + a[i]; + } + + t = Math.exp(xx); + System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); + } + } +} + diff --git a/simple_examples/source/int32/E04ABJE.java b/simple_examples/source/int32/E04ABJE.java new file mode 100644 index 0000000..773f1ff --- /dev/null +++ b/simple_examples/source/int32/E04ABJE.java @@ -0,0 +1,76 @@ +import com.nag.routines.E04.E04AB; + +/** + * E04ABJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04ABJE{ + + /** + * E04ABJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04ABJ Example Program Results"); + + //e1 and e2 are set to zero so that E04ABA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); + e04ab.eval(); + + //update + ifail = e04ab.getIFAIL(); + a = e04ab.getA(); + b = e04ab.getB(); + x = e04ab.getX(); + f = e04ab.getF(); + maxcal = e04ab.getMAXCAL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04AB.Abstract_E04AB_FUNCT{ + public void eval(){ + FC = Math.sin(this.XC) / this.XC; + } + } +} diff --git a/simple_examples/source/int32/E04BBJE.java b/simple_examples/source/int32/E04BBJE.java new file mode 100644 index 0000000..d7032f5 --- /dev/null +++ b/simple_examples/source/int32/E04BBJE.java @@ -0,0 +1,81 @@ +import com.nag.routines.E04.E04BB; + +/** + * E04BBJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class E04BBJE{ + + /** + * E04BBJE main program + */ + public static void main(String[] args){ + double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders + int ifail, maxcal; + double[] ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("E04BBJ Example Program Results"); + + //e1 and e2 are set to zero so that E04BBA will reset them to their default values + + e1 = 0; + e2 = 0; + + //The minimum is known to lie in the range (3.5, 5.0) + + a = 3.5; + b = 5.0; + + //Allow 30 calls of FUNCT + + maxcal = 30; + + ifail = -1; + funct funct1 = new funct(); + E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); + e04bb.eval(); + + //update + a = e04bb.getA(); + b = e04bb.getB(); + maxcal = e04bb.getMAXCAL(); + x = e04bb.getX(); + f = e04bb.getF(); + g = e04bb.getG(); + ifail = e04bb.getIFAIL(); + + switch(ifail){ + case 0: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + case 2: + System.out.println(); + System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); + System.out.printf("Its estimated position is %.8f,\n", x); + System.out.printf("where the function value is %.4f\n", f); + System.out.printf("and the gradient is %.1e (machine dependent)\n", g); + System.out.printf("%d function evaluations were required\n", maxcal); + break; + default: + break; + } + } + + public static class funct extends E04BB.Abstract_E04BB_FUNCT{ + public void eval(){ + this.FC = Math.sin(this.XC) / this.XC; + this.GC = (Math.cos(this.XC) - this.FC)/this.XC; + } + } +} + diff --git a/simple_examples/source/int32/E04CBJE.java b/simple_examples/source/int32/E04CBJE.java new file mode 100644 index 0000000..fbde674 --- /dev/null +++ b/simple_examples/source/int32/E04CBJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.E04.E04CB; +import com.nag.routines.E04.E04CBK; +import com.nag.routines.X02.X02AJ; + +/** + * E04CBJ Example Program text + * @author willa + * @since 27.1.0.0 + */ +public class E04CBJE{ + + /** + * E04CBJE main program + */ + public static void main(String[] args){ + int n = 2, ifail, maxcal; + double f = 0, tolf, tolx; //placeholders + boolean monitoring; + int[] iuser; + double[] ruser, x; + + iuser = new int[1]; + ruser = new double[1]; + x = new double[n]; + + System.out.println("E04CBJ Example Program Results"); + + //Set monitoring to true to obtain monitoring information + monitoring = false; + + x[0] = -1.0; + x[1] = 1.0; + X02AJ x02aj = new X02AJ(); + tolf = Math.sqrt(x02aj.eval()); + tolx = Math.sqrt(tolf); + maxcal = 100; + + ifail = 0; + + funct funct1 = new funct(); + if(!monitoring){ + defMonit monit = new defMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + else{ + myMonit monit = new myMonit(); + E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); + e04cb.eval(); + } + + System.out.println(); + System.out.printf("The final function value is \t%.4f\n", f); + System.out.printf("at the point\t"); + for(int i = 0; i < n; i++){ + System.out.printf("%.4f\t", x[i]); + } + System.out.printf("\n"); + } + + public static class funct extends E04CB.Abstract_E04CB_FUNCT{ + public void eval(){ + this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); + } + } + + public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ + public void eval(){ + System.out.println(); + System.out.printf("There have been %d function calls\n", this.NCALL); + System.out.printf("The smallest function value is %.4f\n", this.FMIN); + System.out.printf("The simplex is\n"); + for(int i = 0; i <= this.N; i++){ + for(int j = 0; j < this.N; j++){ + System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); + } + System.out.printf("\n"); + } + System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); + System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); + } + } + + //This is how to use NAG supplied function as argument + public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ + public void eval(){ + super.eval(); + } + } +} diff --git a/simple_examples/source/int32/E04FCJE.java b/simple_examples/source/int32/E04FCJE.java new file mode 100644 index 0000000..939f68d --- /dev/null +++ b/simple_examples/source/int32/E04FCJE.java @@ -0,0 +1,420 @@ +import com.nag.routines.E04.E04FC; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04FC example program text. + * @author ludovic + */ +public class E04FCJE { + + public static void main(String[] args) { + + BufferedReader dataIn = null; + + try { + E04FC e04fc = new E04FC(); + System.out.println(" E04FCJ Example Program Results"); + dataIn = new BufferedReader(new FileReader(args[0])); + //skip header + dataIn.readLine(); + + int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, + lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; + String trans = "T"; + + double eta, fsumsq, stepmx, xtol; + eta = fsumsq = stepmx = xtol = Double.NaN; + int ifail, iprint, maxcal, nf, niter; + ifail = iprint = maxcal = nf = niter = 0; + double[] fjac = new double[m * n], + fvec = new double[m], + g = new double[n], + s = new double[n], + v = new double[ldv * n], + w = new double[lw], + x = new double[n], + y = new double[m], + t = new double[m * nt]; + + + int[] iw = new int[liw]; + + for (int i = 0; i < m; ++i) { + String[] line = dataIn.readLine().trim().split("\\s+"); + if (line.length != nt + 1) { + System.err.println("Error in data file - only " + line.length + + " records at line " + (i + 2) + " while expecting " + (nt + 1) + + " elements"); + System.exit(1); + } + y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format + for (int j = 1; j <= nt; ++j) { + t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); + } + } + + // Set IPRINT to 1 to obtain output from LSQMON at each iteration + iprint = -1; + + maxcal = 400 * n; + eta = 0.5; + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + + // We estimate that the minimum will be within 10 units of the starting point + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + + LSQFUN lsqfun = new LSQFUN(); + lsqfun.t = t; + lsqfun.y = y; + LSQMON lsqmon = new LSQMON(); + + e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, + fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); + + ifail = e04fc.getIFAIL(); + + + switch (ifail) { + case (1): + System.err.println("Unexpected ifail = " + ifail); + break; + default: + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); + System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); + lsqgrd(m, n, fvec, fjac, ldfjac, g); + System.out.print(" The estimated gradient is "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.3e\t", g[i]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int i = 0; i < m; ++i) { + System.out.printf(" %9.1e\n", fvec[i]); + } + } + + + + } + catch (Exception ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + finally { + try { + dataIn.close(); + } + catch (IOException ex) { + Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + } + + public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); + dgemv.eval(); + for (int i = 0; i < g.length; ++i) { + g[i] = 2.0 * g[i]; + } + } + + public static class LSQFUN implements E04FC.E04FC_LSQFUN { + + public double[] t, y; + int IFLAG, M, N, LW, LIW; + double[] XC, FVEC, W; + int[] IW; + + @Override + public void setIFLAG(int IFLAG) { + this.IFLAG = IFLAG; + } + + @Override + public int getIFLAG() { + return IFLAG; + } + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, + int[] IW, int LIW, double[] W, int LW) { + for (int i = 0; i < M; ++i) { + FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; + } + } + + } + + public static class LSQMON implements E04FC.E04FC_LSQMON { + + int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; + int[] IW; + double[] XC, FVEC, FJAC, S, W; + + @Override + public void setM(int M) { + this.M = M; + } + + @Override + public int getM() { + return M; + } + + @Override + public void setN(int N) { + this.N = N; + } + + @Override + public int getN() { + return N; + } + + @Override + public void setXC(double[] XC) { + this.XC = XC; + } + + @Override + public double[] getXC() { + return XC; + } + + @Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + @Override + public double[] getFVEC() { + return FVEC; + } + + @Override + public void setFJAC(double[] FJAC) { + this.FJAC = FJAC; + } + + @Override + public double[] getFJAC() { + return FJAC; + } + + @Override + public void setLDFJAC(int LDFJAC) { + this.LDFJAC = LDFJAC; + } + + @Override + public int getLDFJAC() { + return LDFJAC; + } + + @Override + public void setS(double[] S) { + this.S = S; + } + + @Override + public double[] getS() { + return S; + } + + @Override + public void setIGRADE(int IGRADE) { + this.IGRADE = IGRADE; + } + + @Override + public int getIGRADE() { + return IGRADE; + } + + @Override + public void setNITER(int NITER) { + this.NITER = NITER; + } + + @Override + public int getNITER() { + return NITER; + } + + @Override + public void setNF(int NF) { + this.NF = NF; + } + + @Override + public int getNF() { + return NF; + } + + @Override + public void setIW(int[] IW) { + this.IW = IW; + } + + @Override + public int[] getIW() { + return IW; + } + + @Override + public void setLIW(int LIW) { + this.LIW = LIW; + } + + @Override + public int getLIW() { + return LIW; + } + + @Override + public void setW(double[] W) { + this.W = W; + } + + @Override + public double[] getW() { + return W; + } + + @Override + public void setLW(int LW) { + this.LW = LW; + } + + @Override + public int getLW() { + return LW; + } + + @Override + public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, + int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, + int LIW, double[] W, int LW) { + + int ndec = 3; + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); + fsumsq = ddot.eval(); + + lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); + + gtg = ddot.eval(N, g, 1, g, 1); + // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", + NITER, NF, fsumsq, gtg, IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < N; ++j) { + System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04FFJE.java b/simple_examples/source/int32/E04FFJE.java new file mode 100644 index 0000000..ad81e32 --- /dev/null +++ b/simple_examples/source/int32/E04FFJE.java @@ -0,0 +1,140 @@ +import com.nag.routines.E04.E04FF; +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.util.Arrays; + +/** + * E04FF example program text. + * @author joed + */ +public class E04FFJE { + + public static void main(String[] args) { + double infbnd = 1.0e20; + double[] lx, rx, ux, x, ruser, pdy, pdz; + double[] rinfo = new double[100], stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; + int[] iuser; + int[] icolrd = new int[1], irowrd = new int[1]; + long cpuser, handle; // c_ptr + MONIT monit = new MONIT(); + OBJFUN objfun = new OBJFUN(); + + /* Header */ + System.out.printf(" E04FFJ Example Program Results\n\n"); + + /* Fill problem data structure */ + pdny = 11; + pdnz = 11; + pdy = new double[] { + 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, + 8.33e-2, 7.14e-2, 6.25e-2 + }; + pdz = new double[] { + 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, + 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 + }; + nvar = 4; + nres = 11; + + /* Initialize handle */ + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define residuals structure */ + E04RM e04rm = new E04RM(); + isparse = 0; // Dense => irowrd and icolrd are not accessed + nnzrd = 1; + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set options */ + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + + /* Define starting point */ + x = new double[] {0.25, 0.39, 0.415, 0.39}; + rx = new double[nres]; + + /* Define bounds for the second and the fourth variable */ + E04RH e04rh = new E04RH(); + lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; + ux = new double[] {infbnd, 1.0, infbnd, infbnd}; + ifail = 0; + e04rh.eval(handle, nvar, lx, ux, ifail); + + /* Call the solver */ + E04FF e04ff = new E04FF(); + ifail = -1; + iuser = new int[] {pdny, pdnz}; + ruser = new double[2 * nres]; + cpuser = 0L; + for (int i = 0; i < nres; i++) { + ruser[i] = pdy[i]; + ruser[nres + i] = pdz[i]; + } + e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, + iuser, ruser, cpuser, ifail); + + /* Free handle memory */ + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + + } + + public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { + + public void eval() { + int pdny, pdnz; + double r1, r2; + double[] pdy, pdz; + + /* Interrupt solver if the dimensions are incorrect */ + if (this.NRES != 11 || this.NVAR != 4) { + this.INFORM = -1; + return; + } + + /* Extract the problem data structure from the workspaces */ + pdny = this.IUSER[0]; + pdnz = this.IUSER[1]; + if (pdny != this.NRES || pdnz != this.NRES) { + this.INFORM = -1; + return; + } + pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); + pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); + + for (int i = 0; i < this.NRES; i++) { + r1 = pdy[i] * (pdy[i] + this.X[1]); + r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; + this.RX[i] = pdz[i] - (this.X[0] * r1/r2); + } + + } + + } + + public static class MONIT extends E04FF.Abstract_E04FF_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GBJE.java b/simple_examples/source/int32/E04GBJE.java new file mode 100644 index 0000000..7becf21 --- /dev/null +++ b/simple_examples/source/int32/E04GBJE.java @@ -0,0 +1,183 @@ +import com.nag.routines.A00.A00AA; +import com.nag.routines.E04.E04GB; +import com.nag.routines.E04.E04HEV; +import com.nag.routines.E04.E04YA; +import com.nag.routines.F06.DDOT; +import com.nag.routines.F06.F06PA; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04GB example program text. + */ +public class E04GBJE { + + public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; + public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; + public static final String trans = "T"; + public static double[] y; + public static double[] t; + + public static void main(String[] args) { + + double eta, fsumq = 0.0, stepmx, xtol; + int ifail, iprint, maxcal, nf = 0, niter = 0; + double[] fjac = new double[ldfjac * n]; + double[] fvec = new double[m]; + double[] g = new double[n]; + double[] s = new double[n]; + double[] v = new double[ldv * n]; + double[] w = new double[lw * n]; + double[] x = new double[n]; + int[] iw = new int[liw]; + + System.out.println(" E04GBJ Example Program Results"); + + // Data + y = new double[] { + 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, + 0.96, 1.34, 2.10, 4.39 + }; + + t = new double[m * nt]; + for (int i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + // Check LSQFUN by calling E04YA at an arbitrary point + E04YA e04ya = new E04YA(); + LSQFUN lsqfun = new LSQFUN(); + x[0] = 0.19; + x[1] = -.34; + x[2] = 0.88; + ifail = 0; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); + + // Continue setting parameters for E04GB + E04GB e04gb = new E04GB(); + LSQMON lsqmon = new LSQMON(); + LSQLIN lsqlin = new LSQLIN(); + iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration + maxcal = 50 * n; + eta = 0.09; // Since E04HEV is being used as LSQLIN + xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); + stepmx = 10.0; + + // Set up the starting point + x[0] = 0.5; + x[1] = 1.0; + x[2] = 1.5; + + ifail = -1; + e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, + stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, + liw, w, lw, ifail); + fsumq = e04gb.getFSUMSQ(); + x = e04gb.getX(); + ifail = e04gb.getIFAIL(); + + if (ifail == 0 || ifail >= 2) { + System.out.println(); + System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); + System.out.printf(" at the point "); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.4f", x[ii]); + } + System.out.println(); + + lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); + + System.out.print(" The corresponding gradient is"); + for (int ii = 0; ii < n; ++ii) { + System.out.printf("%12.3E", g[ii]); + } + System.out.println(); + System.out.println(" (machine dependent)"); + System.out.println(" and the residuals are"); + for (int ii = 0; ii < m; ++ii) { + System.out.printf(" %9.1E\n", fvec[ii]); + } + System.out.println(); + } + + } + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + + for (int i = 0; i < m; i++) { + denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; + this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; + + if (this.IFLAG != 0) { + this.FJAC[i] = 1.0; + dummy = -1.0 / (denom * denom); + this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; + this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; + } + } + + } + + } + + public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { + + public static final int ndec = 3; + + /** Monitoring routine. */ + public void eval() { + double fsumsq, gtg; + double[] g = new double[ndec]; + DDOT ddot = new DDOT(); + + fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); + this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); + gtg = ddot.eval(this.N, g, inc1, g, inc1); + + System.out.println(); + System.out.println(" Itn F evals SUMSQ GTG Grade"); + System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", + this.NITER, this.NF, fsumsq, gtg, this.IGRADE); + System.out.println(); + System.out.println(" X G Singular values"); + for (int j = 0; j < n; j++) { + System.out.printf(" %13.5E %9.1E %9.1E\n", + this.XC[j], g[j], this.S[j]); + } + + } + + /** Routine to evaluate gradient of the sum of squares. */ + public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { + F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); + f06pa.eval(); + + for (int i = 0; i < n; ++i) { + g[i] = 2.0 * g[i]; + } + + } + + } + + /** Using E04HEV as LSQLIN. */ + private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { + + public void eval() { + super.eval(); + } + + } + +} diff --git a/simple_examples/source/int32/E04GGJE.java b/simple_examples/source/int32/E04GGJE.java new file mode 100644 index 0000000..8a18c6a --- /dev/null +++ b/simple_examples/source/int32/E04GGJE.java @@ -0,0 +1,219 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; + +/** + * E04GG example program text. + */ +public class E04GGJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser = 0, handle = 0; + int ifail, isparse, nnzrd, nres, nvar; + + double[] blx, bux, ruser, rx, x, z; + double[] rinfo = new double[100], stats = new double[100]; + int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; + + /* Header */ + System.out.println(" E04GGJ Example Program Results\n"); + + nvar = 6; + nres = 24; + // ruser = new double[2*nres]; + // Data from Lanczos 3 Problem + ruser = new double[] { + // t(:) = + 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, + 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, + 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, + // y(:) = + 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, + 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, + 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 + }; + + iuser[0] = 0; + + // Initialize handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define residuals structure, isparse=0 means the residual structure is + // dense => irowrd and icolrd are not accessed + isparse = 0; + nnzrd = 0; + E04RM e04rm = new E04RM(); + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); + e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); + e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); + // Change printed output verbosity + e04zm.eval(handle, "Print Level = 1",ifail); + + // Define starting point + rx = new double[nres]; + z = new double[nvar]; + // x = new double[nvar]; + x = new double[] { + 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 + }; + + // Define bounds + blx = new double[nvar]; + bux = new double[nvar]; + blx[0] = 0.0; + bux[0] = 1.0; + blx[1] = -1.0; + bux[1] = infbnd; + blx[2] = -1.0; + bux[2] = infbnd; + blx[3] = -1.0; + bux[3] = infbnd; + blx[4] = -1.0; + bux[4] = 1.0; + blx[5] = -1.0; + bux[5] = 10.0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, blx, bux, ifail); + + // Call the solver + ifail = -1; + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); + ifail = e04gg.getIFAIL(); + + // Recover latest iterate from handle if available + if (ifail == 0) { + ifail = -1; + E04RX e04rx = new E04RX(); + e04rx.eval(handle,"X",1,nvar,z,ifail); + ifail = e04rx.getIFAIL(); + if (ifail == 0) { + System.out.println("\nSolver stored solution iterate in the handle"); + System.out.print("X: "); + for (int i = 0; i < nvar; i++){ + System.out.printf("%8.2E ", z[i]); + } + System.out.println(); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++){ + this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - + this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int i; + + for (i = 0; i < this.RDX.length; i++) { + this.RDX[i] = 0; + } + + for (i = 0; i < this.NRES; i++) { + this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); + this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); + this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); + this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); + } + + this.INFORM = 0; + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + for (int i = 0; i < this.NVAR * this.NVAR; i++) { + this.HX[i] = 0.0; + } + + double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; + + for (int i = 0; i < this.NRES; i++){ + sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); + sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); + sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); + sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); + sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); + sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); + } + + this.HX[(2-1) + (1-1) * this.NVAR] = sum21; + this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; + this.HX[(2-1) + (2-1) * this.NVAR] = sum22; + this.HX[(4-1) + (3-1) * this.NVAR] = sum43; + this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; + this.HX[(4-1) + (4-1) * this.NVAR] = sum44; + this.HX[(6-1) + (5-1) * this.NVAR] = sum65; + this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; + this.HX[(6-1) + (6-1) * this.NVAR] = sum66; + + this.INFORM = 0; + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + +} diff --git a/simple_examples/source/int32/E04MTJE.java b/simple_examples/source/int32/E04MTJE.java new file mode 100644 index 0000000..6272e91 --- /dev/null +++ b/simple_examples/source/int32/E04MTJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RF; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04MT example program text. + */ +public class E04MTJE { + + public static void main(String[] args) throws IOException { + + System.out.println(" E04MTJ Example Program Results"); + int m = 7; + int n = 7; + int nnza = 41; + int nnzc = 7; + int nnzu = 2*n + 2*m; + + int[] cindex = {1,2,3,4,5,6,7}; + double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; + int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, + 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; + int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, + 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; + double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, + 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, + 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, + 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, + 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, + 0.12, 0.02, 0.01, 0.97}; + double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, + -0.0992,-0.003}; + double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, + 1.0e20, 0.002}; + double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; + double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; + double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; + + long handle = 0; + int ifail = 0; + E04RA e04ra = new E04RA(handle,n,ifail); + e04ra.eval(); + + handle = e04ra.getHANDLE(); + + int[] icolh = new int[1]; + int[] irowh = new int[1]; + double[] h = new double[1]; + E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); + e04rf.eval(); + handle = e04ra.getHANDLE(); + + E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); + e04rh.eval(); + handle = e04rh.getHANDLE(); + + int idlc = 0; + E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); + e04rj.eval(); + handle = e04rj.getHANDLE(); + + E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); + e04zm.eval(); + e04zm.setOPTSTR("Print Solution = YES"); + e04zm.eval(); + e04zm.setOPTSTR("Print Options = NO"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); + e04zm.eval(); + handle = e04zm.getHANDLE(); + + long cpuser = 2; + int[] iuser = {1}; + double[] ruser = new double[1]; + ifail = -1; + MONIT monit = new MONIT(); + double[] x = new double[n], u = new double[nnzu]; + double[] rinfo = new double[100], stats = new double[100]; + System.out.println(); + System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); + E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, + monit,iuser,ruser,cpuser,ifail); + e04mt.eval(); + System.out.println(); + System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); + e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); + e04zm.eval(); + e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); + e04zm.eval(); + iuser[0] = 2; + e04mt.setIFAIL(-1); + e04mt.setHANDLE(e04zm.getHANDLE()); + e04mt.setIUSER(iuser); + e04mt.eval(); + + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + + double tol = 1.2e-8; + + if (IUSER[0] == 1) { + if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + else { + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + System.out.println("Iteration " + Integer.toString((int)STATS[0])); + System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); + } + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04MXJE.java b/simple_examples/source/int32/E04MXJE.java new file mode 100644 index 0000000..642a933 --- /dev/null +++ b/simple_examples/source/int32/E04MXJE.java @@ -0,0 +1,292 @@ +import com.nag.routines.E04.E04MX; +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NS; +import com.nag.routines.E04.E04NT; +import com.nag.routines.X04.X04AC; +import com.nag.routines.X04.X04AD; +import java.util.Arrays; + +/** + * E04MX example program text. + */ +public class E04MXJE { + + public static void main(String[] args) { + + /* Parameters */ + int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; + boolean readints = false; + String fname = args[0]; + /* Local Scalars */ + double obj, objadd, sinf; + int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, + maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; + boolean verboseOutput; + String start; + /* Local Arrays */ + double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; + int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; + String[] crname, cw; + String[] cuser = new String[1], pnames = new String[5]; + cuser[0] = " "; + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + + System.out.println(" E04MXJ Example Program Results"); + + // Initialize + for (int j = 0; j < 5; j++) { + pnames[j] = " "; + } + maxm = 0; + maxn = 0; + maxnnz = 0; + maxnnzh = 0; + maxncolh = 0; + maxlintvar = 0; + + // Open the data file for reading + X04AC x04ac = new X04AC(); + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Prep call to E04MX in query mode + E04MX e04mx = new E04MX(); + a = new double[1]; + irowa = new int[1]; + iccola = new int[1]; + bl = new double[1]; + bu = new double[1]; + crname = new String[]{" "}; + h = new double[1]; + irowh = new int[1]; + iccolh = new int[1]; + intvar = new int[1]; + ifail = 0; + + // Placeholders for output only scalars + n = 0; + m = 0; + nnz = 0; + ncolh = 0; + nnzh = 0; + lintvar = 0; + iobj = 0; + nname = 0; + minmax = 0; + + // Make call to E04MX + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + + // Get output scalar values + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close file + X04AD x04ad = new X04AD(); + ifail = 0; + x04ad.eval(nin, ifail); + + // Set maxm, maxn and maxnnz + maxm = m; + maxn = n; + maxnnz = nnz; + maxnnzh = nnzh; + maxncolh = ncolh; + maxlintvar = (readints) ? lintvar : 1; + + // Allocate memory + irowa = new int[maxnnz]; + iccola = new int[maxn + 1]; + a = new double[maxnnz]; + bl = new double[maxn + maxm]; + bu = new double[maxn + maxm]; + crname = new String[maxn + maxm]; + for (int j = 0; j < (maxn + maxm); j++) { + crname[j] = " "; + } + irowh = new int[maxnnzh]; + iccolh = new int[maxncolh + 1]; + h = new double[maxnnzh]; + intvar = new int[maxlintvar]; + + // Open the data file for reading + mode = 0; + ifail = 0; + x04ac.eval(nin, fname, mode, ifail); + + // Call E04MX to read the problem + ifail = 0; + e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, + mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, + iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, + minmax, intvar, ifail); + n = e04mx.getN(); + m = e04mx.getM(); + nnz = e04mx.getNNZ(); + ncolh = e04mx.getNCOLH(); + nnzh = e04mx.getNNZH(); + lintvar = e04mx.getLINTVAR(); + iobj = e04mx.getIOBJ(); + nname = e04mx.getNNAME(); + minmax = e04mx.getMINMAX(); + ifail = e04mx.getIFAIL(); + + // Close the data file + ifail = 0; + x04ad.eval(nin, ifail); + + /* Data has been read. Set up and run the solver */ + + iw = new int[leniw]; + rw = new double[lenrw]; + cw = new String[lencw]; + for (int j = 0; j < lencw; j++) { + cw[j] = " "; + } + + // Call E04NP to initialize workspace + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); + + // Call option setter E04NS to change the direction of optimization. + // Minimization is assumed by default. + E04NS e04ns = new E04NS(); + if (minmax == 1) { + ifail = 0; + e04ns.eval("Maximize", cw, iw, rw, ifail); + } + else if (minmax == 0) { + ifail = 0; + e04ns.eval("Feasible Point", cw, iw, rw, ifail); + } + + // Set this to TRUE to cause E04NQ to produce intermediate progress output + verboseOutput = false; + + if (verboseOutput) { + // By default E04NQ does not print monitoring information. Set the print + // file unit or the summary file unit to get information. + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", nout, cw, iw, rw, ifail); + } + else { + System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); + } + + // We have no explicit objective vector so set LENC = 0; the objective vector + // is stored in row IOBJ of ACOL. + lenc = 0; + objadd = 0.0; + start = "C"; + + c = new double[Math.max(1, lenc)]; + helast = new int[n + m]; + x = new double[n + m]; + pi = new double[m]; + rc = new double[n + m]; + hs = new int[n + m]; + iuser = new int[ncolh + 1 + nnzh]; + ruser = new double[nnzh]; + + if (ncolh > 0) { + // Store the non zeros of H in ruser for use by qphx + for (int j = 0; j < nnzh; j++) { + ruser[j] = h[j]; + } + // Store iccolh and irowh in iuser for use by qphx + for (int j = 0; j < ncolh + 1; j++) { + iuser[j] = iccolh[j]; + } + for (int j = 0; j < nnzh; j++) { + iuser[j + ncolh + 1] = irowh[j]; + } + + } + + // Call E04NQ to solve the problem + E04NQ e04nq = new E04NQ(); + QPHX qphx = new QPHX(); + ns = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + ifail = 0; + e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, + pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, + x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, + lenrw,cuser,iuser,ruser,ifail); + ns = e04nq.getNS(); + ninf = e04nq.getNINF(); + sinf = e04nq.getSINF(); + obj = e04nq.getOBJ(); + ifail = e04nq.getIFAIL(); + + if (!verboseOutput) { + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n", obj); + System.out.printf(" Optimal X = \n"); + System.out.printf(" "); + for (int j = 0; j < n; j++) { + System.out.printf("%9.2f", x[j]); + } + System.out.printf("\n"); + } + + } + + public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { + + /** + * Subroutine to compute H*x. + * Note: IUSER and RUSER contain the following data: + * RUSER(1:NNZH) = H(1:NNZH) + * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) + * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) + */ + public void eval() { + /* Local Scalars */ + int end, icol, idx, irow, start; + + Arrays.fill(HX, 0.0); + + for (icol = 0; icol < this.NCOLH + 1; ++icol) { + + start = this.IUSER[icol] - 1; + end = IUSER[icol+1] - 2; + + for (idx = start; idx < end + 1; ++idx) { + + irow = this.IUSER[this.NCOLH + 1 + idx] - 1; + this.HX[irow] += this.X[icol] * this.RUSER[idx]; + + if (irow != icol) { + this.HX[icol] += this.X[irow] * this.RUSER[idx]; + } + + } + + } + + } + + } + + +} diff --git a/simple_examples/source/int32/E04NCJE.java b/simple_examples/source/int32/E04NCJE.java new file mode 100644 index 0000000..d6c3010 --- /dev/null +++ b/simple_examples/source/int32/E04NCJE.java @@ -0,0 +1,246 @@ +import static java.lang.Math.max; + +import com.nag.routines.E04.E04NC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NC example program text. + * @author ludovic + */ +public class E04NCJE { + + public static void main(String[] args) { + + double one = 1.0; + double zero = 0.0; + int inc1 = 1, lcwsav = 1, liwsav = 610, + llwsav = 120, lrwsav = 475, nin = 5, + nout = 6; + double obj; + int i, ifail, iter, lda, ldc, liwork, + lwork, m, n, nclin, sdc; + double[] a, b, bl, bu, c, + clamda, cvec, work, x; + double[] rwsav = new double[lrwsav]; + int[] istate, iwork, kx; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + String[] cwsav = new String[lcwsav]; + + System.out.println(" E04NCJ Example Program Results"); + try { + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + m = Integer.parseInt(data[0]); + n = Integer.parseInt(data[1]); + nclin = Integer.parseInt(data[2]); + + liwork = n; + ldc = max(1,nclin); + lda = max(1,m); + + if (nclin > 0) { + sdc = n; + } + else { + sdc = 1; + } + + /* This particular example problem is of type LS1, so we allocate + * A(LDA,N), CVEC(1), B(M) and define LWORK as below + */ + if (nclin > 0) { + lwork = 2*n*n + 9*n + 6*nclin; + } + else { + lwork = 9*n; + } + + /* + * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column + * ie: + * 1 1 1 + * 2 2 2 + * 3 3 3 + * + * is stored [1,2,3,1,2,3,1,2,3] + */ + istate = new int[n+nclin]; + kx = new int[n]; + iwork = new int[liwork]; + c = new double[ldc*sdc]; + bl = new double[n+nclin]; + bu = new double[n+nclin]; + cvec = new double[1]; + x = new double[n]; + a = new double[lda * n]; + b = new double[m]; + clamda = new double[n+nclin]; + work = new double[lwork]; + + /* + * Extra arrays to initialize: + */ + for (int ii = 0; ii < cwsav.length; ++ii) { + // 80 characters long... + cwsav[ii] + = " "; + } + + for (int ii = 0; ii < lda; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < n; ++jj) { + a[lda*jj+ii] = Double.parseDouble(data[jj]); + } + } + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + + for (int ii = 0; ii < m; ++ii) { + b[ii] = Double.parseDouble(data[ii]); + } + + for (int ii = 0; ii < ldc; ++ii) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < sdc; ++jj) { + c[ldc*jj+ii] = Double.parseDouble(data[jj]); + } + } + + //bl and bu to complicated to read properly -> hardcoded + line = br.readLine(); + line = br.readLine(); + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = -1.0E+25; + bl[3] = 0.0; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 0.0; + bl[8] = 0.0; + bl[9] = 2.0; + bl[10] = -1.0E+25; + bl[11] = 1.0; + + line = br.readLine(); + line = br.readLine(); + bu[0] = 2.0; + bu[1] = 2.0; + bu[2] = 2.0; + bu[3] = 2.0; + bu[4] = 2.0; + bu[5] = 2.0; + bu[6] = 2.0; + bu[7] = 2.0; + bu[8] = 2.0; + bu[9] = 1.0E+25; + bu[10] = 2.0; + bu[11] = 4.0; + + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int ii = 0; ii < n; ++ii) { + x[ii] = Double.parseDouble(data[ii]); + } + + // CALL TO E04WBF + ifail = 0; + String routname = "E04NCA"; + E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, + lrwsav, ifail); + e04wb.eval(); + cwsav = e04wb.getCWSAV(); + iwsav = e04wb.getIWSAV(); + lwsav = e04wb.getLWSAV(); + rwsav = e04wb.getRWSAV(); + + // CALL TO E04NCF + ifail = -1; + + /* Java needs these to be initialized, so set it to an impossible value + * to trap possible error later */ + iter = Integer.MIN_VALUE; + obj = Double.NaN; + + E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, + clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); + e04nc.eval(); + + // Getting ifail's value back + ifail = e04nc.getIFAIL(); + + switch (ifail) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + System.out.println("\n Varbl Istate Value Lagr Mult\n"); + + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println("\n\n L Con Istate Value Lagr Mult\n"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); + break; + default: + if (ifail > 7) { + System.out.println(" Varbl Istate Value Lagr Mult"); + for (i = 0; i < n; ++i) { + System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); + } + + if (nclin > 0) { + DGEMV dgemv = new DGEMV(); + dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); + System.out.println(" L Con Istate Value Lagr Mult"); + for (int ii = 0; ii < nclin; ++ii) { + System.out.printf(" L %3d %3d %14.3E %12.3E\n", + ii+1,istate[ii+n],work[ii],clamda[ii+n]); + } + } + + System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); + } + else { + System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); + } + } + } + catch (Exception ex) { + Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/simple_examples/source/int32/E04NFJE.java b/simple_examples/source/int32/E04NFJE.java new file mode 100644 index 0000000..e341f9f --- /dev/null +++ b/simple_examples/source/int32/E04NFJE.java @@ -0,0 +1,234 @@ +import com.nag.routines.E04.E04NF; +import com.nag.routines.E04.E04NH; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E54NFU; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * E04NF example program text. + */ +public class E04NFJE { + + public static void main(String[] args) { + + /* Local Scalars */ + double obj; + int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; + /* Local Arrays */ + double[] a, ax, bl, bu, clamda, cvec, h, work, x; + int[] istate, iwork; + + try { + + System.out.println(" E04NFJ Example Program Results"); + + if (args.length == 0) { + System.err.println("You need to provide the path to the data file e04nfae.d"); + System.exit(-1); + } + + // Read data from file + DataFile datafile = new DataFile(args[0]); + datafile.read(); + + liwork = 2 * datafile.n + 3; + lda = Math.max(1, datafile.nclin); + + sda = (datafile.nclin > 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new int[datafile.n + datafile.nclin]; + ax = new double[Math.max(1, datafile.nclin)]; + iwork = new int[liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[datafile.n + datafile.nclin]; + work = new double[lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[lcwsav]; + cwsav[0] + = " "; + int[] iwsav = new int[liwsav]; + boolean[] lwsav = new boolean[llwsav]; + double[] rwsav = new double[lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + int[] iuser = new int[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } + catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default. */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + super.eval(); + } + + } + + public static class DataFile { + + public String filename; + public int n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file" + + " - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } + else { + sda = 1; + } + ldh = n; + + cvec = new double[n]; + a = new double[lda * sda]; + bl = new double[n + nclin]; + bu = new double[n + nclin]; + x = new double[n]; + h = new double[ldh * n]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file" + + " - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int32/E04NKJE.java b/simple_examples/source/int32/E04NKJE.java new file mode 100644 index 0000000..604ee66 --- /dev/null +++ b/simple_examples/source/int32/E04NKJE.java @@ -0,0 +1,295 @@ +import com.nag.routines.E04.E04NK; +import com.nag.routines.E04.E04WB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NKJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class E04NKJE{ + private static int lcwsav = 1; + private static int liwsav = 380; + private static int llwsav = 20; + private static int lrwsav = 285; + + /** + * E04NKJ Example main program. + */ + public static void main(String[] args){ + double obj, sinf; + int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; + String start; + double[] a, bl, bu, clamda, xs, z, ruser, rwsav; + int[] ha, istate, iz, ka, iuser, iwsav; + boolean[] lwsav; + String[] crname, cwsav, names; + + System.out.println("E04NKJ Example Program Results"); + + ruser = new double[1]; + rwsav = new double[lrwsav]; + iuser = new int[1]; + iwsav = new int[liwsav]; + + cwsav = new String[lcwsav]; + //equivalent to ```Character (80) :: cwsav(lcwsav)``` + for(i = 0; i < lcwsav; i++){ + char[] chars = new char[80]; + Arrays.fill(chars, ' '); + cwsav[i] = new String(chars); + } + names = new String[5]; + //names all blank anyway this time + for(i = 0; i < 5; i++){ + char[] chars = new char[8]; + Arrays.fill(chars, ' '); + names[i] = new String(chars); + } + + //dummy arrays + crname = new String[0]; + + n = 7; + m = 8; + nnz = 48; + iobj = 8; + ncolh = 7; + start = "C"; + nname = 15; + + ha = new int[nnz]; + ka = new int[n + 1]; + istate = new int[n + m]; + a = new double[nnz]; + bl = new double[n + m]; + bu = new double[n + m]; + xs = new double[n + m]; + clamda = new double[n + m]; + crname = new String[nname]; + lwsav = new boolean[llwsav]; + + names[0] = " "; + names[1] = " "; + names[2] = " "; + names[3] = " "; + names[4] = " "; + + crname[0] = "...X1..."; + crname[1] = "...X2..."; + crname[2] = "...X3..."; + crname[3] = "...X4..."; + crname[4] = "...X5..."; + crname[5] = "...X6..."; + crname[6] = "...X7..."; + crname[7] = "..ROW1.."; + crname[8] = "..ROW2.."; + crname[9] = "..ROW3.."; + crname[10] = "..ROW4.."; + crname[11] = "..ROW5.."; + crname[12] = "..ROW6.."; + crname[13] = "..ROW7.."; + crname[14] = "..COST.."; + + //Matrix A. Set up KA + jcol = 1; + ka[0] = 1; + + a[0] = 0.02; ha[0] = 7; + a[1] = 0.02; ha[1] = 5; + a[2] = 0.03; ha[2] = 3; + a[3] = 1.00; ha[3] = 1; + a[4] = 0.70; ha[4] = 6; + a[5] = 0.02; ha[5] = 4; + a[6] = 0.15; ha[6] = 2; + a[7] = -200.00; ha[7] = 8; + a[8] = 0.06; ha[8] = 7; + a[9] = 0.75; ha[9] = 6; + a[10] = 0.03; ha[10] = 5; + a[11] = 0.04; ha[11] = 4; + a[12] = 0.05; ha[12] = 3; + a[13] = 0.04; ha[13] = 2; + a[14] = 1.00; ha[14] = 1; + a[15] = -2000.00; ha[15] = 8; + a[16] = 0.02; ha[16] = 2; + a[17] = 1.00; ha[17] = 1; + a[18] = 0.01; ha[18] = 4; + a[19] = 0.08; ha[19] = 3; + a[20] = 0.08; ha[20] = 7; + a[21] = 0.80; ha[21] = 6; + a[22] = -2000.00; ha[22] = 8; + a[23] = 1.00; ha[23] = 1; + a[24] = 0.12; ha[24] = 7; + a[25] = 0.02; ha[25] = 3; + a[26] = 0.02; ha[26] = 4; + a[27] = 0.75; ha[27] = 6; + a[28] = 0.04; ha[28] = 2; + a[29] = -2000.00; ha[29] = 8; + a[30] = 0.01; ha[30] = 5; + a[31] = 0.80; ha[31] = 6; + a[32] = 0.02; ha[32] = 7; + a[33] = 1.00; ha[33] = 1; + a[34] = 0.02; ha[34] = 2; + a[35] = 0.06; ha[35] = 3; + a[36] = 0.02; ha[36] = 4; + a[37] = -2000.00; ha[37] = 8; + a[38] = 1.00; ha[38] = 1; + a[39] = 0.01; ha[39] = 2; + a[40] = 0.01; ha[40] = 3; + a[41] = 0.97; ha[41] = 6; + a[42] = 0.01; ha[42] = 7; + a[43] = 400.00; ha[43] = 8; + a[44] = 0.97; ha[44] = 7; + a[45] = 0.03; ha[45] = 2; + a[46] = 1.00; ha[46] = 1; + a[47] = 400.00; ha[47] = 8; + + ka[1] = 9; + ka[2] = 17; + ka[3] = 24; + ka[4] = 31; + ka[5] = 39; + ka[6] = 45; + ka[7] = 49; + + bl[0] = 0.0; + bl[1] = 0.0; + bl[2] = 4.0e2; + bl[3] = 1.0e2; + bl[4] = 0.0; + bl[5] = 0.0; + bl[6] = 0.0; + bl[7] = 2.0e3; + bl[8] = -1.0e25; + bl[9] = -1.0e25; + bl[10] = -1.0e25; + bl[11] = -1.0e25; + bl[12] = 1.5e3; + bl[13] = 2.5e2; + bl[14] = -1.0e25; + + bu[0] = 2.0e2; + bu[1] = 2.5e3; + bu[2] = 8.0e2; + bu[3] = 7.0e2; + bu[4] = 1.5e3; + bu[5] = 1.0e25; + bu[6] = 1.0e25; + bu[7] = 2.0e3; + bu[8] = 6.0e1; + bu[9] = 1.0e2; + bu[10] = 4.0e1; + bu[11] = 3.0e1; + bu[12] = 1.0e25; + bu[13] = 3.0e2; + bu[14] = 1.0e25; + + istate[0] = 0; + istate[1] = 0; + istate[2] = 0; + istate[3] = 0; + istate[4] = 0; + istate[5] = 0; + istate[6] = 0; + istate[7] = 0; + + xs[0] = 0.0; + xs[1] = 0.0; + xs[2] = 0.0; + xs[3] = 0.0; + xs[4] = 0.0; + xs[5] = 0.0; + xs[6] = 0.0; + xs[7] = 0.0; + + ifail = 0; + E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, + lrwsav,ifail); + e04wb.eval(); + + leniz = 1; + lenz = 1; + iz = new int[leniz]; + z = new double[lenz]; + + QPHX qphx = new QPHX(); + + ifail = 1; + + //placeholders + ns = 0; + miniz = 0; + minz = 0; + ninf = 0; + sinf = 0.0; + obj = 0.0; + + E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, + crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, + leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); + e04nk.eval(); + ifail = e04nk.getIFAIL(); + + minz = e04nk.getMINZ(); + miniz = e04nk.getMINIZ(); + + lenz = minz; + leniz = miniz; + + iz = new int[leniz]; + z = new double[lenz]; + + ifail = -1; + + e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, + istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, + lwsav,iwsav,rwsav,ifail); + + //update + ifail = e04nk.getIFAIL(); + obj = e04nk.getOBJ(); + + if(ifail == 0){ + System.out.println(); + System.out.println("\tVariable Istate Value Lagr Mult"); + System.out.println(); + + for(i = 0; i < n; i++){ + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + if(m > 0){ + System.out.println(); + System.out.println(); + System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); + System.out.println(); + + for(i = n; i < n + m - 1; i++){ + System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); + } + + System.out.println(); + System.out.println(); + System.out.printf("Final objetive value = %15.7g\n", obj); + } + + } + + public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ + public void eval(){ + this.HX[0] = 2 * this.X[0]; + this.HX[1] = 2 * this.X[1]; + this.HX[2] = 2 * (this.X[2] + this.X[3]); + this.HX[3] = this.HX[2]; + this.HX[4] = 2 * this.X[4]; + this.HX[5] = 2 * (this.X[5] + this.X[6]); + this.HX[6] = this.HX[5]; + } + } +} diff --git a/simple_examples/source/int32/E04NQJE.java b/simple_examples/source/int32/E04NQJE.java new file mode 100644 index 0000000..6cf84fe --- /dev/null +++ b/simple_examples/source/int32/E04NQJE.java @@ -0,0 +1,384 @@ +import com.nag.routines.E04.E04NP; +import com.nag.routines.E04.E04NQ; +import com.nag.routines.E04.E04NT; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +/** + * E04NQ example program text. + */ +public class E04NQJE { + + public static final int LENCW = 600; + public static final int LENIW = 600; + public static final int LENRW = 600; + public static final int NIN = 5; + public static final int NOUT = 6; + + public static void main(String[] args) throws IOException { + + /* Local Scalars */ + double obj, objadd, sinf; + int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; + boolean verboseOutput; + String prob; // Length = 8 + String start; // Length = 1 + /* Local Arrays */ + double[] acol, bl, bu, c, pi, rc, x; + double[] ruser = new double[1], rw = new double[LENRW]; + int[] helast, hs, inda, loca; + int[] iuser = new int[1], iw = new int[LENIW]; + String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 + String[] names; // Length = 8 + /* Init String arrays with same length*/ + Arrays.fill(cuser, " "); + Arrays.fill(cw, " "); + + System.out.println(" E04NQJ Example Program Results"); + + /* Read data file */ + + if (args.length != 1) { + usage(); + } + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + String line; + + // Skip heading in data file + line = dataIn.readLine(); + + // Read n, m + line = dataIn.readLine(); + String[] data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 2) { + System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" + + line + "\n"+Arrays.toString(data)); + System.exit(1); + } + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + + // Read ne, iobj, ncolh, start, nname + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 5) { + System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); + System.exit(1); + } + ne = Integer.parseInt(data[0]); + iobj = Integer.parseInt(data[1]); + ncolh = Integer.parseInt(data[2]); + start = data[3].replaceAll("'",""); + nname = Integer.parseInt(data[4]); + + // Allocate + inda = new int[ne]; + loca = new int[n+1]; + helast = new int[n+m]; + hs = new int[n+m]; + acol = new double[ne]; + bl = new double[n+m]; + bu = new double[n+m]; + x = new double[n+m]; + pi = new double[m]; + rc = new double[n+m]; + names = new String[nname]; + + // Read names + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + int nameIndex = 0; + int dataIndex = 0; + while (nameIndex < nname) { + names[nameIndex] = data[dataIndex].replaceAll("'", ""); + ++nameIndex; + ++dataIndex; + if (nameIndex < nname && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read matrix + line = dataIn.readLine(); // skipping blank line + int locaIndex = 0; + int currentCol = 0; + for (i = 0; i < ne; ++i) { + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != 3) { + System.out.println("The line is not well formatted for input of A:\n\t"+line); + System.exit(1); + } + acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); + inda[i] = Integer.parseInt(data[1]); + if (i == 0) { + loca[locaIndex] = 1;//storing for Fortran use: 1-based + ++locaIndex; + ++currentCol; + } + else { + int tmp = Integer.parseInt(data[2]); + if (tmp != currentCol) { + loca[locaIndex] = i+1; + ++currentCol; + ++locaIndex; + } + } + } + loca[n] = ne + 1; + + // Read bl + line = dataIn.readLine(); // skipping blank line + int blindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (blindex < bl.length) { + bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++blindex; + ++dataIndex; + if (blindex < bl.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read bu + line = dataIn.readLine(); // skipping blank line + int buindex = 0; + dataIndex = 0; + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + while (buindex < bu.length) { + bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); + ++buindex; + ++dataIndex; + if (buindex < bu.length && dataIndex == data.length) { + //need to read one more line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + dataIndex = 0; + } + } + + // Read hs + line = dataIn.readLine(); // skipping blank line + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (start.equalsIgnoreCase("C")) { + if (data.length != n) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + else { + if (data.length != n+m) { + System.out.println("Wrong format for HS data.\n"); + System.exit(1); + } + } + for (i = 0; i < data.length; ++i) { + hs[i] = Integer.parseInt(data[i]); + } + + // Read x + line = dataIn.readLine(); + data = line.split(":")[0].trim().split("\\s+"); + if (data.length != n) { + System.out.println("Wrong format for X data."); + System.exit(1); + } + for (i = 0; i < data.length; ++i) { + x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); + } + + /* Done reading data file */ + + System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); + + /* Call E04NP to initialize E04NQ. */ + E04NP e04np = new E04NP(); + ifail = 0; + e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); + + /* Set this to .True. to cause e04nqf to produce intermediate + * progress output. */ + verboseOutput = true; + + if (verboseOutput) { + /* By default e04nqf does not print monitoring + * information. Set the print file unit or the summary + * file unit to get information. */ + E04NT e04nt = new E04NT(); + ifail = 0; + e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); + } + + /* We have no explicit objective vector so set LENC = 0; the + * objective vector is stored in row IOBJ of ACOL. */ + lenc = 0; + c = new double[Math.max(1,lenc)]; + objadd = 0.0; + sinf = 0.0; + obj = Double.NaN; + prob = " "; + + /* Do not allow any elastic variables (i.e. they cannot be + * infeasible). If we'd set optional argument "Elastic mode" to 0, + * we wouldn't need to set the individual elements of array HELAST. */ + + for (int j = 0; j < (n+m); j++) { + helast[j] = 0; + } + + /* Solve the QP problem. */ + + E04NQ e04nq = new E04NQ(); + ifail = 0; + ns = 0; + ninf = 0; + e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, + inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, + iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); + + System.out.println(); + System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); + System.out.print(" Optimal X = "); + for (i = 0; i < n; ++i) { + System.out.printf("%9.2f ", x[i]); + } + System.out.println(); + + } + + private static void usage() { + System.out.println("Usage:\n" + + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator + + ". E04NQJE " + File.separator + "e04nqfe.d"); + System.exit(1); + } + + public static class QPHX implements E04NQ.E04NQ_QPHX { + + private int NCOLHREF; + + public QPHX(int NCOLHREF) { + this.NCOLHREF = NCOLHREF; + } + + // @Override + public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, + String[] CUSER, int[] IUSER, double[] RUSER) { + + if (NCOLH != NCOLHREF) { + System.out.println("NCOLH value is wrong!"); + System.out.println("TEST FAILED"); + System.exit(1); + } + HX[0] = 2.0*X[0]; + HX[1] = 2.0*X[1]; + HX[2] = 2.0*(X[2]+X[3]); + HX[3] = HX[2]; + HX[4] = 2.0*X[4]; + HX[5] = 2.0*(X[5]+X[6]); + HX[6] = HX[5]; + + } + + private String[] CUSER; + private double[] HX,RUSER,X; + private int[] IUSER; + private int NCOLH, NSTATE; + + // @Override + public String[] getCUSER() { + return CUSER; + } + + // @Override + public double[] getHX() { + return HX; + } + + // @Override + public int[] getIUSER() { + return IUSER; + } + + // @Override + public int getNCOLH() { + return NCOLH; + } + + // @Override + public int getNSTATE() { + return NSTATE; + } + + // @Override + public double[] getRUSER() { + return RUSER; + } + + // @Override + public double[] getX() { + return X; + } + + // @Override + public void setCUSER(String[] arg0) { + CUSER = arg0; + + } + + // @Override + public void setHX(double[] arg0) { + HX = arg0; + + } + + // @Override + public void setIUSER(int[] arg0) { + IUSER = arg0; + + } + + // @Override + public void setNCOLH(int arg0) { + NCOLH = arg0; + + } + + // @Override + public void setNSTATE(int arg0) { + NSTATE = arg0; + + } + + // @Override + public void setRUSER(double[] arg0) { + RUSER = arg0; + + } + + // @Override + public void setX(double[] arg0) { + X = arg0; + + } + + } + + + + +} diff --git a/simple_examples/source/int32/E04PTJE.java b/simple_examples/source/int32/E04PTJE.java new file mode 100644 index 0000000..75303ac --- /dev/null +++ b/simple_examples/source/int32/E04PTJE.java @@ -0,0 +1,344 @@ +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RB; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.F08.DSYEVD; +import java.util.Arrays; + +/** + * E04PTJ example program text. + * @author joed + * @since 27.0.0.0 + */ +public class E04PTJE { + + + /** + * Monitoring function can be used to monitor the progress + * or, for example, to implement bespoke stopping criteria. + */ + private static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + + double tol = RUSER[0]; + int tolReached = IUSER[1]; + + // If x is close to the solution, print a message + if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { + if (tolReached == 0) { + System.out.println(); + System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); + IUSER[1] = 1; + } + } + + } + + } + + + /** + * E04PTJ example main program. + */ + public static void main(String[] args) { + + DSYEVD dsyevd = new DSYEVD(); + E04PT e04pt = new E04PT(); + E04RA e04ra = new E04RA(); + E04RB e04rb = new E04RB(); + E04RE e04re = new E04RE(); + E04RH e04rh = new E04RH(); + E04RJ e04rj = new E04RJ(); + E04RZ e04rz = new E04RZ(); + E04ZM e04zm = new E04ZM(); + MONIT monit = new MONIT(); + + final int nqc = 1; + long cpuser, handle; + double r1; + int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, + nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; + boolean verboseOutput; + String ctype1, ctype2; // Length must be 8 + double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, + work, x, xl, xu; + double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; + int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; + int[] iuser = new int[2]; + + System.out.println("E04PTJ Example Program Results\n"); + + // Dimensions of the problem + n = 3; + nnzp0 = 6; + nnzp1 = 6; + + // Initialize size of linear constraints in SOCP + m = nqc; + na = n + nqc + 1; + nnza = nqc + n; + + // Initialize size of cone constraints + nvarc1 = 2; + nvarc2 = 2; + + // Set problem data + lwork = Math.max(2*n*n+6*n+1, 120+9*n); + liwork = 5*n + 3; + irowp0 = new int[]{1, 2, 3, 2, 3, 3}; + icolp0 = new int[]{1, 1, 1, 2, 2, 3}; + p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; + irowp1 = new int[]{1, 2, 3, 2, 3, 3}; + icolp1 = new int[]{1, 1, 1, 2, 2, 3}; + p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; + q0 = new double[]{0.847, 0.08, 0.505}; + q1 = new double[]{0.065, 0.428, 0.097}; + r1 = 1.276; + f0 = new double[n*n]; + f1 = new double[n*n]; + lambda0 = new double[n]; + lambda1 = new double[n]; + work = new double[lwork]; + iwork = new int[liwork]; + + // Store full P0 and P1 in F0 and F1 + Arrays.fill(f0, 0.0); + for (i = 0; i < nnzp0; i++) { + f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; + } + Arrays.fill(f1, 0.0); + for (i = 0; i < nnzp1; i++) { + f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; + } + + // Factorize P0 and P1 via eigenvalue decomposition + ifail = 0; + dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); + dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); + + // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 + nu = 0; + nv = 0; + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + for (j = 1; j <= n; j++) { + f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); + } + m++; + nu++; + nnza += n; + } + if (lambda1[i-1] > 0) { + for (j = 1; j <= n; j++) { + f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); + } + m++; + nv++; + nnza += n; + } + } + nnza += nu + nv; + na += nu+ nv; + nvarc1 += nu; + nvarc2 += nv; + + // Add two fixed variable for two rotated quadratic cones + na += 2; + m += 2; + nnza += 2; + + // Compute size of multipliers + nnzu = 2*na + 2*m; + nnzuc = nvarc1 + nvarc2; + + // Initialize arrays to build SOCP + icola = new int[nnza]; + irowa = new int[nnza]; + a = new double[nnza]; + bla = new double[m]; + bua = new double[m]; + xl = new double[na]; + xu = new double[na]; + c = new double[na]; + x = new double[na]; + u = new double[nnzu]; + uc = new double[nnzuc]; + idxc1 = new int[nvarc1]; + idxc2 = new int[nvarc2]; + + // Build objective function parameter c + // [x, t1, u, v, y1, y2, t0] + Arrays.fill(c, 0.0); + for (j = 0; j < n; j++) { + c[j] = q0[j]; + } + c[na-1] = 1.0; + + // Build linear constraints parameter A + idxa = 0; + rptr = 0; + // q1 in First row + rptr++; + Arrays.fill(irowa, 0, n, rptr); + for (j = 0; j < n; j++) { + icola[j] = j+1; + a[j] = q1[j]; + } + idxa += n; + + // F0 in F0*x-u=0 row + for (i = 1; i <= n; i++) { + if (lambda0[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f0[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // F1 in F1*x-v=0 row + for (i = 1; i <= n; i++) { + if (lambda1[i-1] > 0) { + rptr += 1; + for (j = 0; j < n; j++) { + irowa[idxa+j] = rptr; + icola[idxa+j] = j+1; + a[idxa+j] = f1[getIdx(j+1,i,n)]; + } + idxa += n; + } + } + // Rest of A, a diagonal matrix + for (j = 0; j < m; j++) { + irowa[idxa+j] = j+1; + icola[idxa+j] = n+j+1; + a[idxa+j] = 1.0; + } + for (j = 1; j < (nu+nv+1); j++) { + a[idxa+j] = -1.0; + } + // RHS in linear constraints + Arrays.fill(bla, 0.0); + Arrays.fill(bua, 0.0); + bla[0] = -r1; + bua[0] = -r1; + for (j = (m-nqc); j <= m; j++) { + bla[j-1] = 1.0; + bua[j-1] = 1.0; + } + + // Box constraints, all variables are free + Arrays.fill(xl, -1E+20); + Arrays.fill(xu, 1E+20); + + // Cone constraints + // First cone + idxc1[0] = na; + idxc1[1] = n + 1 + nu + nv + 1; + for (j = 2; j < nvarc1; j++) { + idxc1[j] = n + j; + } + ctype1 = "RQUAD "; + // Second cone + idxc2[0] = n + 1; + idxc2[1] = n + 1 + nu + nv + 2; + for (j = 2; j < nvarc2; j++) { + idxc2[j] = n + nu + j; + } + ctype2 = "RQUAD "; + + // Create the problem handle + handle = 0; + ifail = 0; + e04ra.eval(handle, na, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + ifail = 0; + e04re.eval(handle, na, c, ifail); + + // Set box constraints + ifail = 0; + e04rh.eval(handle, na, xl, xu, ifail); + + // Set linear constraints + ifail = 0; + idlc = 0; + e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); + idlc = e04rj.getIDLC(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Set first cone constraint + ifail = 0; + idgroup = 0; + e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); + idgroup = e04rb.getIDGROUP(); + + // Turn on monitoring + ifail = 0; + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + /* Set this to true to cause e04pt to produce intermediate + * progress output */ + verboseOutput = false; + + if (verboseOutput) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } + else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = 0; // unused in this example + iuser[1] = 0; + ruser[0] = 1.0E-7; + ifail = -1; + e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, + ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if (ifail == 0 || ifail == 50) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (xIdx = 1; xIdx <= n; xIdx++) { + System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); + } + } + + // Free the handle memory + ifail = 0; + e04rz.eval(handle, ifail); + + } + + + /** + * Convert from 2D Fortran index to 1D-column major Java index. + * @param x 1-based row index for a 2D array + * @param y 1-based column index for a 2D array + * @return the corresponding 0-based index for a 1D column-major array + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/E04RPJE.java b/simple_examples/source/int32/E04RPJE.java new file mode 100644 index 0000000..d22d3d1 --- /dev/null +++ b/simple_examples/source/int32/E04RPJE.java @@ -0,0 +1,199 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RN; +import com.nag.routines.E04.E04RP; +import com.nag.routines.E04.E04RY; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04SV; + +/** + * E04RPJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ + +public class E04RPJE{ + + /** + * E04RPJ Example main program + */ + public static void main(String[] args){ + int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, + nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; + double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; + int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, + nnzq, qi, qj, idummy; + long cpuser, handle; + + rdummy = new double[1]; + rinfo = new double[32]; + stats = new double[32]; + idummy = new int[1]; + + System.out.println("E04RPJ Example Program Results"); + System.out.println(); + + //Problem size + nvar = 5; + nnzh = 0; + nclin = 0; + nnzb = 0; + nblk = 2; + + //Initialize handle to an empty problem + E04RA e04ra = new E04RA(); + handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + //Linear part of the objective function + cvec = new double[nvar]; + cvec[0] = 1; + cvec[1] = 0; + cvec[2] = 1; + cvec[3] = 0; + cvec[4] = 0; + + //Add the linear objetive function to the problem formulation + ifail = 0; + E04RE e04re = new E04RE(handle, nvar, cvec, ifail); + e04re.eval(); + + //Matrix inequalities + //block 1 + dimaq = 2; + nnzasum = 9; nnzqsum = 8; + idblk = 0; + + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 2; + nnza[2] = 3; + nnza[3] = 2; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 2.0; irowa[2] = 1; icola[2] = 1; + a[3] = -2.0; irowa[3] = 1; icola[3] = 2; + a[4] = 6.0; irowa[4] = 1; icola[4] = 1; + a[5] = 5.0; irowa[5] = 1; icola[5] = 2; + a[6] = -4.0; irowa[6] = 2; icola[6] = 2; + a[7] = 3.0; irowa[7] = 1; icola[7] = 2; + a[8] = 8.0; irowa[8] = 2; icola[8] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + //update + idblk = e04rn.getIDBLK(); + + nq = 6; + + qi = new int[nq]; + qj = new int[nq]; + nnzq = new int[nq]; + irowq = new int[nnzqsum]; + icolq = new int[nnzqsum]; + q = new double[nnzqsum]; + + qi[0] = 1; qj[0] = 4; + qi[1] = 2; qj[1] = 4; + qi[2] = 3; qj[2] = 4; + qi[3] = 1; qj[3] = 5; + qi[4] = 2; qj[4] = 5; + qi[5] = 3; qj[5] = 5; + + nnzq[0] = 1; + nnzq[1] = 2; + nnzq[2] = 1; + nnzq[3] = 1; + nnzq[4] = 2; + nnzq[5] = 1; + + q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; + q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; + q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; + q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; + q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; + q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; + q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; + q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; + + ifail = 0; + //Expand the existing linear matrix inequality with bilnear term + E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, + q,idblk,ifail); + e04rp.eval(); + + //block 2 + dimaq = 2; + nnzasum = 5; + nnza = new int[nvar + 1]; + irowa = new int[nnzasum]; + icola = new int[nnzasum]; + a = new double[nnzasum]; + + nnza[0] = 2; + nnza[1] = 1; + nnza[2] = 1; + nnza[3] = 1; + nnza[4] = 0; + nnza[5] = 0; + + a[0] = 1.0; irowa[0] = 1; icola[0] = 1; + a[1] = 1.0; irowa[1] = 2; icola[1] = 2; + a[2] = 1.0; irowa[2] = 1; icola[2] = 1; + a[3] = 1.0; irowa[3] = 1; icola[3] = 2; + a[4] = 1.0; irowa[4] = 2; icola[4] = 2; + + idblk = 0; + ifail = 0; + //Add the linear matrix inequality to the problem formulation + e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, + idummy,idblk,ifail); + e04rn.eval(); + + System.out.println("Passing SDP problem to solver"); + System.out.println(); + + ifail = 0; + //Print overview of handle + //nout = 6 is default output for fortran + E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); + e04ry.eval(); + + //Allocate memory for the solver + x = new double[nvar]; + nnzu = 0; + nnzuc = 0; + nnzua = 0; + inform = 0; + for(int i = 0; i < nvar; i++){ + x[i] = 0.0; + } + + ifail = 0; + E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, + rinfo,stats,inform,ifail); + e04sv.eval(); + + //Destroy handle + ifail = 0; + E04RZ e04rz = new E04RZ(handle,ifail); + e04rz.eval(); + } + +} + + + diff --git a/simple_examples/source/int32/E04RSJE.java b/simple_examples/source/int32/E04RSJE.java new file mode 100644 index 0000000..d614fbb --- /dev/null +++ b/simple_examples/source/int32/E04RSJE.java @@ -0,0 +1,229 @@ +import com.nag.routines.E04.E04RS; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RS + */ +public class E04RSJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + double s = 0.0; + int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; + int[] iuser = new int[2]; + + System.out.println(" E04RSJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + nnzq0 = Integer.parseInt(sVal[1]); + nnzq1 = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + irowq0 = new int[nnzq0]; + icolq0 = new int[nnzq0]; + q0 = new double[nnzq0]; + irowq1 = new int[nnzq1]; + icolq1 = new int[nnzq1]; + q1 = new double[nnzq1]; + idxr0 = new int[n]; + r0 = new double[n]; + idxr1 = new int[n]; + r1 = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + irowq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + icolq0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq0; i++) { + q0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + irowq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + icolq1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < nnzq1; i++) { + q1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr0[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + idxr1[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (int i = 0; i < n; i++) { + r1[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + s = Double.parseDouble(sVal[0]); + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute size of multipliers + // One quadratic constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set objective function + idqc = -1; + ifail = 0; + E04RS e04rs = new E04RS(); + e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); + + // Set quadratic constraint + idqc = 0; + ifail = 0; + e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } +} diff --git a/simple_examples/source/int32/E04RTJE.java b/simple_examples/source/int32/E04RTJE.java new file mode 100644 index 0000000..dd4bce8 --- /dev/null +++ b/simple_examples/source/int32/E04RTJE.java @@ -0,0 +1,225 @@ +import com.nag.routines.E04.E04RT; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04RH; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * E04RT example program text. + */ +public class E04RTJE { + + public static void main(String[] args) { + + final int nout = 6; + + long cpuser, handle = 0; + int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; + boolean verbose_output; + + double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; + double[] lc = new double[3]; + double[] lc_rhs = new double[1]; + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + int[] icola = null, idxr0 = null, irowa = null; + int[] icollc = new int[3]; + int[] irowlc = new int[3]; + int[] iuser = new int[2]; + + System.out.println(" E04RTJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + // Read dimensions of the problem + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + m = Integer.parseInt(sVal[1]); + nnza = Integer.parseInt(sVal[2]); + + // Allocate memory to read data + a = new double[nnza]; + icola = new int[nnza]; + irowa = new int[nnza]; + idxr0 = new int[n]; + r0 = new double[n]; + b = new double[m]; + xl = new double[n]; + xu = new double[n]; + + // Read problem data + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + irowa[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + icola[i] = Integer.parseInt(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < nnza; i++) { + a[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < m; i++) { + b[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xl[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + xu[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Compute -2*b'A as linear term in quadratic function + for (j = 0; j < n; j++) { + r0[j] = 0.0; + idxr0[j] = j + 1; + } + for (i = 0; i < nnza; i++) { + r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; + } + + // Compute size of multipliers + // One linear constraint in the model will have + // 2 multipliers for both bounds + nnzu = 2 * n + 2; + // No cone constraint in the model, so set nnzuc to 0 + nnzuc = 0; + + // Allocate memory for final results + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Create the problem handle + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, n, ifail); + handle = e04ra.getHANDLE(); + + // Set quadratic objective function + idqc = -1; + ifail = 0; + E04RT e04rt = new E04RT(); + e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); + + // Set box constraints + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, n, xl, xu, ifail); + + // Set linear constraint: x1 + x2 + x3 = 1 + for (j = 0; j < n; j++) { + irowlc[j] = 1; + icollc[j] = j + 1; + lc[j] = 1.0; + } + lc_rhs[0] = 1.0; + ifail = 0; + idlc = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); + + // Turn on monitoring + ifail = 0; + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); + + // Set this to True to cause e04ptf to produce intermediate progress output + verbose_output = false; + + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + iuser[0] = nout; + iuser[1] = 0; + ruser[0] = 1.0e-07; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + double tol; + int nout, tol_reached; + + nout = this.IUSER[0]; + tol_reached = this.IUSER[1]; + tol = this.RUSER[0]; + + // If x is close to the solution, print a message + if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { + if (tol_reached == 0) { + System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); + this.IUSER[1] = 1; + } + } + } + } + } diff --git a/simple_examples/source/int32/E04SAJE.java b/simple_examples/source/int32/E04SAJE.java new file mode 100644 index 0000000..325267b --- /dev/null +++ b/simple_examples/source/int32/E04SAJE.java @@ -0,0 +1,104 @@ +import com.nag.routines.E04.E04RC; +import com.nag.routines.E04.E04SA; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04PT; +import com.nag.routines.E04.E04PTU; + +/** + * E04SA example program text. + */ +public class E04SAJE { + + public static final String fname = "e04saje.opt"; + public static void main(String[] args) { + + long cpuser, handle = 0; + int ifail, n, nnzu, nnzuc, x_idx; + boolean verbose_output; + String ftype; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u, uc, x; + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04SAJ Example Program Results"); + + // Read mps file to a handle + ifail = 0; + ftype = "mps"; + E04SA e04sa = new E04SA(); + e04sa.eval(handle, fname, ftype, pinfo, ifail); + handle = e04sa.getHANDLE(); + + // Get problem size from pinfo + pinfo = e04sa.getPINFO(); + n = pinfo[0]; + nnzu = pinfo[10]; + nnzuc = pinfo[11]; + + // Set all variables as continuous + ifail = 0; + E04RC e04rc = new E04RC(); + + int[] x_idx_Arr = new int[n]; + for (x_idx = 1; x_idx <= n; x_idx++) { + x_idx_Arr[x_idx - 1] = x_idx; + } + + e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); + + // Allocate memory + x = new double[n]; + u = new double[nnzu]; + uc = new double[nnzuc]; + + // Set this to .True. to cause e04ptf to produce intermediate progress output + verbose_output = false; + + E04ZM e04zm = new E04ZM(); + if (verbose_output) { + // Require printing of primal and dual solutions at the end of the solve + ifail = 0; + e04zm.eval(handle, "Print Solution = YES", ifail); + } else { + // Turn off printing of intermediate progress output + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + } + + // Call SOCP interior point solver + cpuser = 0; + ifail = -1; + E04PT e04pt = new E04PT(); + MONIT monit = new MONIT(); + e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + ifail = e04pt.getIFAIL(); + + // Print solution if optimal or suboptimal solution found + if ((ifail == 0) || (ifail == 50)) { + System.out.println(" Optimal X:"); + System.out.println(" x_idx " + " Value "); + for (x_idx = 0; x_idx < n; x_idx++) { + System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); + } + } + + // Free the handle memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04PT.Abstract_E04PT_MONIT { + + public void eval() { + E04PTU e04ptu = new E04PTU(); + e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); + this.INFORM = e04ptu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TAJE.java b/simple_examples/source/int32/E04TAJE.java new file mode 100644 index 0000000..97cebe2 --- /dev/null +++ b/simple_examples/source/int32/E04TAJE.java @@ -0,0 +1,188 @@ +import com.nag.routines.E04.E04TA; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RE; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RJ; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04MT; +import com.nag.routines.E04.E04MTU; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04TE; +import com.nag.routines.E04.E04TJ; +import com.nag.routines.E04.E04RW; +import com.nag.routines.E04.E04RZ; + +import java.util.Arrays; + +/** + * E04TA + */ +public class E04TAJE { + + public static void main(String[] args) { + + final double infbnd = 1.0e20; + + long cpuser, handle; + int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; + + double[] a, bla, bua, cvec, ulag, x, xl, xu; + + double[] rinfo = new double[100]; + double[] ruser = new double[1]; + double[] stats = new double[100]; + double[] u = new double[1]; + + int[] icola, irowa; + + int[] iuser = new int[1]; + int[] pinfo = new int[100]; + + System.out.println(" E04TAJ Example Program Results\n"); + System.out.println(" Solve the first LP\n"); + + handle = 0; + cpuser = 0; + + // Initialize the handle + nvar = 2; + ifail = 0; + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the objective function + cvec = new double[nvar]; + cvec[0] = 2.0; + cvec[1] = 4.5; + ifail = 0; + E04RE e04re = new E04RE(); + e04re.eval(handle, nvar, cvec, ifail); + + // Box constraints + xl = new double[nvar]; + xu = new double[nvar]; + Arrays.fill(xl, 0.0); + xu[0] = infbnd; + xu[1] = 100.0; + ifail = 0; + E04RH e04rh = new E04RH(); + e04rh.eval(handle, nvar, xl, xu, ifail); + + // Set the linear constraints + idlc = 0; + nclin = 3; + nnza = 6; + bla = new double[nclin]; + bua = new double[nclin]; + irowa = new int[nnza]; + icola = new int[nnza]; + a = new double[nnza]; + Arrays.fill(bla, -infbnd); + bua = new double[] { + 1500.0, 6000.0, 16000.0 + }; + irowa = new int[] { + 1, 1, 2, 2, 3, 3 + }; + icola = new int[] { + 1, 2, 1, 2, 1, 2 + }; + a = new double[] { + 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 + }; + ifail = 0; + E04RJ e04rj = new E04RJ(); + e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); + + // Optional parameters + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Task = Max", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + + // Call the LP solver + x = new double[nvar + 1]; + nnzu = 0; + ifail = -1; + E04MT e04mt = new E04MT(); + MONIT monit = new MONIT(); + e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a variable + ifail = 0; + E04TA e04ta = new E04TA(); + e04ta.eval(handle, 1, nvar, ifail); + nvar = e04ta.getNVAR(); + + // Box constraint on the new variable + ifail = 0; + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); + + // Add the linear objective component + ifail = 0; + E04TE e04te = new E04TE(); + e04te.eval(handle, 3, 7.0, ifail); + + // Add linear constraints coefficients + E04TJ e04tj = new E04TJ(); + ifail = 0; + e04tj.eval(handle, 1, 3, 5.0, ifail); + ifail = 0; + e04tj.eval(handle, 2, 3, 12.0, ifail); + ifail = 0; + e04tj.eval(handle, 3, 3, 120.0, ifail); + + System.out.println("\n The new variable has been added, solve the handle again\n"); + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Add a linear constraint + nclin = 1; + bla[0] = -infbnd; + bua[0] = 100.0; + nnza = 2; + irowa[0] = 1; + irowa[1] = 1; + icola[0] = 2; + icola[1] = 3; + a[0] = 1.0; + a[1] = 1.0; + idlc = 0; + e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); + + System.out.println("\n The new constraint has been added, solve the handle again\n"); + + // Query the problem sizes to request the Lagrangian multipliers for the + // last solve + ioflag = 1; + liarr = 100; + E04RW e04rw = new E04RW(); + e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); + nnzu = pinfo[10]; + ulag = new double[nnzu]; + + // Solve the problem again + ifail = -1; + e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); + + // Free the memory + ifail = 0; + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + public static class MONIT extends E04MT.Abstract_E04MT_MONIT { + + public void eval() { + E04MTU e04mtu = new E04MTU(); + e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, + this.CPUSER, this.INFORM); + this.INFORM = e04mtu.getINFORM(); + } + } +} diff --git a/simple_examples/source/int32/E04TCJE.java b/simple_examples/source/int32/E04TCJE.java new file mode 100644 index 0000000..d28d78b --- /dev/null +++ b/simple_examples/source/int32/E04TCJE.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04FFU; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04TB; +import com.nag.routines.E04.E04TC; +import com.nag.routines.E04.E04TD; +import com.nag.routines.E04.E04ZM; +import java.io.BufferedReader; +import java.io.FileReader; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * E04TC example program text. + * @author Mo + */ +public class E04TCJE { + + public static void main(String[] args) { + double[] rx, x, udt, udy; + double[] rinfo = new double[100], ruser = new double[0], + stats = new double[100]; + int ifail, isparse, nnzrd, nres, nvar, udnres; + int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; + int[] idx; + long cpuser, handle; // c_ptr + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + + /* Header */ + System.out.printf(" E04TCJ Example Program Results\n\n"); + try { + + handle = 0L; + cpuser = 0L; + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); // read the header + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + String[] data = line.split("\\s+"); + + /* Read number of residuals */ + nres = Integer.parseInt(data[0]); + + udnres = nres; + + /* Allocate memory */ + udt = new double[nres]; + udy = new double[nres]; + + /* Read observations */ + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udt[ii+jj] = Double.parseDouble(data[jj]); + } + } + + for (int ii = 0; ii < nres; ii += 3) { + line = br.readLine().trim(); + line.replaceAll("\\s+", " "); + data = line.split("\\s+"); + for (int jj = 0; jj < 3; ++jj) { + udy[ii+jj] = Double.parseDouble(data[jj]); + } + } + + /* try to fit the model */ + /* f(t) = at^2 + bt + c + d sin(omega t) */ + /* To the data {(t_i, y_i)} */ + nvar = 5; + + /* Initialize the NAG optimization handle */ + E04RA e04ra = new E04RA(); + ifail = 0; // hard fail + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + /* Define a dense nonlinear least-squares objective function */ + /* (isparse = 0 => the sparsity pattern of the Jacobian */ + /* doesn't need to be defined) */ + E04RM e04rm = new E04RM(); + isparse = 0; + nnzrd = 1; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + /* Set some optional parameters to control the output of the solver */ + E04ZM e04zm = new E04ZM(); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + + System.out.println("First solve the problem with the outliers"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Call the solver */ + E04GG e04gg = new E04GG(); + x = new double[nvar]; + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + rx = new double[nres]; + iuser = new int[] {udnres}; + ruser = new double[2 * udnres];; + for (int ii = 0; ii < udnres; ii++) { + ruser[ii] = udt[ii]; + ruser[udnres + ii] = udy[ii]; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Now remove the outlier residuals from the problem handle"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Disable the two outlier residuals */ + E04TC e04tc = new E04TC(); + idx = new int[] {10, 20}; + e04tc.eval(handle, "NLS", 2, idx, ifail); + + /* Solve the problem again */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + System.out.println("--------------------------------------------------------"); + System.out.println(); + System.out.println("Assuming the outliers points are measured again"); + System.out.println("we can enable the residuals and adjust the values"); + System.out.println(); + System.out.println("--------------------------------------------------------"); + + /* Fix the first variable to its known value of 0.3 */ + /* enable the residuals and adjust the values in the data */ + E04TD e04td = new E04TD(); + e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); + E04TB e04tb = new E04TB(); + e04tb.eval(handle, "NLS", 2, idx, ifail); + udy[9] = -0.515629; + udy[19] = 0.54920; + + /* Solve the problem */ + for (int ii = 0; ii < nvar; ++ii) { + x[ii] = 1.0; + } + ifail = -1; + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, + rx, rinfo, stats, iuser, ruser, cpuser, ifail); + + } + catch (Exception ex) { + Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = 0.0; + } + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + + this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - + udy[i]; + } + + this.INFORM = 0; + + } + + } + + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + + public void eval() { + int udnres; + double[] udt, udy; + + /* Unpack the user data from cpuser */ + udnres = this.IUSER[0]; + udt = Arrays.copyOfRange(this.RUSER, 0, udnres); + udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); + + for (int i = 1; i <= this.NRES; i++) { + this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); + this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; + this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; + this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); + this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * + Math.cos(this.X[4] * udt[i-1]); + + } + + this.INFORM = 0; + + } + + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, + this.INFORM, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, + this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + + } + +} diff --git a/simple_examples/source/int32/E04UCJE.java b/simple_examples/source/int32/E04UCJE.java new file mode 100644 index 0000000..e43d457 --- /dev/null +++ b/simple_examples/source/int32/E04UCJE.java @@ -0,0 +1,211 @@ +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04UE; +import com.nag.routines.F06.DGEMV; +import java.util.Arrays; + +/** + * E04UC example program text. + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) { + + /* Local Scalars */ + double objf; + int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[LRWSAV]; + int[] istate, iwork; + int[] iuser = new int[1], iwsav = new int[LIWSAV]; + boolean[] lwsav = new boolean[LLWSAV]; + String[] cwsav = new String[LCWSAV]; + Arrays.fill(cwsav, + " "); + + System.out.println(" E04UCJ Example Program Results"); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new int[n + nclin + ncnln]; + iwork = new int[liwork]; + c = new double[Math.max(1, ncnln)]; + cjac = new double[ldcj * sdcjac]; + clamda = new double[n + nclin + ncnln]; + objgrd = new double[n]; + r = new double[ldr * n]; + work = new double[lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + E04UE e04ue = new E04UE(); + inform = 0; + e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives. */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[LDCJ] = X[1] + X[1]; + CJAC[2*LDCJ] = X[2] + X[2]; + CJAC[3*LDCJ] = X[3] + X[3]; + } + + } + + if (NEEDC[1] > 0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[1+LDCJ] = X[0]*X[2]*X[3]; + CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; + CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/E04YAJE.java b/simple_examples/source/int32/E04YAJE.java new file mode 100644 index 0000000..72d80da --- /dev/null +++ b/simple_examples/source/int32/E04YAJE.java @@ -0,0 +1,112 @@ +import com.nag.routines.E04.E04YA; + + +/** + * E04YA example program text. + * @author joed + */ +public class E04YAJE { + + public static LSQFUN lsqfun = new LSQFUN(); + public static final int LIW = 1, MDEC = 15, NDEC = 3; + public static final int LDFJAC = MDEC; + public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; + public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; + + /** Routine to evaluate the residuals and their 1st derivatives. */ + public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { + + public void eval() { + double denom, dummy; + int i; + + for (i = 0; i < M; i++) { + denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); + + if (IFLAG != 1) { + FVEC[i] = XC[0] + (t[i]/denom) - y[i]; + } + + if (IFLAG != 0) { + FJAC[i] = 1.0; + dummy = -1.0/(denom*denom); + FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; + FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; + } + + } + } + + } + + public static void main(String[] args) { + int i, ifail, m, n; + double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], + w = new double[LW], x = new double[NDEC]; + int[] iw = new int[LIW]; + + System.out.println(" E04YAJ Example Program Results"); + + n = NDEC; + m = MDEC; + + /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) + * (I = 1, 2, ..., m) */ + + y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, + 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; + for (i = 0; i < m; i++) { + t[i] = i + 1.0; + t[m + i] = 15.0 - i; + t[2*m + i] = -Math.abs(i - 7.0) + 8.0; + } + + /* Set up an arbitrary point at which to check the 1st derivatives */ + + x[0] = 0.19; + x[1] = -1.34; + x[2] = 0.88; + + System.out.println(); + System.out.println("The test point is"); + System.out.printf(" "); + for (i = 0; i < n; i++) { + System.out.printf("%10.5f", x[i]); + } + System.out.printf("\n"); + + E04YA e04ya = new E04YA(); + ifail = -1; + e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); + ifail = e04ya.getIFAIL(); + + if (ifail >= 0 && ifail != 1) { + + switch (ifail) { + case 0: + System.out.println(); + System.out.println("1st derivatives are consistent with residual values"); + break; + case 2: + System.out.println(); + System.out.println("Probable error in calculation of 1st derivatives"); + break; + default: + } + + System.out.println(); + System.out.println("At the test point, LSQFUN gives"); + System.out.println(); + System.out.println(" Residuals 1st derivatives"); + for (i = 0; i < m; i++) { + System.out.printf(" %15.3E", fvec[i]); + System.out.printf("%15.3E", fjac[i]); + System.out.printf("%15.3E", fjac[LDFJAC + i]); + System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); + } + + } + + } + +} diff --git a/simple_examples/source/int32/F01ADJE.java b/simple_examples/source/int32/F01ADJE.java new file mode 100644 index 0000000..4167f71 --- /dev/null +++ b/simple_examples/source/int32/F01ADJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.F01.F01AD; +import com.nag.routines.X04.X04CA; + + +/** + * F01AD example program text. + * @author joed + */ +public class F01ADJE { + + public static void main(String[] args) { + + int i, ifail, lda, n; + double[] a; + + System.out.println(" F01ADJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n + 1; + a = new double[] { + 5.0, 7.0, 6.0, 5.0, 0.0, + 7.0, 10.0, 8.0, 7.0, 0.0, + 6.0, 8.0, 10.0, 9.0, 0.0, + 5.0, 7.0, 9.0, 10.0, 0.0 + }; + + F01AD f01ad = new F01AD(); + ifail = -1; + f01ad.eval(n, a, lda, ifail); + ifail = f01ad.getIFAIL(); + + /* Print the result matrix A */ + X04CA x04ca = new X04CA(); + x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CKJE.java b/simple_examples/source/int32/F01CKJE.java new file mode 100644 index 0000000..ed3ffa2 --- /dev/null +++ b/simple_examples/source/int32/F01CKJE.java @@ -0,0 +1,60 @@ +import com.nag.routines.F01.F01CK; +import com.nag.routines.X04.X04CB; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CK example program text. + * @author ludovic + */ +public class F01CKJE { + + public static void main(String[] args) { + + double[] a, b, c, z; + int n, p, m, iz, opt; + int ifail; + + m = 3; + n = p = 2; + iz = 1; + opt = 1; + a = new double[n * p]; + b = new double[n * m]; + c = new double[m * p]; + z = new double[iz]; + ifail = 0; + + System.out.println(" F01CKJ Example Program Results"); + + // Initialising b and c + + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + b[j+i*n] = (double) (i+j); + } + for (int j = 0; j < p; ++j) { + c[i+j*m] = (double) (i+j); + } + } + + F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); + f01ck.eval(); + ifail = f01ck.getIFAIL(); + String title = "Matrix A"; + System.out.println(); + System.out.flush(); + ifail = 0; + + String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; + String[] dummy = {" "}; + int ncols = 80; + int indent = 0; + + (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, + dummy,ncols,indent, ifail); + + } + +} diff --git a/simple_examples/source/int32/F01CRJE.java b/simple_examples/source/int32/F01CRJE.java new file mode 100644 index 0000000..c10b284 --- /dev/null +++ b/simple_examples/source/int32/F01CRJE.java @@ -0,0 +1,47 @@ +import com.nag.routines.F01.F01CR; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F01CR example program text. + * @author ludovic + */ +public class F01CRJE { + + public static void main(String[] args) { + System.out.println(" F01CRJ Example Program Results"); + double[] a; + int m,n,mn,lmove; + int[] move; + int ifail; + n = 7; + m = 3; + mn = m*n; + lmove = (m + n)/2; + a = new double[mn]; + move = new int[lmove]; + ifail = 1; + + for (int i = 0; i < mn; i++) { + a[i] = i+1.0; + } + + F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); + f01cr.eval(); + + System.out.println(); + int index = 0; + for (int i = 0; i < mn; ++i) { + System.out.printf(" %7.1f",a[i]); + ++index; + if (index == 7) { + System.out.println(); + index = 0; + } + } + System.out.println(); + + } + +} diff --git a/simple_examples/source/int32/F01DGJE.java b/simple_examples/source/int32/F01DGJE.java new file mode 100644 index 0000000..107137f --- /dev/null +++ b/simple_examples/source/int32/F01DGJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F01.F01DG; +import com.nag.routines.X04.X04CA; + +/** + * F01DG example program text. + * @author joed + * @since 27.0.0.0 + */ +public class F01DGJE { + + /** + * F01DG example main program. + */ + public static void main(String[] args) { + + F01DG f01dg = new F01DG(); + X04CA x04ca = new X04CA(); + double alpha; + int i, ifail, lda, ldb, n; + String side, transa, uplo; // Length 1 + double[] a, b; + + System.out.println("F01DGJ Example Program Results\n"); + + // Values for side, uplo and transa + side = "L"; + uplo = "U"; + transa = "T"; + + // Order of square matrices + n = 4; + lda = n; + ldb = n; + + // Scaling constant alpha + alpha = 0.4; + + // Set input matrices (column-major order) + a = new double[]{ + 1.5, 0.0, 0.0, 0.0, + 2.3, 3.4, 0.0, 0.0, + 6.7, 5.4, 8.1, 0.0, + 1.9, 8.6, 2.0, 5.9 + }; + b = new double[]{ + 3.5, 0.0, 0.0, 0.0, + 2.1, 5.6, 0.0, 0.0, + 4.0, 2.1, 1.7, 0.0, + 2.1, 2.5, 1.1, 7.4 + }; + + /* ifail: behaviour on error exit + * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ + ifail = 0; + + // Find B=alpha*A*B + f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); + ifail = f01dg.getIFAIL(); + + // Print the solution + if (ifail == 0) { + if (transa.equals("N")) { + x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); + } + else { + x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); + } + } + + } + +} diff --git a/simple_examples/source/int32/F01ELJE.java b/simple_examples/source/int32/F01ELJE.java new file mode 100644 index 0000000..9986c6c --- /dev/null +++ b/simple_examples/source/int32/F01ELJE.java @@ -0,0 +1,89 @@ +import com.nag.routines.F01.F01EL; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04CA; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F01EL example program text. + * @author joed + */ +public class F01ELJE { + + public static void main(String[] args) { + + F01EL f01el = new F01EL(); + X04CA x04ca = new X04CA(); + + FCos2 fcos2 = new FCos2(); + double imnorm; + int i, ifail, iflag, lda, n; + double[] a, ruser = new double[1]; + int[] iuser = new int[1]; + + Routine.setComplex(new NAGComplex()); + + System.out.println(" F01ELJ Example Program Results"); + System.out.println(); + + // Problem data + n = 4; + a = new double[] { + 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 + }; + + // Find f(A) + lda = n; + iflag = 0; + imnorm = 0; + ifail = 0; + f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); + + // Print solution + ifail = 0; + x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); + + // Print the norm of the imaginary part to check it is small + System.out.println(); + System.out.println(" Imnorm = " + imnorm); + + } + + public static class FCos2 extends F01EL.Abstract_F01EL_F { + + /* These methods should really be part of an extension of NAGComplex. */ + + private NAGComplex complexCos(NAGComplexInterface z) { + NAGComplex cosz = new NAGComplex(); + cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); + cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); + return cosz; + } + + private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { + NAGComplex ab = new NAGComplex(); + ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); + ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); + return ab; + } + + /* Calculate F(A) = COS(2A) */ + + public void eval() { + + NAGComplex two = new NAGComplex(); + two.setRe(2.0); + two.setIm(0.0); + + for (int i = 0; i < this.NZ; i++) { + this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); + } + + this.IFLAG = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F01EMJE.java b/simple_examples/source/int32/F01EMJE.java new file mode 100644 index 0000000..716a7b5 --- /dev/null +++ b/simple_examples/source/int32/F01EMJE.java @@ -0,0 +1,106 @@ +import com.nag.routines.F01.F01EM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F01EMJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F01EMJE{ + + /** + * F01EMJ Example main program + */ + public static void main(String[] args){ + double imnorm = 0; + int ifail, iflag = 0, lda, n; //placeholders + double[] a, ruser; + int[] iuser; + + ruser = new double[1]; + iuser = new int[1]; + + System.out.println("F01EMJ Example Program Results"); + System.out.println(); + + //Tell wrapper what type of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //Problem size + n = 4; + lda = n; + + //Allocate + a = new double[lda * n]; + + //Data + //A = ( 1, 0,-2, 1) + // (-1, 2, 0, 1) + // ( 2, 0, 1, 0) + // ( 1, 0,-2, 2) + a[0] = 1; + a[1] = -1; + a[2] = 2; + a[3] = 1; + a[4] = 0; + a[5] = 2; + a[6] = 0; + a[7] = 0; + a[8] = -2; + a[9] = 0; + a[10] = 1; + a[11] = -1; + a[12] = 1; + a[13] = 1; + a[14] = 0; + a[15] = 2; + + //Find f(A) + ifail = 0; + //Create fexp2 object to pass to wrapper + fexp2 f = new fexp2(); + F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); + f01em.eval(); + + //Print solution + ifail = 0; + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); + x04ca.eval(); + + //Print the norm oof the imaginary part to check if it small + System.out.println(); + System.out.printf("Imnorm = %.2f\n", imnorm); + } + + /** + * fexp2 class representing f routine argument + */ + public static class fexp2 extends F01EM.Abstract_F01EM_F{ + public void eval(){ + NAGComplex two = new NAGComplex(2, 0); + NAGComplex twoPowM = new NAGComplex(2, 0); + + twoPowM.setRe(Math.pow(2, this.M)); + + for(int i = 0; i < this.NZ; i++){ + this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); + } + + //Set iflag nonzero to terminate exectuion for any reason + this.IFLAG = 0; + } + + //Raises e ^ z where z is a complex number + //Uses eulers formula; + //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) + public NAGComplex complexExp(NAGComplex x){ + NAGComplex tmp = new NAGComplex(); + tmp.setRe(Math.cos(x.getIm())); + tmp.setIm(Math.sin(x.getIm())); + NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); + return ans; + } + } +} diff --git a/simple_examples/source/int32/F02EKJE.java b/simple_examples/source/int32/F02EKJE.java new file mode 100644 index 0000000..3737022 --- /dev/null +++ b/simple_examples/source/int32/F02EKJE.java @@ -0,0 +1,227 @@ +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexInterface; +import java.util.Arrays; + +/** + * F02EK example program text. + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW() { + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/int32/F02FKJE.java b/simple_examples/source/int32/F02FKJE.java new file mode 100644 index 0000000..0dd7ab9 --- /dev/null +++ b/simple_examples/source/int32/F02FKJE.java @@ -0,0 +1,230 @@ +import com.nag.routines.F02.F02FK; +import com.nag.routines.F12.F12FD; +import com.nag.routines.X04.X04AB; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F02FK example program text. + * @author joed + */ +public class F02FKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) { + F02FK f02fk = new F02FK(); + X04AB x04ab = new X04AB(); + X04CA x04ca = new X04CA(); + double h2, sigma; + int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, + nnz, nx, outchn, prtlvl; + double[] a, dPrint, resid, v, w, ruser = new double[1]; + int[] icol, irow, iuser = new int[4]; + + + System.out.println(" F02FKJ Example Program Results"); + System.out.println(); + + nx = 20; + nev = 8; + ncv = 20; + sigma = 1.0; + + // Construct the matrix A in sparse form and store in A. + // The main diagonal of A is full and there are two subdiagonals of A: + // the first and the nx-th. + + n = nx * nx; + nnz = (3 * n) - (2 * nx); + a = new double[nnz]; + irow = new int[nnz]; + icol = new int[nnz]; + + // Zero out A. + Arrays.fill(a, 0.0); + + // Main diagonal of A. + h2 = 1.0 / (double)((nx + 1) * (nx + 1)); + for (int i = 1; i <= n; i++) { + irow[i - 1] = i; + icol[i - 1] = i; + a[i - 1] = 4.0 / h2; + } + + // First subdiagonal of A. + k = n; + for (int i = 1; i <= nx; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx - 1; j++) { + k += 1; + irow[k - 1] = j + 1; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // nx-th subdiagonal. + for (int i = 1; i <= nx - 1; i++) { + lo = (i - 1) * nx; + for (int j = lo + 1; j <= lo + nx; j++) { + k += 1; + irow[k - 1] = j + nx; + icol[k - 1] = j; + a[k - 1] = -1.0 / h2; + } + } + + // Set some options via iuser array and routine argument OPTION. + // iuser[0] = print level, + // iuser[1] = iteration limit, + // iuser[2]>0 means shifted-invert mode + // iuser[3]>0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 0; + + ruser[0] = 1.0; + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + // Find eigenvalues of largest magnitude and the corresponding + // eigenvectors. + + ldv = n; + w = new double[ncv]; + v = new double[ldv * ncv]; + resid = new double[n]; + + nconv = 0; // placeholder + + ifail = -1; + f02fk.eval( + n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, + w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02fk.getIFAIL(); + nconv = f02fk.getNCONV(); + if (ifail != 0) { + System.err.println(" ** F02FK returned with IFAIL = " + ifail); + } + + + + // Print Eigenvalues and the residual norm ||A*x - lambda*x||. + dPrint = new double[nconv * 2]; + for (int i = 1; i <= nconv; i++) { + dPrint[getIdx(i, 1, nconv)] = w[i - 1]; + dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; + } + + System.out.println(); + + ifail = 0; + x04ca.eval( + "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", + ifail + ); + + } + + public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { + + public void eval() { + F12FD f12fd = new F12FD(); + int ifail1; + String rec = " "; // Required len = 25 + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf(" Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12fd.eval( + "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12fd.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far(%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] + ); + } + + System.out.printf(" Next (uncoverged) Ritz value:\n"); + System.out.printf( + " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] + ); + + } + + this.ISTAT = 0; + + } + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + *

    Fortran array definition: + * a(dimX, *) + * + *

    Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return ((y-1) * dimX) + (x-1); + } + +} diff --git a/simple_examples/source/int32/F02WGJE.java b/simple_examples/source/int32/F02WGJE.java new file mode 100644 index 0000000..36c26c6 --- /dev/null +++ b/simple_examples/source/int32/F02WGJE.java @@ -0,0 +1,132 @@ +import com.nag.routines.F02.F02WG; +import java.util.Arrays; + +/** + * F02WG example program text. + * @author joed + */ +public class F02WGJE { + + public static AV av = new AV(); + + public static void main(String[] args) { + int ifail, k, ldu, ldv, m, n, nconv, ncv; + double[] resid, sigma, u, v; + double[] ruser = new double[1]; + int[] iuser = new int[1]; + + /* Set up wrappers */ + F02WG f02wg = new F02WG(); + + System.out.println(" F02WGJ Example Program Results\n"); + + /* Set F02WG args */ + m = 100; + n = 500; + k = 4; + ncv = 10; + nconv = 0; + ldu = m; + ldv = n; + resid = new double[ncv]; + sigma = new double[ncv]; + u = new double[ldu * ncv]; + v = new double[ldv * ncv]; + ifail = 0; + + /* Call routine */ + f02wg.eval( + m, // Rows in A + n, // Cols in A + k, // Num. of singular values to be computed + ncv, // Dimension of sigma and resid + av, // Subroutine that returns Ax or (A^T)x + nconv, // [Output] + sigma, // [Output] + u, // [Output] + ldu, // 1st dimension of u + v, // [Output] + ldv, // 1st dimension of v + resid, // [Output] + iuser, + ruser, + ifail + ); + + /* Get non-array output args */ + ifail = f02wg.getIFAIL(); + nconv = f02wg.getNCONV(); + + /* Print results */ + System.out.println(" Singular Value Residual"); + for (int i = 0; i < nconv; i++) { + System.out.printf( + " %10.5f %10.2G\n", sigma[i], resid[i] + ); + } + + } + + public static class AV extends F02WG.Abstract_F02WG_AV { + + public void eval() { + + double H = 1.0 / ((double)(this.M + 1)); + double K = 1.0 / ((double)(this.N + 1)); + + if (this.IFLAG == 1) { + + for (int i = 0; i < this.M; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[i] += K * S * (T - 1.0) * this.X[j]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[i] += K * T * (S - 1.0) * this.X[j]; + } + + } + + } + else { + + for (int i = 0; i < this.N; i++) { + this.AX[i] = 0.0; + } + + double S = 0.0; + double T = 0.0; + + for (int j = 0; j < this.N; j++) { + T += K; + S = 0.0; + + for (int i = 0; i < Math.min(j+1, this.M); i++) { + S += H; + this.AX[j] += K * S * (T - 1.0) * this.X[i]; + } + for (int i = j + 1; i < this.M; i++) { + S += H; + this.AX[j] += K * T * (S - 1.0) * this.X[i]; + } + + } + + } + + } + + } + +} diff --git a/simple_examples/source/int32/F03BAJE.java b/simple_examples/source/int32/F03BAJE.java new file mode 100644 index 0000000..673ddec --- /dev/null +++ b/simple_examples/source/int32/F03BAJE.java @@ -0,0 +1,108 @@ +import com.nag.routines.F03.F03BA; +import com.nag.routines.F07.F07AD; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F03BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F03BAJE{ + + /** + * F03BAJ example main program. + */ + public static void main(String[] args){ + double d = 0; + int id = 0, ifail, info = 0, lda = 0, n = 0; + double[] a; + int[] ipiv; + + //Should initialise values so java doesn't give any errors because of try/catch + a = new double[n]; + ipiv = new int[n]; + + System.out.println("F03BAJ Example Program Results"); + + //If file name not given print usage info + if(args.length != 1){ + F03BAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + + lda = n; + + //reallocate with values from data file + a = new double[n * lda]; + ipiv = new int[n]; + + //read in matrix + for(int i = 0; i < n; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); + f07ad.eval(); + + ifail = 0; + + //Print out matrix + System.out.println(); + X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivots"); + for(int i = 0; i < n; i++){ + System.out.printf("\t%d ", ipiv[i]); + } + System.out.printf("\n"); + System.out.println(); + + ifail = 0; + + F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); + f03ba.eval(); + d = f03ba.getD(); + id = f03ba.getID(); + + System.out.printf("D = \t%.5f ID = \t%d\n", d, id); + System.out.println(); + System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); + + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + +} + diff --git a/simple_examples/source/int32/F04AMJE.java b/simple_examples/source/int32/F04AMJE.java new file mode 100644 index 0000000..a498b2b --- /dev/null +++ b/simple_examples/source/int32/F04AMJE.java @@ -0,0 +1,114 @@ +import com.nag.routines.F04.F04AM; +import com.nag.routines.X02.X02AJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04AMJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04AMJE{ + + /** + * F04AMJ example main program. + */ + public static void main(String[] args){ + int m = 0, n = 0; + int ifail, ir, lda, ldb, ldqr, ldx; + double eps; + double[] a, b, alpha, e, qr, r, x, y, z; + int[] ipiv; + + System.out.println("F04AMJ Example Program Results"); + + if(args.length != 1){ + F04AMJE.usage(); + } + + //declare so try/catch works + a = new double[0]; + b = new double[0]; + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[1]); + n = Integer.parseInt(sVal[2]); + + a = new double[m * n]; + b = new double[m * 1]; + + for(int i = 0; i < m; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * m) ] = Double.parseDouble(sVal[j]); + } + for(int j = n; j < m; j++){ + b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + //Setting these in try block is more robust but less neat + //May be needed for array sizes~ + ir = 1; + lda = m; + ldb = m; + ldqr = m; + ldx = n; + + alpha = new double[n]; + e = new double[n]; + qr = new double[ldqr * n]; + r = new double[m]; + x = new double[ldx * ir]; + y = new double[n]; + z = new double[n]; + ipiv = new int[n]; + + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + + ifail = 0; + + F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); + f04am.eval(); + //update any values you want here + x = f04am.getX(); + + System.out.println("Solution"); + for(int i = 0; i < n; i++){ + for(int j = 0; j < ir; j++){ + System.out.printf("%.4f ", x[j + (i * ir)]); + } + System.out.printf("\n"); + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + + + + + + diff --git a/simple_examples/source/int32/F04BAJE.java b/simple_examples/source/int32/F04BAJE.java new file mode 100644 index 0000000..79c2b01 --- /dev/null +++ b/simple_examples/source/int32/F04BAJE.java @@ -0,0 +1,144 @@ +import com.nag.routines.F04.F04BA; +import com.nag.routines.X04.X04CA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F04BAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F04BAJE{ + + /** + * F04BAJ example main program. + */ + public static void main(String[] args){ + int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder + int ierr, ifail; + double errbnd, rcond; + double a[], b[]; + int ipiv[]; + + a = new double[0]; b = new double[0]; //placeholder + + if(args.length != 1){ + F04BAJE.usage(); + } + + System.out.println("F04BAJ Example Program Results"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[1]); + nrhs = Integer.parseInt(sVal[2]); + + lda = n; + ldb = n; + + a = new double[lda * n]; + b = new double[ldb * nrhs]; + + line = reader.readLine(); + for(int i = 0; i < lda; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < ldb; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < nrhs; j++){ + b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ifail = 1; + ipiv = new int[n]; + rcond = 0; + errbnd = 0; + F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); + f04ba.eval(); + + ifail = f04ba.getIFAIL(); + rcond = f04ba.getRCOND(); + errbnd = f04ba.getERRBND(); + ipiv = f04ba.getIPIV(); + a = f04ba.getA(); + b = f04ba.getB(); + + if(ifail == 0){ + //Print solution, estimate of condition number and approximate error bound. + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Estimate of condition number"); + System.out.printf("%.1e\n", 1/rcond); + System.out.println(); + System.out.println("Esttimate of error bound for computed solutions"); + System.out.printf("%.1e\n", errbnd); + } + else if(ifail == (n + 1)){ + //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. + System.out.println(); + System.out.println("Estimate of reciprocal of condition number"); + System.out.printf("%.1e\n", rcond); + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); + x04ca.eval(); + } + else if(ifail > 0 && ifail <= n){ + //The upper triangular matrix U is exactly singular. Print details of factorization. + System.out.println(); + + ierr = 0; + X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); + x04ca.eval(); + + System.out.println(); + System.out.println("Pivot indices"); + for(int i = 0; i < n; i++){ + System.out.printf("%d ", ipiv[i]); + } + System.out.printf("\n"); + } + else{ + System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); + } + + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/F05AAJE.java b/simple_examples/source/int32/F05AAJE.java new file mode 100644 index 0000000..317c269 --- /dev/null +++ b/simple_examples/source/int32/F05AAJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F05.F05AA; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * F05AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class F05AAJE{ + + /** + * F05AAJ example main program. + */ + public static void main(String[] args) { + //Should initialise values to avoid issues with try/catch + int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; + double cc = 0; + double[] a, s; + + //same as ints + a = new double[1]; + s = new double[1]; + System.out.println("F05AAJ Example Program Results"); + System.out.println(); + + //supply data + if(args.length != 1){ + F05AAJE.usage(); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+");; + m = Integer.parseInt(sVal[1]); + n1 = Integer.parseInt(sVal[2]); + n2 = Integer.parseInt(sVal[3]); + lda = m; + + a = new double[lda*n2]; + s = new double[n2]; + + //read in a from data + for(int i = 0; i < n2; i++){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + a[i + (j * n2)] = Double.parseDouble(sVal[j]); + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + //create object then eval + F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); + f05aa.eval(); + + //update values + n1 = f05aa.getN1(); + n2 = f05aa.getN2(); + cc = f05aa.getCC(); + icol = f05aa.getICOL(); + a = f05aa.getA(); + + System.out.printf("N1 = %d N2 = %d\n", n1, n2); + System.out.println(); + System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); + System.out.println(); + System.out.println("Final Vectors"); + + for(int i = 0; i < n2; i++){ + for(int j = 1; j < m; j++){ + System.out.printf("%.4f ", a[i +(j * n2)]); + } + System.out.printf("\n"); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/F06CLJE.java b/simple_examples/source/int32/F06CLJE.java new file mode 100644 index 0000000..ca2ac5e --- /dev/null +++ b/simple_examples/source/int32/F06CLJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.F06.F06CL; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; + +/** + * F06CL example program text. + * @author ludovic + */ +public class F06CLJE { + + public static void main(String[] args) { + boolean fail = false; + NAGComplex z1 = new NAGComplex(); + NAGComplex z2 = new NAGComplex(); + NAGComplex z3 = new NAGComplex(); + + System.out.println(" F06CLJ Example Program Results"); + System.out.println(); + + Routine.complex = z1; + + z1.setRe(1.0); + z1.setIm(1.0); + z2.setRe(2.0); + z2.setIm(2.0); + + F06CL f06cl = new F06CL(z1,z2,fail); + z3 = (NAGComplex)f06cl.eval(); + fail = f06cl.getFAIL(); + + if (fail) { + System.err.println(" Something went wrong..."); + } + else { + System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); + } + + } + +} diff --git a/simple_examples/source/int32/F07AAJE.java b/simple_examples/source/int32/F07AAJE.java new file mode 100644 index 0000000..26eb5dc --- /dev/null +++ b/simple_examples/source/int32/F07AAJE.java @@ -0,0 +1,90 @@ +import com.nag.routines.F07.F07AA; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * F07AA example program text. + * @author joed + */ +public class F07AAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, ldb, n; + double[] a, b; + int[] ipiv; + + System.out.println(" F07AAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + ldb = n; + + a = new double[n*n]; + b = new double[n]; + ipiv = new int[n]; + + a[0+0*n] = 1.80; + a[0+1*n] = 2.88; + a[0+2*n] = 2.05; + a[0+3*n] = -0.89; + a[1+0*n] = 5.25; + a[1+1*n] = -2.95; + a[1+2*n] = -0.95; + a[1+3*n] = -3.80; + a[2+0*n] = 1.58; + a[2+1*n] = -2.69; + a[2+2*n] = -2.90; + a[2+3*n] = -1.04; + a[3+0*n] = -1.11; + a[3+1*n] = -0.66; + a[3+2*n] = -0.59; + a[3+3*n] = 0.80; + + b[0] = 9.52; + b[1] = 24.35; + b[2] = 0.77; + b[3] = -6.22; + + /* Solve the equations Ax = b for x */ + + F07AA f07aa = new F07AA(); + info = 0; + f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); + info = f07aa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); + + /* Print pivot indices */ + + System.out.println(); + System.out.println(" Pivot indices"); + for (i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.printf("\n"); + + } + else { + System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); + } + + } + +} diff --git a/simple_examples/source/int32/F07ABJE.java b/simple_examples/source/int32/F07ABJE.java new file mode 100644 index 0000000..6362739 --- /dev/null +++ b/simple_examples/source/int32/F07ABJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.F07.DGESVX; +import com.nag.routines.X04.X04CA; + +/** + * F07ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ABJE{ + + /** + * F07ABJ example main program + */ + public static void main(String[] args){ + double rcond = 0; + int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders + String equed; + double[] a, af, b, berr, c, ferr, r, work, x; + int[] ipiv, iwork; + + System.out.println("F07ABJ Example Program Results"); + System.out.println(); + + //Problem size + n = 4; + nrhs = 2; + lda = n; + ldaf = n; + ldb = n; + ldx = n; + + //Allocate + a = new double[lda * n]; + af = new double[ldaf * n]; + b = new double[ldb * nrhs]; + berr = new double[nrhs]; + c = new double[n]; + ferr = new double[nrhs]; + r = new double[n]; + work = new double[4 * n]; + x = new double[ldx * nrhs]; + ipiv = new int[n]; + iwork = new int[n]; + equed = " "; + + //Matrices A and B + a[0] = 1.8; + a[1] = 525; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -295; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -380; + a[14] = -1.04; + a[15] = 0.8; + b[0] = 9.52; + b[1] = 2435; + b[2] = 0.77; + b[3] = -6.22; + b[4] = 18.47; + b[5] = 225; + b[6] = -13.28; + b[7] = -6.21; + + //Solve the equations AX = B for X + //The NAG name equivalent of dgesvx is f07abf + DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, + c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + dgesvx.eval(); + + //Update + info = dgesvx.getINFO(); + equed = dgesvx.getEQUED(); + rcond = dgesvx.getRCOND(); + + if(info == 0 || info == n + 1){ + //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); + x04ca.eval(); + + System.out.println(); + System.out.println("Backward errors (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", berr[i]); + } + System.out.println(); + System.out.println(); + System.out.println("Estimated forward error bounds (machine-dependent)"); + for(int i = 0; i < nrhs; i++){ + System.out.printf(" %.1e ", ferr[i]); + } + System.out.println(); + System.out.println(); + if(equed.equals("N")){ + System.out.println("A has not been equilibrated"); + } + else if(equed.equals("R")){ + System.out.println("A has been row scaled as diag(R)*A"); + } + else if(equed.equals("C")){ + System.out.println("A has been column scaled as A*diag(C)"); + } + else if(equed.equals("B")){ + System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); + } + System.out.println(); + System.out.println("Reciprocal condition number estimate of scaled matrix"); + System.out.printf(" %.1e\n", rcond); + System.out.println(); + System.out.println("Estimate of reciprocal pivot growth factor"); + System.out.printf(" %.1e\n", work[0]); + System.out.println(); + + if(info == n + 1){ + System.out.println(); + System.out.println("The matrix A is singular to working precision"); + } + } + else{ + System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); + } + } +} diff --git a/simple_examples/source/int32/F07ADJE.java b/simple_examples/source/int32/F07ADJE.java new file mode 100644 index 0000000..4450683 --- /dev/null +++ b/simple_examples/source/int32/F07ADJE.java @@ -0,0 +1,72 @@ +import com.nag.routines.F07.DGETRF; +import com.nag.routines.X04.X04CA; + +/** + * F07ADJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F07ADJE{ + + /** + * F07ADJ Example main program + */ + public static void main(String[] args){ + int ifail, info = 0, lda, m, n; + double[] a; + int[] ipiv; + + System.out.println("F07ADJ Example Program Results"); + System.out.println(); + + //Problem size (can be read from data file) + m = 4; + n = 4; + lda = m; + + //Data + ipiv = new int[n]; + a = new double[m * n]; + a[0] = 1.8; + a[1] = 5.25; + a[2] = 1.58; + a[3] = -1.11; + a[4] = 2.88; + a[5] = -2.95; + a[6] = -2.69; + a[7] = -0.66; + a[8] = 2.05; + a[9] = -0.95; + a[10] = -2.9; + a[11] = -0.59; + a[12] = -0.89; + a[13] = -3.8; + a[14] = -1.04; + a[15] = 0.8; + + //Factorize A + //The NAG name equivalent of dgetrf is F07ADF + DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); + dgetrf.eval(); + + //Update + info = dgetrf.getINFO(); + + //ifail: behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); + x04ca.eval(); + + //Print pivot indices + System.out.println("IPIV"); + for(int i = 0; i < Math.min(m, n); i++){ + System.out.printf("\t%d", ipiv[i]); + } + System.out.println(); + + if(info != 0){ + System.out.println("The factor U is singular"); + } + } +} diff --git a/simple_examples/source/int32/F07AQJE.java b/simple_examples/source/int32/F07AQJE.java new file mode 100644 index 0000000..5ee47e5 --- /dev/null +++ b/simple_examples/source/int32/F07AQJE.java @@ -0,0 +1,99 @@ +import com.nag.routines.F07.F07AQ; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import com.nag.types.NAGComplexF; + +/** + * F07AQ example program text. + * @author joed + * @since 27.1.0.0 + */ +public class F07AQJE { + + public static void main(String[] args) { + + F07AQ f07aq = new F07AQ(); + int info, iter, lda, ldb, ldx, n, r; + NAGComplex[] a, b, work, x; + NAGComplexF[] swork; + double[] rwork; + int[] ipiv; + + System.out.println(" F07AQJ Example Program Results"); + System.out.println(); + + // Set dimensions and instantiate arrays + n = 4; + r = 1; + lda = ldb = ldx = n; + a = new NAGComplex[lda*n]; + b = new NAGComplex[ldb*r]; + work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); + x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); + swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); + ipiv = new int[n]; + rwork = new double[n]; + + // Set A + a[0] = new NAGComplex(-1.34, 2.55); // Column 1 + a[1] = new NAGComplex(-0.17, -1.41); + a[2] = new NAGComplex(-3.29, -2.39); + a[3] = new NAGComplex(2.41, 0.39); + a[4] = new NAGComplex(0.28, 3.17); // Column 2 + a[5] = new NAGComplex(3.31, -0.15); + a[6] = new NAGComplex(-1.91, 4.42); + a[7] = new NAGComplex(-0.56, 1.47); + a[8] = new NAGComplex(-6.39, -2.20); // Column 3 + a[9] = new NAGComplex(-0.15, 1.34); + a[10] = new NAGComplex(-0.14, -1.35); + a[11] = new NAGComplex(-0.83, -0.69); + a[12] = new NAGComplex(0.72, -0.92); // Column 4 + a[13] = new NAGComplex(1.29, 1.38); + a[14] = new NAGComplex(1.72, 1.35); + a[15] = new NAGComplex(-1.96, 0.67); + + // Set B + b[0] = new NAGComplex(26.26,51.78); + b[1] = new NAGComplex( 6.43,-8.68); + b[2] = new NAGComplex(-5.75,25.31); + b[3] = new NAGComplex( 1.16, 2.57); + + // Notify wrappers of complex types + Routine.setComplex(new NAGComplex()); + Routine.setComplexF(new NAGComplexF()); + + // Solve the equations Ax = b for x + iter = info = 0; + f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); + iter = f07aq.getITER(); + info = f07aq.getINFO(); + + if (info == 0) { + + // Print solution + + System.out.println(" Solution"); + for (int i = 0; i < n; i++) { + for (int j = 0; j < r; j++) { + System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); + } + } + System.out.println(); + + // Print pivot indices + + System.out.println(); + System.out.println(" Pivot indices"); + for (int i = 0; i < n; i++) { + System.out.printf(" %11d", ipiv[i]); + } + System.out.println(); + + } + else { + System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); + } + + } + +} diff --git a/simple_examples/source/int32/F07FAJE.java b/simple_examples/source/int32/F07FAJE.java new file mode 100644 index 0000000..e516051 --- /dev/null +++ b/simple_examples/source/int32/F07FAJE.java @@ -0,0 +1,79 @@ +import com.nag.routines.F07.F07FA; +import com.nag.routines.X04.X04CA; + +/** + * F07FA example program text. + * @author saraht + */ +public class F07FAJE { + + public static void main(String[] args) { + + int i, ifail, info, lda, n; + double[] a, b; + + System.out.println(" F07FAJ Example Program Results"); + System.out.println(); + + n = 4; + lda = n; + + a = new double[n*n]; + b = new double[n]; + + /* A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18 */ + + a[0+0*n] = 4.16; + a[0+1*n] = -3.12; + a[0+2*n] = 0.56; + a[0+3*n] = -0.10; + + a[1+1*n] = 5.03; + a[1+2*n] = -0.83; + a[1+3*n] = 1.18; + + a[2+2*n] = 0.76; + a[2+3*n] = 0.34; + + a[3+3*n] = 1.18; + + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + /* Solve the equations Ax = b for x */ + + F07FA f07fa = new F07FA(); + info = 0; + f07fa.eval("Upper", n, 1, a, lda, b, n, info); + info = f07fa.getINFO(); + + if (info == 0) { + + /* Print solution */ + + System.out.println(" Solution"); + for (i = 0; i < n; i++) { + System.out.printf(" %11.4f", b[i]); + } + System.out.printf("\n"); + + /* Print details of factorization */ + + System.out.println(); + X04CA x04ca = new X04CA(); + ifail = 0; + x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); + + } + else { + System.err.printf(" The leading minor of order %d is not positive definite \n", info); + } + + } + +} diff --git a/simple_examples/source/int32/F07FBJE.java b/simple_examples/source/int32/F07FBJE.java new file mode 100644 index 0000000..09bbd37 --- /dev/null +++ b/simple_examples/source/int32/F07FBJE.java @@ -0,0 +1,122 @@ +import com.nag.routines.F07.F07FB; +import com.nag.routines.X04.X04CA; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * F07FB example program text. + * @author ludovic + */ +public class F07FBJE { + + public static void main(String[] args) { + String fact,uplo,equed; + int n, nrhs,lda,ldaf,ldb,ldx; + int[] iwork; + double rcond; + double[] a,af,s,b,x,ferr,berr,work; + int info,ifail; + lda = 4; + ldaf = lda; + ldb = lda; + ldx = lda; + nrhs = 2; + n = 4; + a = new double[lda*lda]; + af = new double[ldaf*ldaf]; + b = new double[ldb*nrhs]; + berr = new double[nrhs]; + ferr = new double[nrhs]; + s = new double[lda]; + work = new double[3*lda]; + x = new double[ldx*nrhs]; + iwork = new int[lda]; + info = 1; + rcond = Double.NaN; + fact = "E"; + uplo = "U"; + equed = "Z";//dummy value + /*A = 4.16 -3.12 0.56 -0.10 + 5.03 -0.83 1.18 + 0.76 0.34 + 1.18*/ + a[0] = 4.16; + + a[4] = -3.12; + a[5] = 5.03; + + a[8] = 0.56; + a[9] = -0.83; + a[10] = 0.76; + + a[12] = -0.10; + a[13] = 1.18; + a[14] = 0.34; + a[15] = 1.18; + + /*B= 8.70 8.30 + -13.35 2.13 + 1.89 1.61 + - 4.14 5.00*/ + b[0] = 8.70; + b[1] = -13.35; + b[2] = 1.89; + b[3] = -4.14; + + b[4] = 8.30; + b[5] = 2.13; + b[6] = 1.61; + b[7] = 5.00; + + System.out.println(" F07FBJ Example Program Results"); + System.out.println(); + + F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, + ldb, x, ldx, rcond, ferr, berr, work, iwork, info); + f07fb.eval(); + fact = f07fb.getFACT(); + uplo = f07fb.getUPLO(); + equed = f07fb.getEQUED(); + rcond = f07fb.getRCOND(); + info = f07fb.getINFO(); + + + if ((info == 0) || (info == n+1)) { + ifail = 0; + (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); + System.out.println(); + System.out.println(" Backward errors (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",berr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimated forward error bounds (machine-dependent)"); + System.out.print(" "); + for (int ii = 0; ii < nrhs; ++ii) { + System.out.printf(" %11.1e",ferr[ii]); + } + System.out.println("\n"); + System.out.println(" Estimate of reciprocal condition number"); + System.out.printf(" %11.1e\n",rcond); + System.out.println(); + if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has not been equilibrated"); + } + else if (equed.equalsIgnoreCase("N")) { + System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); + } + + if (info == n+1) { + System.out.println(); + System.out.println(" The matrix A is singular to working precision"); + } + + } + else { + System.out.printf(" The leading minor of order %3d is not positive definite\n"); + } + + } + +} diff --git a/simple_examples/source/int32/F08BTJE.java b/simple_examples/source/int32/F08BTJE.java new file mode 100644 index 0000000..43c219b --- /dev/null +++ b/simple_examples/source/int32/F08BTJE.java @@ -0,0 +1,228 @@ +import static java.lang.Math.*; + +import com.nag.routines.F06.F06JJ; +import com.nag.routines.F06.F06ZJ; +import com.nag.routines.F08.F08AU; +import com.nag.routines.F08.F08BT; +import com.nag.routines.Routine; +import com.nag.routines.X04.X04DB; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * F08BT example program text. + * @author ludovic + */ +public class F08BTJE { + + public static void main(String[] args) throws FileNotFoundException, IOException { + int incl = 1, nb = 64; + double tol; + int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; + NAGComplex[] a, b, tau, work; + double[] rnorm, rwork; + int[] jpvt; + String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; + + // Setup complex constants + NAGComplex one = new NAGComplex(); + NAGComplex zero = new NAGComplex(); + one.setRe(1.0); + one.setIm(0.0); + zero.setRe(0.0); + zero.setIm(0.0); + + // Inform the Routine class of the type of complex in use - can use any complex object + Routine.complex = one; + + System.out.println(" F08BTJ Example Program Results"); + System.out.println(); + + // Read values from data file + BufferedReader br = new BufferedReader(new FileReader(args[0])); + String line = br.readLine(); + line = br.readLine().trim(); + line = br.readLine().trim(); + String[] vals = line.split("\\s+"); + m = Integer.parseInt(vals[0].trim()); + n = Integer.parseInt(vals[1].trim()); + nrhs = Integer.parseInt(vals[2].trim()); + lda = ldb = m; + lwork = (n + 1) * nb; + a = new NAGComplex[lda * n]; + b = new NAGComplex[ldb * nrhs]; + tau = new NAGComplex[n]; + work = new NAGComplex[lwork]; + rnorm = new double[nrhs]; + rwork = new double[2 * n]; + jpvt = new int[n]; + + // Actually initialize the complex arrays + for (int i = 0; i < a.length; ++i) { + a[i] = new NAGComplex(); + } + for (int i = 0; i < b.length; ++i) { + b[i] = new NAGComplex(); + } + for (int i = 0; i < tau.length; ++i) { + tau[i] = new NAGComplex(); + } + for (int i = 0; i < work.length; ++i) { + work[i] = new NAGComplex(); + } + + /* Read A and B from data file */ + + readCompMatrix(br, a, lda, n); + readCompMatrix(br, b, ldb, nrhs); + br.close(); + + /* Initialize JPVT to be zero so that all columns are free */ + + for (int i = 0; i < n; ++i) { + jpvt[i] = 0; + } + + /* Compute the QR factorization of A */ + + F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); + f08bt.eval(); + + /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ + + String side = "Left"; + String conjTrans = "Conjugate Transpose"; + F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); + f08au.eval(); + a = (NAGComplex[])f08au.getA(); + + /* Choose TOL to reflect the relative accuracy of the input data */ + + tol = 0.01; + + /* Determine and print the rank, K, or R relative to TOL */ + + for (k = 1; k < n + 1; ++k) { + if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { + break; + } + } + k = k - 1; + + System.out.println(" Tolerance used to estimate the rank of A"); + System.out.printf(" %11.2E\n", tol); + System.out.println(" Estimated rank of A"); + System.out.printf(" %8d\n", k); + + /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 + * storing the result in B */ + + String upDown = "Upper"; + String trans = "No transpose"; + String unit = "Non-Unit"; + F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); + f06zj.eval(); + + /* Compute estimates of the square roots of the residual sums of squares + * (2-norm of each of the columns of C2) */ + + int mMinusK = m - k; + NAGComplex[] btmp = new NAGComplex[b.length]; + for (int i = 0; i < btmp.length; ++i) { + btmp[i] = new NAGComplex(); + } + System.arraycopy(b, k, btmp, 0, b.length - k); + + F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); + rnorm[0] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp, 0, b, k, b.length - k); + for (int j = 1; j < nrhs; ++j) { + System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); + rnorm[j] = f06jj.eval(mMinusK, btmp, incl); + System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); + } + + /* Set the remaining elements of the solutions to zero (to give the + * basic solutions) */ + + for (int i = k; i < n; ++i) { + for (int j = 0; j < nrhs; ++j) { + NAGComplex tmp = new NAGComplex(); + tmp.setRe(0.0); + tmp.setIm(0.0); + b[i + j * ldb] = tmp; + } + } + + /* Permute the least squares solution stored in B to give X = P*Y */ + + for (int j = 0; j < nrhs; j++) { + for (int i = 0; i < n; i++) { + work[jpvt[i] - 1] = b[j*ldb + i]; + } + for (int i = 0; i < n; i++) { + b[j*ldb + i] = work[i]; + } + } + + /* Print least squares solutions */ + + X04DB x04db = new X04DB(); + ifail = 0; + x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", + "Integer",rlabs,"Integer",clabs,80,0,ifail); + + /* Print the square roots of the residual sums of squares */ + + System.out.println(); + System.out.println(" Square root(s) of the residual sum(s) of squares"); + System.out.printf(" "); + for (int i = 0; i < nrhs; ++i) { + System.out.printf("%11.2E", rnorm[i]); + } + System.out.println(); + + } + + private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, + int col) throws IOException { + + // matches one complex number (without the brackets...) + String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; + String fullPattern = complexPat; + for (int i = 0; i < col -1; ++i) { + fullPattern = fullPattern + "\\s*" + complexPat; + } + fullPattern = fullPattern + ".*"; + Pattern comppat = Pattern.compile(fullPattern); + + for (int i = 0; i < row; ++i) { + String line = br.readLine().trim(); + if (line.equalsIgnoreCase("")) { + line = br.readLine().trim(); + } + Matcher m = comppat.matcher(line.trim()); + if (m.matches()) { + for (int j = 0; j < col; ++j) { + String[] numbers = m.group(j + 1).trim().split(","); + mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); + mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); + // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); + } + // System.out.println(); + } + + + } + } + + private static double abs(NAGComplex z) { + return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); + } + +} diff --git a/simple_examples/source/int32/F08FAJE.java b/simple_examples/source/int32/F08FAJE.java new file mode 100644 index 0000000..028f854 --- /dev/null +++ b/simple_examples/source/int32/F08FAJE.java @@ -0,0 +1,113 @@ +import com.nag.routines.F08.DDISNA; +import com.nag.routines.F08.F08FA; +import com.nag.routines.F16.F16JQ; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * F08FA example program text. + * @author ludovic + */ +public class F08FAJE { + + public static void main(String[] args) { + int n = 4, LWork = n*64, lda = n; + double[] a, w, work,zerrbd,rcondz, colVector; + int info = 0, ifail = 0, k = 0; + a = new double[n * n]; + w = new double[n]; + work = new double[LWork]; + zerrbd = new double[n]; + rcondz = new double[n]; + colVector = new double[n]; + + System.out.println(" F08FAJ Example Program Results\n"); + + //array a : Stored in column major way + + a[0] = 1.0; + a[1] = 2.0; + a[2] = 3.0; + a[3] = 4.0; + + a[4] = 2.0; + a[5] = 2.0; + a[6] = 3.0; + a[7] = 4.0; + + a[8] = 3.0; + a[9] = 3.0; + a[10] = 3.0; + a[11] = 4.0; + + a[12] = 4.0; + a[13] = 4.0; + a[14] = 4.0; + a[15] = 4.0; + + //initializing the info parameter + info = 0; + w[0] = Double.NaN; + w[1] = Double.NaN; + w[2] = Double.NaN; + w[3] = Double.NaN; + F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); + f08fa.eval(); + info = f08fa.getINFO(); + + if (info == 0) { + System.out.println(" Eigenvalues"); + System.out.print(" "); + for (int i = 0; i < n; ++i) { + System.out.printf(" %8.4f",w[i]); + } + System.out.println(); + + // Normalize the eigenvectors: largest element positive + F16JQ f16jq = new F16JQ(); // aka blas_damax_val + for (int i = 0; i < n; i++) { + System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate + f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value + k = f16jq.getK() - 1; // Make index zero based + + // Invert sign of column if largest element is negative + if (a[(4*i)+k] < 0) { + for (int j = 0; j < n; j++) { + a[(4*i)+j] = (-1) * a[(4*i)+j]; + } + } + + } + + (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); + + double eps = (new X02AJ()).eval(); + double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); + + (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); + for (int i = 0; i < n; ++i) { + zerrbd[i] = eerrbd/rcondz[i]; + } + + System.out.println(); + System.out.println(" Error estimate for the eigenvalues"); + System.out.printf(" %11.1e\n",eerrbd); + System.out.println(); + System.out.println(" Error estimates for the eigenvectors"); + for (int i = 0; i < n; ++i) { + System.out.printf(" %11.1e",zerrbd[i]); + } + System.out.println(); + + } + else { + System.out.printf(" Failure in DSYEV. INFO =%4d",info); + } + + } + +} diff --git a/simple_examples/source/int32/F08XPJE.java b/simple_examples/source/int32/F08XPJE.java new file mode 100644 index 0000000..cc894d3 --- /dev/null +++ b/simple_examples/source/int32/F08XPJE.java @@ -0,0 +1,297 @@ +import com.nag.routines.F06.F06UA; +import com.nag.routines.F06.F06BN; +import com.nag.routines.F06.ZGEMM; +import com.nag.routines.F08.ZGGESX; +import com.nag.routines.M01.M01DA; +import com.nag.routines.M01.M01ED; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.X04.X04DB; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * F08XPJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class F08XPJE{ + + public static boolean chkfac = false; + public static boolean prcond = false; + public static boolean prmat = false; + public static int nb = 64; + + /* + * F08XPJ Example main program + */ + public static void main(String[] args){ + NAGComplex alph, bet; + double abnorm, anorm, bnorm, eps, normd, norme, tol; + int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; + boolean factor; + NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; + double[] rconde, rcondv, rwork; + int[] idum, iwork; + boolean[] bwork; + String[] clabs, rlabs; + + //Placeholders + idum = new int[1]; + rconde = new double[2]; + rcondv = new double[2]; + dummy = NAGComplex.createArray(1); + + System.out.println("F08XPJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + //Tell wrappers what time of complex type is going to be used + Routine.setComplex(new NAGComplex()); + + //n declared here for neater code but can be read in from data file + n = 4; + lda = n; + ldb = n; + ldc = n; + ldd = n; + lde = n; + ldvsl = n; + ldvsr = n; + + //Allocate + a = NAGComplex.createArray(lda * n); + alpha = NAGComplex.createArray(n); + b = NAGComplex.createArray(ldb * n); + beta = NAGComplex.createArray(n); + c = NAGComplex.createArray(ldc * n); + d = NAGComplex.createArray(ldd * n); + e = NAGComplex.createArray(lde * n); + vsl = NAGComplex.createArray(ldvsl * n); + vsr = NAGComplex.createArray(ldvsr * n); + rwork = new double[8 * n]; + bwork = new boolean[n]; + clabs = new String[1]; + clabs[0] = " "; + rlabs = new String[1]; + rlabs[0] = " "; + + //Use routine workspace query to get optimal workspace + lwork = -1; + liwork = -1; + //The NAG name equivalent of zggesx is f08xpf + selctg selctg1 = new selctg(); + ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, + rwork, idum, liwork, bwork, info); + zggesx.eval(); + + //Make sure that there is a enough workspace for block size nb + lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); + liwork = Math.max(n + 2, idum[0]); + work = NAGComplex.createArray(lwork); + iwork = new int[liwork]; + + //Read in matrices A and B + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + line = reader.readLine(); //skip n (set manually for neater code) + String[] sVal; + + for(int i = 0; i < 2; i++){ + for(int j = 0; j < n; j++){ + line = reader.readLine(); + sVal = line.split("\\)"); + for(int k = 0; k < n; k++){ + if(i == 0){ + a[(k * n) + j] = parseComplex(sVal[k]); + } + else{ + b[(k * n) + j] = parseComplex(sVal[k]); + } + } + } + } + + } + catch(FileNotFoundException err){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException err){ + System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); + } + + if(chkfac){ + for(int i = 0; i < a.length; i++){ + //Copy A and B into D and E respectively + d[i] = a[i]; + e[i] = b[i]; + } + } + + //Find the Forbenius norms of A and B + //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf + F06UA f06ua = new F06UA(); + anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); + bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); + + if(prmat){ + //Print matrices A and B + //ifail : behaviour on error exit + // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft + ifail = 0; + X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + + ifail = 0; + x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", + rlabs, "Integer", clabs, 80, 0, ifail); + x04db.eval(); + System.out.println(); + } + + factor = true; + //Find the generalized Schur form + //The NAG name equivalent of zggesx is f08xpf + zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", + n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, + rwork, iwork, liwork, bwork, info); + zggesx.eval(); + + //update + sdim = zggesx.getSDIM(); + + if(info != 0 && info != (n + 2)){ + System.out.printf("Failure in ZGGESX. INFO = %d\n", info); + factor = false; + } + else if(chkfac){ + //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D + //The NAG name equivalent of zgemm is f06zaf + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); + zgemm.eval(); + + //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E + alph = new NAGComplex(1, 0); + bet = new NAGComplex(0, 0); + zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); + zgemm.eval(); + + alph = new NAGComplex(-1, 0); + bet = new NAGComplex(1, 0); + zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); + zgemm.eval(); + + //Find norms of matrices D and E and warn if either is too large + f06ua = new F06UA("0", ldd, n, d, ldd, rwork); + normd = f06ua.eval(); + X02AJ x02aj = new X02AJ(); + if(normd > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); + factor = false; + System.out.println("Schur factorization has failed"); + } + f06ua = new F06UA("0", lde, n, e, lde, rwork); + norme = f06ua.eval(); + if(norme > Math.pow(x02aj.eval(), 0.75)){ + System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); + factor = false; + } + } + + if(factor){ + //Print eigenvalue details + System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); + System.out.println("(dimension of deflating subspaces)"); + + System.out.println(); + //Print selected (finite) generalized eigenvalues + System.out.println("Selected generalized eigenvalues"); + + //Store absolute values of eigenvalues for ranking + for(int i = 0; i < n; i++){ + work[i] = alpha[i].divide(beta[i]); + rwork[i] = NAGComplex.abs(work[i]); + } + + //Rank eigenvalues + ifail = 0; + M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); + m01da.eval(); + + //Sort eigevalues in work + M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); + m01ed.eval(); + for(int i = 0; i < sdim; i++){ + System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); + } + + if(info == n + 2){ + System.out.println("*** note that rounding errors mean that leading eigenvalues in"); + System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); + System.out.println(); + } + + if(prcond){ + //Compute the machine precision and sqrt(anorm^2 + bnorm^2) + X02AJ x02aj = new X02AJ(); + eps = x02aj.eval(); + F06BN f06bn = new F06BN(anorm, bnorm); + abnorm = f06bn.eval(); + tol = eps * abnorm; + + //Print out the reciprocal condition numbers and error bound for selected eigenvalues + System.out.println("Reciprocal condition numbers for the average of the selected"); + System.out.println("eigenvalues and their asymptotic error bound"); + System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); + } + } + else{ + System.out.println("Schur factorization has failed"); + } + + } + + /** + * Converts String read in from data file to NAGComplex value. + * @param s + * Complex number string + * @return new NAGComplex representing s + */ + public static NAGComplex parseComplex(String s){ + s = s.trim(); + double re = Double.parseDouble(s.substring(1, 7)); + double im = Double.parseDouble(s.substring(8)); + return new NAGComplex(re, im); + } + + /** + * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. + */ + public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ + public boolean eval(){ + return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); + } + } + +} diff --git a/simple_examples/source/int32/G01ALJE.java b/simple_examples/source/int32/G01ALJE.java new file mode 100644 index 0000000..672a151 --- /dev/null +++ b/simple_examples/source/int32/G01ALJE.java @@ -0,0 +1,55 @@ +import com.nag.routines.G01.G01AL; + +/** + * G01ALJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G01ALJE{ + + /** + * G01ALJ Example main program + */ + public static void main(String[] args){ + int ifail, n; + double[] x, res; + int[] iwrk; + + res = new double[5]; + + System.out.println("G01ALJ Example Program Results"); + System.out.println(); + + //Problem size + n = 12; + + //Allocate + x = new double[n]; + iwrk = new int[n]; + + //Data + x[0] = 12; + x[1] = 9; + x[2] = 2; + x[3] = 5; + x[4] = 6; + x[5] = 8; + x[6] = 2; + x[7] = 7; + x[8] = 3; + x[9] = 1; + x[10] = 11; + x[11] = 10; + + //Calculate summary statistics + ifail = 0; + G01AL g01al = new G01AL(n, x, iwrk, res, ifail); + g01al.eval(); + + System.out.printf("Maximum %.4f\n", res[4]); + System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); + System.out.printf("Median (50%% quantile) %.4f\n", res[2]); + System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); + System.out.printf("Minimum %.4f\n", res[0]); + } +} diff --git a/simple_examples/source/int32/G02AKJE.java b/simple_examples/source/int32/G02AKJE.java new file mode 100644 index 0000000..8ddaff2 --- /dev/null +++ b/simple_examples/source/int32/G02AKJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.G02.G02AK; +import com.nag.routines.X04.X04CA; + +/** + * G02AK example program text. + * @author joed + * @since 27.0.0.0 + */ +public class G02AKJE { + + /** + * G02AKJ example main program. + */ + public static void main(String[] args) { + + G02AK g02ak = new G02AK(); + X04CA x04ca = new X04CA(); + double errtol, f, rankerr, ranktol; + int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; + double[] g, x; + + System.out.println("G02AKJ Example Program Results\n"); + + // Problem size + n = 4; + ldg = n; + ldx = n; + + // Rank constraint + rank = 2; + + // Matrix G (column-major) + g = new double[]{ + 2.0, -1.0, 0.0, 0.0, + -1.0, 2.0, -1.0, 0.0, + 0.0, -1.0, 2.0, -1.0, + 0.0, 0.0, -1.0, 2.0 + }; + + // Use the defaults for errtol, ranktol, maxits, maxit + errtol = 0.0; + ranktol = 0.0; + maxits = 0; + maxit = 0; + + // Calculate rank constrained nearest correlation matrix + ifail = 0; + x = new double[ldx*n]; + f = 0.0; + rankerr = 0.0; + nsub = 0; + g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, + rankerr, nsub, ifail); + nsub = g02ak.getNSUB(); + f = g02ak.getF(); + rankerr = g02ak.getRANKERR(); + + // Display results + ifail = 0; + x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); + System.out.println(); + System.out.printf("Number of subproblems solved: %12d\n\n", nsub); + System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); + System.out.printf("Rank error: %35.4f\n", rankerr); + + } + +} diff --git a/simple_examples/source/int32/G02BJJE.java b/simple_examples/source/int32/G02BJJE.java new file mode 100644 index 0000000..3de843e --- /dev/null +++ b/simple_examples/source/int32/G02BJJE.java @@ -0,0 +1,303 @@ +import com.nag.routines.G02.G02BJ; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G02BJ example program text. + * @author ludovic + */ +public class G02BJJE { + + public static void main(String[] args) { + int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; + double[] cnt, r, ssp, std, xbar;//, xmiss; + + if (args.length != 1) { + G02BJJE.usage(); + } + + String dataFile = args[0]; + DataHolder data = new DataHolder(); + readDataFile(dataFile, data); + System.out.println(" G02BJJ Example Program Results"); + System.out.println(); + + ldcnt = ldr = ldssp = data.nvars; + ldx = data.n; + cnt = new double[ldcnt * data.nvars]; + r = new double[ldr * data.nvars]; + ssp = new double[ldssp * data.nvars]; + std = new double[data.nvars]; + xbar = new double[data.nvars]; + + + //Display the data + + System.out.printf(" Number of variables (columns) = %5d\n", data.m); + System.out.printf(" Number of cases (rows) = %5d\n", data.n); + System.out.println(); + System.out.println(" Data matrix is:-"); + for (int ii = 0; ii < data.m; ++ii) { + System.out.printf(" %12d",ii+1); + } + System.out.println(); + for (int ii = 0; ii < data.n; ++ii) { + System.out.printf(" %3d ",ii+1); + for (int jj = 0; jj < data.m; ++jj) { + System.out.printf("%12.4f ",data.x[ii + jj * data.n]); + } + System.out.println(); + } + + ifail = 0; + G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, + data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, + ldcnt, ifail); + g02bj.eval(); + + data.n = g02bj.getN(); + data.m = g02bj.getM(); + data.x = g02bj.getX(); + ldx = g02bj.getLDX(); + data.miss = g02bj.getMISS(); + data.xmiss = g02bj.getXMISS(); + data.nvars = g02bj.getNVARS(); + data.kvar = g02bj.getKVAR(); + xbar = g02bj.getXBAR(); + std = g02bj.getSTD(); + ssp = g02bj.getSSP(); + ldssp = g02bj.getLDSSP(); + r = g02bj.getR(); + ldr = g02bj.getLDR(); + ncases = g02bj.getNCASES(); + cnt = g02bj.getCNT(); + ldcnt = g02bj.getLDCNT(); + ifail = g02bj.getIFAIL(); + + //Display results + System.out.println(); + System.out.println(" Variable\tMean\tSt.dev."); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); + } + System.out.println(); + System.out.println(" Sums of squares and cross-products of deviations"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.println(" Correlation coefficients"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",r[ii + ldr * jj]); + } + System.out.println(); + } + System.out.println(); + System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); + System.out.println(); + System.out.println(" Numbers used for each pair are:"); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %12d",data.kvar[ii]); + } + System.out.println(); + for (int ii = 0; ii < data.nvars; ++ii) { + System.out.printf(" %3d",data.kvar[ii]); + for (int jj = 0; jj < data.nvars; ++jj) { + System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); + } + System.out.println(); + } + System.out.println(); + } + + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + /** + G02BJF Example Program Data + 5 4 3 :: N, M, NVARS + 3.0 3.0 1.0 2.0 + 6.0 4.0 -1.0 4.0 + 9.0 0.0 5.0 9.0 + 12.0 2.0 0.0 0.0 + -1.0 5.0 4.0 12.0 :: End of X + 1 1 0 1 :: MISS + -1.0 0.0 0.0 0.0 :: XMISS + 4 1 2 :: KVAR + */ + private static void readDataFile(String filename, DataHolder data) { + try { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String line = br.readLine(); // skip header + line = br.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvars(Integer.parseInt(sVal[2])); + + data.x = new double[data.n * data.m]; + data.miss = new int[data.m]; + data.xmiss = new double[data.m]; + data.kvar = new int[data.nvars]; + + for (int i = 0; i < data.n; ++i) { + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.x[i + j * data.n] = Double.parseDouble(sVal[j]); + } + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.miss[j] = Integer.parseInt(sVal[j]); + } + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.m; ++j) { + data.xmiss[j] = Double.parseDouble(sVal[j]); + } + + line = br.readLine().trim(); + sVal = line.split("\\s+"); + for (int j = 0; j < data.nvars; ++j) { + data.kvar[j] = Integer.parseInt(sVal[j]); + } + } + catch (FileNotFoundException ex) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch (IOException ex) { + System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); + System.exit(-3); + } + + } + + private static class DataHolder { + private int n; + private int m; + private int nvars; + private double[] x; + private int[] miss; + private double[] xmiss; + private int[] kvar; + + /** + * @return the n + */ + public int getN() { + return n; + } + + /** + * @param n the n to set + */ + public void setN(int n) { + this.n = n; + } + + /** + * @return the m + */ + public int getM() { + return m; + } + + /** + * @param m the m to set + */ + public void setM(int m) { + this.m = m; + } + + /** + * @return the nvars + */ + public int getNvars() { + return nvars; + } + + /** + * @param nvars the nvars to set + */ + public void setNvars(int nvars) { + this.nvars = nvars; + } + + /** + * @return the x + */ + public double[] getX() { + return x; + } + + /** + * @param x the x to set + */ + public void setX(double[] x) { + this.x = x; + } + + /** + * @return the miss + */ + public int[] getMiss() { + return miss; + } + + /** + * @param miss the miss to set + */ + public void setMiss(int[] miss) { + this.miss = miss; + } + + /** + * @return the xmiss + */ + public double[] getXmiss() { + return xmiss; + } + + /** + * @param xmiss the xmiss to set + */ + public void setXmiss(double[] xmiss) { + this.xmiss = xmiss; + } + + /** + * @return the kvar + */ + public int[] getKvar() { + return kvar; + } + + /** + * @param kvar the kvar to set + */ + public void setKvar(int[] kvar) { + this.kvar = kvar; + } + } +} diff --git a/simple_examples/source/int32/G02BRJE.java b/simple_examples/source/int32/G02BRJE.java new file mode 100644 index 0000000..084f478 --- /dev/null +++ b/simple_examples/source/int32/G02BRJE.java @@ -0,0 +1,134 @@ +import com.nag.routines.G02.G02BR; + +/** + * G02BRJ Example Program Text + * @author willa + * @since 27.1.0.0 + */ +public class G02BRJE{ + + /** + * G02BRJ Example main program + */ + public static void main(String[] args){ + int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder + double[] rr, work1, work2, x, xmiss; + int[] incase, kworka, kworkb, kworkc, miss; + + System.out.println("G02BRJ Example Program Results"); + System.out.println(); + + //Problem size + n = 9; + m = 3; + itype = 0; + + ldrr = m; + ldx = n; + + //Allocate + rr = new double[ldrr * m]; + work1 = new double[n]; + work2 = new double[n]; + x = new double[ldx * m]; + xmiss = new double[m]; + incase = new int[n]; + kworka = new int[n]; + kworkb = new int[n]; + kworkc = new int[n]; + miss = new int[m]; + + //Data + //X = (1.70, 1.00, 0.50) + // (2.80, 4.00, 3.00) + // (0.60, 6.00, 2.50) + // (1.80, 9.00, 6.00) + // (0.99, 4.00, 2.50) + // (1.40, 2.00, 5.50) + // (1.80, 9.00, 7.50) + // (2.50, 7.00, 0.00) + // (0.99, 5.00, 3.00) + x[0] = 1.7; + x[1] = 2.8; + x[2] = 0.6; + x[3] = 1.8; + x[4] = 0.99; + x[5] = 1.4; + x[6] = 1.8; + x[7] = 2.5; + x[8] = 0.99; + x[9] = 1; + x[10] = 4; + x[11] = 6; + x[12] = 9; + x[13] = 4; + x[14] = 2; + x[15] = 9; + x[16] = 7; + x[17] = 5; + x[18] = 0.5; + x[19] = 3; + x[20] = 2.5; + x[21] = 6; + x[22] = 2.5; + x[23] = 5.5; + x[24] = 7.5; + x[25] = 0; + x[26] = 3; + + //Missing value flags + miss[0] = 1; + miss[1] = 0; + miss[2] = 1; + xmiss[0] = 0.99; + xmiss[1] = 0; + xmiss[2] = 0; + + //Display data + System.out.printf("Number of variables (columns) = %d\n", m); + System.out.printf("Number of case (rows) = %d\n", n); + System.out.println(); + System.out.println("Data matrix is:-\n"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", x[(j * n) + i]); + } + System.out.println(); + } + System.out.println(); + + //Calculate correlation coefficients + ifail = 0; + G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, + work1, work2, ifail); + g02br.eval(); + + //Update + ncases = g02br.getNCASES(); + + //Display results + System.out.println("Matrix of rank correlation coefficients:"); + System.out.println("Upper triangle -- Spearman's"); + System.out.println("Lower triangle -- Kendall's tau"); + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf("\t %d", i + 1); + } + System.out.println(); + for(int i = 0; i < m; i++){ + System.out.printf(" %d\t", i + 1); + for(int j = 0; j < m; j++){ + System.out.printf("%.4f\t", rr[(j * m) + i]); + } + System.out.println(); + } + System.out.println(); + System.out.printf("Number of cases actually used: %d\n", ncases); + } +} diff --git a/simple_examples/source/int32/G02DAJE.java b/simple_examples/source/int32/G02DAJE.java new file mode 100644 index 0000000..c390197 --- /dev/null +++ b/simple_examples/source/int32/G02DAJE.java @@ -0,0 +1,187 @@ +import com.nag.routines.G02.G02BU; +import com.nag.routines.G02.G02DA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G02DAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02DAJE{ + + /** + * G02DAJ Example main program + */ + public static void main(String[] args){ + double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; + int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; + boolean svd = false; + String mean, weight; + double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; + int[] isx; + + System.out.println("G02DAJ Example Program Results"); + System.out.println(); + + c = new double[1]; + wmean = new double[1]; + + //Problem size (can be read in from data file + n = 12; + m = 4; + weight = "U"; + mean = "M"; + + if(weight.toLowerCase().equals("w")){ + lwt = n; + } + else{ + lwt = 0; + } + ldx = n; + + x = new double[ldx * m]; + y = new double[n]; + wt = new double[n]; + isx = new int[m]; + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip n, m, weight, mean + + //Read in data + String[] sVal; + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + x[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + if(lwt > 0){ + wt[i] = Double.parseDouble(sVal[m + 1]); + } + } + + //Read in variable inclusion flags + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int i = 0; i < m; i++){ + isx[i] = Integer.parseInt(sVal[i]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Calcluate IP + ip = 0; + for(int i = 0; i < m; i++){ + if(isx[i] == 1){ + ip++; + } + } + if(mean.toLowerCase().equals("m")){ + ip = ip + 1; + } + + //Allocate + ldq = n; + b = new double[ip]; + cov = new double[((ip * ip) + ip)/2]; + h = new double[n]; + p = new double[ip * ip * (ip + 2)]; + q = new double[ldq * (ip + 1)]; + res = new double[n]; + se = new double[ip]; + wk = new double[ip * ip + (5 * (ip - 1))]; + + //Use suggested value for tolerance + tol = 0.000001; + + //fit general linear regression model + ifail = -1; + G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, + ldq, svd, irank, p, tol, wk, ifail); + g02da.eval(); + ifail = g02da.getIFAIL(); + if(ifail != 0){ + if(ifail != 5){ + System.exit(-3); + } + } + + //Calculate (weighted) total sums of squares, adjusted for mean if required + //If in G02DAF, an intercept is added to the regression by including a comlumn of + //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used + //in this call to G02BUF + ifail = 0; + G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); + g02bu.eval(); + + idf = g02da.getIDF(); + irank = g02da.getIRANK(); + //Get effective number of observations (=N if there are no zero weights) + en = (double) idf + irank; + + rss = g02da.getRSS(); + //Calculate R-squared, corrected R-Squared and AIC + rsq = 1 - rss/c[0]; + if(mean.toLowerCase().equals("m")){ + mult = (en - 1) / (en - irank); + } + else{ + mult = en / (en - irank); + } + arsq = 1 - mult * (1 - rsq); + aic = en * Math.log(rss/en) + (2 * irank); + + svd = g02da.getSVD(); + //Disply results + if(svd){ + System.out.printf("Model not of full rank, rank = %d", irank); + System.out.println(); + } + System.out.printf("Residual sum of squares = %.4e\n", rss); + System.out.printf("Degrees of freedom = %d\n", idf); + System.out.printf("R-squared = %.4e\n", rsq); + System.out.printf("Adjusted R-squared = %.4e\n", arsq); + System.out.printf("AIC = %.4e\n", aic); + System.out.println(); + System.out.printf("Variable\tParameter estimate\tStandard error\n"); + System.out.println(); + if(ifail == 0){ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); + } + } + else{ + for(int i = 0; i < ip; i++){ + System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); + } + } + System.out.println(); + System.out.printf(" Obs\t\t Residuals\t\t H\n"); + System.out.println(); + for(int i = 0; i < n; i++){ + System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); + } + + } +} diff --git a/simple_examples/source/int32/G02EEJE.java b/simple_examples/source/int32/G02EEJE.java new file mode 100644 index 0000000..5856fde --- /dev/null +++ b/simple_examples/source/int32/G02EEJE.java @@ -0,0 +1,184 @@ +import com.nag.routines.G02.G02EE; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G02EE example program text. + */ +public class G02EEJE { + + public static void main(String[] args) throws Exception { + int vnlen = 3; + double chrss, f, fin, rss; + rss = chrss = f = Double.NaN; + int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; + boolean addvar = false; + String mean, weight, newvar; + newvar = " "; + double[] exss, p, q, wk, wt, x, y; + int[] isx; + String[] free, model, vname; + + System.out.println(" G02EEJ Example Program Results\n"); + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + String line = dataIn.readLine(); + + String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + + n = Integer.parseInt(data[0]); + m = Integer.parseInt(data[1]); + mean = data[2].substring(1,2); + weight = data[3].substring(1,2); + fin = Double.parseDouble(data[4]); + + if (weight.equalsIgnoreCase("W")) { + lwt = n; + } + else { + lwt = 0; + } + ldx = n; + + x = new double[ldx*m]; + y = new double[n]; + wt = new double[lwt]; + isx = new int[m]; + vname = new String[m]; + + for (int i = 0; i < vname.length;++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + vname[i] = tmp.toString(); + } + + if (lwt > 0) { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + wt[i] = Double.parseDouble(data[m+1]); + } + } + else { + for (int i = 0; i < n; ++i) { + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int j = 0; j < m; ++j) { + x[i+j*ldx] = Double.parseDouble(data[j]); + } + y[i] = Double.parseDouble(data[m]); + } + } + data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); + for (int i = 0; i < m; ++i) { + isx[i] = Integer.parseInt(data[i]); + } + + data = dataIn.readLine().trim().split("::")[0].trim() + .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); + for (int i = 0; i < m; ++i) { + vname[i] = data[i].substring(0,3); + } + + dataIn.close(); + + maxip = 0; + for (int i = 0; i < m; ++i) { + if (isx[i] > 0) { + ++maxip; + } + } + + if (mean.equalsIgnoreCase("M")) { + maxip += 1; + } + + ldq = n; + model = new String[maxip]; + free = new String[maxip]; + exss = new double[maxip]; + q = new double[ldq*(maxip+2)]; + p = new double[maxip+1]; + wk = new double[2*maxip]; + + for (int i = 0; i < model.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + model[i] = tmp.toString(); + } + for (int i = 0; i < free.length; ++i) { + StringBuilder tmp = new StringBuilder(); + for (int j = 0; j < vnlen; ++j) { + tmp.append(" "); + } + free[i] = tmp.toString(); + } + istep = 0; + ifail = -1; + + + G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, + addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, + wk,ifail); + for (int i = 0; i < m; ++i) { + g02ee.setIFAIL(0); + g02ee.eval(); + + System.out.printf(" Step %2d\n",g02ee.getISTEP()); + if (!g02ee.getADDVAR()) { + System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + break; + } + else { + System.out.println(" Added variable is "+g02ee.getNEWVAR()); + System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); + System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); + System.out.println(); + System.out.print(" Variables in model:"); + for (int j = 0; j < g02ee.getNTERM(); ++j) { + System.out.print(" "+g02ee.getMODEL()[j]); + } + System.out.println("\n"); + System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); + System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); + System.out.println(); + if (g02ee.getIFR() == 0) { + System.out.println(" No free variables remaining"); + break; + } + System.out.print(" Free variables: "); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.print(" "+free[j]); + } + System.out.println(); + System.out.println(" Change in residual sums of squares for free variables:"); + for (int j = 0; j < g02ee.getIFR(); ++j) { + System.out.printf(" %9.4f",g02ee.getEXSS()[j]); + } + System.out.println(); + + } + + } + + } + +} diff --git a/simple_examples/source/int32/G02MAJE.java b/simple_examples/source/int32/G02MAJE.java new file mode 100644 index 0000000..4a8bfcb --- /dev/null +++ b/simple_examples/source/int32/G02MAJE.java @@ -0,0 +1,130 @@ +import com.nag.routines.G02.G02MA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; + +/** + * G02MAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G02MAJE{ + + /** + * G02MAJ example main program + */ + public static void main(String[] args){ + int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; + double[] b, d, fitsum, ropt, y; + int[] isx; + + isx = new int[0]; //placeholder + + System.out.println("G02MAJ Example Program Results"); + System.out.println(); + + //data (Could also read in from data file) + //Problem size + n = 20; + m = 6; + + //Model Specification + mtype = 1; + pred = 3; + prey = 1; + mnstep = 6; + lisx = 0; + + //Variable inclusion flags aren't needed in this example + ip = m; + + //Optional arguments (using defaults) + lropt = 0; + ropt = new double[lropt]; + + //D and Y + ldd = n; + y = new double[n]; + d = new double[ldd * m]; + + //Read in D and Y from data file (too large to write out) + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + line = reader.readLine(); //skip N, M + line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx + + String sVal[]; + + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < m; j++){ + d[(j * n) + i] = Double.parseDouble(sVal[j]); + } + y[i] = Double.parseDouble(sVal[m]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Allocate output arrays + ldb = ip; + b = new double[ldb * (mnstep + 2)]; + fitsum = new double[6 * (mnstep + 1)]; + + //Call the model fitting routine + ifail = -1; + G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, + fitsum, ropt, lropt, ifail); + g02ma.eval(); + ifail = g02ma.getIFAIL(); + if(ifail != 0){ + if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ + //ifail = 112, 161, 162, 163 are warnings, so no need to terminate + System.exit(-2); + } + } + + //update + nstep = g02ma.getNSTEP(); + + //Display the parameter estimates + System.out.printf(" Step\t\t\tParameter Estimate\n"); + System.out.println("------------------------------------------------------"); + for(int i = 0; i < nstep; i++){ + System.out.printf(" %d", (i + 1)); + for(int j = 0; j < ip; j++){ + System.out.printf("\t%.3f", b[j + (i * nstep)]); + } + System.out.printf("\n"); + } + System.out.println(); + System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); + System.out.println(); + System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); + System.out.println("---------------------------------------------------------"); + for(int k = 0; k < nstep; k++){ + System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], + (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], + fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); + } + System.out.println(); + System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); + } +} diff --git a/simple_examples/source/int32/G03GAJE.java b/simple_examples/source/int32/G03GAJE.java new file mode 100644 index 0000000..ba20592 --- /dev/null +++ b/simple_examples/source/int32/G03GAJE.java @@ -0,0 +1,355 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import com.nag.routines.G03.G03GA; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * G03GAJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G03GAJE{ + + /** + * G03GAJ example main program. + */ + public static void main(String[] args){ + int i, ldx, lprob, riter, lds, sds, ifail = 0; + double[] w, g, s, f; + double tol, loglik = 0; + + if(args.length != 1){ + G03GAJE.usage(); + } + + // Data file name as argument + String filename = args[0]; + // DataHolder object to hold data read in from data file + DataHolder data = new DataHolder(); + + readDataFile(filename, data); + + System.out.println(" G03GAJ Example Program Results"); + System.out.println(); + + // Leading dimensions + ldx = data.n; + lprob = data.n; + + + switch(data.sopt){ + case 1: + s = new double[data.nvar * data.nvar * data.ng]; + lds = data.nvar; + sds = data.nvar; + break; + case 2: + s = new double[data.nvar * data.nvar * 1]; + lds = data.nvar; + sds = data.nvar; + break; + case 3: + s = new double[data.nvar * data.ng * 1]; + lds = data.nvar; + sds = data.ng; + break; + case 4: + s = new double[data.nvar * 1 * 1]; + lds = data.nvar; + sds = 1; + break; + default: + s = new double[1 * 1 * 1]; + lds = 1; + sds = 1; + break; + } + + // Allocate array size + g = new double[data.nvar * data.ng]; + w = new double[data.ng]; + f = new double[data.n * data.ng]; + tol = 0.0; + riter = 5; + + ifail = 0; + + // Create g03ga object with variables from data file + G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, + lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); + + // Run routine + g03ga.eval(); + + // Update variables + data.n = g03ga.getN(); + data.m = g03ga.getM(); + data.x = g03ga.getX(); + ldx = g03ga.getLDX(); + data.isx = g03ga.getISX(); + data.nvar = g03ga.getNVAR(); + data.ng = g03ga.getNG(); + data.popt = g03ga.getPOPT(); + data.prob = g03ga.getPROB(); + lprob = g03ga.getLPROB(); + data.niter = g03ga.getNITER(); + riter = g03ga.getRITER(); + w = g03ga.getW(); + g = g03ga.getG(); + data.sopt = g03ga.getSOPT(); + s = g03ga.getS(); + lds = g03ga.getLDS(); + sds = g03ga.getSDS(); + f = g03ga.getF(); + tol = g03ga.getTOL(); + loglik = g03ga.getLOGLIK(); + ifail = g03ga.getIFAIL(); + + // Results + X04CA x04ca = new X04CA(); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); + + System.out.println(); + switch(data.sopt){ + case 1: + for(i = 0; i < data.ng; i++){ + ifail = 0; + // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic + // calling X04CA along the 3rd dimension + x04ca.eval("g", "n", data.nvar, data.nvar, + Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), + lds, "Variance-cavariance matrix", ifail); + } + break; + case 2: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); + break; + case 3: + ifail = 0; + x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); + break; + case 4: + ifail = 0; + x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); + break; + case 5: + ifail = 0; + x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); + break; + } + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); + + System.out.println(); + ifail = 0; + x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); + + System.out.println(); + System.out.println("No. iterations: " + data.niter); + System.out.printf("Log-likelihood: %.04f\n", loglik); + } + + /** + * Read data from given filename and puts into DataHolder object + * @param filename + * Name of data file (absolute or relative path) + * @param data + * DataHolder object to store data from data file + */ + public static void readDataFile(String filename, DataHolder data){ + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + // Problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + data.setN(Integer.parseInt(sVal[0])); + data.setM(Integer.parseInt(sVal[1])); + data.setNvar(Integer.parseInt(sVal[2])); + + // Number of groups + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNg(Integer.parseInt(sVal[0])); + + // Scaling option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setSopt(Integer.parseInt(sVal[0])); + + // Initial probabilities option + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setPopt(Integer.parseInt(sVal[0])); + + // Maximum number of iterations + line = reader.readLine(); + sVal = line.split("\\s+"); + data.setNiter(Integer.parseInt(sVal[0])); + + // + data.x = new double[data.m * data.n]; + data.prob = new double[data.ng * data.n]; + data.isx = new int[data.m]; + + //Data matrix X + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.m; ++j){ + data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + + //Included variables + if(data.nvar != data.m){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int i = 0; i < data.m; ++i){ + data.isx[i] = Integer.parseInt(sVal[i]); + } + } + + + //Optionally read initial probabilities of group memebership (included in example data) + if(data.popt == 2){ + for(int i = 0; i < data.n; ++i){ + line = reader.readLine().trim(); + sVal = line.split("\\s+"); + for(int j = 0; j < data.ng; ++j){ + data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); + } + } + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + } + + /** + * Stores data from data file for later reference + */ + private static class DataHolder{ + private int n; + private int m; + private int nvar; + private int ng; + private int sopt; + private int popt; + private int niter; + private int isx[]; + private double x[]; + private double prob[]; + + public void setN(int n){ + this.n = n; + } + + public int getN(){ + return n; + } + + public void setM(int m){ + this.m = m; + } + + public int getM(){ + return m; + } + + public void setNvar(int nvar){ + this.nvar = nvar; + } + + public int getNvar(){ + return nvar; + } + + public void setNg(int ng){ + this.ng = ng; + } + + public int getNg(){ + return ng; + } + + public void setSopt(int sopt){ + this.sopt = sopt; + } + + public int getSopt(){ + return sopt; + } + + public void setPopt(int popt){ + this.popt = popt; + } + + public int getPopt(){ + return popt; + } + + public void setNiter(int niter){ + this.niter = niter; + } + + public int getNiter(){ + return niter; + } + + public void setIsx(int[] isx){ + this.isx = isx; + } + + public int[] getIsx(){ + return isx; + } + + public void setX(double[] x){ + this.x = x; + } + + public double[] getX(){ + return x; + } + + public void setProb(double[] prob){ + this.prob = prob; + } + + public double[] getProb(){ + return prob; + } + } + + /** + * No arguments supplied when example runs + */ + private static void usage() { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} + diff --git a/simple_examples/source/int32/G05KFJE.java b/simple_examples/source/int32/G05KFJE.java new file mode 100644 index 0000000..18ce755 --- /dev/null +++ b/simple_examples/source/int32/G05KFJE.java @@ -0,0 +1,105 @@ +import com.nag.routines.G05.G05KF; +import com.nag.routines.G05.G05SA; +import com.nag.routines.Routine; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * G05KFJ example program text. + * @author willa + * @since 27.0.0.0 + */ +public class G05KFJE{ + + /** + * G05KFJ example main program. + */ + public static void main(String[] args){ + //genid, subid only initilised so they can be set in try{} without java throwing error + int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; + int ifail, lstate; + int[] seed, state; + double x[]; + + System.out.println("G05KFJ Example Program Results"); + System.out.println(); + + //No file input given + if(args.length != 1){ + G05KFJE.usage(); + } + + seed = new int[lseed]; + + //Read in data from data fiel + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the base generator information and seed + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + genid = Integer.parseInt(sVal[0]); + subid = Integer.parseInt(sVal[1]); + seed[0] = Integer.parseInt(sVal[2]); + + //Read in sample size + line = reader.readLine(); + sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + lstate = 0; + ifail = 0; + state = new int[lstate]; + + //Initial call to get size of STATE array + G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); + g05kf.eval(); + + //Update local variables + lstate = g05kf.getLSTATE(); + state = g05kf.getSTATE(); + + //Reallocate STATE + state = new int[lstate]; + + //Update object variables + g05kf.setSTATE(state); + g05kf.eval(); + + //Update local variables + state = g05kf.getSTATE(); + + x = new double[n]; + + //Generate the variates + ifail = 0; + G05SA g05sa = new G05SA(n, state, x, ifail); + g05sa.eval(); + + //Display the variates + for(int i = 0; i < x.length; i++){ + System.out.printf("%.4f\n", x[i]); + } + } + + /** + * Print usage information. + */ + private static void usage(){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } +} diff --git a/simple_examples/source/int32/G13AWJE.java b/simple_examples/source/int32/G13AWJE.java new file mode 100644 index 0000000..9e829bd --- /dev/null +++ b/simple_examples/source/int32/G13AWJE.java @@ -0,0 +1,31 @@ +import com.nag.routines.G01.G01EW; +import com.nag.routines.G13.G13AW; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * G13AW example program text. + */ +public class G13AWJE { + + public static void main(String[] args) { + + int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; + double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., + -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., + 88.,122.,126.,114.,85.,64}; + int[] state = new int[1]; + G13AW g13aw = new G13AW(type, p, n, y, ifail); + System.out.println(" G13AWJ Example Program Results\n"); + double ts = g13aw.eval(); + G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); + double pvalue = g01ew.eval(); + ifail = g01ew.getIFAIL(); + if (ifail == 0 || ifail == 201) { + System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); + System.out.printf("associated p-value = %6.3f\n", pvalue); + } + + } + +} diff --git a/simple_examples/source/int32/G13MEJE.java b/simple_examples/source/int32/G13MEJE.java new file mode 100644 index 0000000..a768a46 --- /dev/null +++ b/simple_examples/source/int32/G13MEJE.java @@ -0,0 +1,160 @@ +import com.nag.routines.G13.G13ME; + +/** + * G13MEJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13MEJE{ + + /** + * G13MEJ main program + */ + public static void main(String[] args){ + double tau; + int ifail, lrcomm, m, nb, pn; + double[] iema, rcomm, sinit, t; + int[] inter, nbVal; + + inter = new int[2]; + + System.out.println("G13MEJ Example Program Results"); + System.out.println(); + + //data (can read in from data file) + //Number of iteration required + m = 2; + + //Decay parameter and interpolation method + tau = 2; + inter[0] = 3; + inter[1] = 2; + + //Initial values + sinit = new double[m + 2]; + sinit[0] = 5; + sinit[1] = 0.5; + sinit[2] = 0.5; + sinit[3] = 0.5; + + //Array of NB values in order + nbVal = new int[3]; + nbVal[0] = 5; + nbVal[1] = 10; + nbVal[2] = 15; + + //First block + double[] t1 = new double[nbVal[0]]; + double[] iema1 = new double[nbVal[0]]; + t1[0] = 7.5; + t1[1] = 8.2; + t1[2] = 18.1; + t1[3] = 22.8; + t1[4] = 25.8; + iema1[0] = 0.6; + iema1[1] = 0.6; + iema1[2] = 0.8; + iema1[3] = 0.1; + iema1[4] = 0.2; + + //Second block + double[] t2 = new double[nbVal[1]]; + double[] iema2 = new double[nbVal[1]]; + t2[0] = 26.8; + t2[1] = 31.1; + t2[2] = 38.4; + t2[3] = 45.9; + t2[4] = 48.2; + t2[5] = 48.9; + t2[6] = 57.9; + t2[7] = 58.5; + t2[8] = 63.9; + t2[9] = 65.2; + iema2[0] = 0.2; + iema2[1] = 0.5; + iema2[2] = 0.7; + iema2[3] = 0.1; + iema2[4] = 0.4; + iema2[5] = 0.7; + iema2[6] = 0.8; + iema2[7] = 0.3; + iema2[8] = 0.2; + iema2[9] = 0.5; + + //Third block + double[] t3 = new double[nbVal[2]]; + double[] iema3 = new double[nbVal[2]]; + t3[0] = 66.6; + t3[1] = 67.4; + t3[2] = 69.3; + t3[3] = 69.9; + t3[4] = 73.0; + t3[5] = 75.6; + t3[6] = 77.0; + t3[7] = 84.7; + t3[8] = 86.8; + t3[9] = 88.0; + t3[10] = 88.5; + t3[11] = 91.0; + t3[12] = 93.0; + t3[13] = 93.7; + t3[14] = 94.0; + iema3[0] = 0.2; + iema3[1] = 0.3; + iema3[2] = 0.8; + iema3[3] = 0.6; + iema3[4] = 0.1; + iema3[5] = 0.7; + iema3[6] = 0.9; + iema3[7] = 0.6; + iema3[8] = 0.3; + iema3[9] = 0.1; + iema3[10] = 0.1; + iema3[11] = 0.4; + iema3[12] = 1.0; + iema3[13] = 1.0; + iema3[14] = 0.1; + + //Print some titles + System.out.printf("\t\t\tIterated\n"); + System.out.println("\t\tTime\t EMA\n"); + System.out.println("--------------------------------"); + + lrcomm = 20 + m; + rcomm = new double[lrcomm]; + + pn = 0; + + //Loop through 3 blocks + for(int i = 0; i < nbVal.length; i++){ + //nb for given block + nb = nbVal[i]; + + //Use data for current block + if(i == 0){ + t = t1; + iema = iema1; + } + else if(i == 1){ + t = t2; + iema = iema2; + } + else{ + t = t3; + iema = iema3; + } + + ifail = 0; + G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); + g13me.eval(); + pn = g13me.getPN(); + + //Display results for this block of data + for(int j = 0; j < nb; j++){ + System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); + } + System.out.println(); + } + } +} + diff --git a/simple_examples/source/int32/G13NAJE.java b/simple_examples/source/int32/G13NAJE.java new file mode 100644 index 0000000..2032eb1 --- /dev/null +++ b/simple_examples/source/int32/G13NAJE.java @@ -0,0 +1,123 @@ +import com.nag.routines.G13.G13NA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * G13NAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class G13NAJE{ + + /** + * G13NAJ example main program + */ + public static void main(String[] args){ + double beta = 0; + int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder + double[] param, sparam, y; + int[] tau; + + param = new double[1]; + //Placeholder y to be read in from data file + y = new double[0]; + + System.out.println("G13NAJ Example Program Results"); + System.out.println(); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Read in the problem size + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + n = Integer.parseInt(sVal[0]); + + //Allocate enough size to hold the input series + y = new double[n]; + + //Read in the input series + for(int i = 0; i < 10; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + for(int j = 0; j < 10; j++){ + y[(i * 10) + j] = Double.parseDouble(sVal[j]); + } + } + + //Read in the type of change point, penalty and minimum segment size + line = reader.readLine(); + sVal = line.split("\\s+"); + ctype = Integer.parseInt(sVal[0]); + iparam = Integer.parseInt(sVal[1]); + beta = Double.parseDouble(sVal[2]); + minss = Integer.parseInt(sVal[3]); + + //Read in the distribution parameter (if required) + if(iparam == 1){ + line = reader.readLine(); + sVal = line.split("\\s+"); + param[0] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + System.exit(-2); + } + + //Output arrays + tau = new int[n]; + sparam = new double[(2 * n) + 2]; + + ifail = -1; + + //Call routine to detece change points + G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); + g13na.eval(); + + //update + ifail = g13na.getIFAIL(); + ctype = g13na.getCTYPE(); + ntau = g13na.getNTAU(); + + if(ifail == 0 || ifail == 200 || ifail == 201){ + //Display the results + if(ctype == 5 || ctype == 6){ + //Exponential or Poisson distribtion + System.out.printf(" -- Charge Points -- Distribution\n"); + System.out.printf(" Number Position Parameter \n"); + System.out.println("====================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); + } + + } + else{ + //Normal of Gamma distribution + System.out.printf(" -- Charge Points -- --- Distribution ---\n"); + System.out.printf(" Number Position Parameters\n"); + System.out.println("================================================="); + for(int i = 0; i < ntau; i++){ + System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); + } + } + } + if(ifail == 200 || ifail == 201){ + System.out.println("Some truncation occured internally to avoid overflow"); + } + } +} diff --git a/simple_examples/source/int32/H02BBJE.java b/simple_examples/source/int32/H02BBJE.java new file mode 100644 index 0000000..04f4207 --- /dev/null +++ b/simple_examples/source/int32/H02BBJE.java @@ -0,0 +1,92 @@ +import com.nag.routines.H.H02BB; + +/** + * H02BBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class H02BBJE{ + + /** + * H02BBJ example main program + */ + public static void main(String[] args){ + double bigbnd, objmip = 0, tolfes, toliv; + int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; + double[] a, bl, bu, cvec, rwork, x; + int[] intvar, iwork; + + System.out.println("H02BBJ Example Program Results"); + System.out.println(); + + //Data (can be read in from data file) + n = 2; + m = 3; + lda = m; + + a = new double[lda * n]; + bl = new double[m + n]; + bu = new double[m + n]; + cvec = new double[n]; + x = new double[n]; + intvar = new int[n]; + + itmax = 0; + msglvl = 10; + maxnod = 0; + intfst = 0; + maxdpt = 4; + tolfes = 0; + toliv = 0; + + cvec[0] = -3; + cvec[1] = -4; + + //A = ( 2, 5) + // ( 2, -2) + // ( 3, 2) + a[0] = 2; + a[1] = 2; + a[2] = 3; + a[3] = 5; + a[4] = -2; + a[5] = 2; + + bigbnd = 1E+20; + + bl[0] = 0; + bl[1] = 0; + bl[2] = -1E+20; + bl[3] = -1E+20; + bl[4] = 5; + + bu[0] = 1E+20; + bu[1] = 1E+20; + bu[2] = 15; + bu[3] = 5; + bu[4] = 1E+20; + + intvar[0] = 1; + intvar[1] = 1; + + x[0] = 1; + x[1] = 1; + + liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; + //Math.pow() needs to be casted to int in java + lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); + iwork = new int[liwork]; + rwork = new double[lrwork]; + + ifail = 0; + + H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, + tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); + h02bb.eval(); + } +} + + + + + diff --git a/simple_examples/source/int32/H02DAJE.java b/simple_examples/source/int32/H02DAJE.java new file mode 100644 index 0000000..6e90401 --- /dev/null +++ b/simple_examples/source/int32/H02DAJE.java @@ -0,0 +1,228 @@ +import com.nag.routines.H.H02DA; +import com.nag.routines.H.H02ZK; +import com.nag.routines.H.H02ZL; +import com.nag.routines.X04.X04CA; +import java.util.Arrays; + +/** + * H02DAJ exmaple program text + * @author willa + * @since 27.1.0.0 + */ +public class H02DAJE{ + + /** + * H02DAJ example main program + */ + public static void main(String[] args){ + double acc, accqp = 0, objmip = 0; + int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; + String cvalue; + double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; + int[] iopts, iuser, varcon; + + System.out.println("H02DAJ Example Program Results"); + System.out.println(); + + opts = new double[100]; + ruser = new double[1]; + iopts = new int[200]; + iuser = new int[1]; + + //Blank 40 character string to represent ```Character (40) :: cvalue``` + char[] ch = new char[40]; + Arrays.fill(ch, ' '); + cvalue = new String(ch); + + n = 8; + nclin = 5; + ncnln = 2; + lda = nclin; + + a = new double[lda * n]; + d = new double[nclin]; + ax = new double[nclin]; + bl = new double[n]; + bu = new double[n]; + varcon = new int[n + nclin + ncnln]; + x = new double[n]; + c = new double[ncnln]; + cjac = new double[ncnln * n]; + objgrd = new double[n]; + + //Set variable types: continuous then binary + varcon[0] = 0; + varcon[1] = 0; + varcon[2] = 0; + varcon[3] = 0; + varcon[4] = 1; + varcon[5] = 1; + varcon[6] = 1; + varcon[7] = 1; + + //Set continuous variable bounds + bl[0] = 0; + bl[1] = 0; + bl[2] = 0; + bl[3] = 0; + bu[0] = 1000; + bu[1] = 1000; + bu[2] = 1000; + bu[3] = 1000; + + //Bounds for binary variables need not be provided + bl[4] = 0; + bl[5] = 0; + bl[6] = 0; + bl[7] = 0; + bu[4] = 1; + bu[5] = 1; + bu[6] = 1; + bu[7] = 1; + + //Set linear constraint, equality first + varcon[n] = 3; + varcon[n + 1] = 4; + varcon[n + 2] = 4; + varcon[n + 3] = 4; + varcon[n + 4] = 4; + + //Set Ax=d then Ax>=d + //( 1, 1, 1, 1, 0, 0, 0, 0) + //(-1, 0, 0, 0, 1, 0, 0, 0) + //( 0,-1, 0, 0, 0, 1, 0, 0) + //( 0, 0,-1, 0, 0, 0, 1, 0) + //( 0, 0, 0,-1, 0, 0, 0, 1) + a[0] = 1; + a[1] = -1; + a[5] = 1; + a[7] = -1; + a[10] = 1; + a[13] = -1; + a[15] = 1; + a[19] = -1; + a[21] = 1; + a[27] = 1; + a[33] = 1; + a[39] = 1; + d[0] = 1; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + + //Set constraints supplied by CONFUN, equality first + varcon[n + nclin] = 3; + varcon[n + nclin + 1] = 4; + + liopts = iopts.length; + lopts = opts.length; + + //Initialize communication arrays + ifail = 0; + H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); + h02zk.eval(); + + + //Optimization parameters + maxit = 500; + acc = 0.000001; + + //Initial estimate (binary variables need not be given) + x[0] = 1; + x[1] = 1; + x[2] = 1; + x[3] = 1; + x[4] = 0; + x[5] = 0; + x[6] = 0; + x[7] = 0; + + //Portfolio parameters p and rho + iuser[0] = 3; + ruser[0] = 10; + + ifail = 0; + //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines + objfun objfun1 = new objfun(); + confun confun1 = new confun(); + H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, + objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); + h02da.eval(); + + //Results + ifail = h02da.getIFAIL(); + if(ifail == 0){ + X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); + x04ca.eval(); + + //Query the accuracy of the mixed integer QP Solver + ifail = -1; + H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); + h02zl.eval(); + + //Update values to print + accqp = h02zl.getRVALUE(); + objmip = h02da.getOBJMIP(); + ifail = h02zl.getIFAIL(); + if(ifail == 0){ + System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); + } + System.out.printf("Optimised value:\t%.3f\n", objmip); + } + else{ + System.out.printf("h02daf returns ifail = %d\n", ifail); + } + } + + /** + * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA + */ + public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ + public void eval(){ + if(this.MODE == 0){ + //Objective value + this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) + + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) + + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); + } + else{ + //Objective gradients for continous varaiables + this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); + this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); + this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); + this.OBJGRD[3] = 0; + } + } + } + + /** + * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA + */ + public static class confun extends H02DA.Abstract_H02DA_CONFUN{ + public void eval(){ + if(this.MODE == 0){ + //Constraints + int p = this.IUSER[0]; + double rho = this.RUSER[0]; + + //Mean return rho: + this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; + //Maximum of p assets in portfolio + this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; + } + else{ + //Jacobian + this.CJAC[0] = 8; + this.CJAC[2] = 9; + this.CJAC[4] = 12; + this.CJAC[6] = 7; + //c[2] does not include continuours varaibles which requries that their derivatives are zero + this.CJAC[1] = 0; + this.CJAC[3] = 0; + this.CJAC[5] = 0; + this.CJAC[7] = 0; + } + } + } +} diff --git a/simple_examples/source/int32/M01CCJE.java b/simple_examples/source/int32/M01CCJE.java new file mode 100644 index 0000000..fda5e2f --- /dev/null +++ b/simple_examples/source/int32/M01CCJE.java @@ -0,0 +1,42 @@ +import com.nag.routines.M01.M01CC; +import java.io.*; + +/** + * M01CC example program text. + */ +public class M01CCJE { + + public static void main(String[] args) throws Exception { + + String[] ch; + String order = "Reverse ASCII"; + int m1,m2,l1,l2; + int ifail = 0; + + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); + ch = new String[m2]; + m1 = 1; + for (int i = m1-1; i < m2; ++i) { + ch[i] = dataIn.readLine(); + } + dataIn.close(); + l1 = 7; + l2 = 12; + + System.out.println(" M01CCJ Example Program Results"); + M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); + m01cc.eval(); + ifail = m01cc.getIFAIL(); + System.out.println(); + System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); + System.out.println(); + for (int i = m1-1; i < m2; ++i) { + System.out.println(" "+ch[i]); + } + + } + +} diff --git a/simple_examples/source/int32/S01BAJE.java b/simple_examples/source/int32/S01BAJE.java new file mode 100644 index 0000000..4bf2823 --- /dev/null +++ b/simple_examples/source/int32/S01BAJE.java @@ -0,0 +1,39 @@ +import com.nag.routines.S.S01BA; + +/** + * S01BAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S01BAJE{ + + /** + * S01BAJE main program + */ + public static void main(String[] args){ + double y; + int ifail; + double[] xVal; //data + + //store data + xVal = new double[6]; + xVal[0] = 2.5; + xVal[1] = 0.125; + xVal[2] = -0.906; + xVal[3] = 0.00129; + xVal[4] = -0.00000783; + xVal[5] = 0.000000001; + + System.out.println("S01BAJ Example Program Results"); + System.out.println(); + System.out.printf("\tX\t\tY\n"); + + for(double x : xVal){ + ifail = -1; + S01BA s01ba = new S01BA(x, ifail); + y = s01ba.eval(); + + System.out.printf("\t%.4e\t%.4e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10AAJE.java b/simple_examples/source/int32/S10AAJE.java new file mode 100644 index 0000000..2a0878a --- /dev/null +++ b/simple_examples/source/int32/S10AAJE.java @@ -0,0 +1,40 @@ +import com.nag.routines.S.S10AA; + +/** + * S10AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10AAJE{ + + /** + * S10AAJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[4]; + xVal[0] = -20; + xVal[1] = -5.0; + xVal[2] = 0.5; + xVal[3] = 5.0; + + System.out.println("S10AAJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AA s10aa = new S10AA(x, ifail); + y = s10aa.eval(); + ifail = s10aa.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ABJE.java b/simple_examples/source/int32/S10ABJE.java new file mode 100644 index 0000000..dd84ab7 --- /dev/null +++ b/simple_examples/source/int32/S10ABJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AB; + +/** + * S10ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ABJE{ + + /** + * S10ABJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ABJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AB s10ab = new S10AB(x, ifail); + y = s10ab.eval(); + ifail = s10ab.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S10ACJE.java b/simple_examples/source/int32/S10ACJE.java new file mode 100644 index 0000000..cc0c04c --- /dev/null +++ b/simple_examples/source/int32/S10ACJE.java @@ -0,0 +1,41 @@ +import com.nag.routines.S.S10AC; + +/** + * S10ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S10ACJE{ + + /** + * S10ACJ example main program + */ + public static void main(String[] args){ + double y; + double[] xVal; + int ifail; + + //x values (can be read in from data file) + xVal = new double[5]; + xVal[0] = -10; + xVal[1] = -0.5; + xVal[2] = 0; + xVal[3] = 0.5; + xVal[4] = 25.0; + + System.out.println("S10ACJ Example Program Results"); + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + for(double x : xVal){ + ifail = -1; + S10AC s10ac = new S10AC(x, ifail); + y = s10ac.eval(); + ifail = s10ac.getIFAIL(); + + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } +} diff --git a/simple_examples/source/int32/S14ABJE.java b/simple_examples/source/int32/S14ABJE.java new file mode 100644 index 0000000..673a4b3 --- /dev/null +++ b/simple_examples/source/int32/S14ABJE.java @@ -0,0 +1,71 @@ +import com.nag.routines.S.S14AB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ABJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ABJE{ + + /** + * S14ABJ example main program + */ + public static void main(String[] args){ + double x, y; + int ifail; + + System.out.println("S14ABJ Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\t\tY"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //loop until break + while(true){ + line = reader.readLine(); + + //if finished looping through file break + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[1]); + + ifail = -1; + S14AB s14ab = new S14AB(x, ifail); + y = s14ab.eval(); + //update ifail + ifail = s14ab.getIFAIL(); + + if(ifail < 0){ + break; + } + System.out.printf("\t%.3e\t%.3e\n", x, y); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S14ACJE.java b/simple_examples/source/int32/S14ACJE.java new file mode 100644 index 0000000..e2fff05 --- /dev/null +++ b/simple_examples/source/int32/S14ACJE.java @@ -0,0 +1,68 @@ +import com.nag.routines.S.S14AC; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14ACJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14ACJE{ + + /** + * S14ACJ example main program + */ + public static void main(String[] args){ + double f, x; + int ifail; + + System.out.println("S14ACJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + System.out.println(); + System.out.printf("\tX\tpsi(X)-log(X)\n"); + System.out.println(); + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //Loop until break... + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + + x = Double.parseDouble(sVal[0]); + + ifail = -1; + S14AC s14ac = new S14AC(x, ifail); + f = s14ac.eval(); + ifail = s14ac.getIFAIL(); + + if(ifail < 0){ + break; + } + + System.out.printf("\t%.4f\t%.4f\n", x, f); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S14AFJE.java b/simple_examples/source/int32/S14AFJE.java new file mode 100644 index 0000000..9005cc1 --- /dev/null +++ b/simple_examples/source/int32/S14AFJE.java @@ -0,0 +1,80 @@ +import com.nag.routines.S.S14AF; +import com.nag.routines.Routine; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S14AFJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class S14AFJE{ + + /** + * S14AFJ Example main program + */ + public static void main(String[] args){ + NAGComplex y, z; + int ifail, k; + + //Tell the wrapper the type of complex being used before calling a routine + Routine.setComplex(new NAGComplex()); + + y = new NAGComplex(); + z = new NAGComplex(); + + System.out.println("S14AFJ Example Program Results"); + + //Supply file path as terminal input + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); + + System.out.println(); + System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); + System.out.println(); + + //loop until break... + while(true){ + line = reader.readLine(); + + //end of file reached + if(line == null){ + break; + } + + String[] sVal = line.split("\\s+"); + z.setRe(Double.parseDouble(sVal[0])); + z.setIm(Double.parseDouble(sVal[1])); + k = Integer.parseInt(sVal[2]); + + ifail = -1; + S14AF s14af = new S14AF(z, k, ifail); + y = (NAGComplex) s14af.eval(); + ifail = s14af.getIFAIL(); + + //ifail < 0 => error + if(ifail < 0){ + break; + } + System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} diff --git a/simple_examples/source/int32/S17DCJE.java b/simple_examples/source/int32/S17DCJE.java new file mode 100644 index 0000000..ba01290 --- /dev/null +++ b/simple_examples/source/int32/S17DCJE.java @@ -0,0 +1,69 @@ +import com.nag.routines.S.S17DC; +import com.nag.types.NAGComplex; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class S17DCJE{ + private static int n = 2; + + public static void main(String[] args){ + double fnu; + int ifail, nz = 0; + String scal; + NAGComplex z; + NAGComplex[] cwrk, cy; + + z = new NAGComplex(); + //initiate complex arrays like this to save looping through and doing it manually by looping through + cwrk = NAGComplex.createArray(n); + cy = NAGComplex.createArray(n); + + System.out.println("S17DCF Example Program Results"); + + //Supply file path as argument + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + System.out.println(); + System.out.printf("Calling with N = %d\n", n); + System.out.println(); + System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); + System.out.println(); + + while(true){ + line = reader.readLine(); + if(line == null){ + break; + } + String[] sVal = line.split("\\s+"); + fnu = Double.parseDouble(sVal[0]); + z.setRe(Double.parseDouble(sVal[1])); + z.setIm(Double.parseDouble(sVal[2])); + scal = sVal[3].substring(1,2); + + ifail = 0; + S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); + s17dc.eval(); + + System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + } +} + diff --git a/simple_examples/source/int32/S17DGJE.java b/simple_examples/source/int32/S17DGJE.java new file mode 100644 index 0000000..b93c9e0 --- /dev/null +++ b/simple_examples/source/int32/S17DGJE.java @@ -0,0 +1,61 @@ +import com.nag.routines.S.S17DG; +import com.nag.types.NAGComplex; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * S17DG example program text. + */ +public class S17DGJE { + + public static void main(String[] args) throws Exception { + String deriv,scal; + int ifail = 1; + NAGComplex z,ai; + int nz = -1; + z = new NAGComplex(); + ai = new NAGComplex(); + ai.setRe(Double.NaN); + ai.setIm(Double.NaN); + + System.out.println(" S17DGJ Example Program Results"); + BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); + + dataIn.readLine(); + System.out.println(); + System.out.println(" DERIV Z SCAL AI NZ"); + System.out.println(); + String line = dataIn.readLine(); + Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," + + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); + Matcher m; + S17DG s17dg = new S17DG(); + while (line != null) { + m = linePatt.matcher(line); + if (m.matches()) { + deriv = m.group(1); + z.setRe(Double.parseDouble(m.group(2))); + z.setIm(Double.parseDouble(m.group(3))); + scal = m.group(4); + ifail = 1;// SOFT AND SILENT FAILURE + s17dg.eval(deriv,z,scal,ai,nz,ifail); + if (s17dg.getIFAIL() == 0) { + System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", + s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), + s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); + } + else { + System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); + System.exit(-1); + } + } + else { + System.out.println("Can't match:\n"+line); + } + line = dataIn.readLine(); + } + + } + +} diff --git a/simple_examples/source/int32/S30AAJE.java b/simple_examples/source/int32/S30AAJE.java new file mode 100644 index 0000000..7e01ffe --- /dev/null +++ b/simple_examples/source/int32/S30AAJE.java @@ -0,0 +1,109 @@ +import com.nag.routines.S.S30AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * S30AAJ Example program text + * @author willa + * @since 27.1.0.0 + */ +public class S30AAJE{ + + /** + * S30AAJ main program + */ + public static void main(String[] args){ + double q = 0, r = 0, s = 0, sigma = 0; + int ifail, ldp, m = 0, n = 0; + String calput = ""; //placeholders + double[] p, t, x; + + //placeholders + t = new double[0]; + x = new double[0]; + + System.out.println("S30AAJ Example Program Results"); + + //Supply file path as arugment + if(args.length != 1){ + System.out.println("Please specify path to data file"); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + calput = sVal[0].substring(1,2); + + line = reader.readLine(); + sVal = line.split("\\s+"); + s = Double.parseDouble(sVal[0]); + sigma = Double.parseDouble(sVal[1]); + r = Double.parseDouble(sVal[2]); + q = Double.parseDouble(sVal[3]); + + line = reader.readLine(); + sVal = line.split("\\s+"); + m = Integer.parseInt(sVal[0]); + n = Integer.parseInt(sVal[1]); + + t = new double[n]; + x = new double[m]; + + for(int i = 0; i < m; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + x[i] = Double.parseDouble(sVal[0]); + } + for(int i = 0; i < n; i++){ + line = reader.readLine(); + sVal = line.split("\\s+"); + t[i] = Double.parseDouble(sVal[0]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + ldp = m; + p = new double[ldp * n]; + + ifail = 0; + S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); + s30aa.eval(); + + System.out.println(); + System.out.println("Black-Scholes-Merton formula"); + + if(calput.toLowerCase().equals("c")){ + System.out.println("European Call : "); + } + else if(calput.toLowerCase().equals("p")){ + System.out.println("European Put : "); + } + + System.out.printf(" Spot =\t%.4f\n", s); + System.out.printf(" Volatility =\t%.4f\n", sigma); + System.out.printf(" Rate =\t%.4f\n", r); + System.out.printf(" Dividend =\t%.4f\n", q); + + System.out.println(); + System.out.printf(" Strike\tExpiry\tOption Price\n"); + for(int i = 0; i < m; i++){ + for(int j = 0; j < n; j++){ + System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); + } + } + } +} + diff --git a/simple_examples/source/int32/S30ACJE.java b/simple_examples/source/int32/S30ACJE.java new file mode 100644 index 0000000..8d994dc --- /dev/null +++ b/simple_examples/source/int32/S30ACJE.java @@ -0,0 +1,129 @@ +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +import com.nag.routines.S.S30AC; + +/** + * S30AC example program text. + */ +public class S30ACJE { + + public static void main(String[] args) { + + int i, ifail, mode = 0, n = 0; + String calput; + + double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; + int[] ivalid = null; + + // Strings must be length expected by Fortran + calput = getBlankString(1); + + /* Header */ + System.out.println(" S30ACJ Example Program Results"); + + // Specify path to data file + if (args.length != 1) { + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try { + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); // skip header + + System.out.println(); + System.out.println(" SIGMA IVALID"); + System.out.println(); + + line = reader.readLine(); + String[] sVal = line.trim().split("\\s+"); + calput = sVal[0].replaceAll("\'", ""); + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + n = Integer.parseInt(sVal[0]); + mode = Integer.parseInt(sVal[1]); + + line = reader.readLine(); // skip empty line + + p = new double[n]; + k = new double[n]; + s0 = new double[n]; + t = new double[n]; + r = new double[n]; + sigma = new double[n]; + ivalid = new int[n]; + + // Read p, k, s0, t and r from data file + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + p[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + k[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + s0[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + t[i] = Double.parseDouble(sVal[i]); + } + + line = reader.readLine(); + sVal = line.trim().split("\\s+"); + for (i = 0; i < n; i++) { + r[i] = Double.parseDouble(sVal[i]); + } + + } catch (FileNotFoundException e) { + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } catch (IOException e) { + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + // Find the implied volatilities, sigma + ifail = 0; + S30AC s30ac = new S30AC(); + s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); + + // Print solution + for (i = 0; i < n; i++) { + System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); + } + + } + + /** + * Returns a new String, filled with spaces to the specified length. + * + * @param len the required length of the String + * @return a blank String of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } +} diff --git a/simple_examples/source/int32/X03AAJE.java b/simple_examples/source/int32/X03AAJE.java new file mode 100644 index 0000000..b03f1ab --- /dev/null +++ b/simple_examples/source/int32/X03AAJE.java @@ -0,0 +1,87 @@ +import com.nag.routines.X03.X03AA; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * X03AAJ example program text. + * @author willa + * @since 27.1.0.0 + */ +public class X03AAJE{ + + /** + * X03AAJ example main program. + */ + public static void main(String[] args){ + int n = 3; + double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder + int ifail, isizea, isizeb, istepa, istepb; + boolean sw; + double[] a, b; + + a = new double[n * n]; + b = new double[n]; + + System.out.println("X03AAF Example Program Results"); + System.out.println(); + + if(args.length != 1){ + System.err.println("Please specify the path to the data file."); + System.exit(-1); + } + + String filename = args[0]; + try{ + BufferedReader reader = new BufferedReader(new FileReader(filename)); + String line = reader.readLine(); //skip header + + //stored column wise + //a = (-2, -3, 7) + // ( 2, -5, 3) + // (-9, 1, 0) + for(int i = 0; i < n; i++){ + line = reader.readLine(); + String[] sVal = line.split("\\s+"); + for(int j = 0; j < n; j++){ + a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); + } + } + + line = reader.readLine(); + for(int i = 0; i < n; i++){ + String[] sVal = line.split("\\s+"); + b[i] = Double.parseDouble(sVal[i + 1]); + } + } + catch(FileNotFoundException e){ + System.err.println("***FATAL: Can't find " + filename); + System.exit(-2); + } + catch(IOException e){ + System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); + } + + + c1 = 1; + c2 = 0; + isizea = n; + isizeb = n; + istepa = 1; + istepb = 1; + sw = true; + + ifail = 0; + X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); + x03aa.eval(); + + //update + c1 = x03aa.getC1(); + c2 = x03aa.getC2(); + d1 = x03aa.getD1(); + d2 = x03aa.getD2(); + + System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); + } +} diff --git a/simple_examples/source/int32/X04CBJE.java b/simple_examples/source/int32/X04CBJE.java new file mode 100644 index 0000000..fa77c3a --- /dev/null +++ b/simple_examples/source/int32/X04CBJE.java @@ -0,0 +1,53 @@ +import com.nag.routines.X04.X04CB; + +/** + * X04CBJ example program text + * @author willa + * @since 27.1.0.0 + */ +public class X04CBJE{ + + /** + * X04CBJ example main program + */ + public static void main(String[] args){ + int nmax = 5, lda = nmax, ifail, indent, ncols; + double[] a; + + a = new double[lda * nmax]; + + String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; + String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; + + System.out.println("X04CBJ Example Program Results"); + System.out.println(); + + //generate an array of data + for(int i = 0; i < nmax; i++){ + for(int j = 0; j < lda; j++){ + a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); + } + } + + ncols = 80; + indent = 0; + + //Print 3 by nmax rectangular matrix with default format and integer row and column labels + ifail = 0; + X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", + clabs, ncols, indent, ifail); + x04cb.eval(); + System.out.println(); + + //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels + ifail = 0; + x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", + clabs, ncols, indent, ifail); + System.out.println(); + + //Print 3 by nmax lower triangular matrix in MATLAB format + //Row and column labelling is ignored + ifail = 0; + x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); + } +} diff --git a/simple_examples/source/int32/X05ABJE.java b/simple_examples/source/int32/X05ABJE.java new file mode 100644 index 0000000..acb3804 --- /dev/null +++ b/simple_examples/source/int32/X05ABJE.java @@ -0,0 +1,25 @@ +import com.nag.routines.X05.X05AB; + +/** + * X05AB example program text. + */ +public class X05ABJE { + + public static void main(String[] args) { + + int[] itime = new int[7]; + + itime[0] = 1789; + itime[1] = 7; + itime[2] = 14; + itime[3] = 13; + itime[4] = 11; + itime[5] = 48; + itime[6] = 320; + + System.out.println(" X05ABJ Example Program Results"); + System.out.println((new X05AB(itime)).eval()); + + } + +} diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java new file mode 100644 index 0000000..490c163 --- /dev/null +++ b/simple_examples/source/int64/A00AAJE.java @@ -0,0 +1,14 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AA; +import com.nag.routines.Routine; + +public class A00AAJE { + + public static void main (String[] args) throws NAGBadIntegerException { + Routine.init(); + A00AA a00aa = new A00AA(); + System.out.println(" A00AAJ Example Program Results\n"); + a00aa.eval(); + } + +} diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java new file mode 100644 index 0000000..8250321 --- /dev/null +++ b/simple_examples/source/int64/A00ADJE.java @@ -0,0 +1,113 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.A00.A00AD; +import com.nag.routines.Routine; +import java.util.Arrays; + +public class A00ADJE { + + /* Parameters */ + public static final int MSGLEN = 15; + + /** A00ADJ Example Program */ + public static void main (String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + int i; + long mkmaj, mkmin; + boolean licval; + String fcomp = getBlankString(80), hdware = getBlankString(80), + impl = getBlankString(80), opsys = getBlankString(80), + pcode = getBlankString(80), prec = getBlankString(80), + vend = getBlankString(80); + /* Local Arrays */ + int[] itime = new int[7]; + String[] msg = new String[MSGLEN]; + + // Instantiate arguments + mkmaj = 0; + mkmin = 0; + licval = false; + // Strings must be length expected by Fortran + fcomp = getBlankString(80); + hdware = getBlankString(80); + impl = getBlankString(80); + opsys = getBlankString(80); + pcode = getBlankString(80); + prec = getBlankString(80); + vend = getBlankString(80); + for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); + + Routine.init(); + System.out.println(" A00ADJ Example Program Results\n"); + + A00AD a00ad = new A00AD(); + a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); + impl = a00ad.getIMPL(); + prec = a00ad.getPREC(); + pcode = a00ad.getPCODE(); + mkmaj = a00ad.getMKMAJ(); + mkmin = a00ad.getMKMIN(); + hdware = a00ad.getHDWARE(); + opsys = a00ad.getOPSYS(); + fcomp = a00ad.getFCOMP(); + vend = a00ad.getVEND(); + licval = a00ad.getLICVAL(); + + /* Print implementation details */ + + System.out.println("*** Start of NAG Library implementation details ***"); + System.out.println(); + System.out.println("Implementation title: " + impl.trim()); + System.out.println(" Precision: " + prec.trim()); + System.out.println(" Product code: " + pcode.trim()); + + if (mkmin < 10) { + System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); + } + else { + System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); + } + + if (vend.trim().equals("(self-contained)")) { + System.out.println(" Vendor Library: None"); + } + else { + System.out.println(" Vendor Library: " + vend.trim()); + } + + System.out.println("Applicable to:"); + System.out.println(" hardware: " + hdware.trim()); + System.out.println(" operating system: " + opsys.trim()); + System.out.println(" Fortran compiler: " + fcomp.trim()); + System.out.println("and compatible systems."); + + if (!licval) { + System.out.println(" Licence query: Unsuccessful"); + } + else { + System.out.println(" Licence query: Successful"); + } + + System.out.println(); + System.out.println("*** End of NAG Library implementation details ***"); + + } + + /** + * Returns a new String, filled with spaces to the specified length + * + * @param len the required length of the String + * @returns a String of spaces of the specified length + */ + public static String getBlankString(int len) { + + if (len > 0) { + char[] arr = new char[len]; + Arrays.fill(arr, ' '); + return new String(arr); + } + + return ""; + + } + +} diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java new file mode 100644 index 0000000..a3bd5f1 --- /dev/null +++ b/simple_examples/source/int64/C05AYJE.java @@ -0,0 +1,45 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AY; +import com.nag.routines.Routine; + + +public class C05AYJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + C05AY c05ay = new C05AY(); + OBJFUN f = new OBJFUN(); + double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; + long ifail = 0; + long[] iuser = new long[1]; + double[] ruser = new double[1]; + + System.out.println("C05AYJ Example Program Results"); + System.out.println(); + + Routine.init(); + c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); + x = c05ay.getX(); + + switch ((int)ifail) { + case 0: + System.out.printf("Zero at x = %12.5f\n", x); + break; + case 2: case 3: + System.out.printf("Final point = %12.5f\n", x); + break; + default: + System.out.println("Unexpected ifail = " + ifail); + } + + } + + private static class OBJFUN extends C05AY.Abstract_C05AY_F { + + public double eval() { + return Math.exp(-X) - X; + } + + } + +} diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java new file mode 100644 index 0000000..bec1b03 --- /dev/null +++ b/simple_examples/source/int64/C05AZJE.java @@ -0,0 +1,65 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05AZ; +import com.nag.routines.Routine; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class C05AZJE { + + public static void main (String[] args)throws NAGBadIntegerException{ + double tolx = 0.00001, x = 0.0, y = 1.0, fx; + long ir = 0, ind = 1, ifail = -1; + double[] c = new double[17]; + boolean keepOn = true; + + Routine.init(); + + C05AZ c05az = new C05AZ(); + fx = fun(x); + int ite = 0; + + System.out.println(" C05AZJ Example Program Results\n"); + System.out.println(" Iterations\n"); + while (keepOn) { + ++ite; + + c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); + + x = c05az.getX(); + y = c05az.getY(); + tolx = c05az.getTOLX(); + ir = c05az.getIR(); + ind = c05az.getIND(); + ifail = c05az.getIFAIL(); + + if(ind == 0){ + keepOn = false; + } + else{ + fx = fun(x); + System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); + } + } + + + + switch ((int)ifail) { + case 0: + System.out.println("\n Solution\n"); + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + case 4: + case 5: + System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); + break; + default: + System.out.printf("Unexpected error ifail=%d\n",ifail); + } + } + + private static double fun(double x) { + double res = (Math.expm1(-x) + 1) - x; + return res; + } + +} diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java new file mode 100644 index 0000000..08dd454 --- /dev/null +++ b/simple_examples/source/int64/C05MBJE.java @@ -0,0 +1,104 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.C05.C05MB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.X02.X02AJ; + +/** + * C05MBJ Example Program Text + * @author joed + * @since 27.0 + */ + /* ** There have been at least 200*(n+1) calls to fcn. + ** Consider restarting the calculation from the point held in x. + ** ABNORMAL EXIT from NAG Library routine + ** NAG soft failure - control returned +*/ +public class C05MBJE { + + private static final int n = 4; + + private static class FCN extends C05MB.Abstract_C05MB_FCN { + + public void eval() { + + FVEC[0] = Math.cos(X[2]) - X[0]; + FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; + FVEC[2] = Math.sin(X[0]) - X[2]; + FVEC[3] = Math.pow(X[1], 2) - X[3]; + + // Set iflag negative to terminate execution for any reason + IFLAG = 0; + + return; + + } + + } + + /** + * C05MBJ Example Main Program + */ + public static void main(String[] args) throws NAGBadIntegerException { + + C05MB c05mb = new C05MB(); + DNRM2 dnrm2 = new DNRM2(); + X02AJ x02aj = new X02AJ(); + FCN fcn = new FCN(); + long cpuser; + double atol, cndtol, fnorm, machpr, rtol; + long astart, ifail, m; + int i; + double[] fvec, x; + double[] ruser = new double[1]; + long[] iuser = new long[1]; + + System.out.println("C05MBJ Example Program Results\n"); + + // Initialise NAG for Java + Routine.init(); + + // Get machine precision from X02AJ + machpr = (new X02AJ()).eval(); + + fvec = new double[n]; + x = new double[n]; + + // The following starting values provide a rough solution + x = new double[]{2.0, 0.5, 2.0, 0.5}; + + m = 2; + atol = Math.sqrt(machpr); + rtol = Math.sqrt(machpr); + cndtol = 0.0; + astart = 0; + cpuser = 0; + + ifail = -1; + c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, + cpuser, ifail); + ifail = c05mb.getIFAIL(); + + if (ifail==0 || ifail==8 || ifail==9) { + if (ifail==0) { + // The NAG name equivalent of dnrm2 is f06ej + fnorm = dnrm2.eval(n, fvec, 1); + System.out.println(); + System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); + System.out.println(); + System.out.println("Final approximate solution"); + } + else { + System.out.println(); + System.out.println("Approximate solution"); + } + System.out.println(); + for (i = 1; i <= n; i++) { + System.out.printf("%12.4f", x[i-1]); + } + System.out.printf("\n"); + } + + } + +} diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java new file mode 100644 index 0000000..d7a6435 --- /dev/null +++ b/simple_examples/source/int64/C05QBJE.java @@ -0,0 +1,178 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.C05.C05QB; +import com.nag.routines.F06.DNRM2; +import com.nag.routines.Routine; +import com.nag.routines.X02.X02AJ; + +/** + * + * @author ludovic + */ +public class C05QBJE { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws NAGBadIntegerException { + try { + Routine.init(); + + C05QB c05qb = new C05QB(); + + System.out.println(" C05QBJ Example Program Results"); + + int n = 9, ifail = -1; + + double xtol, fnorm; + + long[] IUSER = new long[1]; + double[] fvec = new double[n]; + double[] x = new double[n]; + double[] RUSER = new double[1]; + + + FCN fcn = new FCN(); + + for (int i = 0; i < n; ++i) { + x[i] = -1.0; + } + + xtol = Math.sqrt((new X02AJ()).eval()); + + c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); + + ifail = (int)c05qb.getIFAIL(); + + switch (ifail) { + case (0): + fnorm = (new DNRM2(n, fvec, 1)).eval(); + System.out.println(); + System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); + System.out.println(); + System.out.println(" Final approximate solution"); + int count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + break; + case (2): + case (3): + case (4): + System.out.println("Approximate solution"); + count = 0; + for (int i = 0; i < n; ++i) { + System.out.printf(" %12.4f", x[i]); + ++count; + if(count == 3){ + System.out.println(); + count = 0; + } + } + + break; + } + + } catch (NAGBadIntegerException ex) { + System.err.println("Something went wrong!\n" + ex.getMessage()); + } + + + } + + public static class FCN implements C05QB.C05QB_FCN { + + private long N, IFLAG; + private double[] X, FVEC, RUSER; + private long[] IUSER; + + //@Override + public void setN(long N) { + this.N = N; + } + + //@Override + public long getN() { + return N; + } + + //@Override + public void setX(double[] X) { + this.X = X; + } + + //@Override + public double[] getX() { + return X; + } + + //@Override + public void setFVEC(double[] FVEC) { + this.FVEC = FVEC; + } + + //@Override + public double[] getFVEC() { + return FVEC; + } + + //@Override + public void setIUSER(long[] IUSER) { + this.IUSER = IUSER; + } + + //@Override + public long[] getIUSER() { + return IUSER; + } + + //@Override + public void setRUSER(double[] RUSER) { + this.RUSER = RUSER; + } + + //@Override + public double[] getRUSER() { + return RUSER; + } + + //@Override + public void setIFLAG(long IFLAG) { + this.IFLAG = IFLAG; + } + + //@Override + public long getIFLAG() { + return IFLAG; + } + + //@Override + public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { + /* + * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp + * fvec(2:n) = fvec(2:n) - x(1:(n-1)) + * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) + */ + for (int i = 0; i < N; ++i) { + FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; + /*if (i >= 1) { + FVEC[i] = FVEC[i] - X[i - 1]; + } + if (i < N - 1) { + FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; + }*/ + } + for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { + System.out.println("Warning - requested accuracy may not have been achieved"); + } + + } + + + public static class D01BDJE_FUN implements D01BD.D01BD_F { + + private double x; + + public double eval(double x) { + return (x * x * Math.sin(10.0 * Math.PI * x)); + } + + public double getX() { + return x; + } + + public void setX(double d) { + x = d; + } + + + } + +} diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java new file mode 100644 index 0000000..b32ae64 --- /dev/null +++ b/simple_examples/source/int64/D02NEJE.java @@ -0,0 +1,393 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.Routine; +import com.nag.routines.D02.D02MC; +import com.nag.routines.D02.D02MW; +import com.nag.routines.D02.D02NE; +import com.nag.routines.D02.D02NEZ; +import com.nag.routines.D02.D02NP; + + +/** + * @author joed + */ +public class D02NEJE { + + public static final double ALPHA = 0.04; + public static final double BETA = 1.0E4; + public static final double GAMMA = 3.0E7; + public static final int ML = 1; + public static final int MU = 2; + public static final int NEQ1 = 3; + public static final int NEQ2 = 1; + + public static JAC1 jac1 = new JAC1(); + public static JAC2 jac2 = new JAC2(); + public static RES1 res1 = new RES1(); + public static RES2 res2 = new RES2(); + + public static void main(String[] args) throws NAGBadIntegerException { + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02NEJ Example Program Results"); + + ex1(); + ex2(); + + } + + private static void ex1() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + D02NP d02np = new D02NP(); + double h0, hmax, t, tout; + long ifail, itask, maxord, ijac, itol, licom, neq, lcom; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[3]; + + System.out.println(); + System.out.println(" D02NEF Example 1"); + System.out.println(); + + maxord = 5; + + neq = NEQ1; + lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq + + 2 * (neq / (ML + MU + 1) + 1); + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + Arrays.fill(rtol, 1.0E-3); + Arrays.fill(atol, 1.0E-6); + Arrays.fill(ydot, 0.0); + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Set initial values + y[0] = 1.0; + y[1] = 0.0; + y[2] = 0.0; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.02; + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Specify that the Jacobian is banded. + ifail = 0; + d02np.eval(neq, ML, MU, icom, licom, ifail); + ifail = d02np.getIFAIL(); + + // Use the iuser array to pass the band dimensions through to jac. + // An alternative would be to hard code values for ml and mu in jac. + iuser[0] = ML; + iuser[1] = MU; + iuser[2] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" Y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + // Obtain the solution at 5 equally spaced values of T. + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.02; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + private static void ex2() { + D02MC d02mc = new D02MC(); + D02MW d02mw = new D02MW(); + D02NE d02ne = new D02NE(); + double h0, hmax, t, tout; + long ifail, ijac, itask, itol, lcom, licom, maxord, neq; + String jceval; // length 8 + double[] atol, com, rtol, y, ydot, ruser; + long[] icom, iuser; + + ruser = new double[1]; + iuser = new long[1]; + + System.out.println(); + System.out.println(" D02NEF Example 2"); + System.out.println(); + + maxord = 5; + neq = NEQ2; + lcom = 40 + (maxord + 4) * neq + neq * neq; + licom = 50 + neq; + + atol = new double[(int)neq]; + com = new double[(int)lcom]; + rtol = new double[(int)neq]; + y = new double[(int)neq]; + ydot = new double[(int)neq]; + icom = new long[(int)licom]; + + ijac = 1; + itol = 1; + rtol[0] = 0.0; + atol[0] = 1.0E-8; + ydot[0] = 0.0; + + // String length = 8 + jceval = (ijac == 1) ? "Analytic" : "Numeric "; + + // Initialize the problem, specifying that the Jacobian is to be + // evaluated analytically using the provided routine jac. + y[0] = 2.0; + hmax = 0.0; + h0 = 0.0; + t = 0.0; + tout = 0.2; + + ifail = 0; + d02mw.eval( + neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail + ); + ifail = d02mw.getIFAIL(); + + // Use the iuser array to pass whether numerical or analytic Jacobian + // is to be used. + iuser[0] = ijac; + + System.out.printf(" t "); + for (int i = 1; i <= neq; i++) { + System.out.printf(" y(%1d) ", i); + } + System.out.println(); + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + itask = 0; + + for (int j = 0; j < 5; j++) { + ifail = -1; + d02ne.eval( + neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, + com, lcom, iuser, ruser, ifail + ); + itask = d02ne.getITASK(); + ifail = d02ne.getIFAIL(); + t = d02ne.getT(); + + System.out.printf(" %8.4f ", t); + for (int i = 0; i < neq; i++) { + System.out.printf("%12.6f", y[i]); + } + System.out.println(); + + if (ifail != 0) { + System.out.printf( + " ** D02NEF returned with IFAIL = %5d\n", ifail + ); + break; + } + + tout += 0.2; + d02mc.eval(icom); + + } + + System.out.println(); + System.out.printf( + " The integrator completed task, ITASK = %4d\n", itask + ); + + } + + /** + * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based + * Java index. + * + * Fortran array definition: + * a(dimX, *) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static long getIdx(long x, long y, long dimX) { + return ((y-1) * dimX) + (x-1); + } + + public static class RES1 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + + this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) + - this.YDOT[0]; + this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) + - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; + this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; + + } + + } + + public static class JAC1 extends D02NE.Abstract_D02NE_JAC { + + private double[] myjac1( + long neq, long ml, long mu, double t, double[] y, double[] ydot, + double[] pd, double cj + ) { + + long md, ms, pd_dim1; + + pd_dim1 = (2 * ml) + mu + 1; + + // Main diagonal pdfull(i,i), i=1, neq + md = mu + ml + 1; + pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; + pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) + - cj; + pd[(int)getIdx(md, 3, pd_dim1)] = -cj; + + // 1 subdiagonal pdfull(i-1,i), i=2, neq + ms = md + 1; + pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; + pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; + + // First superdiagonal pdfull(i-1,i), i=2, neq + ms = md - 1; + pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; + pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; + + // Second superdiagonal pdfull(i-2,i), i=3, neq + ms = md - 2; + pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; + + return pd; + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac, ml, mu; + + ml = this.IUSER[0]; + mu = this.IUSER[1]; + ijac = this.IUSER[2]; + + if (ijac == 1) { + myjac1( + this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, + this.CJ + ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + + public static class RES2 extends D02NE.Abstract_D02NE_RES { + + public void eval() { + this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) + + (this.T * 0.1E0 * Math.exp(this.Y[0])); + } + + } + + public static class JAC2 extends D02NE.Abstract_D02NE_JAC { + + private void myjac2( + long neq, double t, double[] y, double[] ydot, double[] pd, + double cj + ) { + + pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); + + } + + public void eval() { + D02NEZ d02nez = new D02NEZ(); + long ijac; + + ijac = this.IUSER[0]; + + if (ijac == 1) { + myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); + } + else { + d02nez.eval( + this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, + this.IUSER, this.RUSER + ); + } + + } + + } + +} diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java new file mode 100644 index 0000000..d1feabb --- /dev/null +++ b/simple_examples/source/int64/DTFSMJE.java @@ -0,0 +1,61 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F01.DTRTTF; +import com.nag.routines.F06.DTFSM; +import com.nag.routines.X04.X04CA; +import com.nag.routines.Routine; + +/** + * Adapted from f06wbfe.f90 + * + * @author joed + * + */ +public class DTFSMJE { + + public static void main(String[] args) throws NAGBadIntegerException { + + double alpha = 4.21; + long ifail = 0, info = 0, m = 6, n = 4; + String side = "L", trans = "N", transr = "N", uplo = "L"; + + // Init NAG Java + DTFSM dtfsm = new DTFSM(); + DTRTTF dtrttf = new DTRTTF(); + X04CA x04ca = new X04CA(); + Routine.init(); + + System.out.println(" DTFSMJ Example Program Results\n"); + + // Set lower triangle of matrix A + double[] a = new double[(int)(m*m)]; + for (int i=0; i=i) ? j+1 : 0; + } + } + + // Set matrix B + double[] b = new double[] { + 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, + 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, + 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, + 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 + }; + + // Convert A to rectangular full packed storage in ar + double[] ar = new double[((int)(m*(m+1)))/2]; + info = 0; + dtrttf.eval(transr, uplo, m, a, m, ar, info); + info = dtrttf.getINFO(); + + // Perform the matrix-matrix operation + dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); + + // Print result + ifail = 0; + x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); + ifail = x04ca.getIFAIL(); + + } + +} diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java new file mode 100644 index 0000000..89a89e4 --- /dev/null +++ b/simple_examples/source/int64/E01DAJE.java @@ -0,0 +1,177 @@ +/* + * E01DA Example Program - NAG Copyright 2016 + */ + import com.nag.exceptions.NAGBadIntegerException; + import com.nag.routines.E01.E01DA; + import com.nag.routines.E02.E02DF; + import com.nag.routines.Routine; + +public class E01DAJE { + + public static void main (String[] args)throws NAGBadIntegerException { + Routine.init(); + + int mx = 7, my = 6, ifail = -1; + double[] x = new double[mx]; + double[] y = new double[my]; + double[] f = new double[mx*my]; + double[] lamda = new double[mx+4]; + double[] mu = new double[my+4]; + double[] c = new double[mx*my]; + double[] wrk = new double[(mx+6)*(my+6)]; + + int nx = 6, ny = 6, px = 0, py = 0; + double xlo = 1.0, xhi = 2.0; + double ylo = 0.0, yhi = 1.0; + + E01DA e01da = new E01DA(); + + // Input X, Y and function values on X-Y grid + x[0] = 1.00; + x[1] = 1.10; + x[2] = 1.30; + x[3] = 1.50; + x[4] = 1.60; + x[5] = 1.80; + x[6] = 2.00; + + y[0] = 0.00; + y[1] = 0.10; + y[2] = 0.40; + y[3] = 0.70; + y[4] = 0.90; + y[5] = 1.00; + + // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx + // and r=1,2,...,my. + f[0] = 1.00; + f[1] = 1.10; + f[2] = 1.40; + f[3] = 1.70; + f[4] = 1.90; + f[5] = 2.00; + f[6] = 1.21; + f[7] = 1.31; + f[8] = 1.61; + f[9] = 1.91; + f[10] = 2.11; + f[11] = 2.21; + f[12] = 1.69; + f[13] = 1.79; + f[14] = 2.09; + f[15] = 2.39; + f[16] = 2.59; + f[17] = 2.69; + f[18] = 2.25; + f[19] = 2.35; + f[20] = 2.65; + f[21] = 2.95; + f[22] = 3.15; + f[23] = 3.25; + f[24] = 2.56; + f[25] = 2.66; + f[26] = 2.96; + f[27] = 3.26; + f[28] = 3.46; + f[29] = 3.56; + f[30] = 3.24; + f[31] = 3.34; + f[32] = 3.64; + f[33] = 3.94; + f[34] = 4.14; + f[35] = 4.24; + f[36] = 4.00; + f[37] = 4.10; + f[38] = 4.40; + f[39] = 4.70; + f[40] = 4.90; + f[41] = 5.00; + + System.out.printf(" E01DAJ Example Program Results\n\n"); + e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); + + ifail = (int)e01da.getIFAIL(); + switch (ifail) + { + case 0: + System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); + for (int i = 3; i <= Math.max(mx,my); ++i) + { + if (i <= mx) + System.out.printf("%4d %9.4f", i+1, lamda[i]); + else + System.out.printf(" "); + if (i <= my) + System.out.printf("%8d %9.4f\n", i+1, mu[i]); + else + System.out.printf("\n"); + } + System.out.printf("\n The B-Spline coefficients:\n"); + for (int i = 0; i < mx*my; ++i) + { + System.out.printf("%9.4f", c[i]); + if ((i+1)%8 == 0) + System.out.printf("\n"); + } + System.out.printf("\n"); + break; + default: + System.out.printf("\n Error detected by E01DA: %d\n", ifail); + } + + /* Evaluate the spline on a regular rectangular grid at nx*ny points + over the domain [xlo,xhi] x [ylo,yhi]. */ + px = (int)e01da.getPX(); + py = (int)e01da.getPY(); + int liwrk; + int lwrk = Math.min(4*nx+px,4*ny+py); + if (4*nx+px>4*ny+py) + liwrk = ny + py - 4; + else + liwrk = nx + px - 4; + double tx[] = new double[nx]; + double ty[] = new double[ny]; + double ff[] = new double[nx*ny]; + wrk = new double[lwrk]; + long iwrk[] = new long[liwrk]; + + /* Generate nx/ny equispaced x/y co-ordinates */ + double step = (xhi-xlo)/(nx-1); + tx[0] = xlo; + for (int i = 1; i 0) ? datafile.n : 1; + + // This particular example problem is of type QP2 with H stored explicitly, + // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below + ldh = datafile.n; + + if (datafile.nclin > 0) { + lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; + } + else { + lwork = datafile.n * datafile.n + 8 * datafile.n; + } + + istate = new long[(int)(datafile.n + datafile.nclin)]; + ax = new double[(int)Math.max(1, datafile.nclin)]; + iwork = new long[(int)liwork]; + // h, bl, bu, cvec, x, a: already read from data file + clamda = new double[(int)(datafile.n + datafile.nclin)]; + work = new double[(int)lwork]; + + // Init routine + E04WB e04wb = new E04WB(); + long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; + String[] cwsav = new String[(int)lcwsav]; + cwsav[0] = " "; + long[] iwsav = new long[(int)liwsav]; + boolean[] lwsav = new boolean[(int)llwsav]; + double[] rwsav = new double[(int)lrwsav]; + ifail = 0; + e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); + + // Set print level to match E04NFF example output + E04NH e04nh = new E04NH(); + int inform = 0; + e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); + + // Solve the problem + E04NF e04nf = new E04NF(); + double[] ruser = new double[1]; + long[] iuser = new long[1]; + iter = 0; + obj = Double.NaN; + ifail = 0; + e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, + datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, + datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, + iuser, ruser, lwsav, iwsav, rwsav, ifail); + + ifail = e04nf.getIFAIL(); + + } catch (Exception ex) { + Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** Using E54NFU as a default */ + public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { + + public void eval() { + + super.eval(); + + } + + } + + public static class DataFile { + + public String filename; + public long n, nclin, lda, sda, ldh; + public double[] cvec, a, bl, bu, x, h; + + public DataFile(String filename) { + this.filename = filename; + } + + public void read() throws FileNotFoundException, IOException { + BufferedReader dataIn = new BufferedReader(new FileReader(filename)); + String line = dataIn.readLine(); // skipping header + line = dataIn.readLine().trim(); + String[] lines = line.split(":");//removing comments + String[] dataLine = lines[0].split("\\s+"); + if (dataLine.length != 2) { + System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); + System.exit(1); + } + n = Integer.parseInt(dataLine[0]); + nclin = Integer.parseInt(dataLine[1]); + + lda = Math.max(1, nclin); + + if (nclin > 0) { + sda = n; + } else { + sda = 1; + + } + ldh = n; + + cvec = new double[(int)n]; + a = new double[(int)(lda * sda)]; + bl = new double[(int)(n + nclin)]; + bu = new double[(int)(n + nclin)]; + x = new double[(int)n]; + h = new double[(int)(ldh * n)]; + + //reading cvec + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); + System.exit(1); + } + + for (int i = 0; i < n; ++i) { + cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); + } + + //reading a + for (int i = 0; i < lda; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != sda) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); + System.exit(1); + } + for (int j = 0; j < sda; ++j) { + a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); + } + } + + //reading bl + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + //reading bu + //it's on two lines in the data file, so we need to merge them + line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n + nclin) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); + System.exit(1); + } + for (int i = 0; i < n + nclin; ++i) { + bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); + System.exit(1); + } + for (int i = 0; i < n; ++i) { + x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); + } + + for (int i = 0; i < ldh; ++i) { + line = dataIn.readLine().trim().split(":")[0].trim(); + dataLine = line.split("\\s+"); + if (dataLine.length != n) { + System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); + System.exit(1); + } + for (int j = 0; j < n; ++j) { + h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); + } + } + + + } + } + +} diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java new file mode 100644 index 0000000..20ad573 --- /dev/null +++ b/simple_examples/source/int64/E04UCJE.java @@ -0,0 +1,207 @@ +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.E04.E04UC; +import com.nag.routines.E04.E04WB; +import com.nag.routines.F06.DGEMV; +import com.nag.routines.Routine; +import java.util.Arrays; + +/** + * @author joed + */ +public class E04UCJE { + + public static final double ONE = 1.0, ZERO = 0.0; + public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; + public static CONFUN confun = new CONFUN(); + public static OBJFUN objfun = new OBJFUN(); + + public static void main(String[] args) throws NAGBadIntegerException { + /* Local Scalars */ + double objf; + long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; + /* Local Arrays */ + double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; + double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; + long[] istate, iwork; + long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; + boolean[] lwsav = new boolean[(int)LLWSAV]; + String[] cwsav = new String[(int)LCWSAV]; + Arrays.fill(cwsav, " "); + + System.out.println(" E04UCJ Example Program Results"); + Routine.init(); + + /* Set scalars */ + n = 4; + nclin = 1; + ncnln = 2; + liwork = 3*n + nclin + 2*ncnln; + lda = Math.max(1, nclin); + sda = (nclin > 0) ? n : 1; + ldcj = Math.max(1, ncnln); + sdcjac = (ncnln > 0) ? n : 1; + ldr = n; + + if (ncnln == 0 && nclin > 0) { + lwork = 2*n*n + 20*n + 11*nclin; + } + else if (ncnln > 0 && nclin >= 0) { + lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; + } + else { + lwork = 20*n; + } + + /* Set arrays */ + istate = new long[(int)(n + nclin + ncnln)]; + iwork = new long[(int)liwork]; + c = new double[(int)(Math.max(1, ncnln))]; + cjac = new double[(int)(ldcj * sdcjac)]; + clamda = new double[(int)(n + nclin + ncnln)]; + objgrd = new double[(int)n]; + r = new double[(int)(ldr * n)]; + work = new double[(int)lwork]; + + a = new double[]{1.0, 1.0, 1.0, 1.0}; + bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; + bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; + x = new double[]{1.0, 5.0, 5.0, 1.0}; + + /* Initialise E04UC */ + E04WB e04wb = new E04WB(); + ifail = 0; + e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); + + /* Solve the problem */ + E04UC e04uc = new E04UC(); + iter = 0; + objf = 0.0; + ifail = -1; + e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, + cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, + lwsav, iwsav, rwsav, ifail); + iter = e04uc.getITER(); + objf = e04uc.getOBJF(); + ifail = e04uc.getIFAIL(); + + if ((0 >= ifail && ifail <= 6) || ifail == 8) { + System.out.println(); + System.out.println(" Varbl Istate Value Lagr Mult"); + System.out.println(); + + for (i = 0; i < n; i++) { + System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); + } + + if (nclin > 0) { + + /* A*x --> work. + * The NAG name equivalent of DGEMV is F06PA */ + DGEMV dgemv = new DGEMV(); + dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); + + System.out.println(); + System.out.println(); + System.out.println(" L Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n; i < n+nclin; i++) { + j = i - n; + System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); + } + + } + + if (ncnln > 0) { + System.out.println(); + System.out.println(); + System.out.println(" N Con Istate Value Lagr Mult"); + System.out.println(); + + for (i = n+nclin; i < n+nclin+ncnln; i++) { + j = i - n - nclin; + System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); + } + + } + + System.out.println(); + System.out.println(); + System.out.printf(" Final objective value = %11.7G\n", objf); + + } + + } + + /** Routine to evaluate objective function and its 1st derivatives */ + public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { + + public void eval() { + + if (MODE == 0 || MODE == 2) { + OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; + } + + if (MODE == 1 || MODE == 2) { + OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); + OBJGRD[1] = X[0] * X[3]; + OBJGRD[2] = X[0] * X[3] + ONE; + OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); + } + + } + + } + + /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ + public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { + + public void eval() { + + if (NSTATE == 1) { + + /* First call to CONFUN. Set all Jacobian elements to zero. + * Note that this will only work when 'Derivative Level = 3' + * (the default; see Section 11.2). */ + + for (int i = 0; i < CJAC.length; ++i) { + CJAC[i] = 0; + } + + } + + if (NEEDC[0] > 0) { + + if (MODE == 0 || MODE == 2) { + C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[0] = X[0] + X[0]; + CJAC[(int)LDCJ] = X[1] + X[1]; + CJAC[(int)(2*LDCJ)] = X[2] + X[2]; + CJAC[(int)(3*LDCJ)] = X[3] + X[3]; + } + + } + + if (NEEDC[1]>0) { + + if (MODE == 0 || MODE == 2) { + C[1] = X[0]*X[1]*X[2]*X[3]; + } + + if (MODE == 1 || MODE == 2) { + CJAC[1] = X[1]*X[2]*X[3]; + CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; + CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; + CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; + } + + } + + } + + } + +} diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java new file mode 100644 index 0000000..d8f152c --- /dev/null +++ b/simple_examples/source/int64/F02EKJE.java @@ -0,0 +1,230 @@ +emacimport java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.F02.F02EK; +import com.nag.routines.F12.F12AD; +import com.nag.routines.X02.X02AJ; +import com.nag.routines.Routine; +import com.nag.types.*; + + +/** + * @author joed + */ +public class F02EKJE { + + public static MYMONIT mymonit = new MYMONIT(); + public static MYOPTION myoption = new MYOPTION(); + + public static void main(String[] args) throws NAGBadIntegerException { + F02EK f02ek = new F02EK(); + X02AJ x02aj = new X02AJ(); + double h, rho, s, sigma; + int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, + prtlvl; + NAGComplex complex = new NAGComplex(); + double[] a, resid, v, ruser = new double[1]; + int[] icolzp, irowix, iuser = new int[4]; + NAGComplex[] w; + + // Initialise wrapper library + Routine.init(); + Routine.setComplex(complex); + + System.out.println(" F02EKJ Example Program Results"); + System.out.println(); + + nx = 10; + nev = 4; + ncv = 20; + rho = 10.0; + sigma = 5.5; + + n = nx * nx; + nnz = 3*n - 2; + ldv = n; + + resid = new double[ncv]; + a = new double[nnz]; + icolzp = new int[n + 1]; + irowix = new int[nnz]; + w = (NAGComplex[]) complex.getArrayOfInstances(ncv); + v = new double[ldv * ncv]; + + // Construct A in compressed column storage (CCS) format where: + // A{ i , i } = 2 + i + // A{i+1, i } = 3 + // A{ i , i+1} = rho/(2n+2) - 1 + + h = 1.0 / (double)(n+1); + s = (rho * h / 2.0) - 1.0; + + a[0] = 2.0 + 1.0; + a[1] = 3.0; + icolzp[0] = 1; + irowix[0] = 1; + irowix[1] = 2; + k = 3; + + for (int i = 1; i < n - 1; i++) { + icolzp[i] = k; + irowix[k - 1] = i; + irowix[k] = i + 1; + irowix[k + 1] = i + 2; + a[k - 1] = s; + a[k] = 2.0 + (double)(i + 1); + a[k + 1] = 3.0; + k += 3; + } + + icolzp[n - 1] = k; + icolzp[n] = k + 2; + irowix[k - 1] = n - 1; + irowix[k] = n; + a[k - 1] = s; + a[k] = 2.0 + (double)(n); + + // Set some options via iuser array and return routine argument OPTION + // iuser[0] = print level + // iuser[1] = iteration limit + // iuser[2] > 0 means shifted-invert mode + // iuser[3] > 0 means print monitoring info + + prtlvl = 0; + maxit = 500; + mode = 1; + imon = 1; + + if (prtlvl > 0) { + imon = 0; + } + + iuser[0] = prtlvl; + iuser[1] = maxit; + iuser[2] = mode; + iuser[3] = imon; + + nconv = 0; // placeholder value, nconv is output only + ifail = 0; // hard exit on error + + f02ek.eval( + n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, + nconv, w, v, ldv, resid, iuser, ruser, ifail + ); + ifail = f02ek.getIFAIL(); + nconv = f02ek.getNCONV(); + + System.out.println(); + System.out.printf( + " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma + ); + + // Get machine precision + double mp = x02aj.eval(); + + for (int i = 0; i < nconv; i++) { + if (resid[i] > (double)(100*n*mp)) { + System.out.printf( + " %8d ( %13.5E , %13.5E ) %13.5E\n", + i + 1, w[i], resid[i] + ); + } + else { + System.out.printf( + " %8d ( %13.5E , %13.5E )\n", + i + 1, w[i].getRe(), w[i].getIm() + ); + } + } + + } + + public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { + + public void eval() { + F12AD f12ad = new F12AD(); + int ifail1; + String rec = " "; + + this.ISTAT = 0; + + if (this.IUSER[0] > 0) { + System.out.printf("Print Level=%5d\n", this.IUSER[0]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[1] > 100) { + System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); + ifail1 = 1; + f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + if (this.IUSER[2] > 0) { + ifail1 = 1; + f12ad.eval ( + "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 + ); + ifail1 = f12ad.getIFAIL(); + this.ISTAT = Math.max(this.ISTAT, ifail1); + } + + } + + } + + public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { + + public NAGComplexInterface[] getW(){ + return this.W; + } + + public void eval() { + + if (this.IUSER[3] > 0) { + + if (this.NITER == 1 && this.IUSER[2] > 0) { + System.out.printf( + " Arnoldi basis vectors used:%4d\n", this.NCV + ); + System.out.printf( + " The following Ritz values (mu) are related to the\n" + + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" + ); + } + + System.out.println(); + System.out.printf(" Iteration number %4d\n", this.NITER); + System.out.printf( + " Ritz values converged so far (%4d) and their Ritz" + + " estimates:\n", this.NCONV + ); + + for (int i = 0; i < this.NCONV; i++) { + System.out.printf( + " %4d (%13.5E,%13.5E) %13.5E\n", + i + 1, this.W[i].getRe(), this.W[i].getIm(), + this.RZEST[i] + ); + } + + System.out.printf(" Next (unconverged) Ritz value:\n"); + + System.out.printf( + " %4d (%13.5E,%13.5E)\n", + this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() + ); + + } + + this.ISTAT = 0; + + } + + } + +} diff --git a/simple_examples/source/withdrawn/D02TKJE.java b/simple_examples/source/withdrawn/D02TKJE.java new file mode 100644 index 0000000..16e9e9b --- /dev/null +++ b/simple_examples/source/withdrawn/D02TKJE.java @@ -0,0 +1,290 @@ +import java.util.Arrays; + +import com.nag.exceptions.NAGBadIntegerException; +import com.nag.routines.D02.D02TK; +import com.nag.routines.D02.D02TV; +import com.nag.routines.D02.D02TX; +import com.nag.routines.D02.D02TY; +import com.nag.routines.D02.D02TZ; +import com.nag.routines.Routine; + + +/** + * @author joed + */ +public class D02TKJE { + + public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; + + public static double omega, sqrofr; + public static int[] m = {1, 3, 2}; + + public static FFUN ffun = new FFUN(); + public static FJAC fjac = new FJAC(); + public static GAFUN gafun = new GAFUN(); + public static GAJAC gajac = new GAJAC(); + public static GBFUN gbfun = new GBFUN(); + public static GBJAC gbjac = new GBJAC(); + public static GUESS guess = new GUESS(); + + public static void main(String[] args) throws NAGBadIntegerException { + D02TK d02tk = new D02TK(); + D02TV d02tv = new D02TV(); + D02TX d02tx = new D02TX(); + D02TY d02ty = new D02TY(); + D02TZ d02tz = new D02TZ(); + double dx, ermx, r; + int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, nmesh; + double[] mesh, tol, work, y; + int[] icomm, ipmesh; + + // Initialise wrappers + Routine.init(); + + System.out.println(" D02TKJ Example Program Results"); + System.out.println(); + + // Values from d02tkfe.d + ncol = 7; + nmesh = 11; + mxmesh = 51; + + licomm = 23 + NEQ + mxmesh; + lrcomm = mxmesh * (109 * (int)Math.pow(NEQ, 2) + 78 * NEQ + 7); + + mesh = new double[mxmesh]; + tol = new double[NEQ]; + work = new double[lrcomm]; + y = new double[NEQ * MMAX]; + ipmesh = new int[mxmesh]; + icomm = new int[licomm]; + + // Values from d02tkfe.d + omega = 1.0; + Arrays.fill(tol, 1.0E-4); + + dx = 1.0 / ((double) nmesh - 1); + + mesh[0] = 0.0; + for (int i = 1; i < nmesh - 1; i++) { + mesh[i] = mesh[i - 1] + dx; + } + mesh[nmesh - 1] = 1.0; + + ipmesh[0] = 1; + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + ipmesh[nmesh - 1] = 1; + + // Initial integrator for given problem. + ifail = 0; + d02tv.eval( + NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, work, + lrcomm, icomm, licomm, ifail + ); + + // Values from d02tkfe.d + ncont = 3; + r = 1.0E6; + + sqrofr = Math.sqrt(r); + + ermx = 0.0; + iermx = 0; + ijermx = 0; + + for (int j = 0; j < ncont; j++) { + System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); + + // Solve problem + ifail = -1; + d02tk.eval( + ffun, fjac, gafun, gbfun, gajac, gbjac, guess, work, icomm, + ifail + ); + ifail = d02tk.getIFAIL(); + if (ifail == 1) break; + + // Extract mesh + ifail = -1; + d02tz.eval( + mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, work, icomm, + ifail + ); + nmesh = d02tz.getNMESH(); + iermx = d02tz.getIERMX(); + ijermx = d02tz.getIJERMX(); + ermx = d02tz.getERMX(); + ifail = d02tz.getIFAIL(); + if (ifail == 1) break; + + // Print mesh, error stats + System.out.printf( + "\n" + + " Used a mesh of %4d points\n" + + " Maximum error = %10.2E in interval %4d for component %4d\n" + + "\n", + nmesh, ermx, iermx, ijermx + ); + System.out.printf("\n Mesh points:\n"); + for (int i = 0; i < nmesh; i++) { + System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); + if ((i+1) % 4 == 0) System.out.printf("\n"); + } + System.out.printf("\n"); + + // Print solution components on mesh + System.out.printf("\n x f f\' g\n"); + for (int i = 0; i < nmesh; i++) { + ifail = 0; + d02ty.eval(mesh[i], y, NEQ, MMAX, work, icomm, ifail); + ifail = d02ty.getIFAIL(); + if (ifail != 0) { + System.err.println( + "D02TY failed with error code " + ifail + ); + break; + } + System.out.printf( + " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], + y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] + ); + } + + if (j == ncont - 1) break; + + // Modify continuation parameter + r = 100.0 * r; + sqrofr = Math.sqrt(r); + + // Select mesh for continuation + Arrays.fill(ipmesh, 1, nmesh - 1, 2); + + // Call continuation primer routine + ifail = 0; + d02tx.eval(mxmesh, nmesh, mesh, ipmesh, work, icomm, ifail); + mxmesh = d02tx.getMXMESH(); + nmesh = d02tx.getNMESH(); + ifail = d02tx.getIFAIL(); + if (ifail != 0) { + System.err.println("D02TX failed with error code " + ifail); + } + + } + + } + + /** + * Converts a 2D Fortran index to the 1D index for its corresponding Java + * array. Assumes y is already zero-based. + * + * Fortran array definition: + * a(dimX, 0:*) + * + * Conversion: + * a(x, y) --> A[result] + */ + private static int getIdx(int x, int y, int dimX) { + return (y * dimX) + (x-1); + } + + /** + * Converts a 3D Fortran index to the 1D index for its corresponding Java + * array. Assumes z is already zero-based. + * + * Fortran array definition: + * a(dimX, dimY, 0:*) + * + * Conversion: + * a(x, y, z) --> A[result] + */ + private static int getIdx(int x, int y, int z, int dimX, int dimY) { + return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); + } + + public static class FFUN extends D02TK.Abstract_D02TK_FFUN { + + public void eval() { + F[0] = Y[getIdx(2, 0, NEQ)]; + F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) + + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) + - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; + } + + } + + public static class FJAC extends D02TK.Abstract_D02TK_FJAC { + + public void eval() { + DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; + DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; + DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; + DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; + DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; + } + + } + + public static class GAFUN extends D02TK.Abstract_D02TK_GAFUN { + + public void eval() { + GA[0] = YA[getIdx(1, 0, NEQ)]; + GA[1] = YA[getIdx(2, 0, NEQ)]; + GA[2] = YA[getIdx(3, 0, NEQ)] - omega; + } + + } + + public static class GBFUN extends D02TK.Abstract_D02TK_GBFUN { + + public void eval() { + GB[0] = YB[getIdx(1, 0, NEQ)]; + GB[1] = YB[getIdx(2, 0, NEQ)]; + GB[2] = YB[getIdx(3, 0, NEQ)] + omega; + } + + } + + public static class GAJAC extends D02TK.Abstract_D02TK_GAJAC { + + public void eval() { + DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; + DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; + } + + } + + public static class GBJAC extends D02TK.Abstract_D02TK_GBJAC { + + public void eval() { + DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; + DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; + } + + } + + public static class GUESS extends D02TK.Abstract_D02TK_GUESS { + + public void eval() { + Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); + Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) + * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) + * (10.0 * X * (X - 1.0) + 1.0); + Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); + Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); + Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); + DYM[0] = Y[getIdx(2, 0, NEQ)]; + DYM[1] = -120.0 * (X - 0.5); + DYM[2] = -56.0 * omega * (X - 0.5); + } + + } + +} From d9fe429148d032456ed37c052222f0a850ff2033 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Mon, 18 Jan 2021 09:40:46 +0000 Subject: [PATCH 133/196] Simple Examples Synced --- simple_examples/data/mytemp | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 simple_examples/data/mytemp diff --git a/simple_examples/data/mytemp b/simple_examples/data/mytemp deleted file mode 100644 index e69de29..0000000 From 928ed3aec5a9830a1cd43477ca8afec4cedfeb3f Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Mon, 18 Jan 2021 10:00:01 +0000 Subject: [PATCH 134/196] Removed extra examples --- simple_examples/A00AAJE.java | 16 -- simple_examples/A00ACJE.java | 29 --- simple_examples/A00ADJE.java | 107 --------- simple_examples/C02AAJE.java | 174 --------------- simple_examples/C02ABJE.java | 217 ------------------ simple_examples/C02AFJE.java | 271 ---------------------- simple_examples/C02AGJE.java | 262 ---------------------- simple_examples/C02AHJE.java | 61 ----- simple_examples/C02AJJE.java | 65 ------ simple_examples/C02AKJE.java | 62 ------ simple_examples/C02ALJE.java | 64 ------ simple_examples/C02AMJE.java | 75 ------- simple_examples/C02ANJE.java | 80 ------- simple_examples/C05AUJE.java | 67 ------ simple_examples/C05AWJE.java | 59 ----- simple_examples/C05AYJE.java | 44 ---- simple_examples/C05AZJE.java | 65 ------ simple_examples/C05BBJE.java | 89 -------- simple_examples/C05MBJE.java | 95 -------- simple_examples/C05QBJE.java | 167 -------------- simple_examples/C06BAJE.java | 56 ----- simple_examples/C06FKJE.java | 91 -------- simple_examples/C09AAJE.java | 158 ------------- simple_examples/D01BDJE.java | 58 ----- simple_examples/D01RJJE.java | 184 --------------- simple_examples/D01RKJE.java | 173 --------------- simple_examples/D01RLJE.java | 196 ---------------- simple_examples/D01RMJE.java | 163 -------------- simple_examples/D01TCJE.java | 45 ---- simple_examples/D02NEJE.java | 388 -------------------------------- simple_examples/D02TLJE.java | 290 ------------------------ simple_examples/D03PCJE.java | 217 ------------------ simple_examples/D03RAJE.java | 307 ------------------------- simple_examples/D03RBJE.java | 388 -------------------------------- simple_examples/D05BAJE.java | 111 --------- simple_examples/D05BEJE.java | 185 --------------- simple_examples/DTFSMJE.java | 54 ----- simple_examples/E01DAJE.java | 182 --------------- simple_examples/E02ALJE.java | 101 --------- simple_examples/E04ABJE.java | 76 ------- simple_examples/E04BBJE.java | 81 ------- simple_examples/E04CBJE.java | 90 -------- simple_examples/E04FCJE.java | 420 ----------------------------------- simple_examples/E04FFJE.java | 140 ------------ simple_examples/E04GBJE.java | 183 --------------- simple_examples/E04GGJE.java | 219 ------------------ simple_examples/E04MTJE.java | 132 ----------- simple_examples/E04MXJE.java | 292 ------------------------ simple_examples/E04NCJE.java | 246 -------------------- simple_examples/E04NFJE.java | 234 ------------------- simple_examples/E04NKJE.java | 295 ------------------------ simple_examples/E04NQJE.java | 384 -------------------------------- simple_examples/E04PTJE.java | 344 ---------------------------- simple_examples/E04RPJE.java | 199 ----------------- simple_examples/E04RSJE.java | 229 ------------------- simple_examples/E04RTJE.java | 225 ------------------- simple_examples/E04SAJE.java | 104 --------- simple_examples/E04TAJE.java | 188 ---------------- simple_examples/E04TCJE.java | 263 ---------------------- simple_examples/E04UCJE.java | 211 ------------------ simple_examples/E04YAJE.java | 112 ---------- simple_examples/F01ADJE.java | 39 ---- simple_examples/F01CKJE.java | 60 ----- simple_examples/F01CRJE.java | 47 ---- simple_examples/F01DGJE.java | 72 ------ simple_examples/F01ELJE.java | 89 -------- simple_examples/F01EMJE.java | 106 --------- simple_examples/F02EKJE.java | 227 ------------------- simple_examples/F02FKJE.java | 230 ------------------- simple_examples/F02WGJE.java | 132 ----------- simple_examples/F03BAJE.java | 108 --------- simple_examples/F04AMJE.java | 114 ---------- simple_examples/F04BAJE.java | 144 ------------ simple_examples/F05AAJE.java | 99 --------- simple_examples/F06CLJE.java | 40 ---- simple_examples/F07AAJE.java | 90 -------- simple_examples/F07ABJE.java | 134 ----------- simple_examples/F07ADJE.java | 72 ------ simple_examples/F07AQJE.java | 99 --------- simple_examples/F07FAJE.java | 79 ------- simple_examples/F07FBJE.java | 122 ---------- simple_examples/F08BTJE.java | 228 ------------------- simple_examples/F08FAJE.java | 113 ---------- simple_examples/F08XPJE.java | 297 ------------------------- simple_examples/G01ALJE.java | 55 ----- simple_examples/G02AKJE.java | 68 ------ simple_examples/G02BJJE.java | 303 ------------------------- simple_examples/G02BRJE.java | 134 ----------- simple_examples/G02DAJE.java | 187 ---------------- simple_examples/G02EEJE.java | 184 --------------- simple_examples/G02MAJE.java | 130 ----------- simple_examples/G03GAJE.java | 355 ----------------------------- simple_examples/G05KFJE.java | 105 --------- simple_examples/G13AWJE.java | 31 --- simple_examples/G13MEJE.java | 160 ------------- simple_examples/G13NAJE.java | 123 ---------- simple_examples/H02BBJE.java | 92 -------- simple_examples/H02DAJE.java | 228 ------------------- simple_examples/M01CCJE.java | 42 ---- simple_examples/S01BAJE.java | 39 ---- simple_examples/S10AAJE.java | 40 ---- simple_examples/S10ABJE.java | 41 ---- simple_examples/S10ACJE.java | 41 ---- simple_examples/S14ABJE.java | 71 ------ simple_examples/S14ACJE.java | 68 ------ simple_examples/S14AFJE.java | 80 ------- simple_examples/S17DCJE.java | 69 ------ simple_examples/S17DGJE.java | 61 ----- simple_examples/S30AAJE.java | 109 --------- simple_examples/S30ACJE.java | 129 ----------- simple_examples/X03AAJE.java | 87 -------- simple_examples/X04CBJE.java | 53 ----- simple_examples/X05ABJE.java | 25 --- 113 files changed, 15934 deletions(-) delete mode 100644 simple_examples/A00AAJE.java delete mode 100644 simple_examples/A00ACJE.java delete mode 100644 simple_examples/A00ADJE.java delete mode 100644 simple_examples/C02AAJE.java delete mode 100644 simple_examples/C02ABJE.java delete mode 100644 simple_examples/C02AFJE.java delete mode 100644 simple_examples/C02AGJE.java delete mode 100644 simple_examples/C02AHJE.java delete mode 100644 simple_examples/C02AJJE.java delete mode 100644 simple_examples/C02AKJE.java delete mode 100644 simple_examples/C02ALJE.java delete mode 100644 simple_examples/C02AMJE.java delete mode 100644 simple_examples/C02ANJE.java delete mode 100644 simple_examples/C05AUJE.java delete mode 100644 simple_examples/C05AWJE.java delete mode 100644 simple_examples/C05AYJE.java delete mode 100644 simple_examples/C05AZJE.java delete mode 100644 simple_examples/C05BBJE.java delete mode 100644 simple_examples/C05MBJE.java delete mode 100644 simple_examples/C05QBJE.java delete mode 100644 simple_examples/C06BAJE.java delete mode 100644 simple_examples/C06FKJE.java delete mode 100644 simple_examples/C09AAJE.java delete mode 100644 simple_examples/D01BDJE.java delete mode 100644 simple_examples/D01RJJE.java delete mode 100644 simple_examples/D01RKJE.java delete mode 100644 simple_examples/D01RLJE.java delete mode 100644 simple_examples/D01RMJE.java delete mode 100644 simple_examples/D01TCJE.java delete mode 100644 simple_examples/D02NEJE.java delete mode 100644 simple_examples/D02TLJE.java delete mode 100644 simple_examples/D03PCJE.java delete mode 100644 simple_examples/D03RAJE.java delete mode 100644 simple_examples/D03RBJE.java delete mode 100644 simple_examples/D05BAJE.java delete mode 100644 simple_examples/D05BEJE.java delete mode 100644 simple_examples/DTFSMJE.java delete mode 100644 simple_examples/E01DAJE.java delete mode 100644 simple_examples/E02ALJE.java delete mode 100644 simple_examples/E04ABJE.java delete mode 100644 simple_examples/E04BBJE.java delete mode 100644 simple_examples/E04CBJE.java delete mode 100644 simple_examples/E04FCJE.java delete mode 100644 simple_examples/E04FFJE.java delete mode 100644 simple_examples/E04GBJE.java delete mode 100644 simple_examples/E04GGJE.java delete mode 100644 simple_examples/E04MTJE.java delete mode 100644 simple_examples/E04MXJE.java delete mode 100644 simple_examples/E04NCJE.java delete mode 100644 simple_examples/E04NFJE.java delete mode 100644 simple_examples/E04NKJE.java delete mode 100644 simple_examples/E04NQJE.java delete mode 100644 simple_examples/E04PTJE.java delete mode 100644 simple_examples/E04RPJE.java delete mode 100644 simple_examples/E04RSJE.java delete mode 100644 simple_examples/E04RTJE.java delete mode 100644 simple_examples/E04SAJE.java delete mode 100644 simple_examples/E04TAJE.java delete mode 100644 simple_examples/E04TCJE.java delete mode 100644 simple_examples/E04UCJE.java delete mode 100644 simple_examples/E04YAJE.java delete mode 100644 simple_examples/F01ADJE.java delete mode 100644 simple_examples/F01CKJE.java delete mode 100644 simple_examples/F01CRJE.java delete mode 100644 simple_examples/F01DGJE.java delete mode 100644 simple_examples/F01ELJE.java delete mode 100644 simple_examples/F01EMJE.java delete mode 100644 simple_examples/F02EKJE.java delete mode 100644 simple_examples/F02FKJE.java delete mode 100644 simple_examples/F02WGJE.java delete mode 100644 simple_examples/F03BAJE.java delete mode 100644 simple_examples/F04AMJE.java delete mode 100644 simple_examples/F04BAJE.java delete mode 100644 simple_examples/F05AAJE.java delete mode 100644 simple_examples/F06CLJE.java delete mode 100644 simple_examples/F07AAJE.java delete mode 100644 simple_examples/F07ABJE.java delete mode 100644 simple_examples/F07ADJE.java delete mode 100644 simple_examples/F07AQJE.java delete mode 100644 simple_examples/F07FAJE.java delete mode 100644 simple_examples/F07FBJE.java delete mode 100644 simple_examples/F08BTJE.java delete mode 100644 simple_examples/F08FAJE.java delete mode 100644 simple_examples/F08XPJE.java delete mode 100644 simple_examples/G01ALJE.java delete mode 100644 simple_examples/G02AKJE.java delete mode 100644 simple_examples/G02BJJE.java delete mode 100644 simple_examples/G02BRJE.java delete mode 100644 simple_examples/G02DAJE.java delete mode 100644 simple_examples/G02EEJE.java delete mode 100644 simple_examples/G02MAJE.java delete mode 100644 simple_examples/G03GAJE.java delete mode 100644 simple_examples/G05KFJE.java delete mode 100644 simple_examples/G13AWJE.java delete mode 100644 simple_examples/G13MEJE.java delete mode 100644 simple_examples/G13NAJE.java delete mode 100644 simple_examples/H02BBJE.java delete mode 100644 simple_examples/H02DAJE.java delete mode 100644 simple_examples/M01CCJE.java delete mode 100644 simple_examples/S01BAJE.java delete mode 100644 simple_examples/S10AAJE.java delete mode 100644 simple_examples/S10ABJE.java delete mode 100644 simple_examples/S10ACJE.java delete mode 100644 simple_examples/S14ABJE.java delete mode 100644 simple_examples/S14ACJE.java delete mode 100644 simple_examples/S14AFJE.java delete mode 100644 simple_examples/S17DCJE.java delete mode 100644 simple_examples/S17DGJE.java delete mode 100644 simple_examples/S30AAJE.java delete mode 100644 simple_examples/S30ACJE.java delete mode 100644 simple_examples/X03AAJE.java delete mode 100644 simple_examples/X04CBJE.java delete mode 100644 simple_examples/X05ABJE.java diff --git a/simple_examples/A00AAJE.java b/simple_examples/A00AAJE.java deleted file mode 100644 index 65b6c18..0000000 --- a/simple_examples/A00AAJE.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.nag.routines.A00.A00AA; - -/** - * A00AA example program text. - */ -public class A00AAJE { - - public static void main(String[] args) { - A00AA a00aa = new A00AA(); - - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - - } - -} diff --git a/simple_examples/A00ACJE.java b/simple_examples/A00ACJE.java deleted file mode 100644 index 7f44ba3..0000000 --- a/simple_examples/A00ACJE.java +++ /dev/null @@ -1,29 +0,0 @@ -import com.nag.routines.A00.A00AC; - -/** - * A00AC example program text. - * @author Mo - */ -public class A00ACJE { - - public static void main(String[] args) { - A00AC a00ac = new A00AC(); - boolean lmok; - - System.out.println(" A00ACJ Example Program Results\n"); - System.out.println(); - - a00ac.eval(); - - lmok = a00ac.eval(); - - if (lmok) { - System.out.println("A valid licence key is available"); - } - else { - System.out.println("No valid licence key was found"); - } - - } - -} diff --git a/simple_examples/A00ADJE.java b/simple_examples/A00ADJE.java deleted file mode 100644 index 139c8b9..0000000 --- a/simple_examples/A00ADJE.java +++ /dev/null @@ -1,107 +0,0 @@ -import com.nag.routines.A00.A00AD; -import com.nag.routines.X05.X05AA; -import java.util.Arrays; - -/** - * A00AD example program text. - */ -public class A00ADJE { - - public static void main(String[] args) { - - A00AD a00ad = new A00AD(); - X05AA x05aa = new X05AA(); - int i, mkmaj, mkmin; - boolean licval; - String fcomp, hdware, impl, opsys, pcode, prec, vend; - int[] itime = new int[7]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - - System.out.println(" A00ADJ Example Program Results\n"); - - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - - // Output scalars must be retrieved manually - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - // Print implementation details - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/C02AAJE.java b/simple_examples/C02AAJE.java deleted file mode 100644 index 1abc528..0000000 --- a/simple_examples/C02AAJE.java +++ /dev/null @@ -1,174 +0,0 @@ -import com.nag.routines.C02.C02AA; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.types.NAGComplex; -import java.util.Arrays; - -/** - * C02AA example program text. - * @author joed - * @since 27.1.0.0 - */ -public class C02AAJE { - - public static void main(String[] args) { - - System.out.println(" C02AAJ Example Program Results"); - - Routine.setComplex(new NAGComplex()); - exampleBasic(); - examplePolishing(); - - System.out.println(); - - } - - /** Demonstrate a basic problem. */ - public static void exampleBasic() { - - C02AA c02aa = new C02AA(); - int ifail, itmax, n, polish; - NAGComplex[] a, z; - double[] berr, cond; - int[] conv; - - System.out.println(); - System.out.println("Example 1: Basic Problem"); - System.out.println(); - - // Set polynomial degree and instantiate arrays - n = 5; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Set polynomial coefficients - a[0] = new NAGComplex(5.0, 6.0); - a[1] = new NAGComplex(30.0, 20.0); - a[2] = new NAGComplex(-0.2, -6.0); - a[3] = new NAGComplex(50.0, 100000.0); - a[4] = new NAGComplex(-2.0, 40.0); - a[5] = new NAGComplex(10.0, 1.0); - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond "); - System.out.println(" ---------------------------------------------------"); - for (int i = 0; i < n; i++) { - System.out.printf(" %2d %9.2E, %9.2E %3d %9.2E %9.2E\n", i+1, - z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - - } - - /** Compare polishing processes on a Wilkinson-style polynomial. */ - public static void examplePolishing() { - - C02AA c02aa = new C02AA(); - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - NAGComplex pz; - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int ifail, itmax, k, n, polish; - NAGComplex[] a, z, zact; - double[] berr, cond; - int[] conv; - boolean[] matched; - - System.out.println(); - System.out.println("Example 2: Polishing Processes"); - System.out.println(); - - // Set polynomial degree and instantiate - n = 10; - a = new NAGComplex[n+1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = new NAGComplex[n]; - zact = new NAGComplex[n]; - - // Set known roots and (instantiate z) - for (int i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) i+1, 0.0); - z[i] = new NAGComplex(); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (int i = 0; i < n; i++) { - a[i] = new NAGComplex(); - } - a[n] = new NAGComplex(1.0, 0.0); - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - a[j] = a[j+1].subtract(a[j].multiply(zact[i])); - } - a[n] = a[n].negate().multiply(zact[i]); - } - - System.out.println(" polish relerr fwderr "); - System.out.println(" ----------------------------"); - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - for (polish = 0; polish <= 2; polish++) { - - // Find roots - ifail = 0; - c02aa.eval(a, n, itmax, polish, z, berr, cond, conv, ifail); - - /* Calculate the maximum relative errors of the roots, and the maximum - * forward error evaluating the polynomial at those roots. Errors are - * capped at machine precision. */ - maxrelerr = maxfwderr = eps; - Arrays.fill(matched, false); - - for (int i = 0; i < n; i++) { - - // Evaluate polynomial at this root - pz = a[0].clone(); - for (int j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(a[j]); - } - - // Match to an expected root - k = 0; - err = rmax; - for (int j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - - } - -} diff --git a/simple_examples/C02ABJE.java b/simple_examples/C02ABJE.java deleted file mode 100644 index fad5ebb..0000000 --- a/simple_examples/C02ABJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.C02.C02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AB - */ -public class C02ABJE { - - public static void main(String[] args) { - - final boolean polish_example = false; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" C02ABJ Example Program Results"); - - ex1_basic(args); - if (polish_example) { - ex2_polishing(args); - } - } - - public static void ex1_basic(String[] args) { - - int i, ifail, itmax, n = 0, polish; - - NAGComplex[] z = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - - System.out.println("\n Basic Problem\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - String line = reader.readLine(); - line = reader.readLine(); - line = reader.readLine(); - - // Read polynomial degree and allocate - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - z = NAGComplex.createArray(n); - - // Read polynomial coefficients - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[i] = Double.parseDouble(sVal[0]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find roots of the polynomial - itmax = 30; - polish = 1; - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a ,n, itmax, polish, z, berr, cond, conv, ifail); - - // Print output - System.out.println(" i z conv berr cond"); - System.out.println(" -----------------------------------------------------"); - for (i = 0; i < n; i++) { - System.out.printf(" %2d (%10.2E, %9.2E) %3d %9.2E %9.2E\n", i+1, z[i].getRe(), z[i].getIm(), conv[i], berr[i], cond[i]); - } - } - - public static void ex2_polishing(String[] args) { - NAGComplex pz = new NAGComplex(); - double delta, eps, err, fwderr, maxfwderr, maxrelerr, relerr, rmax; - int i, ifail, itmax, j, k, n = 0, polish; - - NAGComplex[] z = null, zact = null; - double[] a = null, berr = null, cond = null; - int[] conv = null; - boolean[] matched = null; - - System.out.println("\n Polishing Processes\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i <= 12; i++) { - reader.readLine(); - } - - // Read polynomial degree and allocate - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n + 1]; - berr = new double[n]; - cond = new double[n]; - conv = new int[n]; - matched = new boolean[n]; - z = NAGComplex.createArray(n); - zact = NAGComplex.createArray(n); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Set known roots - for (i = 0; i < n; i++) { - zact[i] = new NAGComplex((double) (i + 1), 0.0); - } - - // Multiply out (z-1)(z-2)...(z-n) for coefficients - for (i = 0; i < n; i++) { - a[i] = 0.0; - } - a[n] = 1.0; - for (i = 0; i < n; i++) { - for (j = 0; j < n; j++) { - a[j] = a[j + 1] - a[j] * zact[i].getRe(); - } - a[n] = -a[n] * zact[i].getRe(); - } - - System.out.println(" polish relerr fwderr"); - System.out.println(" ----------------------------"); - - // Use different polish modes - X02AJ x02aj = new X02AJ(); - X02AL x02al = new X02AL(); - for (polish = 0; polish <= 2; polish++) { - - itmax = 30; - eps = x02aj.eval(); - rmax = x02al.eval(); - - // Find roots - ifail = 0; - C02AB c02ab = new C02AB(); - c02ab.eval(a, n , itmax, polish, z, berr, cond, conv, ifail); - - // Calculate the maximum relative errors of the roots, and the maximum - // forward error evaluating the polynomial at those roots. Errors are - // capped at machine precision. - maxrelerr = eps; - maxfwderr = eps; - Arrays.fill(matched, false); - - for (i = 0; i < n; i++) { - // Evaluate polynomial at this root - pz = new NAGComplex(a[0], 0.0); - for (j = 1; j <= n; j++) { - pz = z[i].multiply(pz).add(new NAGComplex(a[j], 0.0)); - } - - // Match to an expected root - k = 0; - err = rmax; - for (j = 0; j < n; j++) { - if (!matched[j]) { - delta = z[i].subtract(zact[j]).abs(); - if (delta <= err) { - err = delta; - k = j; - } - } - } - - // Mark as matched and update max errors - matched[k] = true; - relerr = err/zact[k].abs(); - fwderr = pz.abs(); - maxrelerr = Math.max(maxrelerr, relerr); - maxfwderr = Math.max(maxfwderr, fwderr); - } - - // Print output - System.out.printf(" %2d %10.2E%10.2E\n", polish, maxrelerr, maxfwderr); - - } - } -} diff --git a/simple_examples/C02AFJE.java b/simple_examples/C02AFJE.java deleted file mode 100644 index 6043be7..0000000 --- a/simple_examples/C02AFJE.java +++ /dev/null @@ -1,271 +0,0 @@ -import com.nag.routines.C02.C02AF; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AF - */ -public class C02AFJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AFJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - - int i, ifail, n = 0; - - double[][] a = null, z = null; - double[] w = null; - - System.out.println("\n\n Example 1"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[2][n + 1]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i\n", z[0][i], z[1][i]); - } - - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[][] a = null, abar = null, z = null, zbar = null; - double[] r = null, w = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 12; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[2][n + 1]; - abar = new double[2][n + 1]; - r = new double[n]; - w = new double[4 * (n + 1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - for (i = 0; i <= n; i++) { - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - a[0][i] = Double.parseDouble(sVal[0]); - a[1][i] = Double.parseDouble(sVal[1]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AF c02af = new C02AF(); - double[] a1d = convert2DTo1D(a); - double[] z1d = convert2DTo1D(z); - c02af.eval(a1d, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar = 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[0][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[0][i] = f * a[0][i]; - - if (a[1][i] != 0.0E0) { - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - - } else { - - if (a[1][i] != 0.0E0) { - f = 1.0E0 + epsbar; - epsbar = -epsbar; - abar[1][i] = f * a[1][i]; - } else { - abar[1][i] = 0.0E0; - } - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] abar1d = convert2DTo1D(abar); - double[] zbar1d = convert2DTo1D(zbar); - c02af.eval(abar1d, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][j], zbar[1][j]); - deltac = Math.abs(r1 - r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0E0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j*n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j*n]; - } - } - - return b; - } -} diff --git a/simple_examples/C02AGJE.java b/simple_examples/C02AGJE.java deleted file mode 100644 index c58e524..0000000 --- a/simple_examples/C02AGJE.java +++ /dev/null @@ -1,262 +0,0 @@ -import com.nag.routines.C02.C02AG; -import com.nag.routines.A02.A02AB; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X02.X02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * C02AG - */ -public class C02AGJE { - - public static final boolean scal = true; - - public static void main(String[] args) { - - System.out.println(" C02AGJ Example Program Results"); - - ex1(args); - - ex2(args); - } - - public static void ex1(String[] args) { - double zi, zr; - int i, ifail, n = 0, nroot; - - double[] a = null, w = null; - double[][] z = null; - - System.out.println("\n\n Example 1\n"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading in data file - reader.readLine(); - reader.readLine(); - reader.readLine(); - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - a = new double[n + 1]; - w = new double[2 * (n + 1)]; - z = new double[2][n]; - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d, w, ifail); - - z = convert1DTo2D(z1d, 2); - - System.out.println(" Computed roots of polynomial"); - System.out.println(); - - nroot = 0; - - while (nroot < n) { - zr = z[0][nroot]; - zi = z[1][nroot]; - if (zi == 0.0E0) { - System.out.printf(" z = %12.4E\n", zr); - nroot += 1; - } else { - System.out.printf(" z = %12.4E +/- %12.4E*i\n", zr, Math.abs(zi)); - nroot += 2; - } - } - } - - public static void ex2(String[] args) { - - double deltac, deltai, di, eps, epsbar, f, r1, r2, r3, rmax; - int i, ifail, j, jmin = 0, n = 0; - - double[] a = null, abar = null, r = null, w = null; - double[][] z = null, zbar = null; - int[] m = null; - - System.out.println("\n\n Example 2"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - - // Skip heading and previous example in data file - for (i = 0; i < 7; i++) { - reader.readLine(); - } - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - - a = new double[n+1]; - abar = new double[n+1]; - r = new double[n]; - w = new double[2 * (n+1)]; - z = new double[2][n]; - zbar = new double[2][n]; - m = new int[n]; - - // Read in the coefficients of the original polynomial. - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i <= n; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute the roots of the original polynomial. - ifail = 0; - C02AG c02ag = new C02AG(); - double[] z1d = convert2DTo1D(z); - c02ag.eval(a, n, scal, z1d ,w, ifail); - - z = convert1DTo2D(z1d, 2); - - // Form the coefficients of the perturbed polynomial. - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - epsbar= 3.0 * eps; - - for (i = 0; i <= n; i++) { - if (a[i] != 0.0) { - f = 1.0 + epsbar; - epsbar = -epsbar; - abar[i] = f * a[i]; - } else { - abar[i] = 0.0E0; - } - } - - // Compute the roots of the perturbed polynomial. - ifail = 0; - double[] zbar1d = convert2DTo1D(zbar); - c02ag.eval(abar, n, scal, zbar1d, w, ifail); - - zbar = convert1DTo2D(zbar1d, 2); - - // Perform error analysis. - - // Initialize markers to 0 (unmarked). - Arrays.fill(m, 0); - - X02AL x02al = new X02AL(); - rmax = x02al.eval(); - - // Loop over all unperturbed roots (stored in Z). - A02AB a02ab = new A02AB(); - for (i = 0; i < n; i++) { - deltai = rmax; - r1 = a02ab.eval(z[0][i], z[1][i]); - - // Loop over all perturbed roots (stored in ZBAR). - for (j = 0; j < n; j++) { - // Compare the current unperturbed root to all unmarked - // perturbed roots. - - if (m[j] == 0) { - r2 = a02ab.eval(zbar[0][i], zbar[1][i]); - deltac = Math.abs(r1-r2); - - if (deltac < deltai) { - deltai = deltac; - jmin = j; - } - } - } - - // Mark the selected perturbed root. - m[jmin] = 1; - - // Compute the relative error. - if (r1 != 0.0E0) { - r3 = a02ab.eval(zbar[0][jmin], zbar[1][jmin]); - di = Math.min(r1, r3); - r[i] = Math.max(deltai / Math.max(di, deltai / rmax), eps); - } else { - r[i] = 0.0; - } - } - - System.out.println(); - System.out.printf(" Degree of polynomial = %4d\n", n); - System.out.println(); - System.out.println(" Computed roots of polynomial Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", z[0][i], z[1][i], r[i]); - } - } - - public static double[] convert2DTo1D(double[][] a) { - double[] b = new double[a.length * a[0].length]; - int n = a.length; - - for (int i = 0; i < a.length; i++) { - for (int j = 0; j < a[0].length; j++) { - b[i + j * n] = a[i][j]; - } - } - - return b; - } - - public static double[][] convert1DTo2D(double[] a, int n) { - double[][] b = new double[n][a.length / n]; - - for (int i = 0; i < b.length; i++) { - for (int j = 0; j < b[0].length; j++) { - b[i][j] = a[i + j * n]; - } - } - - return b; - } -} diff --git a/simple_examples/C02AHJE.java b/simple_examples/C02AHJE.java deleted file mode 100644 index b1e12cd..0000000 --- a/simple_examples/C02AHJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.C02.C02AH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AH - */ -public class C02AHJE { - - public static void main(String[] args) { - - double ai = 0, ar = 0, bi = 0, br = 0, ci = 0, cr = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AHJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - ar = Double.parseDouble(sVal[0]); - ai = Double.parseDouble(sVal[1]); - br = Double.parseDouble(sVal[2]); - bi = Double.parseDouble(sVal[3]); - cr = Double.parseDouble(sVal[4]); - ci = Double.parseDouble(sVal[5]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AH c02ah = new C02AH(); - c02ah.eval(ar, ai, br, bi, cr, ci, zsm, zlg, ifail); - ifail = c02ah.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - System.out.printf(" z = %12.4E%+14.4E*i\n", zsm[0], zsm[1]); - System.out.printf(" z = %12.4E%+14.4E*i\n", zlg[0], zlg[1]); - } - } -} diff --git a/simple_examples/C02AJJE.java b/simple_examples/C02AJJE.java deleted file mode 100644 index 64e3a5e..0000000 --- a/simple_examples/C02AJJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C02.C02AJ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AJ - */ -public class C02AJJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0; - int ifail; - - double[] zlg = new double[2]; - double[] zsm = new double[2]; - - System.out.println(" C02AJJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - a = Double.parseDouble(sVal[0]); - b = Double.parseDouble(sVal[1]); - c = Double.parseDouble(sVal[2]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = -1; - C02AJ c02aj = new C02AJ(); - c02aj.eval(a, b, c, zsm, zlg, ifail); - ifail = c02aj.getIFAIL(); - - if (ifail == 0) { - System.out.println("\n Roots of quadratic equation\n"); - - if (zsm[1] == 0.0E0) { - // 2 real roots. - System.out.printf(" z = %12.4E\n", zsm[0]); - System.out.printf(" z = %12.4E\n", zlg[0]); - } else { - // 2 complex roots. - System.out.printf(" z = %12.4E +/- %12.4E*i", zsm[0], Math.abs(zsm[1])); - } - } - } -} diff --git a/simple_examples/C02AKJE.java b/simple_examples/C02AKJE.java deleted file mode 100644 index 4a0579f..0000000 --- a/simple_examples/C02AKJE.java +++ /dev/null @@ -1,62 +0,0 @@ -import com.nag.routines.C02.C02AK; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AK - */ -public class C02AKJE { - - public static void main(String[] args) { - - double r = 0, s = 0, t = 0, u = 0; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AKJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - u = Double.parseDouble(sVal[0]); - r = Double.parseDouble(sVal[1]); - s = Double.parseDouble(sVal[2]); - t = Double.parseDouble(sVal[3]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AK c02ak = new C02AK(); - c02ak.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/C02ALJE.java b/simple_examples/C02ALJE.java deleted file mode 100644 index 4f9eac9..0000000 --- a/simple_examples/C02ALJE.java +++ /dev/null @@ -1,64 +0,0 @@ -import com.nag.routines.C02.C02AL; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AL - */ -public class C02ALJE { - - public static void main(String[] args) { - - double a = 0, b = 0, c = 0, d = 0, e = 0; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ALJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - e = Double.parseDouble(sVal[0]); - a = Double.parseDouble(sVal[1]); - b = Double.parseDouble(sVal[2]); - c = Double.parseDouble(sVal[3]); - d = Double.parseDouble(sVal[4]); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AL c02al = new C02AL(); - c02al.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02al.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/C02AMJE.java b/simple_examples/C02AMJE.java deleted file mode 100644 index f1fffa4..0000000 --- a/simple_examples/C02AMJE.java +++ /dev/null @@ -1,75 +0,0 @@ -import com.nag.routines.C02.C02AM; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AM - */ -public class C02AMJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex r = null, s = null, t = null, u = null; - int i, ifail; - - double[] errest = new double[3]; - double[] zeroi = new double[3]; - double[] zeror = new double[3]; - - System.out.println(" C02AMJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - u = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - r = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - s = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - t = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 0; - C02AM c02am = new C02AM(); - c02am.eval(u, r, s, t, zeror, zeroi, errest, ifail); - - System.out.println(); - System.out.println(" Roots of cubic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 3; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/C02ANJE.java b/simple_examples/C02ANJE.java deleted file mode 100644 index dc865e2..0000000 --- a/simple_examples/C02ANJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.C02.C02AN; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C02AN - */ -public class C02ANJE { - - public static void main(String[] args) { - - Routine.setComplex(new NAGComplex()); - - NAGComplex a = null, b = null, c = null, d = null, e = null; - int i, ifail; - - double[] errest = new double[4]; - double[] zeroi = new double[4]; - double[] zeror = new double[4]; - - System.out.println(" C02ANJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - reader.readLine(); // Skip heading in data file - - String line = reader.readLine().replaceAll("[(),]", ""); - String[] sVal = line.trim().split("\\s+"); - e = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - a = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - b = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - c = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - line = reader.readLine().replaceAll("[(),]", ""); - sVal = line.trim().split("\\s+"); - d = new NAGComplex(Double.parseDouble(sVal[0]), Double.parseDouble(sVal[1])); - - } catch (FileNotFoundException e_exception) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e_exception) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e_exception.getMessage()); - } - - ifail = 0; - C02AN c02an = new C02AN(); - c02an.eval(e, a, b, c, d, zeror, zeroi, errest, ifail); - ifail = c02an.getIFAIL(); - - System.out.println(); - System.out.println(" Roots of quartic equation Error estimates"); - System.out.println(" (machine-dependent)"); - System.out.println(); - - for (i = 0; i < 4; i++) { - System.out.printf(" z = %12.4E%+12.4E*i %9.1E\n", zeror[i], zeroi[i], errest[i]); - } - } -} diff --git a/simple_examples/C05AUJE.java b/simple_examples/C05AUJE.java deleted file mode 100644 index d2b09b1..0000000 --- a/simple_examples/C05AUJE.java +++ /dev/null @@ -1,67 +0,0 @@ -import com.nag.routines.C05.C05AU; - -/** - * C05AUJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05AUJE{ - - /** - * C05AUJ main program - */ - public static void main(String[] args){ - double a = 0, b = 0, eps, eta, h, x; //placeholders - int ifail; - double[] ruser; - int[] iuser; - - ruser = new double[1]; //need to initialise before passing to wrapper - iuser = new int[1]; - - System.out.println("C05AUJ Example Program Results"); - - x = 1; - h = 0.1; - eps = 0.00001; - eta = 0; - - //Instance of class f to pass to wrapper - f f1 = new f(); - - ifail = -1; - C05AU c05au = new C05AU(x, h, eps, eta, f1, a, b, iuser, ruser, ifail); - c05au.eval(); - - //update values - x = c05au.getX(); - a = c05au.getA(); - b = c05au.getB(); - ifail = c05au.getIFAIL(); - - System.out.println(); - - switch(ifail){ - case 0: - System.out.printf("Root is : \t%.5f\n", x); - System.out.printf("Interval searched is : \t[ %.5f, %.5f]\n", a, b); - break; - case 3: - case 4: - System.out.printf("Final value = %.5f\n", x); - break; - } - } - - /** - * Extends abstract class C05AU.Abstract_C05AU_F. eval() returns the value of the function at a given x. - * eval() must be implemented by the user. - * @return x - e^x - */ - public static class f extends C05AU.Abstract_C05AU_F{ - public double eval(){ - return(this.X - Math.exp(-this.X)); - } - } -} - diff --git a/simple_examples/C05AWJE.java b/simple_examples/C05AWJE.java deleted file mode 100644 index 6ea3c9f..0000000 --- a/simple_examples/C05AWJE.java +++ /dev/null @@ -1,59 +0,0 @@ -import com.nag.routines.C05.C05AW; - -public class C05AWJE{ - - public static void main(String[] args){ - double eps, eta, x; - int ifail, nfmax; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("C05AWJ Example Program Results"); - System.out.println(); - - boolean finished = false; - for(int i = 3; i <= 4; i++){ - eps = Math.pow(10, -i); - x = 1; - eta = 0; - nfmax = 200; - - ifail = -1; - f f1 = new f(); - C05AW c05aw = new C05AW(x, eps, eta, f1, nfmax, iuser, ruser, ifail); - c05aw.eval(); - - ifail = c05aw.getIFAIL(); - x = c05aw.getX(); - eps = c05aw.getEPS(); - - switch(ifail){ - case(0): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - case(-1): - //exit loop - finished = true; - break; - case(3): - case(4): - System.out.printf("With eps = %.2e root = %.5f\n", eps, x); - break; - } - if(finished){ - break; - } - } - } - - public static class f extends C05AW.Abstract_C05AW_F{ - public double eval(){ - return(Math.exp(-X) - X); - } - } -} - - diff --git a/simple_examples/C05AYJE.java b/simple_examples/C05AYJE.java deleted file mode 100644 index c9ee43b..0000000 --- a/simple_examples/C05AYJE.java +++ /dev/null @@ -1,44 +0,0 @@ -import com.nag.routines.C05.C05AY; - -/** - * C05AY example program text. - */ -public class C05AYJE { - - public static void main(String[] args) { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - int ifail = 0; - int[] iuser = new int[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch (ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/C05AZJE.java b/simple_examples/C05AZJE.java deleted file mode 100644 index 7c3e27e..0000000 --- a/simple_examples/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.routines.C05.C05AZ; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * C05AZ example program text. - */ -public class C05AZJE { - - public static void main(String[] args) { - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - int ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - if (ind == 0) { - keepOn = false; - } - else { - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - - } - - switch (ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/C05BBJE.java b/simple_examples/C05BBJE.java deleted file mode 100644 index 4723773..0000000 --- a/simple_examples/C05BBJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.C05.C05BB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C05BBJ Example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C05BBJE{ - - /** - * C05BBJE main program text - */ - public static void main(String[] args){ - NAGComplex w, z; - double resid = 0; - int branch = 0, ifail = 0; //placeholder - boolean offset = false; //placeholder - - //need to initialise first - z = new NAGComplex(); - w = new NAGComplex(); - - System.out.println("C05BBJ Example Program Results"); - - if(args.length != 1){ - System.out.println("Please specify path to data file as input"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - branch = Integer.parseInt(sVal[0]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - offset = Boolean.parseBoolean(sVal[0]); - - System.out.printf("Branch = %d\n", branch); - System.out.printf("Offset = %b\n", offset); - - System.out.println(); - System.out.printf("\t\tZ\t\t\tW(Z)\t\t\t\tRESID\tIFAIL\n"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - sVal = line.split("\\s+"); - - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - - ifail = -1; - C05BB c05bb = new C05BB(branch, offset, z, w, resid, ifail); - c05bb.eval(); - - z = (NAGComplex) c05bb.getZ(); - w = (NAGComplex) c05bb.getW(); - resid = c05bb.getRESID(); - ifail = c05bb.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("(%.5e, %.5e)\t (%.5e, %.5e)\t %.5e\t %d\n", z.getRe(), z.getIm(), w.getRe(), w.getIm(), resid, ifail); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/C05MBJE.java b/simple_examples/C05MBJE.java deleted file mode 100644 index 9b46ff5..0000000 --- a/simple_examples/C05MBJE.java +++ /dev/null @@ -1,95 +0,0 @@ -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ example program text. - * - * @author joed - * @since 27.0.0.0 - * - */ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ example main program. - */ - public static void main(String[] args) { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - int astart, i, ifail, m; - double[] fvec, x; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail == 0 || ifail == 8 || ifail == 9) { - if (ifail == 0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/C05QBJE.java b/simple_examples/C05QBJE.java deleted file mode 100644 index 4b93405..0000000 --- a/simple_examples/C05QBJE.java +++ /dev/null @@ -1,167 +0,0 @@ -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05QB example program text. - * @author ludovic - */ -public class C05QBJE { - - public static void main(String[] args) { - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - int[] IUSER = new int[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if (count == 3) { - System.out.println(); - count = 0; - } - } - break; - } - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private int N, IFLAG; - private double[] X, FVEC, RUSER; - private int[] IUSER; - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void eval(int N, double[] X, double[] FVEC, int[] IUSER, double[] RUSER, int IFLAG) { - - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for (int i = 1; i < N; ++i) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - for (int i = 0; i < N-1; ++i) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - } - - } - - } - -} diff --git a/simple_examples/C06BAJE.java b/simple_examples/C06BAJE.java deleted file mode 100644 index 541d4d3..0000000 --- a/simple_examples/C06BAJE.java +++ /dev/null @@ -1,56 +0,0 @@ -import com.nag.routines.C06.C06BA; -import com.nag.routines.X01.X01AA; - -/** - * C06BAJ example program text. - * @author willa - */ -public class C06BAJE{ - - public static void main(String[] args){ - int lwork = 16, nout = 6; - int ifail, ncall; - double abserr = 0.0, ans, error, pi = 0.0, r, result = 0.0, seqn, sig; - double[] work; - - C06BA c06ba = new C06BA(); - work = new double[lwork]; - - System.out.println("C06BAJ Example Program Results"); - System.out.println(); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - - ans = Math.pow(pi, 2)/12.0; - ncall = 0; - sig = 1.0; - seqn = 0.0; - System.out.println("\t\t\t Estimated\t Actual"); - System.out.println("I\t SEQN \t RESULT\t abs error\t error"); - System.out.println(); - - for(int i = 0; i < 10; i++){ - r = (double) i + 1; - seqn = seqn + sig/Math.pow(r, 2); - - ifail = 0; - c06ba.eval(seqn, ncall, result, abserr, work, lwork, ifail); - - //update variables - ncall = c06ba.getNCALL(); - result = c06ba.getRESULT(); - abserr = c06ba.getABSERR(); - - error = result - ans; - sig = -sig; - - if(i <= 2){ - System.out.printf("%d\t %.4f\t %.4f\t -\t\t %.2e\n", (i + 1), seqn, result, error); - } - else{ - System.out.printf("%d\t %.4f\t %.4f\t %.2e\t %.2e\n", (i + 1), seqn, result, abserr, error); - } - } - } -} diff --git a/simple_examples/C06FKJE.java b/simple_examples/C06FKJE.java deleted file mode 100644 index 58db62f..0000000 --- a/simple_examples/C06FKJE.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.nag.routines.C06.C06FK; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C06FKJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class C06FKJE{ - - /** - * C06FKJE main program - */ - public static void main(String[] args){ - int ifail = 0, n = 0; //placeholder - double[] work, xa, xb, ya, yb; - - work = new double[0]; - xa = new double[0]; - xb = new double[0]; - ya = new double[0]; - yb = new double[0]; //placeholders - - System.out.println("C06FKJ Example Program Results"); - System.out.println(); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - //Break when the end of the file is reached - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - work = new double[n]; - xa = new double[n]; - xb = new double[n]; - ya = new double[n]; - yb = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - xa[i] = Double.parseDouble(sVal[0]); - xb[i] = xa[i]; - ya[i] = Double.parseDouble(sVal[1]); - yb[i] = ya[i]; - } - - ifail = 0; - - C06FK c06fk1 = new C06FK(1, xa, ya, n, work, ifail); - c06fk1.eval(); - xa = c06fk1.getX(); - C06FK c06fk2 = new C06FK(2, xb, yb, n, work, ifail); - c06fk2.eval(); - xb = c06fk2.getX(); - - System.out.printf("\tCovolution \tCorrelation\n"); - System.out.println(); - - for(int i = 0; i < n; i++){ - System.out.printf("%d\t%.5f\t\t%.5f\n", i, xa[i], xb[i]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/C09AAJE.java b/simple_examples/C09AAJE.java deleted file mode 100644 index 48c38b6..0000000 --- a/simple_examples/C09AAJE.java +++ /dev/null @@ -1,158 +0,0 @@ -import com.nag.routines.C09.C09AA; -import com.nag.routines.C09.C09CC; -import com.nag.routines.C09.C09CD; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * C09AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class C09AAJE{ - - /** - * C09AAJ example main program - */ - public static void main(String[] args){ - int ifail, lenc = 0, n = 0, nf = 0, nnz, nwc = 0, nwlmax = 0, ny; //placeholders - String mode = "", wavnam = "", wtrans; //placeholders - int[] dwtlev, icomm; - double[] c, x, y; - - x = new double[0]; y = new double[0]; //placeholders - - //print error message if no data file given - if(args.length != 1){ - C09AAJE.usage(); - } - - icomm = new int[100]; - - System.out.println("C09AAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - wavnam = sVal[1]; - mode = sVal[2]; - - x = new double[n]; - y = new double[n]; - - System.out.printf("Parameters read from file :: \n \tWavelet : %s \tEnd mode : %s \t N = %d\n", wavnam, mode, n); - - System.out.println("Input data \tX : "); - for(int i = 0; i < n; i++){ - line = reader.readLine(); - //Avoid errors with data file format and negative numbers - line = " " + line; - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - System.out.printf("%.3f\t", x[i]); - } - System.out.printf("\n"); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //Query wavelet filter dimensions - //For Multi-Resolution analysis ,decomposition, wrtrans = 'M' - wtrans = "Multilevel"; - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - C09AA c09aa = new C09AA(wavnam, wtrans, mode, n, nwlmax, nf, nwc, icomm, ifail); - c09aa.eval(); - - nwc = c09aa.getNWC(); - nwlmax = c09aa.getNWLMAX(); - lenc = nwc; - c = new double[lenc]; - dwtlev = new int[nwlmax + 1]; - - icomm = c09aa.getICOMM(); - ifail = 0; - //Perform discrete wavelet transform - C09CC c09cc = new C09CC(n, x, lenc, c, nwlmax, dwtlev, icomm, ifail); - c09cc.eval(); - - nf = c09aa.getNF(); - nwlmax = c09cc.getNWL(); - dwtlev = c09cc.getDWTLEV(); - c = c09cc.getC(); - - System.out.println(); - System.out.printf("Length of wavelet filter : \t%d\n", nf); - System.out.printf("Number of Levels : \t%d\n", nwlmax); - System.out.printf("Number of coefficients in each level: \n\t\t"); - for(int i = 0; i <= nwlmax; i++){ - System.out.printf("%d\t ", dwtlev[i]); - } - System.out.printf("\n"); - System.out.printf("Total number of wavelength coefficients : %d\n", nwc); - nnz = arraySum(dwtlev); - System.out.println(); - System.out.println("Wavelet coefficients C:"); - for(int i = 0; i < nnz; i++){ - System.out.printf("%.3f ", c[i]); - } - System.out.printf("\n"); - - //Reconstruct original data - ny = n; - - ifail = 0; - lenc = c09cc.getLENC(); - icomm = c09cc.getICOMM(); - C09CD c09cd = new C09CD(nwlmax, lenc, c, ny, y, icomm, ifail); - c09cd.eval(); - - y = c09cd.getY(); - System.out.println(); - System.out.printf("Reconstruction \tY : \n"); - for(int i = 0; i < ny; i++){ - System.out.printf("%.3f ", y[i]); - } - System.out.printf("\n"); - } - - /** - * Finds the sum of all integers in an array - * @param a - * Array to sum - * @return total - */ - private static int arraySum(int[] a){ - int tot = 0; - for(int i = 0; i < a.length; i++){ - tot += a[i]; - } - return tot; - } - - /** - * No arguments supplied when exmaple runs - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/D01BDJE.java b/simple_examples/D01BDJE.java deleted file mode 100644 index 8659cc4..0000000 --- a/simple_examples/D01BDJE.java +++ /dev/null @@ -1,58 +0,0 @@ -import com.nag.routines.D01.D01BD; - -/** - * D01BD example program text. - */ -public class D01BDJE { - - public static void main(String[] args) { - - double a = 0.0, b = 1.0; - double epsabs = 0.0, epsrel = 0.0001; - double result = Double.NaN; - double abserr = Double.NaN; - FUN fun = new FUN(); - D01BD d01bd = new D01BD(fun, a, b, epsabs, epsrel, result, abserr); - - d01bd.eval(); - result = d01bd.getRESULT(); - abserr = d01bd.getABSERR(); - - System.out.println(" D01BDJ Example Program Results"); - - System.out.println(); - System.out.printf(" A - lower limit of integration = %10.4f\n",a); - System.out.printf(" B - upper limit of integration = %10.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.println(); - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.println(); - - if (abserr > Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - } - -} diff --git a/simple_examples/D01RJJE.java b/simple_examples/D01RJJE.java deleted file mode 100644 index 9eee98a..0000000 --- a/simple_examples/D01RJJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.D01.D01RJ; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RJ example program text. - * @author Mo - */ -public class D01RJJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RJJ Example Program Results"); - - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - /* pass constant to f through ruser */ - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RJ d01rj = new D01RJ(); - ifail = -1; - d01rj.eval(f, a, b, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rj.getRESULT(); - abserr = d01rj.getABSERR(); - ifail = d01rj.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F with IFLAG %4d\n",iuser[0]); - System.out.println(); - } - - } - - } - - public static class F implements D01RJ.D01RJ_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int i = 0; i < NX; i++) { - if (X[i] == 1.0) { - /* An undefined result will be generated. */ - /* Set iflag to force an immediate exit */ - IFLAG = -1; - /* Store chosen value of iflag in iuser */ - IUSER[0] = IFLAG; - } - } - if (IFLAG != -1) { - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j])/ - Math.sqrt(1.0 - Math.pow(X[j],2)/RUSER[0]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/D01RKJE.java b/simple_examples/D01RKJE.java deleted file mode 100644 index 20c0501..0000000 --- a/simple_examples/D01RKJE.java +++ /dev/null @@ -1,173 +0,0 @@ -import com.nag.routines.D01.D01RK; -import com.nag.routines.X01.X01AA; -import java.util.Arrays; - -/** - * D01RK example program text. - * @author Mo - */ -public class D01RKJE { - - public static void main(String[] args) { - - double pi = 0.0; - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, key, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RKJ Example Program Results"); - - key = 6; - X01AA x01aa = new X01AA(pi); - pi = x01aa.eval(); - a = 0.0; - b = 2.0*pi; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {4.0*Math.pow(pi,2)}; - cpuser = 0L; - - D01RK d01rk = new D01RK(); - ifail = -1; - d01rk.eval(f, a, b, key, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rk.getRESULT(); - abserr = d01rk.getABSERR(); - ifail = d01rk.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" KEY - choice of Gaussian rule = %4d\n",key); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RK.D01RK_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int i = 0; i < NX; i++) { - FV[i] = 0.0; - } - - for (int j = 0; j < NX; j++) { - FV[j] = X[j] * Math.sin(30.0 * X[j]) * Math.cos(X[j]); - } - return; - - } - - } - -} diff --git a/simple_examples/D01RLJE.java b/simple_examples/D01RLJE.java deleted file mode 100644 index c8a6d0e..0000000 --- a/simple_examples/D01RLJE.java +++ /dev/null @@ -1,196 +0,0 @@ -import com.nag.routines.D01.D01RL; -import java.util.Arrays; - -/** - * D01RL example program text. - * @author Mo - */ -public class D01RLJE { - - public static void main(String[] args) { - - double a, b, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] points, rinfo, ruser; - int [] iinfo, iuser; - int ifail, liinfo, lrinfo, maxsub, npts; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RLJ Example Program Results"); - - epsabs = 0.0; - epsrel = 0.0001; - a = 0.0; - b = 1.0; - npts = 1; - maxsub = 20; - liinfo = 2*Math.max(maxsub,npts) + npts + 4; - lrinfo = 4*Math.max(maxsub,npts) + npts + 6; - - points = new double[npts]; - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[21]; - - points[0] = 1.0/7.0; - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RL d01rl = new D01RL(); - ifail = -1; - d01rl.eval(f, a, b, npts, points, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - points = d01rl.getPOINTS(); - result = d01rl.getRESULT(); - abserr = d01rl.getABSERR(); - ifail = d01rl.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",a); - System.out.printf(" B - upper limit of integration = %9.4f\n",b); - System.out.printf(" POINT(1) - given break-point = %9.4f\n",points[0]); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F"); - System.out.println(); - } - - } - - } - - public static class F implements D01RL.D01RL_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - /*for (int i = 0; i < NX; i++) {*/ - /*FV[i] = 0.0;*/ - /*}*/ - - for (int i = 0; i < NX; i++) { - FV[i] = Math.abs(X[i] - 1.0/7.0); - } - - for (int i = 0; i < NX; i++) { - if (FV[i] == 0.0) { - /* A singular point will be hit. */ - /* Record offending abscissae and abort computation. */ - IFLAG = 0; - for (int k = 0; k < NX; k++) { - if (FV[k] == 0.0) { - IFLAG = IFLAG + 1; - RUSER[IFLAG-1] = X[k]; - } - } - /* Store value of iflag in iuser */ - IUSER[0] = IFLAG; - /* signal abort by setting iflag<0 */ - IFLAG = -IFLAG; - } - } - if (IFLAG == 0) { - /* Safe to evaluate. */ - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/Math.sqrt(FV[j]); - } - } - return; - - } - - } - -} diff --git a/simple_examples/D01RMJE.java b/simple_examples/D01RMJE.java deleted file mode 100644 index 6e80b2b..0000000 --- a/simple_examples/D01RMJE.java +++ /dev/null @@ -1,163 +0,0 @@ -import com.nag.routines.D01.D01RM; -import java.util.Arrays; - -/** - * D01RM example program text. - * @author Mo - */ -public class D01RMJE { - - public static void main(String[] args) { - - double bound, epsabs, epsrel; - double result = Double.NaN; - double abserr = Double.NaN; - double[] rinfo, ruser; - int [] iinfo, iuser; - int ifail, inf, liinfo, lrinfo, maxsub; - long cpuser; // c_ptr - F f = new F(); - - /* Header */ - System.out.println(" D01RMJ Example Program Results"); - - bound = 0.0; - inf = 1; - epsabs = 0.0; - epsrel = 0.0001; - maxsub = 20; - lrinfo = 4*maxsub; - liinfo = Math.max(maxsub,4); - - rinfo = new double[lrinfo]; - iinfo = new int[liinfo]; - iuser = new int[0]; - ruser = new double[0]; - - iuser = new int[] {0}; - ruser = new double[] {0.0}; - cpuser = 0L; - - D01RM d01rm = new D01RM(); - ifail = -1; - d01rm.eval(f, bound, inf, epsabs, epsrel, maxsub, result, abserr, - rinfo, iinfo, iuser, ruser, cpuser, ifail); - result = d01rm.getRESULT(); - abserr = d01rm.getABSERR(); - ifail = d01rm.getIFAIL(); - - if (ifail >= 0) { - System.out.println(); - System.out.printf(" A - lower limit of integration = %9.4f\n",bound); - System.out.println(" B - upper limit of integration = infinity\n"); - System.out.printf(" EPSABS - absolute accuracy requested = %9.2E\n",epsabs); - System.out.printf(" EPSREL - relative accuracy requested = %9.2E\n",epsrel); - System.out.printf(" MAXSUB - maximum number of subintervals = %4d\n",maxsub); - System.out.println(); - if (ifail <= 5) { - System.out.printf(" RESULT - approximation to the integral = %9.5f\n",result); - System.out.printf(" ABSERR - estimate to the absolute error = %9.2E\n",abserr); - System.out.printf(" IINFO(1) - number of subintervals used = %4d\n",iinfo[0]); - System.out.println(); - } - else if (ifail == -1) { - /* User requested exit */ - System.out.printf(" Exit requested from F \n"); - System.out.println(); - } - - } - - } - - public static class F implements D01RM.D01RM_F { - - private int NX, IFLAG; - private double[] X, FV, RUSER; - private int[] IUSER; - private long CPUSER; - - @Override - public void setX(double[] X) { - this.X = X; - } - - @Override - public double[] getX() { - return X; - } - - @Override - public void setNX(int NX) { - this.NX = NX; - } - - @Override - public int getNX() { - return NX; - } - - @Override - public void setFV(double[] FV) { - this.FV = FV; - } - - @Override - public double[] getFV() { - return FV; - } - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setIUSER(int[] IUSER) { - this.IUSER = IUSER; - } - - @Override - public int[] getIUSER() { - return IUSER; - } - - @Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - @Override - public double[] getRUSER() { - return RUSER; - } - - @Override - public void setCPUSER(long CPUSER) { - this.CPUSER = CPUSER; - } - - @Override - public long getCPUSER() { - return CPUSER; - } - - @Override - public void eval(double[] X, int NX, double[] FV, int IFLAG, - int[] IUSER, double[] RUSER, long CPUSER) { - - for (int j = 0; j < NX; j++) { - FV[j] = 1.0/((X[j] + 1.0) * Math.sqrt(X[j])); - } - return; - - } - - } - -} diff --git a/simple_examples/D01TCJE.java b/simple_examples/D01TCJE.java deleted file mode 100644 index cde8428..0000000 --- a/simple_examples/D01TCJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.routines.D01.D01TC; -import java.util.Arrays; - -/** - * D01TC example program text. - * @author Mo - */ -public class D01TCJE { - - public static void main(String[] args) { - - double a, b, c, d; - double[] abscis, weight; - int n, ifail, itype; - - /* Header */ - System.out.println(" D01TCJ Example Program Results"); - - n = 7; - a = 0.0; - b = 1.0; - c = 0.0; - d = 0.0; - itype = -3; - - abscis = new double[n]; - weight = new double[n]; - - D01TC d01tc = new D01TC(); - ifail = 0; - d01tc.eval(itype, a, b, c, d, n, weight, abscis, ifail); - abscis= d01tc.getABSCIS(); - weight = d01tc.getWEIGHT(); - - System.out.println(); - System.out.printf(" Laguerre formula, %2d points\n",n); - System.out.println(); - System.out.println(" Abscissae Weights\n"); - for (int j = 0; j < n; j++) { - System.out.printf("%15.5E %15.5E\n", abscis[j], weight[j]); - } - - } - -} diff --git a/simple_examples/D02NEJE.java b/simple_examples/D02NEJE.java deleted file mode 100644 index 3d90bb8..0000000 --- a/simple_examples/D02NEJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; -import java.util.Arrays; - -/** - * D02NE example program text. - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) { - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - int ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - int[] icom, iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[neq]; - com = new double[lcom]; - rtol = new double[neq]; - y = new double[neq]; - ydot = new double[neq]; - icom = new int[licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - int neq, int ml, int mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - int md, ms, pdDim1; - - pdDim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[getIdx(md, 1, pdDim1)] = -ALPHA - cj; - pd[getIdx(md, 2, pdDim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[getIdx(md, 3, pdDim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[getIdx(ms, 1, pdDim1)] = ALPHA; - pd[getIdx(ms, 2, pdDim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[getIdx(ms, 2, pdDim1)] = BETA * y[2]; - pd[getIdx(ms, 3, pdDim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[getIdx(ms, 3, pdDim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - int neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - int ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/D02TLJE.java b/simple_examples/D02TLJE.java deleted file mode 100644 index 9333518..0000000 --- a/simple_examples/D02TLJE.java +++ /dev/null @@ -1,290 +0,0 @@ -import com.nag.routines.D02.D02TL; -import com.nag.routines.D02.D02TV; -import com.nag.routines.D02.D02TX; -import com.nag.routines.D02.D02TY; -import com.nag.routines.D02.D02TZ; -import java.util.Arrays; - -/** - * D02TL example program text. - * @author joed - */ -public class D02TLJE { - - public static final int MMAX = 3, NEQ = 3, NLBC = 3, NRBC = 3; - - public static double omega, sqrofr; - public static int[] m = {1, 3, 2}; - - public static FFUN ffun = new FFUN(); - public static FJAC fjac = new FJAC(); - public static GAFUN gafun = new GAFUN(); - public static GAJAC gajac = new GAJAC(); - public static GBFUN gbfun = new GBFUN(); - public static GBJAC gbjac = new GBJAC(); - public static GUESS guess = new GUESS(); - - public static void main(String[] args) { - - D02TL d02tl = new D02TL(); - D02TV d02tv = new D02TV(); - D02TX d02tx = new D02TX(); - D02TY d02ty = new D02TY(); - D02TZ d02tz = new D02TZ(); - double dx, ermx, r; - int iermx, ifail, ijermx, licomm, lrcomm, mxmesh, ncol, ncont, - nmesh; - double[] mesh, rcomm, tol, y, ruser = new double[1]; - int[] icomm, ipmesh, iuser = new int[2]; - - System.out.println(" D02TLJ Example Program Results"); - System.out.println(); - - ncol = 7; - nmesh = 11; - mxmesh = 51; - - mesh = new double[mxmesh]; - tol = new double[NEQ]; - y = new double[NEQ * MMAX]; - ipmesh = new int[mxmesh]; - - omega = 1.0; - Arrays.fill(tol, 1.0E-4); - - dx = 1.0 / ((double) nmesh - 1); - - mesh[0] = 0.0; - for (int i = 1; i < nmesh - 1; i++) { - mesh[i] = mesh[i - 1] + dx; - } - mesh[nmesh - 1] = 1.0; - - ipmesh[0] = 1; - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - ipmesh[nmesh - 1] = 1; - - // Workspace query to get size of rcomm and icomm - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, ruser, - 0, iuser, 2, ifail - ); - ifail = d02tv.getIFAIL(); - lrcomm = iuser[0]; - licomm = iuser[1]; - rcomm = new double[lrcomm]; - icomm = new int[licomm]; - - // Initialise integrator for given problem - ifail = 0; - d02tv.eval( - NEQ, m, NLBC, NRBC, ncol, tol, mxmesh, nmesh, mesh, ipmesh, rcomm, - lrcomm, icomm, licomm, ifail - ); - ifail = d02tv.getIFAIL(); - - ncont = 3; - r = 1.0E6; - - sqrofr = Math.sqrt(r); - - ermx = 0.0; - iermx = 0; - ijermx = 0; - - for (int j = 0; j < ncont; j++) { - System.out.printf("\n Tolerance = %8.1E R = %10.3E\n", tol[0], r); - - // Solve problem - ifail = -1; - d02tl.eval( - ffun, fjac, gafun, gbfun, gajac, gbjac, guess, rcomm, icomm, - iuser, ruser, ifail - ); - ifail = d02tl.getIFAIL(); - if (ifail != 0) { - System.err.println("D02TL failed with error code " + ifail); - } - - // Extract mesh - ifail = -1; - d02tz.eval( - mxmesh, nmesh, mesh, ipmesh, ermx, iermx, ijermx, rcomm, icomm, - ifail - ); - nmesh = d02tz.getNMESH(); - iermx = d02tz.getIERMX(); - ijermx = d02tz.getIJERMX(); - ermx = d02tz.getERMX(); - ifail = d02tz.getIFAIL(); - if (ifail == 1) { - break; - } - - // Print mesh, error stats - System.out.printf( - "\n" - + " Used a mesh of %4d points\n" - + " Maximum error = %10.2E in interval %4d for component %4d\n" - + "\n", - nmesh, ermx, iermx, ijermx - ); - System.out.printf("\n Mesh points:\n"); - for (int i = 0; i < nmesh; i++) { - System.out.printf("%4d(%1d)%10.3E", i+1, ipmesh[i], mesh[i]); - if ((i+1) % 4 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - - // Print solution components on mesh - System.out.printf("\n x f f\' g\n"); - for (int i = 0; i < nmesh; i++) { - ifail = 0; - d02ty.eval(mesh[i], y, NEQ, MMAX, rcomm, icomm, ifail); - ifail = d02ty.getIFAIL(); - System.out.printf( - " %8.3f %9.4f%9.4f%9.4f\n", mesh[i], y[getIdx(1, 0, NEQ)], - y[getIdx(2, 0, NEQ)], y[getIdx(3, 0, NEQ)] - ); - } - - if (j == ncont - 1) { - break; - } - - // Modify continuation parameter - r = 100.0 * r; - sqrofr = Math.sqrt(r); - - // Select mesh for continuation - Arrays.fill(ipmesh, 1, nmesh - 1, 2); - - // Call continuation primer routine - ifail = 0; - d02tx.eval(mxmesh, nmesh, mesh, ipmesh, rcomm, icomm, ifail); - mxmesh = d02tx.getMXMESH(); - nmesh = d02tx.getNMESH(); - ifail = d02tx.getIFAIL(); - - } - - } - - /** - * Converts a 2D Fortran index to the 1D index for its corresponding Java - * array. Assumes y is already zero-based. - * - *

    Fortran array definition: - * a(dimX, 0:*) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return (y * dimX) + (x-1); - } - - /** - * Converts a 3D Fortran index to the 1D index for its corresponding Java - * array. Assumes z is already zero-based. - * - *

    Fortran array definition: - * a(dimX, dimY, 0:*) - * - *

    Conversion: - * a(x, y, z) --> A[result] - */ - private static int getIdx(int x, int y, int z, int dimX, int dimY) { - return (z * dimY * dimX) + ((y-1) * dimX) + (x-1); - } - - public static class FFUN extends D02TL.Abstract_D02TL_FFUN { - - public void eval() { - F[0] = Y[getIdx(2, 0, NEQ)]; - F[1] = -((Y[getIdx(1, 0, NEQ)] * Y[getIdx(2, 2, NEQ)]) - + (Y[getIdx(3, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - F[2] = ((Y[getIdx(2, 0, NEQ)] * Y[getIdx(3, 0, NEQ)]) - - (Y[getIdx(1, 0, NEQ)] * Y[getIdx(3, 1, NEQ)])) * sqrofr; - } - - } - - public static class FJAC extends D02TL.Abstract_D02TL_FJAC { - - public void eval() { - DFDY[getIdx(1, 2, 0, NEQ, NEQ)] = 1.0; - DFDY[getIdx(2, 1, 0, NEQ, NEQ)] = -Y[getIdx(2, 2, NEQ)] * sqrofr; - DFDY[getIdx(2, 2, 2, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(2, 3, 1, NEQ, NEQ)] = -Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 1, 0, NEQ, NEQ)] = -Y[getIdx(3, 1, NEQ)] * sqrofr; - DFDY[getIdx(3, 2, 0, NEQ, NEQ)] = Y[getIdx(3, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 0, NEQ, NEQ)] = Y[getIdx(2, 0, NEQ)] * sqrofr; - DFDY[getIdx(3, 3, 1, NEQ, NEQ)] = -Y[getIdx(1, 0, NEQ)] * sqrofr; - } - - } - - public static class GAFUN extends D02TL.Abstract_D02TL_GAFUN { - - public void eval() { - GA[0] = YA[getIdx(1, 0, NEQ)]; - GA[1] = YA[getIdx(2, 0, NEQ)]; - GA[2] = YA[getIdx(3, 0, NEQ)] - omega; - } - - } - - public static class GBFUN extends D02TL.Abstract_D02TL_GBFUN { - - public void eval() { - GB[0] = YB[getIdx(1, 0, NEQ)]; - GB[1] = YB[getIdx(2, 0, NEQ)]; - GB[2] = YB[getIdx(3, 0, NEQ)] + omega; - } - - } - - public static class GAJAC extends D02TL.Abstract_D02TL_GAJAC { - - public void eval() { - DGADY[getIdx(1, 1, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(2, 2, 0, NLBC, NEQ)] = 1.0; - DGADY[getIdx(3, 3, 0, NLBC, NEQ)] = 1.0; - } - - } - - public static class GBJAC extends D02TL.Abstract_D02TL_GBJAC { - - public void eval() { - DGBDY[getIdx(1, 1, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(2, 2, 0, NRBC, NEQ)] = 1.0; - DGBDY[getIdx(3, 3, 0, NRBC, NEQ)] = 1.0; - } - - } - - public static class GUESS extends D02TL.Abstract_D02TL_GUESS { - - public void eval() { - Y[getIdx(1, 0, NEQ)] = -(X - 0.5) * Math.pow(X * (X - 1.0), 2.0); - Y[getIdx(2, 0, NEQ)] = -X * (X - 1.0) - * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 1, NEQ)] = -(2.0 * X - 1.0) - * (10.0 * X * (X - 1.0) + 1.0); - Y[getIdx(2, 2, NEQ)] = -12.0 * (5.0 * X * (X - 1.0) + 1.0); - Y[getIdx(3, 0, NEQ)] = -8.0 * omega * Math.pow(X - 0.5, 3.0); - Y[getIdx(3, 1, NEQ)] = -24.0 * omega * Math.pow(X - 0.5, 2.0); - DYM[0] = Y[getIdx(2, 0, NEQ)]; - DYM[1] = -120.0 * (X - 0.5); - DYM[2] = -56.0 * omega * (X - 0.5); - } - - } - -} diff --git a/simple_examples/D03PCJE.java b/simple_examples/D03PCJE.java deleted file mode 100644 index 4901e2e..0000000 --- a/simple_examples/D03PCJE.java +++ /dev/null @@ -1,217 +0,0 @@ -import com.nag.routines.D03.D03PC; -import com.nag.routines.D03.D03PZ; -import com.nag.routines.X01.X01AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.StringBuilder; - -/** - * D03PCJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D03PCJE{ - - /** - * D03PCJE main program - */ - public static void main(String[] args){ - int ifail, ind, intpts = 0, it, itask, itrace = 0, itype = 0, lisave, lrsave, m = 0, neqn, npts = 0, nwk, npde = 2; - double hx, pi, piby2, tout = 0, ts = 0, acc = 0, alpha = 0; - int[] isave, iuser, iwsav; - double[] rsave, u, uout, x, xout, ruser, rwsav; - boolean[] lwsav; - String[] cwsav; - - xout = new double[0]; // placeholders - ruser = new double[1]; - rwsav = new double[1100]; - iuser = new int[1]; - iwsav = new int[505]; - lwsav = new boolean[100]; - cwsav = new String[10]; - - System.out.println("D03PCJ Example Program Results"); - - //Specify path to data file - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - intpts = Integer.parseInt(sVal[0]); - npts = Integer.parseInt(sVal[1]); - itype = Integer.parseInt(sVal[2]); - - xout = new double[intpts]; - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < intpts; i++){ - xout[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.split("\\s+"); - acc = Double.parseDouble(sVal[0]); - alpha = Double.parseDouble(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - itrace = Integer.parseInt(sVal[1]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - ts = Double.parseDouble(sVal[0]); - tout = Double.parseDouble(sVal[1]); - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - neqn = npde * npts; - lisave = neqn + 24; - nwk = (10 + (6 * npde)) * neqn; - lrsave = nwk + ((21 + (3 * npde)) * npde) + (7 * npts) + 54; - - rsave = new double[lrsave]; - u = new double[npde * npts]; - uout = new double[npde * intpts * itype]; - x = new double[npts]; - isave = new int[lisave]; - ruser[0] = alpha; - ind = 0; - itask = 1; - - X01AA x01aa = new X01AA(); - pi = x01aa.eval(); - piby2 = 0.5 * pi; - hx = piby2/(double)(npts - 1); - x[0] = 0.0; - x[npts - 1] = 1.0; - for(int i = 1; i < (npts - 1); i++){ - x[i] = Math.sin(hx * (double)(i)); - } - - u = uinit(x, npts, iuser, ruser); - - //Character (80) :: cwsav(10) - //Surely a better way of doing this? - for(int i = 0; i < 10; i++){ - StringBuilder builder = new StringBuilder(""); - for(int j = 0; j < 80; j++){ - builder.append(" "); - } - cwsav[i] = builder.toString(); - } - - for(int i = 0; i <5; i++){ - tout = 10 * tout; - - ifail = 0; - pdedef pdedef1 = new pdedef(); - bndary bndary1 = new bndary(); - D03PC d03pc = new D03PC(npde, m, ts, tout, pdedef1, bndary1, u, npts, x, acc, rsave, lrsave, - isave, lisave, itask, itrace, ind, iuser, ruser, cwsav, lwsav, iwsav, - rwsav, ifail); - d03pc.eval(); - - //update ind - ind = d03pc.getIND(); - - if(i == 0){ - System.out.printf("Accuracy requirement = \t%.5e\n Parameter ALPHA = \t%.3e\n", acc, alpha); - System.out.printf("T / X "); - for(int j = 0; j < xout.length; j++){ - System.out.printf("\t%.4f", xout[j]); - } - System.out.printf("\n"); - } - System.out.println(); - - //Interpolate at required spatial points - ifail = 0; - - D03PZ d03pz = new D03PZ(npde, m, u, npts, x, xout, intpts, itype, uout, ifail); - d03pz.eval(); - - System.out.printf("%.4f \tU(1)", tout); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2]); - } - System.out.printf("\n"); - System.out.printf("\tU(2)"); - for(int j = 0; j < intpts; j++){ - System.out.printf("\t%.4f ", uout[j * 2 + 1]); - } - System.out.printf("\n"); - System.out.println(); - } - - System.out.printf("Number of Integration steps in time\t\t\t%d\n", isave[0]); - System.out.printf("Number of residual evaluations of resulting ODE system\t%d\n", isave[1]); - System.out.printf("Number of Jacobian evaluations\t\t\t\t%d\n", isave[2]); - System.out.printf("Number of iterations of nonlinear solver\t\t%d\n", isave[4]); - } - - /** - * PDE initial condition - */ - public static double[] uinit(double[] x, int npts, int[] iuser, double[] ruser){ - double alpha = ruser[0]; - double[] u = new double[2 * npts]; - for(int i = 0; i < npts; i++){ - u[2 * i] = 2 * alpha * x[i]; - u[(2 * i) + 1] = 1; - } - return u; - } - - public static class pdedef extends D03PC.Abstract_D03PC_PDEDEF{ - public void eval(){ - double alpha = this.RUSER[0]; - this.Q[0] = 4 * alpha * (this.U[1] + (this.X * this.UX[1])); - this.Q[1] = 0; - this.R[0] = this.X * this.UX[0]; - this.R[1] = this.UX[1] - (this.U[0] * this.U[1]); - this.P[0] = 0; - this.P[1] = 0; - this.P[2] = 0; - this.P[3] = 1 - (this.X * this.X); - } - } - - public static class bndary extends D03PC.Abstract_D03PC_BNDARY{ - public void eval(){ - if(this.IBND == 0){ - this.BETA[0] = 0; - this.BETA[1] = 1; - this.GAMMA[0] = this.U[0]; - this.GAMMA[1] = -this.U[0] * this.U[1]; - } - else{ - this.BETA[0] = 1; - this.BETA[1] = 0; - this.GAMMA[0] = -this.U[0]; - this.GAMMA[1] = this.U[1]; - } - } - } - -} - - - diff --git a/simple_examples/D03RAJE.java b/simple_examples/D03RAJE.java deleted file mode 100644 index 03c2e3b..0000000 --- a/simple_examples/D03RAJE.java +++ /dev/null @@ -1,307 +0,0 @@ -import com.nag.routines.D03.D03RA; -import com.nag.routines.D03.D03RA.D03RA_BNDARY; -import com.nag.routines.D03.D03RA.D03RA_MONITR; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; -import java.util.Arrays; - -/** - * D03RA example program text. - * @author joed - */ -public class D03RAJE { - - public static final double ALPHA = 50.0; - public static final double BETA = 300.0; - public static final double XMAX = 1.0; - public static final double XMIN = 0.0; - public static final double YMAX = 1.0; - public static final double YMIN = 0.0; - public static final int ITRACE = 0; - public static final int NPDE = 1; - - public static D03RA d03ra = new D03RA(); - public static PDEDEF pdedef = new PDEDEF(); - public static BNDRY bndry = new BNDRY(); - public static PDEIV pdeiv = new PDEIV(); - public static MONIT monit = new MONIT(); - public static MONITDUMMY monitDummy = new MONITDUMMY(); - - public static void main(String[] args) { - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, npde, npts, nx, ny; - double[] dt, twant, optr, rwk; - int[] wklens, iwk, opti = new int[4]; - boolean[] lwk; - - // Run examples - System.out.println(" D03RAJ Example Program Results"); - System.out.println(); - - npts = 2000; - npde = NPDE; - - dt = new double[] {0.1e-2, 0.0, 0.0}; - twant = new double[] {0.24, 0.25}; - ts = 0.0; - - ind = 10; - nx = 41; - ny = 41; - tols = 0.5; - tolt = 0.01; - Arrays.fill(opti, 0); - opti[0] = 6; - maxlev = Math.max(opti[0], 3); - - wklens = computeWkspaceLens(maxlev, npde, npts); - lenrwk = wklens[0]; - leniwk = wklens[1]; - lenlwk = wklens[2]; - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - - optr = new double[3 * npde]; - Arrays.fill(optr, 1.0); - - for (int i = 0; i < 2; i++) { - tout = twant[i]; - ifail = 0; - if (i == 0) { - // Dummy monitor used to avoid output on first call - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monitDummy, opti, optr, - rwk, lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - else { - d03ra.eval( - npde, ts, tout, dt, XMIN, XMAX, YMIN, YMAX, nx, ny, tols, - tolt, pdedef, bndry, pdeiv, monit, opti, optr, rwk, - lenrwk, iwk, leniwk, lwk, lenlwk, ITRACE, ind, ifail - ); - } - - ind = d03ra.getIND(); - ifail = d03ra.getIFAIL(); - ts = d03ra.getTS(); - - printStatistics(ts, iwk, maxlev); - - } - - } - - public static class PDEIV extends D03RA.Abstract_D03RA_PDEIV { - - public void eval() { - Arrays.fill(this.U, 1.0); - } - - } - - public static class PDEDEF extends D03RA.Abstract_D03RA_PDEDEF { - - private static final double ACTIV_ENERGY = 20.0; - private static final double DIFFUSION = 0.1; - private static final double HEAT_RELEASE = 1.0; - private static final double REACTION_RATE = 5.0; - - public void eval() { - - double damkohler; - - damkohler = REACTION_RATE * Math.exp(ACTIV_ENERGY) - / (HEAT_RELEASE * ACTIV_ENERGY); - - for (int col = 0; col < this.NPDE; col++) { - for (int row = 0; row < this.NPTS; row++) { - int idx = (col * this.NPTS) + row; - this.RES[idx] = this.UT[idx] - - (DIFFUSION * (this.UXX[idx] + this.UYY[idx])) - - (damkohler - * (1.0e0 + HEAT_RELEASE - this.U[idx]) - * Math.exp(-ACTIV_ENERGY / this.U[idx])); - } - } - - } - - } - - public static class BNDRY extends D03RA.Abstract_D03RA_BNDARY { - - public void eval() { - X02AJ x02aj = new X02AJ(); - double tol; - - // X02AJ returns machine precision - tol = 10.0 * x02aj.eval(); - - for (int i = 0; i < this.NBPTS; i++) { - int j = this.LBND[i] - 1; - - if (Math.abs(this.X[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UX[idx]; - } - } - else if (Math.abs(this.X[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - else if (Math.abs(this.Y[j]) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.UY[idx]; - } - } - else if (Math.abs(this.Y[j] - 1.0) <= tol) { - for (int col = 0; col < this.NPDE; col++) { - int idx = (col * this.NPTS) + j; - this.RES[idx] = this.U[idx] - 1.0; - } - } - } - - } - - } - - public static class MONIT extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - int ipsol, k, level, npts; - - if (TLAST) { - // Print solution - level = this.NLEV - 1; - npts = this.NGPTS[level]; - ipsol = this.LSOL[level]; - k = 0; - for (int i = 0; i < level; i++) { - k += this.NGPTS[i]; - } - - System.out.printf( - " Solution at every 4th grid point in level%10d" - + " at time %8.4f:%n%n", this.NLEV, this.T - ); - System.out.println( - " x y approx u\n" - ); - for (int i = 0; i < npts; i += 4) { - double ix = this.XPTS[k + i]; - double iy = this.YPTS[k + i]; - double isol = this.SOL[ipsol + i]; - System.out.printf( - " %11.4E %11.3E %11.3E%n", - ix, iy, isol - ); - } - System.out.println(); - - } - - } - - } - - public static class MONITDUMMY extends D03RA.Abstract_D03RA_MONITR { - - public void eval() { - return; - } - - } - - public static int[] computeWkspaceLens(int maxlev, int npde, int maxpts) { - int lenrwk, leniwk, lenlwk; - - lenrwk = (2 * maxpts * npde * ((5 * maxlev) + (18 * npde) + 9)) - + (2 * maxpts); - leniwk = (2 * maxpts * (14 + (5 * maxlev))) - + (7 * maxlev) + 2; - lenlwk = (2 * maxpts) + 400; - - return new int[] {lenrwk, leniwk, lenlwk}; - - } - - public static void printStatistics(double ts, int[] iwk, int maxlev) { - int[] istats = new int[4]; - - System.out.printf(" Statistics:%n"); - System.out.printf(" Time = %8.4f%n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d%n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d%n", iwk[1] - ); - System.out.printf( - "%n" - + " Total number (rounded) of%n" - + " Residual Jacobian Newton Lin sys%n" - + " evals evals iters iters%n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j + 2] != 0) { - int idx = 0; - for (int i = j+2; i <= j+2+(3*maxlev); i += maxlev) { - istats[idx++] = iwk[i]; - } - istats = roundStatisics(istats); - System.out.printf("%8d", j + 1); - for (int i = 0; i < 4; i++) { - System.out.printf("%10d", istats[i]); - } - System.out.printf("%n"); - } - } - - System.out.printf( - "%n" - + " Maximum number of %n" - + " Newton iters Lin sys iters %n" - + " At level %n" - ); - - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf("%8d", j+1); - System.out.printf("%14d", iwk[j+2+(4*maxlev)]); - System.out.printf("%14d", iwk[j+2+(5*maxlev)]); - System.out.printf("%n"); - } - } - System.out.println(); - - } - - public static int[] roundStatisics(int[] istat) { - double lt; - int k; - - lt = Math.log(10.0); - for (int i = 0; i < istat.length; i++) { - // istat = 0 leads to div by 0 error, doesn't need rounding anyway - if (istat[i] != 0) { - k = (int) (Math.log((double) istat[i]) / lt); - k = (int) Math.pow(10, k); - istat[i] = k * ((istat[i] + k/2)/k); - } - } - - return istat; - - } - -} diff --git a/simple_examples/D03RBJE.java b/simple_examples/D03RBJE.java deleted file mode 100644 index 97faf1c..0000000 --- a/simple_examples/D03RBJE.java +++ /dev/null @@ -1,388 +0,0 @@ -import com.nag.routines.D03.D03RB; -import com.nag.routines.D03.D03RZ; -import java.util.Arrays; - -/** - * D03RB example program text. - * @author joed - */ -public class D03RBJE { - - public static final int ITRACE = -1; - public static final int NPDE = 2; - public static final double[] TWANT = {0.25, 1.0}; - - public static boolean do_monitr; - public static int print_stats = 0; - - public static BNDARY bndary = new BNDARY(); - public static INIDOM inidom = new INIDOM(); - public static MONITR monitr = new MONITR(); - public static PDEDEF pdedef = new PDEDEF(); - public static PDEIV pdeiv = new PDEIV(); - - public static void main(String[] args) { - D03RB d03rb = new D03RB(); - double tols, tolt, tout, ts; - int ifail, ind, leniwk, lenlwk, lenrwk, maxlev, mxlev, npts; - boolean[] lwk; - double[] optr, rwk, dt = new double[3]; - int[] iwk, opti = new int[4]; - - System.out.println(" D03RBJ Example Program Results"); - - npts = 3000; - mxlev = 7; - - leniwk = 10 * npts * (5 * mxlev + 14) + 2 + 7 * mxlev; - lenlwk = 20 * npts; - lenrwk = 20 * (npts * NPDE * (5 * mxlev + 9 + 18 * NPDE) + 2 * npts); - - rwk = new double[lenrwk]; - iwk = new int[leniwk]; - lwk = new boolean[lenlwk]; - optr = new double[3 * NPDE]; - - // Specify that we are starting the integration in time - // (ind = 0 normally). - ind = 10; - - ts = 0.0; - dt[0] = 0.001; - dt[1] = 1.0E-7; - dt[2] = 0.0; - tols = 0.1; - tolt = 0.05; - opti[0] = mxlev; - maxlev = opti[0]; - Arrays.fill(opti, 1, 4, 0); - Arrays.fill(optr, 1.0); - - // Call main routine - for (int iout = 1; iout <= 2; iout++) { - do_monitr = (iout == 2); - tout = TWANT[iout - 1]; - - ifail = 0; - d03rb.eval( - NPDE, ts, tout, dt, tols, tolt, inidom, pdedef, bndary, pdeiv, - monitr, opti, optr, rwk, lenrwk, iwk, leniwk, lwk, lenlwk, - ITRACE, ind, ifail - ); - ind = d03rb.getIND(); - ifail = d03rb.getIFAIL(); - ts = d03rb.getTS(); - - if (print_stats != 0) { - System.out.printf(" Statistics:\n"); - System.out.printf(" Time = %8.4f\n", ts); - System.out.printf( - " Total number of accepted timesteps =%5d\n", iwk[0] - ); - System.out.printf( - " Total number of rejected timesteps =%5d\n", iwk[1] - ); - System.out.println( - " Total number of " - + " maximum number of " - ); - System.out.println( - " Residual Jacobian Newton Newton " - ); - System.out.println( - " evals evals iters iters " - ); - System.out.println(" Level "); - - maxlev = opti[0]; - for (int j = 0; j < maxlev; j++) { - if (iwk[j+2] != 0) { - System.out.printf( - "%4d%10d%10d%10d%10d\n", - j+1, - iwk[j + 2 + 0*maxlev], - iwk[j + 2 + 1*maxlev], - iwk[j + 2 + 2*maxlev], - iwk[j + 2 + 4*maxlev] - ); - } - } - System.out.println(); - - } - - } - - } - - public static class PDEIV extends D03RB.Abstract_D03RB_PDEIV { - - public void eval(int NPTS, int NPDE, double T, double[] X, double[] Y, double[] U) { - this.setNPTS(NPTS); - this.setNPDE(NPDE); - this.setT(T); - this.setX(X); - this.setY(Y); - this.setU(U); - this.eval(); - } - - public void eval() { - double eps = 0.001, a; - - for (int i = 1; i <= this.NPTS; i++) { - a = (4.0 * (this.Y[i-1] - this.X[i-1]) - this.T) / (32.0 * eps); - if (a <= 0.0) { - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.U[getIdx(i, 1, this.NPTS)] - = 0.75 - 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - this.U[getIdx(i, 2, this.NPTS)] - = 0.75 + 0.25 * Math.exp(a) / (1.0 + Math.exp(a)); - } - } - - } - - } - - public static class INIDOM extends D03RB.Abstract_D03RB_INIDOM { - - public void eval() { - int ifail, leniwk; - int[] icold, ilbndd, irowd, lbndd, llbndd, lrowd; - int[] iwk = new int[122]; - String[] pgrid = new String[11]; - - for (int i = 0; i < 11; i++) { - pgrid[i] = " "; - } - - icold = new int[]{ - 0,1,2,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5, - 6,7,8,9,10,0,1,2,3,4,5,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4, - 5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,4,5,6,7,8,0,1,2,3,4, - 5,6,7,8,0,1,2,3,4,5,6,7,8 - }; - - ilbndd = new int[]{ - 1,2,3,4,1,4,1,2,3,4,3,4,1,2,12,23,34,41,14,41,12,23,34,41,43,14, - 21,32 - }; - - irowd = new int[]{0,1,2,3,4,5,6,7,8,9,10}; - - lbndd = new int[]{ - 2,4,15,26,37,46,57,68,79,88,98,99,100,101,102,103,104,96,86,85, - 84,83,82,70,59,48,39,28,17,6,8,9,10,11,12,13,18,29,40,49,60,72, - 73,74,75,76,77,67,56,45,36,25,33,32,42,52,53,43,1,97,105,87,81, - 3,7,71,78,14,31,51,54,34 - }; - - llbndd = new int[]{ - 1,2,11,18,19,24,31,37,42,48,53,55,56,58,59,60,61,62,63,64,65,66, - 67,68,69,70,71,72 - }; - - lrowd = new int[]{1,4,15,26,37,46,57,68,79,88,97}; - - this.NX = 11; - this.NY = 11; - - // Check MAXPTS against rough estimate of NPTS. - this.NPTS = this.NX * this.NY; - if (this.MAXPTS < this.NPTS) { - this.IERR = -1; - return; - } - - this.XMIN = 0.0; - this.YMIN = 0.0; - this.XMAX = 1.0; - this.YMAX = 1.0; - - this.NROWS = 11; - this.NPTS = 105; - this.NBNDS = 28; - this.NBPTS = 72; - - for (int i = 0; i < this.NROWS; i++) { - this.LROW[i] = lrowd[i]; - this.IROW[i] = irowd[i]; - } - - for (int i = 0; i < this.NBNDS; i++) { - this.LLBND[i] = llbndd[i]; - this.ILBND[i] = ilbndd[i]; - } - - for (int i = 0; i < this.NBPTS; i++) { - this.LBND[i] = lbndd[i]; - } - - for (int i = 0; i < this.NPTS; i++) { - this.ICOL[i] = icold[i]; - } - - } - - } - - public static class PDEDEF extends D03RB.Abstract_D03RB_PDEDEF { - - public void eval() { - - double eps = 1E-3; - int n = this.NPTS; // For concise getIdx calls - - for (int i = 1; i <= n; i++) { - this.RES[getIdx(i, 1, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 1, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 1, n)] - + eps * (this.UXX[getIdx(i, 1, n)] - + this.UYY[getIdx(i, 1, n)]); - this.RES[getIdx(i, 2, n)] - = -this.U[getIdx(i, 1, n)] * this.UX[getIdx(i, 2, n)] - - this.U[getIdx(i, 2, n)] * this.UY[getIdx(i, 2, n)] - + eps * (this.UXX[getIdx(i, 2, n)] - + this.UYY[getIdx(i, 2, n)]); - this.RES[getIdx(i, 1, n)] - = this.UT[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.UT[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - } - - } - - } - - public static class BNDARY extends D03RB.Abstract_D03RB_BNDARY { - - public void eval() { - - double a, eps = 1E-3; - int i, n = this.NPTS; - - for (int k = this.LLBND[0]; k <= this.NBPTS; k++) { - i = this.LBND[k - 1]; - a = (-4.0 * this.X[i - 1] + 4.0 * this.Y[i - 1] - this.T) - / (32.0 * eps); - - if (a <= 0.0) { - this.RES[getIdx(i, 1, n)] - = 0.75 - 0.25 / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + 0.25 / (1.0 + Math.exp(a)); - } - else { - a = -a; - this.RES[getIdx(i, 1, n)] - = 0.75 - (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - this.RES[getIdx(i, 2, n)] - = 0.75 + (0.25 * Math.exp(a)) / (1.0 + Math.exp(a)); - } - - this.RES[getIdx(i, 1, n)] - = this.U[getIdx(i, 1, n)] - this.RES[getIdx(i, 1, n)]; - this.RES[getIdx(i, 2, n)] - = this.U[getIdx(i, 2, n)] - this.RES[getIdx(i, 2, n)]; - - } - - } - - } - - public static class MONITR extends D03RB.Abstract_D03RB_MONITR { - - public void eval() { - - D03RZ d03rz = new D03RZ(); - double aprxU, exctU, aprxV, exctV; - int maxpts = 6000; - int ifail, ipsol, npts; - double[] uex = new double[105*2], x = new double[maxpts], - y = new double[maxpts]; - - for (int level = 0; level < this.NLEV; level++) { - - if (!this.TLAST) { - break; - } - - ipsol = this.LSOL[level]; - - // Get grid information - ifail = -1; - npts = 0; - d03rz.eval( - level + 1, this.NLEV, this.XMIN, this.YMIN, this.DXB, - this.DYB, this.LGRID, this.ISTRUC, npts, x, y, maxpts, - ifail - ); - ifail = d03rz.getIFAIL(); - npts = d03rz.getNPTS(); - - if (ifail != 0) { - this.IERR = 1; - break; - } - - // Skip printing? - if (!do_monitr || (level != 0)) { - continue; - } - - // Get exact solution - pdeiv.eval(npts, this.NPDE, this.T, x, y, uex); - - System.out.println(); - System.out.printf( - " Solution at every 2nd grid point in level %d at" - + " time %8.4f:\n\n", level + 1, this.T - ); - System.out.print( - " x y approx u exact u approx v" - + " exact v\n\n" - ); - - ipsol = this.LSOL[level]; - - for (int i = 0; i < npts; i += 2) { - aprxU = this.SOL[ipsol + i]; - exctU = uex[getIdx(i+1, 1, npts)]; - aprxV = this.SOL[ipsol + npts + i]; - exctV = uex[getIdx(i+1, 2, npts)]; - System.out.printf( - " %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f\n", - x[i], y[i], aprxU, exctU, aprxV, exctV - ); - } - System.out.println(); - - } - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/D05BAJE.java b/simple_examples/D05BAJE.java deleted file mode 100644 index 7a8caf7..0000000 --- a/simple_examples/D05BAJE.java +++ /dev/null @@ -1,111 +0,0 @@ -import com.nag.routines.D05.D05BA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BAJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class D05BAJE{ - - /** - * D05BAJE main program - */ - public static void main(String[] args){ - double alim, h, hi, si, thresh, tlim, tol; - int ifail, iorder, lwk, nmesh = 6; - String method; - double[] errest, yn, work; - - errest = new double[nmesh]; - yn = new double[nmesh]; - - System.out.println("D05BAJ Example Program Results"); - - method = "A"; - iorder = 6; - alim = 0; - tlim = 20; - h = (tlim - alim) / (double) nmesh; - tol = 0.001; - X02AJ x02aj = new X02AJ(); - thresh = x02aj.eval(); - lwk = 10 * nmesh + 6; - work = new double[lwk]; - - //Loop until the supplied workspace is big enough - //breakflag used to exit loop - boolean breakflag = false; - while(true){ - ifail = 1; - - ck ck1 = new ck(); - cf cf1 = new cf(); - cg cg1 = new cg(); - - D05BA d05ba = new D05BA(ck1, cg1, cf1, method, iorder, alim, tlim, yn, errest, nmesh, - tol, thresh, work, lwk, ifail); - d05ba.eval(); - - //update - ifail = d05ba.getIFAIL(); - lwk = d05ba.getLWK(); - work = d05ba.getWORK(); - - switch(ifail){ - case 5: - lwk = (int) work[0]; - work = new double[lwk]; - break; - case 6: - lwk = (int) work[0]; - work = new double[lwk]; - break; - default: - breakflag = true; - } - - if(breakflag == true){ - break; - } - } - - if(ifail != 0){ - System.out.printf("D05BAJ exited with IFAIL = %d\n", ifail); - } - - System.out.println(); - System.out.printf("Size of workplace = %d\n", lwk); - System.out.printf("Tolerance = %.4e\n", tol); - System.out.println(); - System.out.print("T\tApprox. Sol.\tTrue Sol.\tEst. Error\tActual Error\n"); - for(int i = 0; i < nmesh; i++){ - hi = (double) (i + 1) * h; - si = sol(hi); - System.out.printf("%.2f\t%.5f\t\t%.5f\t\t%.5e\t%.5e\n", (alim + hi), yn[i], si, errest[i], Math.abs((yn[i] - si) / si)); - } - } - - private static double sol(double t){ - return Math.log(t + Math.exp(1)); - } - - public static class ck extends D05BA.Abstract_D05BA_CK{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cf extends D05BA.Abstract_D05BA_CF{ - public double eval(){ - return Math.exp(-this.T); - } - } - - public static class cg extends D05BA.Abstract_D05BA_CG{ - public double eval(){ - return (this.Y + Math.exp(-this.Y)); - } - } -} - diff --git a/simple_examples/D05BEJE.java b/simple_examples/D05BEJE.java deleted file mode 100644 index f98bea3..0000000 --- a/simple_examples/D05BEJE.java +++ /dev/null @@ -1,185 +0,0 @@ -import com.nag.routines.D05.D05BE; -import com.nag.routines.X01.X01AA; -import com.nag.routines.X02.X02AJ; - -/** - * D05BEJ example program text. - * @author willa - */ -public class D05BEJE{ - - private static final int iorder = 4; - private static final int nmesh = (int)(Math.pow(2, 6) + (2 * iorder) - 1); - private static final int nout = 6; - private static final int lct = nmesh / 32 + 1; - private static final int lwk = ((2 * iorder) + 6) * nmesh + (8 * iorder * iorder) - (16 * iorder) + 1; - - public static void main(String[] args){ - double err, errmax, h, hi1, soln = 0, t = 0, tlim, tolnl; - int ifail; - double[] work, yn; - int[] nct; - - work = new double[lwk]; - yn = new double[nmesh]; - nct = new int[lct]; - - System.out.println("D05BEJ Example Program Results"); - - X02AJ x02aj = new X02AJ(); - tlim = 7; - tolnl = Math.sqrt(x02aj.eval()); - h = tlim /(double) (nmesh - 1); - yn[0] = 0; - - ifail = 0; - - D05BE d05be = new D05BE(); - ck1 k1 = new ck1(); - cf1 f1 = new cf1(); - cg1 g1 = new cg1(); - d05be.eval(k1, f1, g1, "Initial", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 1"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 1; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol1(hi1)); - - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 4) && (i % 5 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - System.out.println(); - - tlim = 5; - h = tlim /(double) (nmesh - 1); - yn[0] = 1; - - ifail = 0; - - ck2 k2 = new ck2(); - cf2 f2 = new cf2(); - cg2 g2 = new cg2(); - d05be.eval(k2, f2, g2, "Subsequent", iorder, tlim, tolnl, nmesh, yn, work, lwk, nct, ifail); - - //UPDATE - yn = d05be.getYN(); - - System.out.println(); - System.out.println("Example 2"); - System.out.println(); - System.out.printf("The stepsize h = %.4f\n", h); - System.out.println(); - System.out.println("\tT\tApproximate"); - System.out.println("\t\tSolution"); - System.out.println(); - - errmax = 0; - - for(int i = 0; i < nmesh; i++){ - hi1 = (double) i * h; - err = Math.abs(yn[i] - sol2(hi1)); - if(err > errmax){ - errmax = err; - t = hi1; - soln = yn[i]; - } - - if((i > 6) && (i % 7 == 0)){ - System.out.printf("\t%.4f\t%.4f\n", hi1, yn[i]); - } - } - - System.out.println(); - System.out.printf("The maximum absolute error, %.2e, occured at T = %.4f with solution %.4f\n", errmax, t, soln); - } - - private static double sol1(double t){ - double c, pi, t1, x = 0; - - //x is dummy variable - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + t; - c = 1 / Math.sqrt(2 * pi); - - return (c * (1 / Math.pow(t, 1.5)) * Math.exp((-t1 * t1) / (2 * t))); - } - - private static double sol2(double t){ - return (1 / (1 + t)); - } - - private static class ck1 extends D05BE.Abstract_D05BE_CK{ - public double eval(){ - return (Math.exp(-0.5 * this.T)); - } - } - - private static class ck2 extends D05BE.Abstract_D05BE_CK{ - double pi, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - return Math.sqrt(pi); - } - } - - private static class cf1 extends D05BE.Abstract_D05BE_CF{ - double a, pi, t1, x = 0; - - public double eval(){ - X01AA x01aa = new X01AA(x); - pi = x01aa.eval(); - - t1 = 1 + this.T; - a = 1 / Math.sqrt(pi * this.T); - return (-a * Math.exp((-0.5 * t1 * t1) / this.T)); - } - } - - private static class cf2 extends D05BE.Abstract_D05BE_CF{ - double st1; - - public double eval(){ - st1 = Math.sqrt(1 + this.T); - return ((-2 * Math.log(st1 + Math.sqrt(this.T))) / st1); - } - } - - private static class cg1 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } - - private static class cg2 extends D05BE.Abstract_D05BE_CG{ - public double eval(){ - return this.Y; - } - } -} diff --git a/simple_examples/DTFSMJE.java b/simple_examples/DTFSMJE.java deleted file mode 100644 index a88b114..0000000 --- a/simple_examples/DTFSMJE.java +++ /dev/null @@ -1,54 +0,0 @@ -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; - -/** - * DTFSM example program text. Adapted from f06wbfe.f90 - * @author joed - */ -public class DTFSMJE { - - public static void main(String[] args) { - - double alpha = 4.21; - int ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[m*m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - a[i*m+j] = (j >= i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[(m*(m+1))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/E01DAJE.java b/simple_examples/E01DAJE.java deleted file mode 100644 index 10c008f..0000000 --- a/simple_examples/E01DAJE.java +++ /dev/null @@ -1,182 +0,0 @@ -import com.nag.routines.E01.E01DA; -import com.nag.routines.E02.E02DF; - -/** - * E01DA example program text. - */ -public class E01DAJE { - - public static void main(String[] args) { - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = e01da.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) { - if (i <= mx) { - System.out.printf("%4d %9.4f", i+1, lamda[i]); - } - else { - System.out.printf(" "); - } - if (i <= my) { - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - } - else { - System.out.printf("\n"); - } - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) { - System.out.printf("\n"); - } - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = e01da.getPX(); - py = e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px, 4*ny+py); - if (4*nx+px > 4*ny+py) { - liwrk = ny + py - 4; - } - else { - liwrk = nx + px - 4; - } - double[] tx = new double[nx]; - double[] ty = new double[ny]; - double[] ff = new double[nx*ny]; - wrk = new double[lwrk]; - int[] iwrk = new int[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i < nx-1; i++) { - tx[i] = tx[i-1] + step; - } - tx[nx-1] = xhi; - - step = (yhi-ylo)/(ny-1); - ty[0] = ylo; - for (int i = 1; i < ny-1; i++) { - ty[i] = ty[i-1] + step; - } - ty[ny-1] = yhi; - - /* Evaluate the spline. */ - E02DF e02df = new E02DF(); - ifail = 0; - e02df.eval(nx,ny,px,py,tx,ty,lamda,mu,c,ff,wrk,lwrk,iwrk,liwrk,ifail); - - ifail = e02df.getIFAIL(); - switch (ifail) { - case 0: - System.out.printf("\n Spline evaluated on a regular mesh (X across, Y down):\n"); - System.out.printf(" "); - for (int i = 0; i < nx; ++i) { - System.out.printf(" %5.2f ", tx[i]); - } - System.out.printf("\n"); - for (int i = 0; i < ny; ++i) { - System.out.printf(" %5.2f ", ty[i]); - for (int j = 0; j < nx; ++j) { - System.out.printf(" %8.3f", ff[ny*j+i]); - } - System.out.printf("\n"); - } - break; - default: - System.out.printf("\n Error detected by E02DF: %d\n", ifail); - } - - } - -} diff --git a/simple_examples/E02ALJE.java b/simple_examples/E02ALJE.java deleted file mode 100644 index 372f125..0000000 --- a/simple_examples/E02ALJE.java +++ /dev/null @@ -1,101 +0,0 @@ -import com.nag.routines.E02.E02AL; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E02ALJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E02ALJE{ - - /** - * E02ALJ Example main program - */ - public static void main(String[] args){ - double dxx, ref = 0, s, t, xx; - int ifail, n = 0, m = 0, neval = 0; //placeholders - double[] a, x, y; - - a = new double[0]; - x = new double[0]; - y = new double[0]; //placeholders - - System.out.println("E02ALJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - m = Integer.parseInt(sVal[2]); - neval = Integer.parseInt(sVal[3]); - - a = new double[m + 1]; - x = new double[n]; - y = new double[n]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[1]); - y[i] = Double.parseDouble(sVal[2]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - ifail = 0; - E02AL e02al = new E02AL(n, x, y, m, a, ref, ifail); - e02al.eval(); - - //update - ref = e02al.getREF(); - x = e02al.getX(); - y = e02al.getY(); - - - System.out.println(); - System.out.printf(" Polynomial coefficients\n"); - for(int i = 0; i <= m; i++){ - System.out.printf("\t%.4e\n", a[i]); - } - System.out.println(); - System.out.printf(" Reference deviation = %.2e\n", ref); - System.out.println(); - System.out.printf("\tX\tFit\texp(x)\tResidual\n"); - - dxx = 1/(double)(neval - 1); - - for(int j = 0; j < neval; j++){ - xx = (double) j * dxx; - - s = a[m]; - - for(int i = m - 1; i >=0; i--){ - s = s * xx + a[i]; - } - - t = Math.exp(xx); - System.out.printf("\t%.2f\t%.4f\t%.4f\t%.2e\n", xx, s, t, (s - t)); - } - } -} - diff --git a/simple_examples/E04ABJE.java b/simple_examples/E04ABJE.java deleted file mode 100644 index 773f1ff..0000000 --- a/simple_examples/E04ABJE.java +++ /dev/null @@ -1,76 +0,0 @@ -import com.nag.routines.E04.E04AB; - -/** - * E04ABJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04ABJE{ - - /** - * E04ABJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04ABJ Example Program Results"); - - //e1 and e2 are set to zero so that E04ABA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04AB e04ab = new E04AB(funct1, e1, e2, a, b, maxcal, x, f, iuser, ruser, ifail); - e04ab.eval(); - - //update - ifail = e04ab.getIFAIL(); - a = e04ab.getA(); - b = e04ab.getB(); - x = e04ab.getX(); - f = e04ab.getF(); - maxcal = e04ab.getMAXCAL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04AB.Abstract_E04AB_FUNCT{ - public void eval(){ - FC = Math.sin(this.XC) / this.XC; - } - } -} diff --git a/simple_examples/E04BBJE.java b/simple_examples/E04BBJE.java deleted file mode 100644 index d7032f5..0000000 --- a/simple_examples/E04BBJE.java +++ /dev/null @@ -1,81 +0,0 @@ -import com.nag.routines.E04.E04BB; - -/** - * E04BBJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class E04BBJE{ - - /** - * E04BBJE main program - */ - public static void main(String[] args){ - double a, b, e1, e2, f = 0, g = 0, x = 0; //placeholders - int ifail, maxcal; - double[] ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("E04BBJ Example Program Results"); - - //e1 and e2 are set to zero so that E04BBA will reset them to their default values - - e1 = 0; - e2 = 0; - - //The minimum is known to lie in the range (3.5, 5.0) - - a = 3.5; - b = 5.0; - - //Allow 30 calls of FUNCT - - maxcal = 30; - - ifail = -1; - funct funct1 = new funct(); - E04BB e04bb = new E04BB(funct1, e1, e2, a, b, maxcal, x, f, g, iuser, ruser, ifail); - e04bb.eval(); - - //update - a = e04bb.getA(); - b = e04bb.getB(); - maxcal = e04bb.getMAXCAL(); - x = e04bb.getX(); - f = e04bb.getF(); - g = e04bb.getG(); - ifail = e04bb.getIFAIL(); - - switch(ifail){ - case 0: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - case 2: - System.out.println(); - System.out.printf("The minimum lies in the interval %.8f to %.8f\n", a, b); - System.out.printf("Its estimated position is %.8f,\n", x); - System.out.printf("where the function value is %.4f\n", f); - System.out.printf("and the gradient is %.1e (machine dependent)\n", g); - System.out.printf("%d function evaluations were required\n", maxcal); - break; - default: - break; - } - } - - public static class funct extends E04BB.Abstract_E04BB_FUNCT{ - public void eval(){ - this.FC = Math.sin(this.XC) / this.XC; - this.GC = (Math.cos(this.XC) - this.FC)/this.XC; - } - } -} - diff --git a/simple_examples/E04CBJE.java b/simple_examples/E04CBJE.java deleted file mode 100644 index fbde674..0000000 --- a/simple_examples/E04CBJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.E04.E04CB; -import com.nag.routines.E04.E04CBK; -import com.nag.routines.X02.X02AJ; - -/** - * E04CBJ Example Program text - * @author willa - * @since 27.1.0.0 - */ -public class E04CBJE{ - - /** - * E04CBJE main program - */ - public static void main(String[] args){ - int n = 2, ifail, maxcal; - double f = 0, tolf, tolx; //placeholders - boolean monitoring; - int[] iuser; - double[] ruser, x; - - iuser = new int[1]; - ruser = new double[1]; - x = new double[n]; - - System.out.println("E04CBJ Example Program Results"); - - //Set monitoring to true to obtain monitoring information - monitoring = false; - - x[0] = -1.0; - x[1] = 1.0; - X02AJ x02aj = new X02AJ(); - tolf = Math.sqrt(x02aj.eval()); - tolx = Math.sqrt(tolf); - maxcal = 100; - - ifail = 0; - - funct funct1 = new funct(); - if(!monitoring){ - defMonit monit = new defMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - else{ - myMonit monit = new myMonit(); - E04CB e04cb = new E04CB(n, x, f, tolf, tolx, funct1, monit, maxcal, iuser, ruser, ifail); - e04cb.eval(); - } - - System.out.println(); - System.out.printf("The final function value is \t%.4f\n", f); - System.out.printf("at the point\t"); - for(int i = 0; i < n; i++){ - System.out.printf("%.4f\t", x[i]); - } - System.out.printf("\n"); - } - - public static class funct extends E04CB.Abstract_E04CB_FUNCT{ - public void eval(){ - this.FC = Math.exp(this.XC[0]) * ((4 * this.XC[0] * (this.XC[0] + this.XC[1])) + (2 * this.XC[1] * (this.XC[1] + 1) + 1)); - } - } - - public static class myMonit extends E04CB.Abstract_E04CB_MONIT{ - public void eval(){ - System.out.println(); - System.out.printf("There have been %d function calls\n", this.NCALL); - System.out.printf("The smallest function value is %.4f\n", this.FMIN); - System.out.printf("The simplex is\n"); - for(int i = 0; i <= this.N; i++){ - for(int j = 0; j < this.N; j++){ - System.out.printf("%.4f\t", this.SIM[(j * (this.N + 1)) + i]); - } - System.out.printf("\n"); - } - System.out.printf("The standard deviation in function values of the vertices of the simplex is %.4f\n", this.SERROR); - System.out.printf("The linearized volume ratio of the current simplex to the starting one is %.4f\n", this.VRATIO); - } - } - - //This is how to use NAG supplied function as argument - public static class defMonit extends E04CBK implements E04CB.E04CB_MONIT{ - public void eval(){ - super.eval(); - } - } -} diff --git a/simple_examples/E04FCJE.java b/simple_examples/E04FCJE.java deleted file mode 100644 index 939f68d..0000000 --- a/simple_examples/E04FCJE.java +++ /dev/null @@ -1,420 +0,0 @@ -import com.nag.routines.E04.E04FC; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04FC example program text. - * @author ludovic - */ -public class E04FCJE { - - public static void main(String[] args) { - - BufferedReader dataIn = null; - - try { - E04FC e04fc = new E04FC(); - System.out.println(" E04FCJ Example Program Results"); - dataIn = new BufferedReader(new FileReader(args[0])); - //skip header - dataIn.readLine(); - - int inc1 = 1, liw = 1, m, ldfjac = m = 15, n, ldv = n = 3, nt = 3, - lw = 6 * n + m * n + 2 * m + n * (n - 1) / 2; - String trans = "T"; - - double eta, fsumsq, stepmx, xtol; - eta = fsumsq = stepmx = xtol = Double.NaN; - int ifail, iprint, maxcal, nf, niter; - ifail = iprint = maxcal = nf = niter = 0; - double[] fjac = new double[m * n], - fvec = new double[m], - g = new double[n], - s = new double[n], - v = new double[ldv * n], - w = new double[lw], - x = new double[n], - y = new double[m], - t = new double[m * nt]; - - - int[] iw = new int[liw]; - - for (int i = 0; i < m; ++i) { - String[] line = dataIn.readLine().trim().split("\\s+"); - if (line.length != nt + 1) { - System.err.println("Error in data file - only " + line.length - + " records at line " + (i + 2) + " while expecting " + (nt + 1) - + " elements"); - System.exit(1); - } - y[i] = Double.parseDouble(line[0].replaceAll("D", "E")); // java doesn't know the D format - for (int j = 1; j <= nt; ++j) { - t[i + (j - 1) * m] = Double.parseDouble(line[j].replaceAll("D", "E")); - } - } - - // Set IPRINT to 1 to obtain output from LSQMON at each iteration - iprint = -1; - - maxcal = 400 * n; - eta = 0.5; - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - - // We estimate that the minimum will be within 10 units of the starting point - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - - LSQFUN lsqfun = new LSQFUN(); - lsqfun.t = t; - lsqfun.y = y; - LSQMON lsqmon = new LSQMON(); - - e04fc.eval(m, n, lsqfun, lsqmon, iprint, maxcal, eta, xtol, stepmx, x, fsumsq, - fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, liw, w, lw, ifail); - - ifail = e04fc.getIFAIL(); - - - switch (ifail) { - case (1): - System.err.println("Unexpected ifail = " + ifail); - break; - default: - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", e04fc.getFSUMSQ()); - System.out.printf(" at the point %12.4f %12.4f %12.4f\n", x[0], x[1], x[2]); - lsqgrd(m, n, fvec, fjac, ldfjac, g); - System.out.print(" The estimated gradient is "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.3e\t", g[i]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int i = 0; i < m; ++i) { - System.out.printf(" %9.1e\n", fvec[i]); - } - } - - - - } - catch (Exception ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - finally { - try { - dataIn.close(); - } - catch (IOException ex) { - Logger.getLogger(E04FCJE.class.getName()).log(Level.SEVERE, null, ex); - } - } - - - } - - public static void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - DGEMV dgemv = new DGEMV("T", m, n, 1.0, fjac, ldfjac, fvec, 1, 0.0, g, 1); - dgemv.eval(); - for (int i = 0; i < g.length; ++i) { - g[i] = 2.0 * g[i]; - } - } - - public static class LSQFUN implements E04FC.E04FC_LSQFUN { - - public double[] t, y; - int IFLAG, M, N, LW, LIW; - double[] XC, FVEC, W; - int[] IW; - - @Override - public void setIFLAG(int IFLAG) { - this.IFLAG = IFLAG; - } - - @Override - public int getIFLAG() { - return IFLAG; - } - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int IFLAG, int M, int N, double[] XC, double[] FVEC, - int[] IW, int LIW, double[] W, int LW) { - for (int i = 0; i < M; ++i) { - FVEC[i] = XC[0] + t[i] / (XC[1] * t[i + M] + XC[2] * t[i + 2 * M]) - y[i]; - } - } - - } - - public static class LSQMON implements E04FC.E04FC_LSQMON { - - int M, N, LDFJAC, NITER, NF, IGRADE, LIW, LW; - int[] IW; - double[] XC, FVEC, FJAC, S, W; - - @Override - public void setM(int M) { - this.M = M; - } - - @Override - public int getM() { - return M; - } - - @Override - public void setN(int N) { - this.N = N; - } - - @Override - public int getN() { - return N; - } - - @Override - public void setXC(double[] XC) { - this.XC = XC; - } - - @Override - public double[] getXC() { - return XC; - } - - @Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - @Override - public double[] getFVEC() { - return FVEC; - } - - @Override - public void setFJAC(double[] FJAC) { - this.FJAC = FJAC; - } - - @Override - public double[] getFJAC() { - return FJAC; - } - - @Override - public void setLDFJAC(int LDFJAC) { - this.LDFJAC = LDFJAC; - } - - @Override - public int getLDFJAC() { - return LDFJAC; - } - - @Override - public void setS(double[] S) { - this.S = S; - } - - @Override - public double[] getS() { - return S; - } - - @Override - public void setIGRADE(int IGRADE) { - this.IGRADE = IGRADE; - } - - @Override - public int getIGRADE() { - return IGRADE; - } - - @Override - public void setNITER(int NITER) { - this.NITER = NITER; - } - - @Override - public int getNITER() { - return NITER; - } - - @Override - public void setNF(int NF) { - this.NF = NF; - } - - @Override - public int getNF() { - return NF; - } - - @Override - public void setIW(int[] IW) { - this.IW = IW; - } - - @Override - public int[] getIW() { - return IW; - } - - @Override - public void setLIW(int LIW) { - this.LIW = LIW; - } - - @Override - public int getLIW() { - return LIW; - } - - @Override - public void setW(double[] W) { - this.W = W; - } - - @Override - public double[] getW() { - return W; - } - - @Override - public void setLW(int LW) { - this.LW = LW; - } - - @Override - public int getLW() { - return LW; - } - - @Override - public void eval(int M, int N, double[] XC, double[] FVEC, double[] FJAC, - int LDFJAC, double[] S, int IGRADE, int NITER, int NF, int[] IW, - int LIW, double[] W, int LW) { - - int ndec = 3; - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(M, FVEC, 1, FVEC, 1); - fsumsq = ddot.eval(); - - lsqgrd(M, N, FVEC, FJAC, LDFJAC, g); - - gtg = ddot.eval(N, g, 1, g, 1); - // 99998 Format (1X,1P,E13.5,10X,1P,E9.1,10X,1P,E9.1) - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5e %9.1e %3d\n", - NITER, NF, fsumsq, gtg, IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < N; ++j) { - System.out.printf(" %13.5e %9.1e %9.1e\n",XC[j], g[j], S[j]); - } - - } - - } - -} diff --git a/simple_examples/E04FFJE.java b/simple_examples/E04FFJE.java deleted file mode 100644 index ad81e32..0000000 --- a/simple_examples/E04FFJE.java +++ /dev/null @@ -1,140 +0,0 @@ -import com.nag.routines.E04.E04FF; -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.util.Arrays; - -/** - * E04FF example program text. - * @author joed - */ -public class E04FFJE { - - public static void main(String[] args) { - double infbnd = 1.0e20; - double[] lx, rx, ux, x, ruser, pdy, pdz; - double[] rinfo = new double[100], stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, pdny, pdnz; - int[] iuser; - int[] icolrd = new int[1], irowrd = new int[1]; - long cpuser, handle; // c_ptr - MONIT monit = new MONIT(); - OBJFUN objfun = new OBJFUN(); - - /* Header */ - System.out.printf(" E04FFJ Example Program Results\n\n"); - - /* Fill problem data structure */ - pdny = 11; - pdnz = 11; - pdy = new double[] { - 4.0e0, 2.0e0, 1.0e0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1, - 8.33e-2, 7.14e-2, 6.25e-2 - }; - pdz = new double[] { - 1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2, 4.56e-2, - 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2 - }; - nvar = 4; - nres = 11; - - /* Initialize handle */ - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define residuals structure */ - E04RM e04rm = new E04RM(); - isparse = 0; // Dense => irowrd and icolrd are not accessed - nnzrd = 1; - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set options */ - E04ZM e04zm = new E04ZM(); - ifail = 0; - e04zm.eval(handle, "DFLS Trust Region Tolerance = 5.0e-6", ifail); - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - - /* Define starting point */ - x = new double[] {0.25, 0.39, 0.415, 0.39}; - rx = new double[nres]; - - /* Define bounds for the second and the fourth variable */ - E04RH e04rh = new E04RH(); - lx = new double[] {-infbnd, 0.2, -infbnd, 0.3}; - ux = new double[] {infbnd, 1.0, infbnd, infbnd}; - ifail = 0; - e04rh.eval(handle, nvar, lx, ux, ifail); - - /* Call the solver */ - E04FF e04ff = new E04FF(); - ifail = -1; - iuser = new int[] {pdny, pdnz}; - ruser = new double[2 * nres]; - cpuser = 0L; - for (int i = 0; i < nres; i++) { - ruser[i] = pdy[i]; - ruser[nres + i] = pdz[i]; - } - e04ff.eval(handle, objfun, monit, nvar, x, nres, rx, rinfo, stats, - iuser, ruser, cpuser, ifail); - - /* Free handle memory */ - E04RZ e04rz = new E04RZ(); - ifail = 0; - e04rz.eval(handle, ifail); - - } - - public static class OBJFUN extends E04FF.Abstract_E04FF_OBJFUN { - - public void eval() { - int pdny, pdnz; - double r1, r2; - double[] pdy, pdz; - - /* Interrupt solver if the dimensions are incorrect */ - if (this.NRES != 11 || this.NVAR != 4) { - this.INFORM = -1; - return; - } - - /* Extract the problem data structure from the workspaces */ - pdny = this.IUSER[0]; - pdnz = this.IUSER[1]; - if (pdny != this.NRES || pdnz != this.NRES) { - this.INFORM = -1; - return; - } - pdy = Arrays.copyOfRange(this.RUSER, 0, pdny); - pdz = Arrays.copyOfRange(this.RUSER, pdny, pdny + pdnz); - - for (int i = 0; i < this.NRES; i++) { - r1 = pdy[i] * (pdy[i] + this.X[1]); - r2 = pdy[i] * (pdy[i] + this.X[2]) + this.X[3]; - this.RX[i] = pdz[i] - (this.X[0] * r1/r2); - } - - } - - } - - public static class MONIT extends E04FF.Abstract_E04FF_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/E04GBJE.java b/simple_examples/E04GBJE.java deleted file mode 100644 index 7becf21..0000000 --- a/simple_examples/E04GBJE.java +++ /dev/null @@ -1,183 +0,0 @@ -import com.nag.routines.A00.A00AA; -import com.nag.routines.E04.E04GB; -import com.nag.routines.E04.E04HEV; -import com.nag.routines.E04.E04YA; -import com.nag.routines.F06.DDOT; -import com.nag.routines.F06.F06PA; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04GB example program text. - */ -public class E04GBJE { - - public static final int inc1 = 1, liw = 1, m = 15, n = 3, nt = 3; - public static final int ldfjac = m, ldv = n, lw = 7*n + m*n + 2*m + n*n; - public static final String trans = "T"; - public static double[] y; - public static double[] t; - - public static void main(String[] args) { - - double eta, fsumq = 0.0, stepmx, xtol; - int ifail, iprint, maxcal, nf = 0, niter = 0; - double[] fjac = new double[ldfjac * n]; - double[] fvec = new double[m]; - double[] g = new double[n]; - double[] s = new double[n]; - double[] v = new double[ldv * n]; - double[] w = new double[lw * n]; - double[] x = new double[n]; - int[] iw = new int[liw]; - - System.out.println(" E04GBJ Example Program Results"); - - // Data - y = new double[] { - 0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, 0.58, 0.73, - 0.96, 1.34, 2.10, 4.39 - }; - - t = new double[m * nt]; - for (int i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - // Check LSQFUN by calling E04YA at an arbitrary point - E04YA e04ya = new E04YA(); - LSQFUN lsqfun = new LSQFUN(); - x[0] = 0.19; - x[1] = -.34; - x[2] = 0.88; - ifail = 0; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, ldfjac, iw, liw, w, lw, ifail); - - // Continue setting parameters for E04GB - E04GB e04gb = new E04GB(); - LSQMON lsqmon = new LSQMON(); - LSQLIN lsqlin = new LSQLIN(); - iprint = -1; // Set to 1 to obtain output from LSQMON at each iteration - maxcal = 50 * n; - eta = 0.09; // Since E04HEV is being used as LSQLIN - xtol = 10.0 * Math.sqrt((new X02AJ()).eval()); - stepmx = 10.0; - - // Set up the starting point - x[0] = 0.5; - x[1] = 1.0; - x[2] = 1.5; - - ifail = -1; - e04gb.eval(m, n, lsqlin, lsqfun, lsqmon, iprint, maxcal, eta, xtol, - stepmx, x, fsumq, fvec, fjac, ldfjac, s, v, ldv, niter, nf, iw, - liw, w, lw, ifail); - fsumq = e04gb.getFSUMSQ(); - x = e04gb.getX(); - ifail = e04gb.getIFAIL(); - - if (ifail == 0 || ifail >= 2) { - System.out.println(); - System.out.printf(" On exit, the sum of squares is %12.4f\n", fsumq); - System.out.printf(" at the point "); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.4f", x[ii]); - } - System.out.println(); - - lsqmon.lsqgrd(m, n, fvec, fjac, ldfjac, g); - - System.out.print(" The corresponding gradient is"); - for (int ii = 0; ii < n; ++ii) { - System.out.printf("%12.3E", g[ii]); - } - System.out.println(); - System.out.println(" (machine dependent)"); - System.out.println(" and the residuals are"); - for (int ii = 0; ii < m; ++ii) { - System.out.printf(" %9.1E\n", fvec[ii]); - } - System.out.println(); - } - - } - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04GB.Abstract_E04GB_LSQFUN implements E04YA.E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - - for (int i = 0; i < m; i++) { - denom = this.XC[1] * t[i + this.M] + this.XC[2] * t[i + 2*this.M]; - this.FVEC[i] = this.XC[0] + t[i] / denom - y[i]; - - if (this.IFLAG != 0) { - this.FJAC[i] = 1.0; - dummy = -1.0 / (denom * denom); - this.FJAC[i + ldfjac] = t[i] * t[i + this.M] * dummy; - this.FJAC[i + 2*ldfjac] = t[i] * t[i + 2*this.M] * dummy; - } - } - - } - - } - - public static class LSQMON extends E04GB.Abstract_E04GB_LSQMON { - - public static final int ndec = 3; - - /** Monitoring routine. */ - public void eval() { - double fsumsq, gtg; - double[] g = new double[ndec]; - DDOT ddot = new DDOT(); - - fsumsq = ddot.eval(this.M, this.FVEC, inc1, this.FVEC, inc1); - this.lsqgrd(this.M, this.N, this.FVEC, this.FJAC, this.LDFJAC, g); - gtg = ddot.eval(this.N, g, inc1, g, inc1); - - System.out.println(); - System.out.println(" Itn F evals SUMSQ GTG Grade"); - System.out.printf(" %4d %5d %13.5E %9.1E %3d\n", - this.NITER, this.NF, fsumsq, gtg, this.IGRADE); - System.out.println(); - System.out.println(" X G Singular values"); - for (int j = 0; j < n; j++) { - System.out.printf(" %13.5E %9.1E %9.1E\n", - this.XC[j], g[j], this.S[j]); - } - - } - - /** Routine to evaluate gradient of the sum of squares. */ - public void lsqgrd(int m, int n, double[] fvec, double[] fjac, int ldfjac, double[] g) { - F06PA f06pa = new F06PA(trans, m, n, 1.0, fjac, ldfjac, fvec, inc1, 0.0, g, inc1); - f06pa.eval(); - - for (int i = 0; i < n; ++i) { - g[i] = 2.0 * g[i]; - } - - } - - } - - /** Using E04HEV as LSQLIN. */ - private static class LSQLIN extends E04HEV implements E04GB.E04GB_LSQLIN { - - public void eval() { - super.eval(); - } - - } - -} diff --git a/simple_examples/E04GGJE.java b/simple_examples/E04GGJE.java deleted file mode 100644 index 8a18c6a..0000000 --- a/simple_examples/E04GGJE.java +++ /dev/null @@ -1,219 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04RX; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; - -/** - * E04GG example program text. - */ -public class E04GGJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser = 0, handle = 0; - int ifail, isparse, nnzrd, nres, nvar; - - double[] blx, bux, ruser, rx, x, z; - double[] rinfo = new double[100], stats = new double[100]; - int[] icolrd = new int[1], irowrd = new int[1], iuser = new int[1]; - - /* Header */ - System.out.println(" E04GGJ Example Program Results\n"); - - nvar = 6; - nres = 24; - // ruser = new double[2*nres]; - // Data from Lanczos 3 Problem - ruser = new double[] { - // t(:) = - 0.0e0, 5.0e-2, 1.0e-1, 1.5e-1, 2.0e-1, 2.5e-1, 3.0e-1, 3.5e-1, - 4.0e-1, 4.5e-1, 5.0e-1, 5.5e-1, 6.0e-1, 6.5e-1, 7.0e-1, 7.5e-1, - 8.0e-1, 8.5e-1, 9.0e-1, 9.5e-1, 1.0e0, 1.05e0, 1.10e0, 1.15e0, - // y(:) = - 2.5134, 2.0443, 1.6684, 1.3664, 1.1232, 0.9269, 0.7679, 0.6389, - 0.5338, 0.4479, 0.3776, 0.3197, 0.2720, 0.2325, 0.1997, 0.1723, - 0.1493, 0.1301, 0.1138, 0.1000, 0.0883, 0.0783, 0.0698, 0.0624 - }; - - iuser[0] = 0; - - // Initialize handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define residuals structure, isparse=0 means the residual structure is - // dense => irowrd and icolrd are not accessed - isparse = 0; - nnzrd = 0; - E04RM e04rm = new E04RM(); - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "BXNL Use Second Derivatives = Yes",ifail); - e04zm.eval(handle, "BXNL Model = Gauss-Newton",ifail); - e04zm.eval(handle, "BXNL Glob Method = Reg",ifail); - // Change printed output verbosity - e04zm.eval(handle, "Print Level = 1",ifail); - - // Define starting point - rx = new double[nres]; - z = new double[nvar]; - // x = new double[nvar]; - x = new double[] { - 1.2, 0.3, 5.6, 5.5, 6.5, 7.6 - }; - - // Define bounds - blx = new double[nvar]; - bux = new double[nvar]; - blx[0] = 0.0; - bux[0] = 1.0; - blx[1] = -1.0; - bux[1] = infbnd; - blx[2] = -1.0; - bux[2] = infbnd; - blx[3] = -1.0; - bux[3] = infbnd; - blx[4] = -1.0; - bux[4] = 1.0; - blx[5] = -1.0; - bux[5] = 10.0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, blx, bux, ifail); - - // Call the solver - ifail = -1; - E04GG e04gg = new E04GG(); - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - e04gg.eval(handle,lsqfun,lsqgrd,lsqhes,lsqhprd,monit,nvar,x,nres,rx,rinfo,stats,iuser,ruser,cpuser,ifail); - ifail = e04gg.getIFAIL(); - - // Recover latest iterate from handle if available - if (ifail == 0) { - ifail = -1; - E04RX e04rx = new E04RX(); - e04rx.eval(handle,"X",1,nvar,z,ifail); - ifail = e04rx.getIFAIL(); - if (ifail == 0) { - System.out.println("\nSolver stored solution iterate in the handle"); - System.out.print("X: "); - for (int i = 0; i < nvar; i++){ - System.out.printf("%8.2E ", z[i]); - } - System.out.println(); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++){ - this.RX[i] = this.RUSER[this.NRES + i] - this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]) - - this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]) - this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int i; - - for (i = 0; i < this.RDX.length; i++) { - this.RDX[i] = 0; - } - - for (i = 0; i < this.NRES; i++) { - this.RDX[i * this.NVAR + 0] = -Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 1] = this.RUSER[i] * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i]); - this.RDX[i * this.NVAR + 2] = -Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 3] = this.RUSER[i] * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i]); - this.RDX[i * this.NVAR + 4] = -Math.exp(-this.X[5] * this.RUSER[i]); - this.RDX[i * this.NVAR + 5] = this.RUSER[i] * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i]); - } - - this.INFORM = 0; - } - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - for (int i = 0; i < this.NVAR * this.NVAR; i++) { - this.HX[i] = 0.0; - } - - double sum21 = 0.0, sum22 = 0.0, sum43 = 0.0, sum44 = 0.0, sum65 = 0.0, sum66 = 0.0; - - for (int i = 0; i < this.NRES; i++){ - sum21 = sum21 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[1] * this.RUSER[i])); - sum22 = sum22 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[0] * Math.exp(-this.X[1] * this.RUSER[i])); - sum43 = sum43 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[3] * this.RUSER[i])); - sum44 = sum44 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[2] * Math.exp(-this.X[3] * this.RUSER[i])); - sum65 = sum65 + (this.LAMBDA[i] * this.RUSER[i] * Math.exp(-this.X[5] * this.RUSER[i])); - sum66 = sum66 + (-this.LAMBDA[i] * Math.pow(this.RUSER[i], 2) * this.X[4] * Math.exp(-this.X[5] * this.RUSER[i])); - } - - this.HX[(2-1) + (1-1) * this.NVAR] = sum21; - this.HX[(1-1) + (2-1) * this.NVAR] = this.HX[(2-1) + (1-1) * this.NVAR]; - this.HX[(2-1) + (2-1) * this.NVAR] = sum22; - this.HX[(4-1) + (3-1) * this.NVAR] = sum43; - this.HX[(3-1) + (4-1) * this.NVAR] = this.HX[(4-1) + (3-1) * this.NVAR]; - this.HX[(4-1) + (4-1) * this.NVAR] = sum44; - this.HX[(6-1) + (5-1) * this.NVAR] = sum65; - this.HX[(5-1) + (6-1) * this.NVAR] = this.HX[(6-1) + (5-1) * this.NVAR]; - this.HX[(6-1) + (6-1) * this.NVAR] = sum66; - - this.INFORM = 0; - } - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - } - -} diff --git a/simple_examples/E04MTJE.java b/simple_examples/E04MTJE.java deleted file mode 100644 index 6272e91..0000000 --- a/simple_examples/E04MTJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RF; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04MT example program text. - */ -public class E04MTJE { - - public static void main(String[] args) throws IOException { - - System.out.println(" E04MTJ Example Program Results"); - int m = 7; - int n = 7; - int nnza = 41; - int nnzc = 7; - int nnzu = 2*n + 2*m; - - int[] cindex = {1,2,3,4,5,6,7}; - double[] c = {-0.02,-0.20,-0.20,-0.20,-0.20, 0.04, 0.04}; - int[] irowa = {1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3, - 4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,7}; - int[] icola = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6, - 1,2,3,4,5,1,2,5,1,2,3,4,5,6,1,2,3,4,5,6,7}; - double[] a = {1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, - 0.15, 0.04, 0.02, 0.04, 0.02, 0.01, 0.03, - 0.03, 0.05, 0.08, 0.02, 0.06, 0.01,0.02, - 0.04, 0.01, 0.02, 0.02,0.02, 0.03, 0.01,0.70, - 0.75, 0.80, 0.75, 0.80, 0.97,0.02, 0.06, 0.08, - 0.12, 0.02, 0.01, 0.97}; - double[] bla = {-0.13,-1.0e20,-1.0e20,-1.0e20,-1.0e20, - -0.0992,-0.003}; - double[] bua = {-0.13,-0.0049,-0.0064,-0.0037,-0.0012, - 1.0e20, 0.002}; - double[] xl = {-0.01,-0.1,-0.01,-0.04,-0.1,-0.01,-0.01}; - double[] xu = {0.01,0.15,0.03,0.02,0.05,1.0e20,1.0e20}; - double[] dArrData = new double[nnza+2*m+3*n+nnzc+nnzu]; - - long handle = 0; - int ifail = 0; - E04RA e04ra = new E04RA(handle,n,ifail); - e04ra.eval(); - - handle = e04ra.getHANDLE(); - - int[] icolh = new int[1]; - int[] irowh = new int[1]; - double[] h = new double[1]; - E04RF e04rf = new E04RF(handle,nnzc,cindex,c,0,irowh,icolh,h,ifail); - e04rf.eval(); - handle = e04ra.getHANDLE(); - - E04RH e04rh = new E04RH(handle,n,xl,xu,ifail); - e04rh.eval(); - handle = e04rh.getHANDLE(); - - int idlc = 0; - E04RJ e04rj = new E04RJ(handle,m,bla,bua,nnza,irowa,icola,a,idlc,ifail); - e04rj.eval(); - handle = e04rj.getHANDLE(); - - E04ZM e04zm = new E04ZM(handle,"LPIPM Monitor Frequency = 1",ifail); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance = 1.0e-10"); - e04zm.eval(); - e04zm.setOPTSTR("Print Solution = YES"); - e04zm.eval(); - e04zm.setOPTSTR("Print Options = NO"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Centrality Correctors = -6"); - e04zm.eval(); - handle = e04zm.getHANDLE(); - - long cpuser = 2; - int[] iuser = {1}; - double[] ruser = new double[1]; - ifail = -1; - MONIT monit = new MONIT(); - double[] x = new double[n], u = new double[nnzu]; - double[] rinfo = new double[100], stats = new double[100]; - System.out.println(); - System.out.println("++++++++++ Use the Primal-Dual algorithm ++++++++++"); - E04MT e04mt = new E04MT(handle,n,x,nnzu,u,rinfo,stats, - monit,iuser,ruser,cpuser,ifail); - e04mt.eval(); - System.out.println(); - System.out.println("++++++++++ Use the Self-Dual algorithm ++++++++++"); - e04zm.setOPTSTR("LPIPM Algorithm = Self-Dual"); - e04zm.eval(); - e04zm.setOPTSTR("LPIPM Stop Tolerance 2 = 1.0e-11"); - e04zm.eval(); - iuser[0] = 2; - e04mt.setIFAIL(-1); - e04mt.setHANDLE(e04zm.getHANDLE()); - e04mt.setIUSER(iuser); - e04mt.eval(); - - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - - double tol = 1.2e-8; - - if (IUSER[0] == 1) { - if ((RINFO[4] < tol) && (RINFO[5] < tol) && (RINFO[6] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - else { - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - System.out.println("Iteration " + Integer.toString((int)STATS[0])); - System.out.printf(" monit() reports good approximate solution (tol = %5.2E):\n", tol); - } - } - - } - - } - -} diff --git a/simple_examples/E04MXJE.java b/simple_examples/E04MXJE.java deleted file mode 100644 index 642a933..0000000 --- a/simple_examples/E04MXJE.java +++ /dev/null @@ -1,292 +0,0 @@ -import com.nag.routines.E04.E04MX; -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NS; -import com.nag.routines.E04.E04NT; -import com.nag.routines.X04.X04AC; -import com.nag.routines.X04.X04AD; -import java.util.Arrays; - -/** - * E04MX example program text. - */ -public class E04MXJE { - - public static void main(String[] args) { - - /* Parameters */ - int lencw = 600, leniw = 600, lenrw = 600, mpslst = 1, nin = 7, nout = 6; - boolean readints = false; - String fname = args[0]; - /* Local Scalars */ - double obj, objadd, sinf; - int i, ifail, iobj, lenc, lintvar, m, maxlintvar, maxm, maxn, maxncolh, - maxnnz, maxnnzh, minmax, mode, n, ncolh, ninf, nname, nnz, nnzh, ns; - boolean verboseOutput; - String start; - /* Local Arrays */ - double[] a, bl, bu, c, h, pi, rc, ruser, rw, x; - int[] helast, hs, iccola, iccolh, intvar, irowa, irowh, iuser, iw; - String[] crname, cw; - String[] cuser = new String[1], pnames = new String[5]; - cuser[0] = " "; - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - - System.out.println(" E04MXJ Example Program Results"); - - // Initialize - for (int j = 0; j < 5; j++) { - pnames[j] = " "; - } - maxm = 0; - maxn = 0; - maxnnz = 0; - maxnnzh = 0; - maxncolh = 0; - maxlintvar = 0; - - // Open the data file for reading - X04AC x04ac = new X04AC(); - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Prep call to E04MX in query mode - E04MX e04mx = new E04MX(); - a = new double[1]; - irowa = new int[1]; - iccola = new int[1]; - bl = new double[1]; - bu = new double[1]; - crname = new String[]{" "}; - h = new double[1]; - irowh = new int[1]; - iccolh = new int[1]; - intvar = new int[1]; - ifail = 0; - - // Placeholders for output only scalars - n = 0; - m = 0; - nnz = 0; - ncolh = 0; - nnzh = 0; - lintvar = 0; - iobj = 0; - nname = 0; - minmax = 0; - - // Make call to E04MX - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - - // Get output scalar values - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close file - X04AD x04ad = new X04AD(); - ifail = 0; - x04ad.eval(nin, ifail); - - // Set maxm, maxn and maxnnz - maxm = m; - maxn = n; - maxnnz = nnz; - maxnnzh = nnzh; - maxncolh = ncolh; - maxlintvar = (readints) ? lintvar : 1; - - // Allocate memory - irowa = new int[maxnnz]; - iccola = new int[maxn + 1]; - a = new double[maxnnz]; - bl = new double[maxn + maxm]; - bu = new double[maxn + maxm]; - crname = new String[maxn + maxm]; - for (int j = 0; j < (maxn + maxm); j++) { - crname[j] = " "; - } - irowh = new int[maxnnzh]; - iccolh = new int[maxncolh + 1]; - h = new double[maxnnzh]; - intvar = new int[maxlintvar]; - - // Open the data file for reading - mode = 0; - ifail = 0; - x04ac.eval(nin, fname, mode, ifail); - - // Call E04MX to read the problem - ifail = 0; - e04mx.eval(nin, maxn, maxm, maxnnz, maxncolh, maxnnzh, maxlintvar, - mpslst, n, m, nnz, ncolh, nnzh, lintvar, iobj, a, irowa, - iccola, bl, bu, pnames, nname, crname, h, irowh, iccolh, - minmax, intvar, ifail); - n = e04mx.getN(); - m = e04mx.getM(); - nnz = e04mx.getNNZ(); - ncolh = e04mx.getNCOLH(); - nnzh = e04mx.getNNZH(); - lintvar = e04mx.getLINTVAR(); - iobj = e04mx.getIOBJ(); - nname = e04mx.getNNAME(); - minmax = e04mx.getMINMAX(); - ifail = e04mx.getIFAIL(); - - // Close the data file - ifail = 0; - x04ad.eval(nin, ifail); - - /* Data has been read. Set up and run the solver */ - - iw = new int[leniw]; - rw = new double[lenrw]; - cw = new String[lencw]; - for (int j = 0; j < lencw; j++) { - cw[j] = " "; - } - - // Call E04NP to initialize workspace - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw, lencw, iw, leniw, rw, lenrw, ifail); - - // Call option setter E04NS to change the direction of optimization. - // Minimization is assumed by default. - E04NS e04ns = new E04NS(); - if (minmax == 1) { - ifail = 0; - e04ns.eval("Maximize", cw, iw, rw, ifail); - } - else if (minmax == 0) { - ifail = 0; - e04ns.eval("Feasible Point", cw, iw, rw, ifail); - } - - // Set this to TRUE to cause E04NQ to produce intermediate progress output - verboseOutput = false; - - if (verboseOutput) { - // By default E04NQ does not print monitoring information. Set the print - // file unit or the summary file unit to get information. - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", nout, cw, iw, rw, ifail); - } - else { - System.out.printf(" \n Problem contains %3d variables and %3d linear constraints\n", n, m); - } - - // We have no explicit objective vector so set LENC = 0; the objective vector - // is stored in row IOBJ of ACOL. - lenc = 0; - objadd = 0.0; - start = "C"; - - c = new double[Math.max(1, lenc)]; - helast = new int[n + m]; - x = new double[n + m]; - pi = new double[m]; - rc = new double[n + m]; - hs = new int[n + m]; - iuser = new int[ncolh + 1 + nnzh]; - ruser = new double[nnzh]; - - if (ncolh > 0) { - // Store the non zeros of H in ruser for use by qphx - for (int j = 0; j < nnzh; j++) { - ruser[j] = h[j]; - } - // Store iccolh and irowh in iuser for use by qphx - for (int j = 0; j < ncolh + 1; j++) { - iuser[j] = iccolh[j]; - } - for (int j = 0; j < nnzh; j++) { - iuser[j + ncolh + 1] = irowh[j]; - } - - } - - // Call E04NQ to solve the problem - E04NQ e04nq = new E04NQ(); - QPHX qphx = new QPHX(); - ns = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - ifail = 0; - e04nq.eval(start, qphx, m, n, nnz, nname, lenc, ncolh, iobj, objadd, - pnames[0], a, irowa, iccola, bl, bu, c, crname, helast, hs, - x, pi, rc, ns, ninf, sinf, obj, cw, lencw, iw, leniw, rw, - lenrw,cuser,iuser,ruser,ifail); - ns = e04nq.getNS(); - ninf = e04nq.getNINF(); - sinf = e04nq.getSINF(); - obj = e04nq.getOBJ(); - ifail = e04nq.getIFAIL(); - - if (!verboseOutput) { - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n", obj); - System.out.printf(" Optimal X = \n"); - System.out.printf(" "); - for (int j = 0; j < n; j++) { - System.out.printf("%9.2f", x[j]); - } - System.out.printf("\n"); - } - - } - - public static class QPHX extends E04NQ.Abstract_E04NQ_QPHX { - - /** - * Subroutine to compute H*x. - * Note: IUSER and RUSER contain the following data: - * RUSER(1:NNZH) = H(1:NNZH) - * IUSER(1:NCOLH+1) = ICCOLH(1:NCOLH+1) - * IUSER(NCOLH+2:NNZH+NCOLH+1) = IROWH(1:NNZH) - */ - public void eval() { - /* Local Scalars */ - int end, icol, idx, irow, start; - - Arrays.fill(HX, 0.0); - - for (icol = 0; icol < this.NCOLH + 1; ++icol) { - - start = this.IUSER[icol] - 1; - end = IUSER[icol+1] - 2; - - for (idx = start; idx < end + 1; ++idx) { - - irow = this.IUSER[this.NCOLH + 1 + idx] - 1; - this.HX[irow] += this.X[icol] * this.RUSER[idx]; - - if (irow != icol) { - this.HX[icol] += this.X[irow] * this.RUSER[idx]; - } - - } - - } - - } - - } - - -} diff --git a/simple_examples/E04NCJE.java b/simple_examples/E04NCJE.java deleted file mode 100644 index d6c3010..0000000 --- a/simple_examples/E04NCJE.java +++ /dev/null @@ -1,246 +0,0 @@ -import static java.lang.Math.max; - -import com.nag.routines.E04.E04NC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NC example program text. - * @author ludovic - */ -public class E04NCJE { - - public static void main(String[] args) { - - double one = 1.0; - double zero = 0.0; - int inc1 = 1, lcwsav = 1, liwsav = 610, - llwsav = 120, lrwsav = 475, nin = 5, - nout = 6; - double obj; - int i, ifail, iter, lda, ldc, liwork, - lwork, m, n, nclin, sdc; - double[] a, b, bl, bu, c, - clamda, cvec, work, x; - double[] rwsav = new double[lrwsav]; - int[] istate, iwork, kx; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - String[] cwsav = new String[lcwsav]; - - System.out.println(" E04NCJ Example Program Results"); - try { - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - m = Integer.parseInt(data[0]); - n = Integer.parseInt(data[1]); - nclin = Integer.parseInt(data[2]); - - liwork = n; - ldc = max(1,nclin); - lda = max(1,m); - - if (nclin > 0) { - sdc = n; - } - else { - sdc = 1; - } - - /* This particular example problem is of type LS1, so we allocate - * A(LDA,N), CVEC(1), B(M) and define LWORK as below - */ - if (nclin > 0) { - lwork = 2*n*n + 9*n + 6*nclin; - } - else { - lwork = 9*n; - } - - /* - * 2Ds arrays (size [n,m]) are stored in 1D arrays of size n*m, ordered by column - * ie: - * 1 1 1 - * 2 2 2 - * 3 3 3 - * - * is stored [1,2,3,1,2,3,1,2,3] - */ - istate = new int[n+nclin]; - kx = new int[n]; - iwork = new int[liwork]; - c = new double[ldc*sdc]; - bl = new double[n+nclin]; - bu = new double[n+nclin]; - cvec = new double[1]; - x = new double[n]; - a = new double[lda * n]; - b = new double[m]; - clamda = new double[n+nclin]; - work = new double[lwork]; - - /* - * Extra arrays to initialize: - */ - for (int ii = 0; ii < cwsav.length; ++ii) { - // 80 characters long... - cwsav[ii] - = " "; - } - - for (int ii = 0; ii < lda; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < n; ++jj) { - a[lda*jj+ii] = Double.parseDouble(data[jj]); - } - } - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - - for (int ii = 0; ii < m; ++ii) { - b[ii] = Double.parseDouble(data[ii]); - } - - for (int ii = 0; ii < ldc; ++ii) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < sdc; ++jj) { - c[ldc*jj+ii] = Double.parseDouble(data[jj]); - } - } - - //bl and bu to complicated to read properly -> hardcoded - line = br.readLine(); - line = br.readLine(); - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = -1.0E+25; - bl[3] = 0.0; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 0.0; - bl[8] = 0.0; - bl[9] = 2.0; - bl[10] = -1.0E+25; - bl[11] = 1.0; - - line = br.readLine(); - line = br.readLine(); - bu[0] = 2.0; - bu[1] = 2.0; - bu[2] = 2.0; - bu[3] = 2.0; - bu[4] = 2.0; - bu[5] = 2.0; - bu[6] = 2.0; - bu[7] = 2.0; - bu[8] = 2.0; - bu[9] = 1.0E+25; - bu[10] = 2.0; - bu[11] = 4.0; - - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int ii = 0; ii < n; ++ii) { - x[ii] = Double.parseDouble(data[ii]); - } - - // CALL TO E04WBF - ifail = 0; - String routname = "E04NCA"; - E04WB e04wb = new E04WB(routname, cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, - lrwsav, ifail); - e04wb.eval(); - cwsav = e04wb.getCWSAV(); - iwsav = e04wb.getIWSAV(); - lwsav = e04wb.getLWSAV(); - rwsav = e04wb.getRWSAV(); - - // CALL TO E04NCF - ifail = -1; - - /* Java needs these to be initialized, so set it to an impossible value - * to trap possible error later */ - iter = Integer.MIN_VALUE; - obj = Double.NaN; - - E04NC e04nc = new E04NC(m,n,nclin,ldc,lda,c,bl,bu,cvec,istate,kx,x,a,b,iter,obj, - clamda,iwork,liwork,work,lwork,lwsav,iwsav,rwsav,ifail); - e04nc.eval(); - - // Getting ifail's value back - ifail = e04nc.getIFAIL(); - - switch (ifail) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 7: - System.out.println("\n Varbl Istate Value Lagr Mult\n"); - - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println("\n\n L Con Istate Value Lagr Mult\n"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("\n\n Final objective value = %15.3E\n",e04nc.getOBJ()); - break; - default: - if (ifail > 7) { - System.out.println(" Varbl Istate Value Lagr Mult"); - for (i = 0; i < n; ++i) { - System.out.printf(" V %3d %3d %14.3E %12.3E)\n",(i+1), istate[i],x[i], clamda[i]); - } - - if (nclin > 0) { - DGEMV dgemv = new DGEMV(); - dgemv.eval("N",nclin,n,one,c,ldc,x,inc1,zero,work,inc1); - System.out.println(" L Con Istate Value Lagr Mult"); - for (int ii = 0; ii < nclin; ++ii) { - System.out.printf(" L %3d %3d %14.3E %12.3E\n", - ii+1,istate[ii+n],work[ii],clamda[ii+n]); - } - } - - System.out.printf("Final objective value is: %15.7f\n",e04nc.getOBJ()); - } - else { - System.out.println("E04NC returned with IFAIL = "+e04nc.getIFAIL()); - } - } - } - catch (Exception ex) { - Logger.getLogger(E04NCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - -} diff --git a/simple_examples/E04NFJE.java b/simple_examples/E04NFJE.java deleted file mode 100644 index e341f9f..0000000 --- a/simple_examples/E04NFJE.java +++ /dev/null @@ -1,234 +0,0 @@ -import com.nag.routines.E04.E04NF; -import com.nag.routines.E04.E04NH; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E54NFU; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * E04NF example program text. - */ -public class E04NFJE { - - public static void main(String[] args) { - - /* Local Scalars */ - double obj; - int i, ifail, iter, lda, ldh, liwork, lwork, n, nclin, sda; - /* Local Arrays */ - double[] a, ax, bl, bu, clamda, cvec, h, work, x; - int[] istate, iwork; - - try { - - System.out.println(" E04NFJ Example Program Results"); - - if (args.length == 0) { - System.err.println("You need to provide the path to the data file e04nfae.d"); - System.exit(-1); - } - - // Read data from file - DataFile datafile = new DataFile(args[0]); - datafile.read(); - - liwork = 2 * datafile.n + 3; - lda = Math.max(1, datafile.nclin); - - sda = (datafile.nclin > 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new int[datafile.n + datafile.nclin]; - ax = new double[Math.max(1, datafile.nclin)]; - iwork = new int[liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[datafile.n + datafile.nclin]; - work = new double[lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - int lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[lcwsav]; - cwsav[0] - = " "; - int[] iwsav = new int[liwsav]; - boolean[] lwsav = new boolean[llwsav]; - double[] rwsav = new double[lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - int[] iuser = new int[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } - catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default. */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - super.eval(); - } - - } - - public static class DataFile { - - public String filename; - public int n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file" - + " - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } - else { - sda = 1; - } - ldh = n; - - cvec = new double[n]; - a = new double[lda * sda]; - bl = new double[n + nclin]; - bu = new double[n + nclin]; - x = new double[n]; - h = new double[ldh * n]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[i + j * lda] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " - + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file" - + " - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[i + j * ldh] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/E04NKJE.java b/simple_examples/E04NKJE.java deleted file mode 100644 index 604ee66..0000000 --- a/simple_examples/E04NKJE.java +++ /dev/null @@ -1,295 +0,0 @@ -import com.nag.routines.E04.E04NK; -import com.nag.routines.E04.E04WB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NKJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class E04NKJE{ - private static int lcwsav = 1; - private static int liwsav = 380; - private static int llwsav = 20; - private static int lrwsav = 285; - - /** - * E04NKJ Example main program. - */ - public static void main(String[] args){ - double obj, sinf; - int icol, ifail, iobj, jcol, leniz, lenz, m, miniz, minz, n, ncolh, ninf, nname, nnz, ns, i; - String start; - double[] a, bl, bu, clamda, xs, z, ruser, rwsav; - int[] ha, istate, iz, ka, iuser, iwsav; - boolean[] lwsav; - String[] crname, cwsav, names; - - System.out.println("E04NKJ Example Program Results"); - - ruser = new double[1]; - rwsav = new double[lrwsav]; - iuser = new int[1]; - iwsav = new int[liwsav]; - - cwsav = new String[lcwsav]; - //equivalent to ```Character (80) :: cwsav(lcwsav)``` - for(i = 0; i < lcwsav; i++){ - char[] chars = new char[80]; - Arrays.fill(chars, ' '); - cwsav[i] = new String(chars); - } - names = new String[5]; - //names all blank anyway this time - for(i = 0; i < 5; i++){ - char[] chars = new char[8]; - Arrays.fill(chars, ' '); - names[i] = new String(chars); - } - - //dummy arrays - crname = new String[0]; - - n = 7; - m = 8; - nnz = 48; - iobj = 8; - ncolh = 7; - start = "C"; - nname = 15; - - ha = new int[nnz]; - ka = new int[n + 1]; - istate = new int[n + m]; - a = new double[nnz]; - bl = new double[n + m]; - bu = new double[n + m]; - xs = new double[n + m]; - clamda = new double[n + m]; - crname = new String[nname]; - lwsav = new boolean[llwsav]; - - names[0] = " "; - names[1] = " "; - names[2] = " "; - names[3] = " "; - names[4] = " "; - - crname[0] = "...X1..."; - crname[1] = "...X2..."; - crname[2] = "...X3..."; - crname[3] = "...X4..."; - crname[4] = "...X5..."; - crname[5] = "...X6..."; - crname[6] = "...X7..."; - crname[7] = "..ROW1.."; - crname[8] = "..ROW2.."; - crname[9] = "..ROW3.."; - crname[10] = "..ROW4.."; - crname[11] = "..ROW5.."; - crname[12] = "..ROW6.."; - crname[13] = "..ROW7.."; - crname[14] = "..COST.."; - - //Matrix A. Set up KA - jcol = 1; - ka[0] = 1; - - a[0] = 0.02; ha[0] = 7; - a[1] = 0.02; ha[1] = 5; - a[2] = 0.03; ha[2] = 3; - a[3] = 1.00; ha[3] = 1; - a[4] = 0.70; ha[4] = 6; - a[5] = 0.02; ha[5] = 4; - a[6] = 0.15; ha[6] = 2; - a[7] = -200.00; ha[7] = 8; - a[8] = 0.06; ha[8] = 7; - a[9] = 0.75; ha[9] = 6; - a[10] = 0.03; ha[10] = 5; - a[11] = 0.04; ha[11] = 4; - a[12] = 0.05; ha[12] = 3; - a[13] = 0.04; ha[13] = 2; - a[14] = 1.00; ha[14] = 1; - a[15] = -2000.00; ha[15] = 8; - a[16] = 0.02; ha[16] = 2; - a[17] = 1.00; ha[17] = 1; - a[18] = 0.01; ha[18] = 4; - a[19] = 0.08; ha[19] = 3; - a[20] = 0.08; ha[20] = 7; - a[21] = 0.80; ha[21] = 6; - a[22] = -2000.00; ha[22] = 8; - a[23] = 1.00; ha[23] = 1; - a[24] = 0.12; ha[24] = 7; - a[25] = 0.02; ha[25] = 3; - a[26] = 0.02; ha[26] = 4; - a[27] = 0.75; ha[27] = 6; - a[28] = 0.04; ha[28] = 2; - a[29] = -2000.00; ha[29] = 8; - a[30] = 0.01; ha[30] = 5; - a[31] = 0.80; ha[31] = 6; - a[32] = 0.02; ha[32] = 7; - a[33] = 1.00; ha[33] = 1; - a[34] = 0.02; ha[34] = 2; - a[35] = 0.06; ha[35] = 3; - a[36] = 0.02; ha[36] = 4; - a[37] = -2000.00; ha[37] = 8; - a[38] = 1.00; ha[38] = 1; - a[39] = 0.01; ha[39] = 2; - a[40] = 0.01; ha[40] = 3; - a[41] = 0.97; ha[41] = 6; - a[42] = 0.01; ha[42] = 7; - a[43] = 400.00; ha[43] = 8; - a[44] = 0.97; ha[44] = 7; - a[45] = 0.03; ha[45] = 2; - a[46] = 1.00; ha[46] = 1; - a[47] = 400.00; ha[47] = 8; - - ka[1] = 9; - ka[2] = 17; - ka[3] = 24; - ka[4] = 31; - ka[5] = 39; - ka[6] = 45; - ka[7] = 49; - - bl[0] = 0.0; - bl[1] = 0.0; - bl[2] = 4.0e2; - bl[3] = 1.0e2; - bl[4] = 0.0; - bl[5] = 0.0; - bl[6] = 0.0; - bl[7] = 2.0e3; - bl[8] = -1.0e25; - bl[9] = -1.0e25; - bl[10] = -1.0e25; - bl[11] = -1.0e25; - bl[12] = 1.5e3; - bl[13] = 2.5e2; - bl[14] = -1.0e25; - - bu[0] = 2.0e2; - bu[1] = 2.5e3; - bu[2] = 8.0e2; - bu[3] = 7.0e2; - bu[4] = 1.5e3; - bu[5] = 1.0e25; - bu[6] = 1.0e25; - bu[7] = 2.0e3; - bu[8] = 6.0e1; - bu[9] = 1.0e2; - bu[10] = 4.0e1; - bu[11] = 3.0e1; - bu[12] = 1.0e25; - bu[13] = 3.0e2; - bu[14] = 1.0e25; - - istate[0] = 0; - istate[1] = 0; - istate[2] = 0; - istate[3] = 0; - istate[4] = 0; - istate[5] = 0; - istate[6] = 0; - istate[7] = 0; - - xs[0] = 0.0; - xs[1] = 0.0; - xs[2] = 0.0; - xs[3] = 0.0; - xs[4] = 0.0; - xs[5] = 0.0; - xs[6] = 0.0; - xs[7] = 0.0; - - ifail = 0; - E04WB e04wb = new E04WB("E04NKA",cwsav,lcwsav,lwsav,llwsav,iwsav,liwsav,rwsav, - lrwsav,ifail); - e04wb.eval(); - - leniz = 1; - lenz = 1; - iz = new int[leniz]; - z = new double[lenz]; - - QPHX qphx = new QPHX(); - - ifail = 1; - - //placeholders - ns = 0; - miniz = 0; - minz = 0; - ninf = 0; - sinf = 0.0; - obj = 0.0; - - E04NK e04nk = new E04NK(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname, - crname,ns,xs,istate,miniz,minz,ninf,sinf,obj,clamda,iz, - leniz,z,lenz,iuser,ruser,lwsav,iwsav,rwsav,ifail); - e04nk.eval(); - ifail = e04nk.getIFAIL(); - - minz = e04nk.getMINZ(); - miniz = e04nk.getMINIZ(); - - lenz = minz; - leniz = miniz; - - iz = new int[leniz]; - z = new double[lenz]; - - ifail = -1; - - e04nk.eval(n,m,nnz,iobj,ncolh,qphx,a,ha,ka,bl,bu,start,names,nname,crname,ns,xs, - istate,miniz,minz,ninf,sinf,obj,clamda,iz,leniz,z,lenz,iuser,ruser, - lwsav,iwsav,rwsav,ifail); - - //update - ifail = e04nk.getIFAIL(); - obj = e04nk.getOBJ(); - - if(ifail == 0){ - System.out.println(); - System.out.println("\tVariable Istate Value Lagr Mult"); - System.out.println(); - - for(i = 0; i < n; i++){ - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - if(m > 0){ - System.out.println(); - System.out.println(); - System.out.println("\tConstrnt Istate Value\t\t Lagr Mult"); - System.out.println(); - - for(i = n; i < n + m - 1; i++){ - System.out.printf("\t%s\t%d\t%.6g\t\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - System.out.printf("\t%s\t%d\t%.6g\t%12.4g\n", crname[i], istate[i], xs[i], clamda[i]); - } - - System.out.println(); - System.out.println(); - System.out.printf("Final objetive value = %15.7g\n", obj); - } - - } - - public static class QPHX extends E04NK.Abstract_E04NK_QPHX{ - public void eval(){ - this.HX[0] = 2 * this.X[0]; - this.HX[1] = 2 * this.X[1]; - this.HX[2] = 2 * (this.X[2] + this.X[3]); - this.HX[3] = this.HX[2]; - this.HX[4] = 2 * this.X[4]; - this.HX[5] = 2 * (this.X[5] + this.X[6]); - this.HX[6] = this.HX[5]; - } - } -} diff --git a/simple_examples/E04NQJE.java b/simple_examples/E04NQJE.java deleted file mode 100644 index 6cf84fe..0000000 --- a/simple_examples/E04NQJE.java +++ /dev/null @@ -1,384 +0,0 @@ -import com.nag.routines.E04.E04NP; -import com.nag.routines.E04.E04NQ; -import com.nag.routines.E04.E04NT; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -/** - * E04NQ example program text. - */ -public class E04NQJE { - - public static final int LENCW = 600; - public static final int LENIW = 600; - public static final int LENRW = 600; - public static final int NIN = 5; - public static final int NOUT = 6; - - public static void main(String[] args) throws IOException { - - /* Local Scalars */ - double obj, objadd, sinf; - int i, icol, ifail, iobj, jcol, lenc, m, n, ncolh, ne, ninf, nname, ns; - boolean verboseOutput; - String prob; // Length = 8 - String start; // Length = 1 - /* Local Arrays */ - double[] acol, bl, bu, c, pi, rc, x; - double[] ruser = new double[1], rw = new double[LENRW]; - int[] helast, hs, inda, loca; - int[] iuser = new int[1], iw = new int[LENIW]; - String[] cuser = new String[1], cw = new String[LENCW]; // Length = 8 - String[] names; // Length = 8 - /* Init String arrays with same length*/ - Arrays.fill(cuser, " "); - Arrays.fill(cw, " "); - - System.out.println(" E04NQJ Example Program Results"); - - /* Read data file */ - - if (args.length != 1) { - usage(); - } - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - String line; - - // Skip heading in data file - line = dataIn.readLine(); - - // Read n, m - line = dataIn.readLine(); - String[] data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 2) { - System.out.println("Data file badly formatted - expected 2 ints separated by blank spaces.\n" - + line + "\n"+Arrays.toString(data)); - System.exit(1); - } - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - - // Read ne, iobj, ncolh, start, nname - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 5) { - System.out.println("Data file badly formatted - expected 5 ints separated by blank spaces"); - System.exit(1); - } - ne = Integer.parseInt(data[0]); - iobj = Integer.parseInt(data[1]); - ncolh = Integer.parseInt(data[2]); - start = data[3].replaceAll("'",""); - nname = Integer.parseInt(data[4]); - - // Allocate - inda = new int[ne]; - loca = new int[n+1]; - helast = new int[n+m]; - hs = new int[n+m]; - acol = new double[ne]; - bl = new double[n+m]; - bu = new double[n+m]; - x = new double[n+m]; - pi = new double[m]; - rc = new double[n+m]; - names = new String[nname]; - - // Read names - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - int nameIndex = 0; - int dataIndex = 0; - while (nameIndex < nname) { - names[nameIndex] = data[dataIndex].replaceAll("'", ""); - ++nameIndex; - ++dataIndex; - if (nameIndex < nname && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read matrix - line = dataIn.readLine(); // skipping blank line - int locaIndex = 0; - int currentCol = 0; - for (i = 0; i < ne; ++i) { - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != 3) { - System.out.println("The line is not well formatted for input of A:\n\t"+line); - System.exit(1); - } - acol[i] = Double.parseDouble(data[0].replaceAll("d", "e").replaceAll("D", "e")); - inda[i] = Integer.parseInt(data[1]); - if (i == 0) { - loca[locaIndex] = 1;//storing for Fortran use: 1-based - ++locaIndex; - ++currentCol; - } - else { - int tmp = Integer.parseInt(data[2]); - if (tmp != currentCol) { - loca[locaIndex] = i+1; - ++currentCol; - ++locaIndex; - } - } - } - loca[n] = ne + 1; - - // Read bl - line = dataIn.readLine(); // skipping blank line - int blindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (blindex < bl.length) { - bl[blindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++blindex; - ++dataIndex; - if (blindex < bl.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read bu - line = dataIn.readLine(); // skipping blank line - int buindex = 0; - dataIndex = 0; - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - while (buindex < bu.length) { - bu[buindex] = Double.parseDouble(data[dataIndex].replaceAll("d", "e").replaceAll("D", "e")); - ++buindex; - ++dataIndex; - if (buindex < bu.length && dataIndex == data.length) { - //need to read one more line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - dataIndex = 0; - } - } - - // Read hs - line = dataIn.readLine(); // skipping blank line - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (start.equalsIgnoreCase("C")) { - if (data.length != n) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - else { - if (data.length != n+m) { - System.out.println("Wrong format for HS data.\n"); - System.exit(1); - } - } - for (i = 0; i < data.length; ++i) { - hs[i] = Integer.parseInt(data[i]); - } - - // Read x - line = dataIn.readLine(); - data = line.split(":")[0].trim().split("\\s+"); - if (data.length != n) { - System.out.println("Wrong format for X data."); - System.exit(1); - } - for (i = 0; i < data.length; ++i) { - x[i] = Double.parseDouble(data[i].replaceAll("d", "e").replaceAll("D", "e")); - } - - /* Done reading data file */ - - System.out.printf(" \n QP problem contains %3d variables and %3d linear constraints\n", n, m); - - /* Call E04NP to initialize E04NQ. */ - E04NP e04np = new E04NP(); - ifail = 0; - e04np.eval(cw,LENCW,iw,LENIW,rw,LENRW,ifail); - - /* Set this to .True. to cause e04nqf to produce intermediate - * progress output. */ - verboseOutput = true; - - if (verboseOutput) { - /* By default e04nqf does not print monitoring - * information. Set the print file unit or the summary - * file unit to get information. */ - E04NT e04nt = new E04NT(); - ifail = 0; - e04nt.eval("Print file", NOUT, cw, iw, rw, ifail); - } - - /* We have no explicit objective vector so set LENC = 0; the - * objective vector is stored in row IOBJ of ACOL. */ - lenc = 0; - c = new double[Math.max(1,lenc)]; - objadd = 0.0; - sinf = 0.0; - obj = Double.NaN; - prob = " "; - - /* Do not allow any elastic variables (i.e. they cannot be - * infeasible). If we'd set optional argument "Elastic mode" to 0, - * we wouldn't need to set the individual elements of array HELAST. */ - - for (int j = 0; j < (n+m); j++) { - helast[j] = 0; - } - - /* Solve the QP problem. */ - - E04NQ e04nq = new E04NQ(); - ifail = 0; - ns = 0; - ninf = 0; - e04nq.eval(start,new QPHX(ncolh),m,n,ne,nname,lenc,ncolh,iobj,objadd,prob,acol, - inda,loca,bl,bu,c,names,helast,hs,x,pi,rc,ns,ninf,sinf,obj,cw,LENCW, - iw,LENIW,rw,LENRW,cuser,iuser,ruser,ifail); - - System.out.println(); - System.out.printf(" Final objective value = %11.3E\n",e04nq.getOBJ()); - System.out.print(" Optimal X = "); - for (i = 0; i < n; ++i) { - System.out.printf("%9.2f ", x[i]); - } - System.out.println(); - - } - - private static void usage() { - System.out.println("Usage:\n" - + "\tjava -cp " + File.separator + "NAGJava.jar" + File.pathSeparator - + ". E04NQJE " + File.separator + "e04nqfe.d"); - System.exit(1); - } - - public static class QPHX implements E04NQ.E04NQ_QPHX { - - private int NCOLHREF; - - public QPHX(int NCOLHREF) { - this.NCOLHREF = NCOLHREF; - } - - // @Override - public void eval(int NCOLH, double[] X, double[] HX, int NSTATE, - String[] CUSER, int[] IUSER, double[] RUSER) { - - if (NCOLH != NCOLHREF) { - System.out.println("NCOLH value is wrong!"); - System.out.println("TEST FAILED"); - System.exit(1); - } - HX[0] = 2.0*X[0]; - HX[1] = 2.0*X[1]; - HX[2] = 2.0*(X[2]+X[3]); - HX[3] = HX[2]; - HX[4] = 2.0*X[4]; - HX[5] = 2.0*(X[5]+X[6]); - HX[6] = HX[5]; - - } - - private String[] CUSER; - private double[] HX,RUSER,X; - private int[] IUSER; - private int NCOLH, NSTATE; - - // @Override - public String[] getCUSER() { - return CUSER; - } - - // @Override - public double[] getHX() { - return HX; - } - - // @Override - public int[] getIUSER() { - return IUSER; - } - - // @Override - public int getNCOLH() { - return NCOLH; - } - - // @Override - public int getNSTATE() { - return NSTATE; - } - - // @Override - public double[] getRUSER() { - return RUSER; - } - - // @Override - public double[] getX() { - return X; - } - - // @Override - public void setCUSER(String[] arg0) { - CUSER = arg0; - - } - - // @Override - public void setHX(double[] arg0) { - HX = arg0; - - } - - // @Override - public void setIUSER(int[] arg0) { - IUSER = arg0; - - } - - // @Override - public void setNCOLH(int arg0) { - NCOLH = arg0; - - } - - // @Override - public void setNSTATE(int arg0) { - NSTATE = arg0; - - } - - // @Override - public void setRUSER(double[] arg0) { - RUSER = arg0; - - } - - // @Override - public void setX(double[] arg0) { - X = arg0; - - } - - } - - - - -} diff --git a/simple_examples/E04PTJE.java b/simple_examples/E04PTJE.java deleted file mode 100644 index 75303ac..0000000 --- a/simple_examples/E04PTJE.java +++ /dev/null @@ -1,344 +0,0 @@ -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RB; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.F08.DSYEVD; -import java.util.Arrays; - -/** - * E04PTJ example program text. - * @author joed - * @since 27.0.0.0 - */ -public class E04PTJE { - - - /** - * Monitoring function can be used to monitor the progress - * or, for example, to implement bespoke stopping criteria. - */ - private static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - - double tol = RUSER[0]; - int tolReached = IUSER[1]; - - // If x is close to the solution, print a message - if ((RINFO[14] < tol) && (RINFO[15] < tol) && (RINFO[16] < tol) && (RINFO[17] < tol)) { - if (tolReached == 0) { - System.out.println(); - System.out.printf("monit() reports good approximate solution (tol = %9.2E)\n", tol); - IUSER[1] = 1; - } - } - - } - - } - - - /** - * E04PTJ example main program. - */ - public static void main(String[] args) { - - DSYEVD dsyevd = new DSYEVD(); - E04PT e04pt = new E04PT(); - E04RA e04ra = new E04RA(); - E04RB e04rb = new E04RB(); - E04RE e04re = new E04RE(); - E04RH e04rh = new E04RH(); - E04RJ e04rj = new E04RJ(); - E04RZ e04rz = new E04RZ(); - E04ZM e04zm = new E04ZM(); - MONIT monit = new MONIT(); - - final int nqc = 1; - long cpuser, handle; - double r1; - int i, idgroup, idlc, idxa, ifail, j, liwork, lwork, m, n, na, nnza, nnzp0, - nnzp1, nnzu, nnzuc, nu, nv, nvarc1, nvarc2, rptr, xIdx; - boolean verboseOutput; - String ctype1, ctype2; // Length must be 8 - double[] a, bla, bua, c, f0, f1, lambda0, lambda1, p0, p1, q0, q1, u, uc, - work, x, xl, xu; - double[] rinfo = new double[100], ruser = new double[1], stats = new double[100]; - int[] icola, icolp0, icolp1, idxc1, idxc2, irowa, irowp0, irowp1, iwork; - int[] iuser = new int[2]; - - System.out.println("E04PTJ Example Program Results\n"); - - // Dimensions of the problem - n = 3; - nnzp0 = 6; - nnzp1 = 6; - - // Initialize size of linear constraints in SOCP - m = nqc; - na = n + nqc + 1; - nnza = nqc + n; - - // Initialize size of cone constraints - nvarc1 = 2; - nvarc2 = 2; - - // Set problem data - lwork = Math.max(2*n*n+6*n+1, 120+9*n); - liwork = 5*n + 3; - irowp0 = new int[]{1, 2, 3, 2, 3, 3}; - icolp0 = new int[]{1, 1, 1, 2, 2, 3}; - p0 = new double[]{0.493, 0.382, 0.270, 0.475, 0.448, 0.515}; - irowp1 = new int[]{1, 2, 3, 2, 3, 3}; - icolp1 = new int[]{1, 1, 1, 2, 2, 3}; - p1 = new double[]{0.737, 0.453, 1.002, 0.316, 0.635, 1.590}; - q0 = new double[]{0.847, 0.08, 0.505}; - q1 = new double[]{0.065, 0.428, 0.097}; - r1 = 1.276; - f0 = new double[n*n]; - f1 = new double[n*n]; - lambda0 = new double[n]; - lambda1 = new double[n]; - work = new double[lwork]; - iwork = new int[liwork]; - - // Store full P0 and P1 in F0 and F1 - Arrays.fill(f0, 0.0); - for (i = 0; i < nnzp0; i++) { - f0[getIdx(irowp0[i], icolp0[i], n)] = p0[i]; - } - Arrays.fill(f1, 0.0); - for (i = 0; i < nnzp1; i++) { - f1[getIdx(irowp1[i], icolp1[i], n)] = p1[i]; - } - - // Factorize P0 and P1 via eigenvalue decomposition - ifail = 0; - dsyevd.eval("V", "L", n, f0, n, lambda0, work, lwork, iwork, liwork, ifail); - dsyevd.eval("V", "L", n, f1, n, lambda1, work, lwork, iwork, liwork, ifail); - - // Fomulate F0 and F1 in P0 = F0'*F0, P1 = F1'*F1 - nu = 0; - nv = 0; - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - for (j = 1; j <= n; j++) { - f0[getIdx(j,i,n)] *= Math.sqrt(lambda0[i-1]); - } - m++; - nu++; - nnza += n; - } - if (lambda1[i-1] > 0) { - for (j = 1; j <= n; j++) { - f1[getIdx(j,i,n)] *= Math.sqrt(lambda1[i-1]); - } - m++; - nv++; - nnza += n; - } - } - nnza += nu + nv; - na += nu+ nv; - nvarc1 += nu; - nvarc2 += nv; - - // Add two fixed variable for two rotated quadratic cones - na += 2; - m += 2; - nnza += 2; - - // Compute size of multipliers - nnzu = 2*na + 2*m; - nnzuc = nvarc1 + nvarc2; - - // Initialize arrays to build SOCP - icola = new int[nnza]; - irowa = new int[nnza]; - a = new double[nnza]; - bla = new double[m]; - bua = new double[m]; - xl = new double[na]; - xu = new double[na]; - c = new double[na]; - x = new double[na]; - u = new double[nnzu]; - uc = new double[nnzuc]; - idxc1 = new int[nvarc1]; - idxc2 = new int[nvarc2]; - - // Build objective function parameter c - // [x, t1, u, v, y1, y2, t0] - Arrays.fill(c, 0.0); - for (j = 0; j < n; j++) { - c[j] = q0[j]; - } - c[na-1] = 1.0; - - // Build linear constraints parameter A - idxa = 0; - rptr = 0; - // q1 in First row - rptr++; - Arrays.fill(irowa, 0, n, rptr); - for (j = 0; j < n; j++) { - icola[j] = j+1; - a[j] = q1[j]; - } - idxa += n; - - // F0 in F0*x-u=0 row - for (i = 1; i <= n; i++) { - if (lambda0[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f0[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // F1 in F1*x-v=0 row - for (i = 1; i <= n; i++) { - if (lambda1[i-1] > 0) { - rptr += 1; - for (j = 0; j < n; j++) { - irowa[idxa+j] = rptr; - icola[idxa+j] = j+1; - a[idxa+j] = f1[getIdx(j+1,i,n)]; - } - idxa += n; - } - } - // Rest of A, a diagonal matrix - for (j = 0; j < m; j++) { - irowa[idxa+j] = j+1; - icola[idxa+j] = n+j+1; - a[idxa+j] = 1.0; - } - for (j = 1; j < (nu+nv+1); j++) { - a[idxa+j] = -1.0; - } - // RHS in linear constraints - Arrays.fill(bla, 0.0); - Arrays.fill(bua, 0.0); - bla[0] = -r1; - bua[0] = -r1; - for (j = (m-nqc); j <= m; j++) { - bla[j-1] = 1.0; - bua[j-1] = 1.0; - } - - // Box constraints, all variables are free - Arrays.fill(xl, -1E+20); - Arrays.fill(xu, 1E+20); - - // Cone constraints - // First cone - idxc1[0] = na; - idxc1[1] = n + 1 + nu + nv + 1; - for (j = 2; j < nvarc1; j++) { - idxc1[j] = n + j; - } - ctype1 = "RQUAD "; - // Second cone - idxc2[0] = n + 1; - idxc2[1] = n + 1 + nu + nv + 2; - for (j = 2; j < nvarc2; j++) { - idxc2[j] = n + nu + j; - } - ctype2 = "RQUAD "; - - // Create the problem handle - handle = 0; - ifail = 0; - e04ra.eval(handle, na, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - ifail = 0; - e04re.eval(handle, na, c, ifail); - - // Set box constraints - ifail = 0; - e04rh.eval(handle, na, xl, xu, ifail); - - // Set linear constraints - ifail = 0; - idlc = 0; - e04rj.eval(handle, m, bla, bua, nnza, irowa, icola, a, idlc, ifail); - idlc = e04rj.getIDLC(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype1, nvarc1, idxc1, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Set first cone constraint - ifail = 0; - idgroup = 0; - e04rb.eval(handle, ctype2, nvarc2, idxc2, idgroup, ifail); - idgroup = e04rb.getIDGROUP(); - - // Turn on monitoring - ifail = 0; - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - /* Set this to true to cause e04pt to produce intermediate - * progress output */ - verboseOutput = false; - - if (verboseOutput) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } - else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = 0; // unused in this example - iuser[1] = 0; - ruser[0] = 1.0E-7; - ifail = -1; - e04pt.eval(handle, na, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, - ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if (ifail == 0 || ifail == 50) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (xIdx = 1; xIdx <= n; xIdx++) { - System.out.printf(" %5d %11.3E\n", xIdx, x[xIdx-1]); - } - } - - // Free the handle memory - ifail = 0; - e04rz.eval(handle, ifail); - - } - - - /** - * Convert from 2D Fortran index to 1D-column major Java index. - * @param x 1-based row index for a 2D array - * @param y 1-based column index for a 2D array - * @return the corresponding 0-based index for a 1D column-major array - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/E04RPJE.java b/simple_examples/E04RPJE.java deleted file mode 100644 index d22d3d1..0000000 --- a/simple_examples/E04RPJE.java +++ /dev/null @@ -1,199 +0,0 @@ -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RN; -import com.nag.routines.E04.E04RP; -import com.nag.routines.E04.E04RY; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04SV; - -/** - * E04RPJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ - -public class E04RPJE{ - - /** - * E04RPJ Example main program - */ - public static void main(String[] args){ - int blkidx, dimaq, idblk, idlc, idx, idxend, ifail, inform, midx, nblk, nclin, - nnzasum, nnzb, nnzc, nnzh, nnzqsum, nnzu, nnzua, nnzuc, nq, nvar; - double[] a, b, bl, bu, cvec, h, q, x, rdummy, rinfo, stats; - int[] icola, icolb, icolh, icolq, idxc, irowa, irowb, irowh, irowq, nnza, - nnzq, qi, qj, idummy; - long cpuser, handle; - - rdummy = new double[1]; - rinfo = new double[32]; - stats = new double[32]; - idummy = new int[1]; - - System.out.println("E04RPJ Example Program Results"); - System.out.println(); - - //Problem size - nvar = 5; - nnzh = 0; - nclin = 0; - nnzb = 0; - nblk = 2; - - //Initialize handle to an empty problem - E04RA e04ra = new E04RA(); - handle = 0; - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - //Linear part of the objective function - cvec = new double[nvar]; - cvec[0] = 1; - cvec[1] = 0; - cvec[2] = 1; - cvec[3] = 0; - cvec[4] = 0; - - //Add the linear objetive function to the problem formulation - ifail = 0; - E04RE e04re = new E04RE(handle, nvar, cvec, ifail); - e04re.eval(); - - //Matrix inequalities - //block 1 - dimaq = 2; - nnzasum = 9; nnzqsum = 8; - idblk = 0; - - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 2; - nnza[2] = 3; - nnza[3] = 2; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 2.0; irowa[2] = 1; icola[2] = 1; - a[3] = -2.0; irowa[3] = 1; icola[3] = 2; - a[4] = 6.0; irowa[4] = 1; icola[4] = 1; - a[5] = 5.0; irowa[5] = 1; icola[5] = 2; - a[6] = -4.0; irowa[6] = 2; icola[6] = 2; - a[7] = 3.0; irowa[7] = 1; icola[7] = 2; - a[8] = 8.0; irowa[8] = 2; icola[8] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - E04RN e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - //update - idblk = e04rn.getIDBLK(); - - nq = 6; - - qi = new int[nq]; - qj = new int[nq]; - nnzq = new int[nq]; - irowq = new int[nnzqsum]; - icolq = new int[nnzqsum]; - q = new double[nnzqsum]; - - qi[0] = 1; qj[0] = 4; - qi[1] = 2; qj[1] = 4; - qi[2] = 3; qj[2] = 4; - qi[3] = 1; qj[3] = 5; - qi[4] = 2; qj[4] = 5; - qi[5] = 3; qj[5] = 5; - - nnzq[0] = 1; - nnzq[1] = 2; - nnzq[2] = 1; - nnzq[3] = 1; - nnzq[4] = 2; - nnzq[5] = 1; - - q[0] = 2.0; irowq[0] = 1; icolq[0] = 1; - q[1] = 2.0; irowq[1] = 1; icolq[1] = 1; - q[2] = 1.0; irowq[2] = 1; icolq[2] = 2; - q[3] = 1.0; irowq[3] = 1; icolq[3] = 2; - q[4] = 1.0; irowq[4] = 1; icolq[4] = 2; - q[5] = 1.0; irowq[5] = 1; icolq[5] = 2; - q[6] = 2.0; irowq[6] = 2; icolq[6] = 2; - q[7] = 2.0; irowq[7] = 2; icolq[7] = 2; - - ifail = 0; - //Expand the existing linear matrix inequality with bilnear term - E04RP e04rp = new E04RP(handle,nq,qi,qj,dimaq,nnzq,nnzqsum,irowq,icolq, - q,idblk,ifail); - e04rp.eval(); - - //block 2 - dimaq = 2; - nnzasum = 5; - nnza = new int[nvar + 1]; - irowa = new int[nnzasum]; - icola = new int[nnzasum]; - a = new double[nnzasum]; - - nnza[0] = 2; - nnza[1] = 1; - nnza[2] = 1; - nnza[3] = 1; - nnza[4] = 0; - nnza[5] = 0; - - a[0] = 1.0; irowa[0] = 1; icola[0] = 1; - a[1] = 1.0; irowa[1] = 2; icola[1] = 2; - a[2] = 1.0; irowa[2] = 1; icola[2] = 1; - a[3] = 1.0; irowa[3] = 1; icola[3] = 2; - a[4] = 1.0; irowa[4] = 2; icola[4] = 2; - - idblk = 0; - ifail = 0; - //Add the linear matrix inequality to the problem formulation - e04rn = new E04RN(handle,nvar,dimaq,nnza,nnzasum,irowa,icola,a,1, - idummy,idblk,ifail); - e04rn.eval(); - - System.out.println("Passing SDP problem to solver"); - System.out.println(); - - ifail = 0; - //Print overview of handle - //nout = 6 is default output for fortran - E04RY e04ry = new E04RY(handle,6,"Overview,Matrix Constraints",ifail); - e04ry.eval(); - - //Allocate memory for the solver - x = new double[nvar]; - nnzu = 0; - nnzuc = 0; - nnzua = 0; - inform = 0; - for(int i = 0; i < nvar; i++){ - x[i] = 0.0; - } - - ifail = 0; - E04SV e04sv = new E04SV(handle,nvar,x,nnzu,rdummy,nnzuc,rdummy,nnzua,rdummy, - rinfo,stats,inform,ifail); - e04sv.eval(); - - //Destroy handle - ifail = 0; - E04RZ e04rz = new E04RZ(handle,ifail); - e04rz.eval(); - } - -} - - - diff --git a/simple_examples/E04RSJE.java b/simple_examples/E04RSJE.java deleted file mode 100644 index d614fbb..0000000 --- a/simple_examples/E04RSJE.java +++ /dev/null @@ -1,229 +0,0 @@ -import com.nag.routines.E04.E04RS; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RS - */ -public class E04RSJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - double s = 0.0; - int idqc, ifail, n = 0, nnzq0 = 0, nnzq1 = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] q0 = null, q1 = null, r0 = null, r1 = null, u, uc, x; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icolq0 = null, icolq1 = null, idxr0 = null, idxr1 = null, irowq0 = null, irowq1 = null; - int[] iuser = new int[2]; - - System.out.println(" E04RSJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - nnzq0 = Integer.parseInt(sVal[1]); - nnzq1 = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - irowq0 = new int[nnzq0]; - icolq0 = new int[nnzq0]; - q0 = new double[nnzq0]; - irowq1 = new int[nnzq1]; - icolq1 = new int[nnzq1]; - q1 = new double[nnzq1]; - idxr0 = new int[n]; - r0 = new double[n]; - idxr1 = new int[n]; - r1 = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - irowq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - icolq0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq0; i++) { - q0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - irowq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - icolq1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < nnzq1; i++) { - q1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr0[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - idxr1[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (int i = 0; i < n; i++) { - r1[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - s = Double.parseDouble(sVal[0]); - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute size of multipliers - // One quadratic constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set objective function - idqc = -1; - ifail = 0; - E04RS e04rs = new E04RS(); - e04rs.eval(handle, 0.0, n, idxr0, r0, nnzq0, irowq0, icolq0, q0, idqc, ifail); - - // Set quadratic constraint - idqc = 0; - ifail = 0; - e04rs.eval(handle, s, n, idxr1, r1, nnzq1, irowq1, icolq1, q1, idqc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } -} diff --git a/simple_examples/E04RTJE.java b/simple_examples/E04RTJE.java deleted file mode 100644 index dd4bce8..0000000 --- a/simple_examples/E04RTJE.java +++ /dev/null @@ -1,225 +0,0 @@ -import com.nag.routines.E04.E04RT; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04RH; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * E04RT example program text. - */ -public class E04RTJE { - - public static void main(String[] args) { - - final int nout = 6; - - long cpuser, handle = 0; - int i, idlc, idqc, ifail, j, m = 0, n = 0, nnza = 0, nnzu, nnzuc, x_idx; - boolean verbose_output; - - double[] a = null, b = null, r0 = null, u, uc, x, xl = null, xu = null; - double[] lc = new double[3]; - double[] lc_rhs = new double[1]; - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - int[] icola = null, idxr0 = null, irowa = null; - int[] icollc = new int[3]; - int[] irowlc = new int[3]; - int[] iuser = new int[2]; - - System.out.println(" E04RTJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - // Read dimensions of the problem - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - m = Integer.parseInt(sVal[1]); - nnza = Integer.parseInt(sVal[2]); - - // Allocate memory to read data - a = new double[nnza]; - icola = new int[nnza]; - irowa = new int[nnza]; - idxr0 = new int[n]; - r0 = new double[n]; - b = new double[m]; - xl = new double[n]; - xu = new double[n]; - - // Read problem data - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - irowa[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - icola[i] = Integer.parseInt(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < nnza; i++) { - a[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < m; i++) { - b[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xl[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - xu[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Compute -2*b'A as linear term in quadratic function - for (j = 0; j < n; j++) { - r0[j] = 0.0; - idxr0[j] = j + 1; - } - for (i = 0; i < nnza; i++) { - r0[icola[i] - 1] = r0[icola[i] - 1] + a[i] * b[irowa[i] - 1]; - } - - // Compute size of multipliers - // One linear constraint in the model will have - // 2 multipliers for both bounds - nnzu = 2 * n + 2; - // No cone constraint in the model, so set nnzuc to 0 - nnzuc = 0; - - // Allocate memory for final results - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Create the problem handle - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, n, ifail); - handle = e04ra.getHANDLE(); - - // Set quadratic objective function - idqc = -1; - ifail = 0; - E04RT e04rt = new E04RT(); - e04rt.eval(handle, 0.0, n, idxr0, r0, m, nnza, irowa, icola, a, idqc, ifail); - - // Set box constraints - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, n, xl, xu, ifail); - - // Set linear constraint: x1 + x2 + x3 = 1 - for (j = 0; j < n; j++) { - irowlc[j] = 1; - icollc[j] = j + 1; - lc[j] = 1.0; - } - lc_rhs[0] = 1.0; - ifail = 0; - idlc = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, 1, lc_rhs, lc_rhs, 3, irowlc, icollc, lc, idlc, ifail); - - // Turn on monitoring - ifail = 0; - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "SOCP Monitor Frequency = 1", ifail); - - // Set this to True to cause e04ptf to produce intermediate progress output - verbose_output = false; - - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - iuser[0] = nout; - iuser[1] = 0; - ruser[0] = 1.0e-07; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %11.3e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - double tol; - int nout, tol_reached; - - nout = this.IUSER[0]; - tol_reached = this.IUSER[1]; - tol = this.RUSER[0]; - - // If x is close to the solution, print a message - if ((this.RINFO[14] < tol) && (this.RINFO[15] < tol) && (this.RINFO[16] < tol) && (this.RINFO[17] < tol)) { - if (tol_reached == 0) { - System.out.printf("\n monit() reports good approximate solution (tol =%9.2e)\n", tol); - this.IUSER[1] = 1; - } - } - } - } - } diff --git a/simple_examples/E04SAJE.java b/simple_examples/E04SAJE.java deleted file mode 100644 index 325267b..0000000 --- a/simple_examples/E04SAJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.routines.E04.E04RC; -import com.nag.routines.E04.E04SA; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04RZ; -import com.nag.routines.E04.E04PT; -import com.nag.routines.E04.E04PTU; - -/** - * E04SA example program text. - */ -public class E04SAJE { - - public static final String fname = "e04saje.opt"; - public static void main(String[] args) { - - long cpuser, handle = 0; - int ifail, n, nnzu, nnzuc, x_idx; - boolean verbose_output; - String ftype; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u, uc, x; - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04SAJ Example Program Results"); - - // Read mps file to a handle - ifail = 0; - ftype = "mps"; - E04SA e04sa = new E04SA(); - e04sa.eval(handle, fname, ftype, pinfo, ifail); - handle = e04sa.getHANDLE(); - - // Get problem size from pinfo - pinfo = e04sa.getPINFO(); - n = pinfo[0]; - nnzu = pinfo[10]; - nnzuc = pinfo[11]; - - // Set all variables as continuous - ifail = 0; - E04RC e04rc = new E04RC(); - - int[] x_idx_Arr = new int[n]; - for (x_idx = 1; x_idx <= n; x_idx++) { - x_idx_Arr[x_idx - 1] = x_idx; - } - - e04rc.eval(handle, "CONT", n, x_idx_Arr, ifail); - - // Allocate memory - x = new double[n]; - u = new double[nnzu]; - uc = new double[nnzuc]; - - // Set this to .True. to cause e04ptf to produce intermediate progress output - verbose_output = false; - - E04ZM e04zm = new E04ZM(); - if (verbose_output) { - // Require printing of primal and dual solutions at the end of the solve - ifail = 0; - e04zm.eval(handle, "Print Solution = YES", ifail); - } else { - // Turn off printing of intermediate progress output - ifail = 0; - e04zm.eval(handle, "Print Level = 1", ifail); - } - - // Call SOCP interior point solver - cpuser = 0; - ifail = -1; - E04PT e04pt = new E04PT(); - MONIT monit = new MONIT(); - e04pt.eval(handle, n, x, nnzu, u, nnzuc, uc, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - ifail = e04pt.getIFAIL(); - - // Print solution if optimal or suboptimal solution found - if ((ifail == 0) || (ifail == 50)) { - System.out.println(" Optimal X:"); - System.out.println(" x_idx " + " Value "); - for (x_idx = 0; x_idx < n; x_idx++) { - System.out.printf(" %5d %12.5e\n", x_idx, x[x_idx]); - } - } - - // Free the handle memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04PT.Abstract_E04PT_MONIT { - - public void eval() { - E04PTU e04ptu = new E04PTU(); - e04ptu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER, this.INFORM); - this.INFORM = e04ptu.getINFORM(); - } - } -} diff --git a/simple_examples/E04TAJE.java b/simple_examples/E04TAJE.java deleted file mode 100644 index 97cebe2..0000000 --- a/simple_examples/E04TAJE.java +++ /dev/null @@ -1,188 +0,0 @@ -import com.nag.routines.E04.E04TA; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RE; -import com.nag.routines.E04.E04RH; -import com.nag.routines.E04.E04RJ; -import com.nag.routines.E04.E04ZM; -import com.nag.routines.E04.E04MT; -import com.nag.routines.E04.E04MTU; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04TE; -import com.nag.routines.E04.E04TJ; -import com.nag.routines.E04.E04RW; -import com.nag.routines.E04.E04RZ; - -import java.util.Arrays; - -/** - * E04TA - */ -public class E04TAJE { - - public static void main(String[] args) { - - final double infbnd = 1.0e20; - - long cpuser, handle; - int idlc, ifail, ioflag, liarr, nclin, nnza, nnzu, nvar; - - double[] a, bla, bua, cvec, ulag, x, xl, xu; - - double[] rinfo = new double[100]; - double[] ruser = new double[1]; - double[] stats = new double[100]; - double[] u = new double[1]; - - int[] icola, irowa; - - int[] iuser = new int[1]; - int[] pinfo = new int[100]; - - System.out.println(" E04TAJ Example Program Results\n"); - System.out.println(" Solve the first LP\n"); - - handle = 0; - cpuser = 0; - - // Initialize the handle - nvar = 2; - ifail = 0; - E04RA e04ra = new E04RA(); - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // Define the objective function - cvec = new double[nvar]; - cvec[0] = 2.0; - cvec[1] = 4.5; - ifail = 0; - E04RE e04re = new E04RE(); - e04re.eval(handle, nvar, cvec, ifail); - - // Box constraints - xl = new double[nvar]; - xu = new double[nvar]; - Arrays.fill(xl, 0.0); - xu[0] = infbnd; - xu[1] = 100.0; - ifail = 0; - E04RH e04rh = new E04RH(); - e04rh.eval(handle, nvar, xl, xu, ifail); - - // Set the linear constraints - idlc = 0; - nclin = 3; - nnza = 6; - bla = new double[nclin]; - bua = new double[nclin]; - irowa = new int[nnza]; - icola = new int[nnza]; - a = new double[nnza]; - Arrays.fill(bla, -infbnd); - bua = new double[] { - 1500.0, 6000.0, 16000.0 - }; - irowa = new int[] { - 1, 1, 2, 2, 3, 3 - }; - icola = new int[] { - 1, 2, 1, 2, 1, 2 - }; - a = new double[] { - 1.2, 3.0, 6.0, 10.0, 40.0, 80.0 - }; - ifail = 0; - E04RJ e04rj = new E04RJ(); - e04rj.eval(handle, nclin, bla, bua, nnza, irowa, icola, a , idlc, ifail); - - // Optional parameters - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Task = Max", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - - // Call the LP solver - x = new double[nvar + 1]; - nnzu = 0; - ifail = -1; - E04MT e04mt = new E04MT(); - MONIT monit = new MONIT(); - e04mt.eval(handle, nvar, x ,nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a variable - ifail = 0; - E04TA e04ta = new E04TA(); - e04ta.eval(handle, 1, nvar, ifail); - nvar = e04ta.getNVAR(); - - // Box constraint on the new variable - ifail = 0; - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", nvar, 0.0, 50.0, ifail); - - // Add the linear objective component - ifail = 0; - E04TE e04te = new E04TE(); - e04te.eval(handle, 3, 7.0, ifail); - - // Add linear constraints coefficients - E04TJ e04tj = new E04TJ(); - ifail = 0; - e04tj.eval(handle, 1, 3, 5.0, ifail); - ifail = 0; - e04tj.eval(handle, 2, 3, 12.0, ifail); - ifail = 0; - e04tj.eval(handle, 3, 3, 120.0, ifail); - - System.out.println("\n The new variable has been added, solve the handle again\n"); - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x, nnzu, u, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Add a linear constraint - nclin = 1; - bla[0] = -infbnd; - bua[0] = 100.0; - nnza = 2; - irowa[0] = 1; - irowa[1] = 1; - icola[0] = 2; - icola[1] = 3; - a[0] = 1.0; - a[1] = 1.0; - idlc = 0; - e04rj.eval(handle, nclin, bla, bua ,nnza, irowa, icola, a ,idlc, ifail); - - System.out.println("\n The new constraint has been added, solve the handle again\n"); - - // Query the problem sizes to request the Lagrangian multipliers for the - // last solve - ioflag = 1; - liarr = 100; - E04RW e04rw = new E04RW(); - e04rw.eval(handle, "pinfo", ioflag, liarr, pinfo, ifail); - nnzu = pinfo[10]; - ulag = new double[nnzu]; - - // Solve the problem again - ifail = -1; - e04mt.eval(handle, nvar, x ,nnzu, ulag, rinfo, stats, monit, iuser, ruser, cpuser, ifail); - - // Free the memory - ifail = 0; - E04RZ e04rz = new E04RZ(); - e04rz.eval(handle, ifail); - } - - public static class MONIT extends E04MT.Abstract_E04MT_MONIT { - - public void eval() { - E04MTU e04mtu = new E04MTU(); - e04mtu.eval(this.HANDLE, this.RINFO, this.STATS, this.IUSER, this.RUSER, - this.CPUSER, this.INFORM); - this.INFORM = e04mtu.getINFORM(); - } - } -} diff --git a/simple_examples/E04TCJE.java b/simple_examples/E04TCJE.java deleted file mode 100644 index d28d78b..0000000 --- a/simple_examples/E04TCJE.java +++ /dev/null @@ -1,263 +0,0 @@ -import com.nag.routines.E04.E04FFU; -import com.nag.routines.E04.E04GG; -import com.nag.routines.E04.E04GGU; -import com.nag.routines.E04.E04GGV; -import com.nag.routines.E04.E04RA; -import com.nag.routines.E04.E04RM; -import com.nag.routines.E04.E04TB; -import com.nag.routines.E04.E04TC; -import com.nag.routines.E04.E04TD; -import com.nag.routines.E04.E04ZM; -import java.io.BufferedReader; -import java.io.FileReader; -import java.text.NumberFormat; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Arrays; - -/** - * E04TC example program text. - * @author Mo - */ -public class E04TCJE { - - public static void main(String[] args) { - double[] rx, x, udt, udy; - double[] rinfo = new double[100], ruser = new double[0], - stats = new double[100]; - int ifail, isparse, nnzrd, nres, nvar, udnres; - int[] icolrd = new int[0], irowrd = new int[0], iuser = new int[0]; - int[] idx; - long cpuser, handle; // c_ptr - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - LSQHES lsqhes = new LSQHES(); - LSQHPRD lsqhprd = new LSQHPRD(); - MONIT monit = new MONIT(); - - /* Header */ - System.out.printf(" E04TCJ Example Program Results\n\n"); - try { - - handle = 0L; - cpuser = 0L; - - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); // read the header - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - String[] data = line.split("\\s+"); - - /* Read number of residuals */ - nres = Integer.parseInt(data[0]); - - udnres = nres; - - /* Allocate memory */ - udt = new double[nres]; - udy = new double[nres]; - - /* Read observations */ - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udt[ii+jj] = Double.parseDouble(data[jj]); - } - } - - for (int ii = 0; ii < nres; ii += 3) { - line = br.readLine().trim(); - line.replaceAll("\\s+", " "); - data = line.split("\\s+"); - for (int jj = 0; jj < 3; ++jj) { - udy[ii+jj] = Double.parseDouble(data[jj]); - } - } - - /* try to fit the model */ - /* f(t) = at^2 + bt + c + d sin(omega t) */ - /* To the data {(t_i, y_i)} */ - nvar = 5; - - /* Initialize the NAG optimization handle */ - E04RA e04ra = new E04RA(); - ifail = 0; // hard fail - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - /* Define a dense nonlinear least-squares objective function */ - /* (isparse = 0 => the sparsity pattern of the Jacobian */ - /* doesn't need to be defined) */ - E04RM e04rm = new E04RM(); - isparse = 0; - nnzrd = 1; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - /* Set some optional parameters to control the output of the solver */ - E04ZM e04zm = new E04ZM(); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = X", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - - System.out.println("First solve the problem with the outliers"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Call the solver */ - E04GG e04gg = new E04GG(); - x = new double[nvar]; - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - rx = new double[nres]; - iuser = new int[] {udnres}; - ruser = new double[2 * udnres];; - for (int ii = 0; ii < udnres; ii++) { - ruser[ii] = udt[ii]; - ruser[udnres + ii] = udy[ii]; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Now remove the outlier residuals from the problem handle"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Disable the two outlier residuals */ - E04TC e04tc = new E04TC(); - idx = new int[] {10, 20}; - e04tc.eval(handle, "NLS", 2, idx, ifail); - - /* Solve the problem again */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - System.out.println("--------------------------------------------------------"); - System.out.println(); - System.out.println("Assuming the outliers points are measured again"); - System.out.println("we can enable the residuals and adjust the values"); - System.out.println(); - System.out.println("--------------------------------------------------------"); - - /* Fix the first variable to its known value of 0.3 */ - /* enable the residuals and adjust the values in the data */ - E04TD e04td = new E04TD(); - e04td.eval(handle, "variable", 1, 0.3, 0.3, ifail); - E04TB e04tb = new E04TB(); - e04tb.eval(handle, "NLS", 2, idx, ifail); - udy[9] = -0.515629; - udy[19] = 0.54920; - - /* Solve the problem */ - for (int ii = 0; ii < nvar; ++ii) { - x[ii] = 1.0; - } - ifail = -1; - e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, - rx, rinfo, stats, iuser, ruser, cpuser, ifail); - - } - catch (Exception ex) { - Logger.getLogger(E04TCJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = 0.0; - } - - for (int i = 0; i < this.NRES; i++) { - this.RX[i] = (this.X[0] * Math.pow(udt[i],2) + this.X[1] * udt[i] + - this.X[2] + this.X[3] * Math.sin(this.X[4] * udt[i])) - - udy[i]; - } - - this.INFORM = 0; - - } - - } - - public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { - - public void eval() { - int udnres; - double[] udt, udy; - - /* Unpack the user data from cpuser */ - udnres = this.IUSER[0]; - udt = Arrays.copyOfRange(this.RUSER, 0, udnres); - udy = Arrays.copyOfRange(this.RUSER, udnres, udnres + udnres); - - for (int i = 1; i <= this.NRES; i++) { - this.RDX[((i-1)*this.NVAR + 1) - 1] = Math.pow(udt[i-1],2); - this.RDX[((i-1)*this.NVAR + 2) - 1] = udt[i-1]; - this.RDX[((i-1)*this.NVAR + 3) - 1] = 1.0; - this.RDX[((i-1)*this.NVAR + 4) - 1] = Math.sin(this.X[4] * udt[i-1]); - this.RDX[((i-1)*this.NVAR + 5) - 1] = this.X[3] * udt[i-1] * - Math.cos(this.X[4] * udt[i-1]); - - } - - this.INFORM = 0; - - } - - } - - public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { - - public void eval() { - E04GGU e04ggu = new E04GGU(); - e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, - this.INFORM, this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggu.getINFORM(); - } - - } - - public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { - - public void eval() { - E04GGV e04ggv = new E04GGV(); - e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ggv.getINFORM(); - } - - } - - public static class MONIT extends E04GG.Abstract_E04GG_MONIT { - - public void eval() { - E04FFU e04ffu = new E04FFU(); - e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, - this.IUSER, this.RUSER, this.CPUSER); - this.INFORM = e04ffu.getINFORM(); - } - - } - -} diff --git a/simple_examples/E04UCJE.java b/simple_examples/E04UCJE.java deleted file mode 100644 index e43d457..0000000 --- a/simple_examples/E04UCJE.java +++ /dev/null @@ -1,211 +0,0 @@ -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.E04.E04UE; -import com.nag.routines.F06.DGEMV; -import java.util.Arrays; - -/** - * E04UC example program text. - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final int INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) { - - /* Local Scalars */ - double objf; - int i, ifail, inform, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[LRWSAV]; - int[] istate, iwork; - int[] iuser = new int[1], iwsav = new int[LIWSAV]; - boolean[] lwsav = new boolean[LLWSAV]; - String[] cwsav = new String[LCWSAV]; - Arrays.fill(cwsav, - " "); - - System.out.println(" E04UCJ Example Program Results"); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new int[n + nclin + ncnln]; - iwork = new int[liwork]; - c = new double[Math.max(1, ncnln)]; - cjac = new double[ldcj * sdcjac]; - clamda = new double[n + nclin + ncnln]; - objgrd = new double[n]; - r = new double[ldr * n]; - work = new double[lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - E04UE e04ue = new E04UE(); - inform = 0; - e04ue.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[i], x[i], clamda[i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[i], work[j], clamda[i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[i], c[j], clamda[i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives. */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives. */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[LDCJ] = X[1] + X[1]; - CJAC[2*LDCJ] = X[2] + X[2]; - CJAC[3*LDCJ] = X[3] + X[3]; - } - - } - - if (NEEDC[1] > 0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[1+LDCJ] = X[0]*X[2]*X[3]; - CJAC[1+2*LDCJ] = X[0]*X[1]*X[3]; - CJAC[1+3*LDCJ] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/E04YAJE.java b/simple_examples/E04YAJE.java deleted file mode 100644 index 72d80da..0000000 --- a/simple_examples/E04YAJE.java +++ /dev/null @@ -1,112 +0,0 @@ -import com.nag.routines.E04.E04YA; - - -/** - * E04YA example program text. - * @author joed - */ -public class E04YAJE { - - public static LSQFUN lsqfun = new LSQFUN(); - public static final int LIW = 1, MDEC = 15, NDEC = 3; - public static final int LDFJAC = MDEC; - public static final int LW = 3*NDEC + MDEC + MDEC*NDEC; - public static double[] t = new double[MDEC*NDEC], y = new double[MDEC]; - - /** Routine to evaluate the residuals and their 1st derivatives. */ - public static class LSQFUN extends E04YA.Abstract_E04YA_LSQFUN { - - public void eval() { - double denom, dummy; - int i; - - for (i = 0; i < M; i++) { - denom = (XC[1] * t[MDEC + i]) + (XC[2] * t[2*MDEC + i]); - - if (IFLAG != 1) { - FVEC[i] = XC[0] + (t[i]/denom) - y[i]; - } - - if (IFLAG != 0) { - FJAC[i] = 1.0; - dummy = -1.0/(denom*denom); - FJAC[MDEC + i] = t[i] * t[MDEC + i] * dummy; - FJAC[2*MDEC + i] = t[i] * t[2*MDEC + i] * dummy; - } - - } - } - - } - - public static void main(String[] args) { - int i, ifail, m, n; - double[] fjac = new double[LDFJAC*NDEC], fvec = new double[MDEC], - w = new double[LW], x = new double[NDEC]; - int[] iw = new int[LIW]; - - System.out.println(" E04YAJ Example Program Results"); - - n = NDEC; - m = MDEC; - - /* Observations of TJ (J = 1, 2, ..., n) are held in T(I, J) - * (I = 1, 2, ..., m) */ - - y = new double[]{0.14, 0.18, 0.22, 0.25, 0.29, 0.32, 0.35, 0.39, 0.37, - 0.58, 0.73, 0.96, 1.34, 2.10, 4.39}; - for (i = 0; i < m; i++) { - t[i] = i + 1.0; - t[m + i] = 15.0 - i; - t[2*m + i] = -Math.abs(i - 7.0) + 8.0; - } - - /* Set up an arbitrary point at which to check the 1st derivatives */ - - x[0] = 0.19; - x[1] = -1.34; - x[2] = 0.88; - - System.out.println(); - System.out.println("The test point is"); - System.out.printf(" "); - for (i = 0; i < n; i++) { - System.out.printf("%10.5f", x[i]); - } - System.out.printf("\n"); - - E04YA e04ya = new E04YA(); - ifail = -1; - e04ya.eval(m, n, lsqfun, x, fvec, fjac, LDFJAC, iw, LIW, w, LW, ifail); - ifail = e04ya.getIFAIL(); - - if (ifail >= 0 && ifail != 1) { - - switch (ifail) { - case 0: - System.out.println(); - System.out.println("1st derivatives are consistent with residual values"); - break; - case 2: - System.out.println(); - System.out.println("Probable error in calculation of 1st derivatives"); - break; - default: - } - - System.out.println(); - System.out.println("At the test point, LSQFUN gives"); - System.out.println(); - System.out.println(" Residuals 1st derivatives"); - for (i = 0; i < m; i++) { - System.out.printf(" %15.3E", fvec[i]); - System.out.printf("%15.3E", fjac[i]); - System.out.printf("%15.3E", fjac[LDFJAC + i]); - System.out.printf("%15.3E\n", fjac[2*LDFJAC + i]); - } - - } - - } - -} diff --git a/simple_examples/F01ADJE.java b/simple_examples/F01ADJE.java deleted file mode 100644 index 4167f71..0000000 --- a/simple_examples/F01ADJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.F01.F01AD; -import com.nag.routines.X04.X04CA; - - -/** - * F01AD example program text. - * @author joed - */ -public class F01ADJE { - - public static void main(String[] args) { - - int i, ifail, lda, n; - double[] a; - - System.out.println(" F01ADJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n + 1; - a = new double[] { - 5.0, 7.0, 6.0, 5.0, 0.0, - 7.0, 10.0, 8.0, 7.0, 0.0, - 6.0, 8.0, 10.0, 9.0, 0.0, - 5.0, 7.0, 9.0, 10.0, 0.0 - }; - - F01AD f01ad = new F01AD(); - ifail = -1; - f01ad.eval(n, a, lda, ifail); - ifail = f01ad.getIFAIL(); - - /* Print the result matrix A */ - X04CA x04ca = new X04CA(); - x04ca.eval("L", "B", lda, n, a, lda, "Lower triangle of inverse", ifail); - - } - -} diff --git a/simple_examples/F01CKJE.java b/simple_examples/F01CKJE.java deleted file mode 100644 index ed3ffa2..0000000 --- a/simple_examples/F01CKJE.java +++ /dev/null @@ -1,60 +0,0 @@ -import com.nag.routines.F01.F01CK; -import com.nag.routines.X04.X04CB; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CK example program text. - * @author ludovic - */ -public class F01CKJE { - - public static void main(String[] args) { - - double[] a, b, c, z; - int n, p, m, iz, opt; - int ifail; - - m = 3; - n = p = 2; - iz = 1; - opt = 1; - a = new double[n * p]; - b = new double[n * m]; - c = new double[m * p]; - z = new double[iz]; - ifail = 0; - - System.out.println(" F01CKJ Example Program Results"); - - // Initialising b and c - - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - b[j+i*n] = (double) (i+j); - } - for (int j = 0; j < p; ++j) { - c[i+j*m] = (double) (i+j); - } - } - - F01CK f01ck = new F01CK(a, b, c, n, p, m, z, iz, opt, ifail); - f01ck.eval(); - ifail = f01ck.getIFAIL(); - String title = "Matrix A"; - System.out.println(); - System.out.flush(); - ifail = 0; - - String matrix = "G", diag = "N", nolabel = "N", form = "F7.1"; - String[] dummy = {" "}; - int ncols = 80; - int indent = 0; - - (new X04CB()).eval(matrix,diag,n,p,a,n,form,title,nolabel,dummy,nolabel, - dummy,ncols,indent, ifail); - - } - -} diff --git a/simple_examples/F01CRJE.java b/simple_examples/F01CRJE.java deleted file mode 100644 index c10b284..0000000 --- a/simple_examples/F01CRJE.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.nag.routines.F01.F01CR; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F01CR example program text. - * @author ludovic - */ -public class F01CRJE { - - public static void main(String[] args) { - System.out.println(" F01CRJ Example Program Results"); - double[] a; - int m,n,mn,lmove; - int[] move; - int ifail; - n = 7; - m = 3; - mn = m*n; - lmove = (m + n)/2; - a = new double[mn]; - move = new int[lmove]; - ifail = 1; - - for (int i = 0; i < mn; i++) { - a[i] = i+1.0; - } - - F01CR f01cr = new F01CR(a, m, n, mn, move, lmove, ifail); - f01cr.eval(); - - System.out.println(); - int index = 0; - for (int i = 0; i < mn; ++i) { - System.out.printf(" %7.1f",a[i]); - ++index; - if (index == 7) { - System.out.println(); - index = 0; - } - } - System.out.println(); - - } - -} diff --git a/simple_examples/F01DGJE.java b/simple_examples/F01DGJE.java deleted file mode 100644 index 107137f..0000000 --- a/simple_examples/F01DGJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F01.F01DG; -import com.nag.routines.X04.X04CA; - -/** - * F01DG example program text. - * @author joed - * @since 27.0.0.0 - */ -public class F01DGJE { - - /** - * F01DG example main program. - */ - public static void main(String[] args) { - - F01DG f01dg = new F01DG(); - X04CA x04ca = new X04CA(); - double alpha; - int i, ifail, lda, ldb, n; - String side, transa, uplo; // Length 1 - double[] a, b; - - System.out.println("F01DGJ Example Program Results\n"); - - // Values for side, uplo and transa - side = "L"; - uplo = "U"; - transa = "T"; - - // Order of square matrices - n = 4; - lda = n; - ldb = n; - - // Scaling constant alpha - alpha = 0.4; - - // Set input matrices (column-major order) - a = new double[]{ - 1.5, 0.0, 0.0, 0.0, - 2.3, 3.4, 0.0, 0.0, - 6.7, 5.4, 8.1, 0.0, - 1.9, 8.6, 2.0, 5.9 - }; - b = new double[]{ - 3.5, 0.0, 0.0, 0.0, - 2.1, 5.6, 0.0, 0.0, - 4.0, 2.1, 1.7, 0.0, - 2.1, 2.5, 1.1, 7.4 - }; - - /* ifail: behaviour on error exit - * = 0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft */ - ifail = 0; - - // Find B=alpha*A*B - f01dg.eval(side, uplo, transa, n, alpha, a, lda, b, ldb, ifail); - ifail = f01dg.getIFAIL(); - - // Print the solution - if (ifail == 0) { - if (transa.equals("N")) { - x04ca.eval(uplo, "N", n, n, b, n, "Solution matrix B", ifail); - } - else { - x04ca.eval("G", "N", n, n, b, n, "Solution matrix B", ifail); - } - } - - } - -} diff --git a/simple_examples/F01ELJE.java b/simple_examples/F01ELJE.java deleted file mode 100644 index 93ffe77..0000000 --- a/simple_examples/F01ELJE.java +++ /dev/null @@ -1,89 +0,0 @@ -import com.nag.routines.F01.F01EL; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04CA; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F01EL example program text. - * @author joed - */ -public class F01ELJE { - - public static void main(String[] args) { - - F01EL f01el = new F01EL(); - X04CA x04ca = new X04CA(); - - FCos2 fcos2 = new FCos2(); - double imnorm; - int i, ifail, iflag, lda, n; - double[] a, ruser = new double[1]; - int[] iuser = new int[1]; - - Routine.setComplex(new NAGComplex()); - - System.out.println(" F01ELJ Example Program Results"); - System.out.println(); - - // Problem data - n = 4; - a = new double[] { - 3.0, -1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 3.0, 2.0, -1.0, 2.0, 1.0, 1.0, 1.0 - }; - - // Find f(A) - lda = n; - iflag = 0; - imnorm = 0; - ifail = 0; - f01el.eval(n, a, lda, fcos2, iuser, ruser, iflag, imnorm, ifail); - - // Print solution - ifail = 0; - x04ca.eval("G", "N", n, n, a, lda, "F(A) = COS(2A)", ifail); - - // Print the norm of the imaginary part to check it is small - System.out.println(); - System.out.println(" Imnorm = " + imnorm); - - } - - public static class FCos2 extends F01EL.Abstract_F01EL_F { - - /* These methods should really be part of an extension of NAGComplex. */ - - private NAGComplex complexCos(NAGComplexInterface z) { - NAGComplex cosz = new NAGComplex(); - cosz.setRe(Math.cos(z.getRe()) * Math.cosh(z.getIm())); - cosz.setIm(-Math.sin(z.getRe()) * Math.sinh(z.getIm())); - return cosz; - } - - private NAGComplex complexMult(NAGComplexInterface a, NAGComplexInterface b) { - NAGComplex ab = new NAGComplex(); - ab.setRe((a.getRe()*b.getRe()) - (a.getIm()*b.getIm())); - ab.setIm((a.getRe()*b.getIm()) + (a.getIm()*b.getRe())); - return ab; - } - - /* Calculate F(A) = COS(2A) */ - - public void eval() { - - NAGComplex two = new NAGComplex(); - two.setRe(2.0); - two.setIm(0.0); - - for (int i = 0; i < this.NZ; i++) { - this.FZ[i] = (NAGComplex) complexCos(complexMult(two, this.Z[i])); - } - - this.IFLAG = 0; - - } - - } - -} diff --git a/simple_examples/F01EMJE.java b/simple_examples/F01EMJE.java deleted file mode 100644 index 716a7b5..0000000 --- a/simple_examples/F01EMJE.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.nag.routines.F01.F01EM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F01EMJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F01EMJE{ - - /** - * F01EMJ Example main program - */ - public static void main(String[] args){ - double imnorm = 0; - int ifail, iflag = 0, lda, n; //placeholders - double[] a, ruser; - int[] iuser; - - ruser = new double[1]; - iuser = new int[1]; - - System.out.println("F01EMJ Example Program Results"); - System.out.println(); - - //Tell wrapper what type of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //Problem size - n = 4; - lda = n; - - //Allocate - a = new double[lda * n]; - - //Data - //A = ( 1, 0,-2, 1) - // (-1, 2, 0, 1) - // ( 2, 0, 1, 0) - // ( 1, 0,-2, 2) - a[0] = 1; - a[1] = -1; - a[2] = 2; - a[3] = 1; - a[4] = 0; - a[5] = 2; - a[6] = 0; - a[7] = 0; - a[8] = -2; - a[9] = 0; - a[10] = 1; - a[11] = -1; - a[12] = 1; - a[13] = 1; - a[14] = 0; - a[15] = 2; - - //Find f(A) - ifail = 0; - //Create fexp2 object to pass to wrapper - fexp2 f = new fexp2(); - F01EM f01em = new F01EM(n, a, lda, f, iuser, ruser, iflag, imnorm, ifail); - f01em.eval(); - - //Print solution - ifail = 0; - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "F(A) = EXP(2A)", ifail); - x04ca.eval(); - - //Print the norm oof the imaginary part to check if it small - System.out.println(); - System.out.printf("Imnorm = %.2f\n", imnorm); - } - - /** - * fexp2 class representing f routine argument - */ - public static class fexp2 extends F01EM.Abstract_F01EM_F{ - public void eval(){ - NAGComplex two = new NAGComplex(2, 0); - NAGComplex twoPowM = new NAGComplex(2, 0); - - twoPowM.setRe(Math.pow(2, this.M)); - - for(int i = 0; i < this.NZ; i++){ - this.FZ[i] = NAGComplex.multiply(twoPowM, this.complexExp(NAGComplex.multiply(two, (NAGComplex) this.Z[i]))); - } - - //Set iflag nonzero to terminate exectuion for any reason - this.IFLAG = 0; - } - - //Raises e ^ z where z is a complex number - //Uses eulers formula; - //c ^ (a + bi) = c^a * ((cos(bln(c))) + isin(bln(c))) - public NAGComplex complexExp(NAGComplex x){ - NAGComplex tmp = new NAGComplex(); - tmp.setRe(Math.cos(x.getIm())); - tmp.setIm(Math.sin(x.getIm())); - NAGComplex ans = NAGComplex.multiply(new NAGComplex(Math.exp(x.getRe()), 0), tmp); - return ans; - } - } -} diff --git a/simple_examples/F02EKJE.java b/simple_examples/F02EKJE.java deleted file mode 100644 index ffdced6..0000000 --- a/simple_examples/F02EKJE.java +++ /dev/null @@ -1,227 +0,0 @@ -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexInterface; -import java.util.Arrays; - -/** - * F02EK example program text. - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW() { - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} diff --git a/simple_examples/F02FKJE.java b/simple_examples/F02FKJE.java deleted file mode 100644 index ecdac2e..0000000 --- a/simple_examples/F02FKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -import com.nag.routines.F02.F02FK; -import com.nag.routines.F12.F12FD; -import com.nag.routines.X04.X04AB; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F02FK example program text. - * @author joed - */ -public class F02FKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) { - F02FK f02fk = new F02FK(); - X04AB x04ab = new X04AB(); - X04CA x04ca = new X04CA(); - double h2, sigma; - int iset = 1, ifail, imon, k, ldv, lo, maxit, mode, n, nconv, ncv, nev, - nnz, nx, outchn, prtlvl; - double[] a, dPrint, resid, v, w, ruser = new double[1]; - int[] icol, irow, iuser = new int[4]; - - - System.out.println(" F02FKJ Example Program Results"); - System.out.println(); - - nx = 20; - nev = 8; - ncv = 20; - sigma = 1.0; - - // Construct the matrix A in sparse form and store in A. - // The main diagonal of A is full and there are two subdiagonals of A: - // the first and the nx-th. - - n = nx * nx; - nnz = (3 * n) - (2 * nx); - a = new double[nnz]; - irow = new int[nnz]; - icol = new int[nnz]; - - // Zero out A. - Arrays.fill(a, 0.0); - - // Main diagonal of A. - h2 = 1.0 / (double)((nx + 1) * (nx + 1)); - for (int i = 1; i <= n; i++) { - irow[i - 1] = i; - icol[i - 1] = i; - a[i - 1] = 4.0 / h2; - } - - // First subdiagonal of A. - k = n; - for (int i = 1; i <= nx; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx - 1; j++) { - k += 1; - irow[k - 1] = j + 1; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // nx-th subdiagonal. - for (int i = 1; i <= nx - 1; i++) { - lo = (i - 1) * nx; - for (int j = lo + 1; j <= lo + nx; j++) { - k += 1; - irow[k - 1] = j + nx; - icol[k - 1] = j; - a[k - 1] = -1.0 / h2; - } - } - - // Set some options via iuser array and routine argument OPTION. - // iuser[0] = print level, - // iuser[1] = iteration limit, - // iuser[2]>0 means shifted-invert mode - // iuser[3]>0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 0; - - ruser[0] = 1.0; - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - // Find eigenvalues of largest magnitude and the corresponding - // eigenvectors. - - ldv = n; - w = new double[ncv]; - v = new double[ldv * ncv]; - resid = new double[n]; - - nconv = 0; // placeholder - - ifail = -1; - f02fk.eval( - n, nnz, a, irow, icol, nev, ncv, sigma, mymonit, myoption, nconv, - w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02fk.getIFAIL(); - nconv = f02fk.getNCONV(); - if (ifail != 0) { - System.err.println(" ** F02FK returned with IFAIL = " + ifail); - } - - - - // Print Eigenvalues and the residual norm ||A*x - lambda*x||. - dPrint = new double[nconv * 2]; - for (int i = 1; i <= nconv; i++) { - dPrint[getIdx(i, 1, nconv)] = w[i - 1]; - dPrint[getIdx(i, 2, nconv)] = resid[i - 1]; - } - - System.out.println(); - - ifail = 0; - x04ca.eval( - "G", "N", nconv, 2, dPrint, nconv, " Ritz values and residuals", - ifail - ); - - } - - public static class MYOPTION extends F02FK.Abstract_F02FK_OPTION { - - public void eval() { - F12FD f12fd = new F12FD(); - int ifail1; - String rec = " "; // Required len = 25 - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf(" Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf(" Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12fd.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12fd.eval( - "Shifted Inverse ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12fd.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02FK.Abstract_F02FK_MONIT { - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far(%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d %13.5E %13.5E\n", i+1, this.W[i], this.RZEST[i] - ); - } - - System.out.printf(" Next (uncoverged) Ritz value:\n"); - System.out.printf( - " %4d %13.5E\n", this.NCONV + 1, this.W[this.NCONV + 1] - ); - - } - - this.ISTAT = 0; - - } - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - *

    Fortran array definition: - * a(dimX, *) - * - *

    Conversion: - * a(x, y) --> A[result] - */ - private static int getIdx(int x, int y, int dimX) { - return ((y-1) * dimX) + (x-1); - } - -} diff --git a/simple_examples/F02WGJE.java b/simple_examples/F02WGJE.java deleted file mode 100644 index 5e077cb..0000000 --- a/simple_examples/F02WGJE.java +++ /dev/null @@ -1,132 +0,0 @@ -import com.nag.routines.F02.F02WG; -import java.util.Arrays; - -/** - * F02WG example program text. - * @author joed - */ -public class F02WGJE { - - public static AV av = new AV(); - - public static void main(String[] args) { - int ifail, k, ldu, ldv, m, n, nconv, ncv; - double[] resid, sigma, u, v; - double[] ruser = new double[1]; - int[] iuser = new int[1]; - - /* Set up wrappers */ - F02WG f02wg = new F02WG(); - - System.out.println(" F02WGJ Example Program Results\n"); - - /* Set F02WG args */ - m = 100; - n = 500; - k = 4; - ncv = 10; - nconv = 0; - ldu = m; - ldv = n; - resid = new double[ncv]; - sigma = new double[ncv]; - u = new double[ldu * ncv]; - v = new double[ldv * ncv]; - ifail = 0; - - /* Call routine */ - f02wg.eval( - m, // Rows in A - n, // Cols in A - k, // Num. of singular values to be computed - ncv, // Dimension of sigma and resid - av, // Subroutine that returns Ax or (A^T)x - nconv, // [Output] - sigma, // [Output] - u, // [Output] - ldu, // 1st dimension of u - v, // [Output] - ldv, // 1st dimension of v - resid, // [Output] - iuser, - ruser, - ifail - ); - - /* Get non-array output args */ - ifail = f02wg.getIFAIL(); - nconv = f02wg.getNCONV(); - - /* Print results */ - System.out.println(" Singular Value Residual"); - for (int i = 0; i < nconv; i++) { - System.out.printf( - " %10.5f %10.2G\n", sigma[i], resid[i] - ); - } - - } - - public static class AV extends F02WG.Abstract_F02WG_AV { - - public void eval() { - - double H = 1.0 / ((double)(this.M + 1)); - double K = 1.0 / ((double)(this.N + 1)); - - if (this.IFLAG == 1) { - - for (int i = 0; i < this.M; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[i] += K * S * (T - 1.0) * this.X[j]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[i] += K * T * (S - 1.0) * this.X[j]; - } - - } - - } - else { - - for (int i = 0; i < this.N; i++) { - this.AX[i] = 0.0; - } - - double S = 0.0; - double T = 0.0; - - for (int j = 0; j < this.N; j++) { - T += K; - S = 0.0; - - for (int i = 0; i < Math.min(j+1, this.M); i++) { - S += H; - this.AX[j] += K * S * (T - 1.0) * this.X[i]; - } - for (int i = j + 1; i < this.M; i++) { - S += H; - this.AX[j] += K * T * (S - 1.0) * this.X[i]; - } - - } - - } - - } - - } - -} diff --git a/simple_examples/F03BAJE.java b/simple_examples/F03BAJE.java deleted file mode 100644 index 673ddec..0000000 --- a/simple_examples/F03BAJE.java +++ /dev/null @@ -1,108 +0,0 @@ -import com.nag.routines.F03.F03BA; -import com.nag.routines.F07.F07AD; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F03BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F03BAJE{ - - /** - * F03BAJ example main program. - */ - public static void main(String[] args){ - double d = 0; - int id = 0, ifail, info = 0, lda = 0, n = 0; - double[] a; - int[] ipiv; - - //Should initialise values so java doesn't give any errors because of try/catch - a = new double[n]; - ipiv = new int[n]; - - System.out.println("F03BAJ Example Program Results"); - - //If file name not given print usage info - if(args.length != 1){ - F03BAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - - lda = n; - - //reallocate with values from data file - a = new double[n * lda]; - ipiv = new int[n]; - - //read in matrix - for(int i = 0; i < n; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - F07AD f07ad = new F07AD(n, n, a, lda, ipiv, info); - f07ad.eval(); - - ifail = 0; - - //Print out matrix - System.out.println(); - X04CA x04ca = new X04CA("G", "N", n, n, a, lda, "Array A after factorization", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivots"); - for(int i = 0; i < n; i++){ - System.out.printf("\t%d ", ipiv[i]); - } - System.out.printf("\n"); - System.out.println(); - - ifail = 0; - - F03BA f03ba = new F03BA(n, a, lda, ipiv, d, id, ifail); - f03ba.eval(); - d = f03ba.getD(); - id = f03ba.getID(); - - System.out.printf("D = \t%.5f ID = \t%d\n", d, id); - System.out.println(); - System.out.printf("Value of determinant = %.5e\n", d * Math.pow(2.0, id)); - - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - -} - diff --git a/simple_examples/F04AMJE.java b/simple_examples/F04AMJE.java deleted file mode 100644 index a498b2b..0000000 --- a/simple_examples/F04AMJE.java +++ /dev/null @@ -1,114 +0,0 @@ -import com.nag.routines.F04.F04AM; -import com.nag.routines.X02.X02AJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04AMJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04AMJE{ - - /** - * F04AMJ example main program. - */ - public static void main(String[] args){ - int m = 0, n = 0; - int ifail, ir, lda, ldb, ldqr, ldx; - double eps; - double[] a, b, alpha, e, qr, r, x, y, z; - int[] ipiv; - - System.out.println("F04AMJ Example Program Results"); - - if(args.length != 1){ - F04AMJE.usage(); - } - - //declare so try/catch works - a = new double[0]; - b = new double[0]; - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[1]); - n = Integer.parseInt(sVal[2]); - - a = new double[m * n]; - b = new double[m * 1]; - - for(int i = 0; i < m; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * m) ] = Double.parseDouble(sVal[j]); - } - for(int j = n; j < m; j++){ - b[i + (j * (m - (n + 1)))] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - //Setting these in try block is more robust but less neat - //May be needed for array sizes~ - ir = 1; - lda = m; - ldb = m; - ldqr = m; - ldx = n; - - alpha = new double[n]; - e = new double[n]; - qr = new double[ldqr * n]; - r = new double[m]; - x = new double[ldx * ir]; - y = new double[n]; - z = new double[n]; - ipiv = new int[n]; - - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - - ifail = 0; - - F04AM f04am = new F04AM(a, lda, x, ldx, b, ldb, m, n, ir, eps, qr, ldqr, alpha, e, y, z, r, ipiv, ifail); - f04am.eval(); - //update any values you want here - x = f04am.getX(); - - System.out.println("Solution"); - for(int i = 0; i < n; i++){ - for(int j = 0; j < ir; j++){ - System.out.printf("%.4f ", x[j + (i * ir)]); - } - System.out.printf("\n"); - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - - - - - - diff --git a/simple_examples/F04BAJE.java b/simple_examples/F04BAJE.java deleted file mode 100644 index 79c2b01..0000000 --- a/simple_examples/F04BAJE.java +++ /dev/null @@ -1,144 +0,0 @@ -import com.nag.routines.F04.F04BA; -import com.nag.routines.X04.X04CA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F04BAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F04BAJE{ - - /** - * F04BAJ example main program. - */ - public static void main(String[] args){ - int n = 0, nrhs = 0, lda = 0, ldb = 0; //placeholder - int ierr, ifail; - double errbnd, rcond; - double a[], b[]; - int ipiv[]; - - a = new double[0]; b = new double[0]; //placeholder - - if(args.length != 1){ - F04BAJE.usage(); - } - - System.out.println("F04BAJ Example Program Results"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[1]); - nrhs = Integer.parseInt(sVal[2]); - - lda = n; - ldb = n; - - a = new double[lda * n]; - b = new double[ldb * nrhs]; - - line = reader.readLine(); - for(int i = 0; i < lda; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < ldb; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < nrhs; j++){ - b[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ifail = 1; - ipiv = new int[n]; - rcond = 0; - errbnd = 0; - F04BA f04ba = new F04BA(n, nrhs, a, lda, ipiv, b, ldb, rcond, errbnd, ifail); - f04ba.eval(); - - ifail = f04ba.getIFAIL(); - rcond = f04ba.getRCOND(); - errbnd = f04ba.getERRBND(); - ipiv = f04ba.getIPIV(); - a = f04ba.getA(); - b = f04ba.getB(); - - if(ifail == 0){ - //Print solution, estimate of condition number and approximate error bound. - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Estimate of condition number"); - System.out.printf("%.1e\n", 1/rcond); - System.out.println(); - System.out.println("Esttimate of error bound for computed solutions"); - System.out.printf("%.1e\n", errbnd); - } - else if(ifail == (n + 1)){ - //Matrix A is numerically singular. Print estimate of reciprocal of condition number and solution. - System.out.println(); - System.out.println("Estimate of reciprocal of condition number"); - System.out.printf("%.1e\n", rcond); - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, b, ldb, "Solution", ierr); - x04ca.eval(); - } - else if(ifail > 0 && ifail <= n){ - //The upper triangular matrix U is exactly singular. Print details of factorization. - System.out.println(); - - ierr = 0; - X04CA x04ca = new X04CA("General", " ", n, n, a, lda, "Details of factorization", ierr); - x04ca.eval(); - - System.out.println(); - System.out.println("Pivot indices"); - for(int i = 0; i < n; i++){ - System.out.printf("%d ", ipiv[i]); - } - System.out.printf("\n"); - } - else{ - System.out.printf(" ** F04BAF returned with IFAIL = %d\n", ifail); - } - - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/F05AAJE.java b/simple_examples/F05AAJE.java deleted file mode 100644 index 317c269..0000000 --- a/simple_examples/F05AAJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F05.F05AA; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * F05AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class F05AAJE{ - - /** - * F05AAJ example main program. - */ - public static void main(String[] args) { - //Should initialise values to avoid issues with try/catch - int icol = 0, ifail = 0, lda = 0, m = 0, n1 = 0, n2 = 0; - double cc = 0; - double[] a, s; - - //same as ints - a = new double[1]; - s = new double[1]; - System.out.println("F05AAJ Example Program Results"); - System.out.println(); - - //supply data - if(args.length != 1){ - F05AAJE.usage(); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+");; - m = Integer.parseInt(sVal[1]); - n1 = Integer.parseInt(sVal[2]); - n2 = Integer.parseInt(sVal[3]); - lda = m; - - a = new double[lda*n2]; - s = new double[n2]; - - //read in a from data - for(int i = 0; i < n2; i++){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - a[i + (j * n2)] = Double.parseDouble(sVal[j]); - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - //create object then eval - F05AA f05aa = new F05AA(a, lda, m, n1, n2, s, cc, icol, ifail); - f05aa.eval(); - - //update values - n1 = f05aa.getN1(); - n2 = f05aa.getN2(); - cc = f05aa.getCC(); - icol = f05aa.getICOL(); - a = f05aa.getA(); - - System.out.printf("N1 = %d N2 = %d\n", n1, n2); - System.out.println(); - System.out.printf("CC = %.4f ICOL = %d\n", cc, icol); - System.out.println(); - System.out.println("Final Vectors"); - - for(int i = 0; i < n2; i++){ - for(int j = 1; j < m; j++){ - System.out.printf("%.4f ", a[i +(j * n2)]); - } - System.out.printf("\n"); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/F06CLJE.java b/simple_examples/F06CLJE.java deleted file mode 100644 index ca2ac5e..0000000 --- a/simple_examples/F06CLJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.F06.F06CL; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; - -/** - * F06CL example program text. - * @author ludovic - */ -public class F06CLJE { - - public static void main(String[] args) { - boolean fail = false; - NAGComplex z1 = new NAGComplex(); - NAGComplex z2 = new NAGComplex(); - NAGComplex z3 = new NAGComplex(); - - System.out.println(" F06CLJ Example Program Results"); - System.out.println(); - - Routine.complex = z1; - - z1.setRe(1.0); - z1.setIm(1.0); - z2.setRe(2.0); - z2.setIm(2.0); - - F06CL f06cl = new F06CL(z1,z2,fail); - z3 = (NAGComplex)f06cl.eval(); - fail = f06cl.getFAIL(); - - if (fail) { - System.err.println(" Something went wrong..."); - } - else { - System.out.println(" " + z1.toString() + "/"+ z2.toString() + " = " + z3.toString()); - } - - } - -} diff --git a/simple_examples/F07AAJE.java b/simple_examples/F07AAJE.java deleted file mode 100644 index 26eb5dc..0000000 --- a/simple_examples/F07AAJE.java +++ /dev/null @@ -1,90 +0,0 @@ -import com.nag.routines.F07.F07AA; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * F07AA example program text. - * @author joed - */ -public class F07AAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, ldb, n; - double[] a, b; - int[] ipiv; - - System.out.println(" F07AAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - ldb = n; - - a = new double[n*n]; - b = new double[n]; - ipiv = new int[n]; - - a[0+0*n] = 1.80; - a[0+1*n] = 2.88; - a[0+2*n] = 2.05; - a[0+3*n] = -0.89; - a[1+0*n] = 5.25; - a[1+1*n] = -2.95; - a[1+2*n] = -0.95; - a[1+3*n] = -3.80; - a[2+0*n] = 1.58; - a[2+1*n] = -2.69; - a[2+2*n] = -2.90; - a[2+3*n] = -1.04; - a[3+0*n] = -1.11; - a[3+1*n] = -0.66; - a[3+2*n] = -0.59; - a[3+3*n] = 0.80; - - b[0] = 9.52; - b[1] = 24.35; - b[2] = 0.77; - b[3] = -6.22; - - /* Solve the equations Ax = b for x */ - - F07AA f07aa = new F07AA(); - info = 0; - f07aa.eval(n, 1, a, lda, ipiv, b, ldb, info); - info = f07aa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("General", " ", n, n, a, lda, "Details of factorization", ifail); - - /* Print pivot indices */ - - System.out.println(); - System.out.println(" Pivot indices"); - for (i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.printf("\n"); - - } - else { - System.err.printf(" The (%3d,%3d) element of the factor U is zero\n", info, info); - } - - } - -} diff --git a/simple_examples/F07ABJE.java b/simple_examples/F07ABJE.java deleted file mode 100644 index 6362739..0000000 --- a/simple_examples/F07ABJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.F07.DGESVX; -import com.nag.routines.X04.X04CA; - -/** - * F07ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ABJE{ - - /** - * F07ABJ example main program - */ - public static void main(String[] args){ - double rcond = 0; - int ifail, info = 0, lda, ldaf, ldb, ldx, n, nrhs; //placeholders - String equed; - double[] a, af, b, berr, c, ferr, r, work, x; - int[] ipiv, iwork; - - System.out.println("F07ABJ Example Program Results"); - System.out.println(); - - //Problem size - n = 4; - nrhs = 2; - lda = n; - ldaf = n; - ldb = n; - ldx = n; - - //Allocate - a = new double[lda * n]; - af = new double[ldaf * n]; - b = new double[ldb * nrhs]; - berr = new double[nrhs]; - c = new double[n]; - ferr = new double[nrhs]; - r = new double[n]; - work = new double[4 * n]; - x = new double[ldx * nrhs]; - ipiv = new int[n]; - iwork = new int[n]; - equed = " "; - - //Matrices A and B - a[0] = 1.8; - a[1] = 525; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -295; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -380; - a[14] = -1.04; - a[15] = 0.8; - b[0] = 9.52; - b[1] = 2435; - b[2] = 0.77; - b[3] = -6.22; - b[4] = 18.47; - b[5] = 225; - b[6] = -13.28; - b[7] = -6.21; - - //Solve the equations AX = B for X - //The NAG name equivalent of dgesvx is f07abf - DGESVX dgesvx = new DGESVX("Equilibration", "No Transpose", n, nrhs, a, lda, af, ldaf, ipiv, equed, r, - c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - dgesvx.eval(); - - //Update - info = dgesvx.getINFO(); - equed = dgesvx.getEQUED(); - rcond = dgesvx.getRCOND(); - - if(info == 0 || info == n + 1){ - //Print solution, error bounds, condition number, the form of equilibration and the pivot growth factor - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", n, nrhs, x, ldx, "Solution(s)", ifail); - x04ca.eval(); - - System.out.println(); - System.out.println("Backward errors (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", berr[i]); - } - System.out.println(); - System.out.println(); - System.out.println("Estimated forward error bounds (machine-dependent)"); - for(int i = 0; i < nrhs; i++){ - System.out.printf(" %.1e ", ferr[i]); - } - System.out.println(); - System.out.println(); - if(equed.equals("N")){ - System.out.println("A has not been equilibrated"); - } - else if(equed.equals("R")){ - System.out.println("A has been row scaled as diag(R)*A"); - } - else if(equed.equals("C")){ - System.out.println("A has been column scaled as A*diag(C)"); - } - else if(equed.equals("B")){ - System.out.println("A has been row and column scaled as diag(R)*A*diag(C)"); - } - System.out.println(); - System.out.println("Reciprocal condition number estimate of scaled matrix"); - System.out.printf(" %.1e\n", rcond); - System.out.println(); - System.out.println("Estimate of reciprocal pivot growth factor"); - System.out.printf(" %.1e\n", work[0]); - System.out.println(); - - if(info == n + 1){ - System.out.println(); - System.out.println("The matrix A is singular to working precision"); - } - } - else{ - System.out.println("The (" + info + ", " + info + ")" + " element of the factor U is zero"); - } - } -} diff --git a/simple_examples/F07ADJE.java b/simple_examples/F07ADJE.java deleted file mode 100644 index 4450683..0000000 --- a/simple_examples/F07ADJE.java +++ /dev/null @@ -1,72 +0,0 @@ -import com.nag.routines.F07.DGETRF; -import com.nag.routines.X04.X04CA; - -/** - * F07ADJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F07ADJE{ - - /** - * F07ADJ Example main program - */ - public static void main(String[] args){ - int ifail, info = 0, lda, m, n; - double[] a; - int[] ipiv; - - System.out.println("F07ADJ Example Program Results"); - System.out.println(); - - //Problem size (can be read from data file) - m = 4; - n = 4; - lda = m; - - //Data - ipiv = new int[n]; - a = new double[m * n]; - a[0] = 1.8; - a[1] = 5.25; - a[2] = 1.58; - a[3] = -1.11; - a[4] = 2.88; - a[5] = -2.95; - a[6] = -2.69; - a[7] = -0.66; - a[8] = 2.05; - a[9] = -0.95; - a[10] = -2.9; - a[11] = -0.59; - a[12] = -0.89; - a[13] = -3.8; - a[14] = -1.04; - a[15] = 0.8; - - //Factorize A - //The NAG name equivalent of dgetrf is F07ADF - DGETRF dgetrf = new DGETRF(m, n, a, lda, ipiv, info); - dgetrf.eval(); - - //Update - info = dgetrf.getINFO(); - - //ifail: behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04CA x04ca = new X04CA("General", " ", m, n, a, lda, "Details of factorization", ifail); - x04ca.eval(); - - //Print pivot indices - System.out.println("IPIV"); - for(int i = 0; i < Math.min(m, n); i++){ - System.out.printf("\t%d", ipiv[i]); - } - System.out.println(); - - if(info != 0){ - System.out.println("The factor U is singular"); - } - } -} diff --git a/simple_examples/F07AQJE.java b/simple_examples/F07AQJE.java deleted file mode 100644 index 5ee47e5..0000000 --- a/simple_examples/F07AQJE.java +++ /dev/null @@ -1,99 +0,0 @@ -import com.nag.routines.F07.F07AQ; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import com.nag.types.NAGComplexF; - -/** - * F07AQ example program text. - * @author joed - * @since 27.1.0.0 - */ -public class F07AQJE { - - public static void main(String[] args) { - - F07AQ f07aq = new F07AQ(); - int info, iter, lda, ldb, ldx, n, r; - NAGComplex[] a, b, work, x; - NAGComplexF[] swork; - double[] rwork; - int[] ipiv; - - System.out.println(" F07AQJ Example Program Results"); - System.out.println(); - - // Set dimensions and instantiate arrays - n = 4; - r = 1; - lda = ldb = ldx = n; - a = new NAGComplex[lda*n]; - b = new NAGComplex[ldb*r]; - work = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(n*r); - x = (NAGComplex[]) (new NAGComplex()).getArrayOfInstances(ldx*r); - swork = (NAGComplexF[]) (new NAGComplexF()).getArrayOfInstances(n*(n+r)); - ipiv = new int[n]; - rwork = new double[n]; - - // Set A - a[0] = new NAGComplex(-1.34, 2.55); // Column 1 - a[1] = new NAGComplex(-0.17, -1.41); - a[2] = new NAGComplex(-3.29, -2.39); - a[3] = new NAGComplex(2.41, 0.39); - a[4] = new NAGComplex(0.28, 3.17); // Column 2 - a[5] = new NAGComplex(3.31, -0.15); - a[6] = new NAGComplex(-1.91, 4.42); - a[7] = new NAGComplex(-0.56, 1.47); - a[8] = new NAGComplex(-6.39, -2.20); // Column 3 - a[9] = new NAGComplex(-0.15, 1.34); - a[10] = new NAGComplex(-0.14, -1.35); - a[11] = new NAGComplex(-0.83, -0.69); - a[12] = new NAGComplex(0.72, -0.92); // Column 4 - a[13] = new NAGComplex(1.29, 1.38); - a[14] = new NAGComplex(1.72, 1.35); - a[15] = new NAGComplex(-1.96, 0.67); - - // Set B - b[0] = new NAGComplex(26.26,51.78); - b[1] = new NAGComplex( 6.43,-8.68); - b[2] = new NAGComplex(-5.75,25.31); - b[3] = new NAGComplex( 1.16, 2.57); - - // Notify wrappers of complex types - Routine.setComplex(new NAGComplex()); - Routine.setComplexF(new NAGComplexF()); - - // Solve the equations Ax = b for x - iter = info = 0; - f07aq.eval(n, r, a, lda, ipiv, b, ldb, x, ldx, work, swork, rwork, iter, info); - iter = f07aq.getITER(); - info = f07aq.getINFO(); - - if (info == 0) { - - // Print solution - - System.out.println(" Solution"); - for (int i = 0; i < n; i++) { - for (int j = 0; j < r; j++) { - System.out.printf(" (%7.4f,%7.4f)", x[j*n+i].getRe(), x[j*n+i].getIm()); - } - } - System.out.println(); - - // Print pivot indices - - System.out.println(); - System.out.println(" Pivot indices"); - for (int i = 0; i < n; i++) { - System.out.printf(" %11d", ipiv[i]); - } - System.out.println(); - - } - else { - System.out.printf(" The (%3d,%3d) element of the factor U is zero", info, iter); - } - - } - -} diff --git a/simple_examples/F07FAJE.java b/simple_examples/F07FAJE.java deleted file mode 100644 index e516051..0000000 --- a/simple_examples/F07FAJE.java +++ /dev/null @@ -1,79 +0,0 @@ -import com.nag.routines.F07.F07FA; -import com.nag.routines.X04.X04CA; - -/** - * F07FA example program text. - * @author saraht - */ -public class F07FAJE { - - public static void main(String[] args) { - - int i, ifail, info, lda, n; - double[] a, b; - - System.out.println(" F07FAJ Example Program Results"); - System.out.println(); - - n = 4; - lda = n; - - a = new double[n*n]; - b = new double[n]; - - /* A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18 */ - - a[0+0*n] = 4.16; - a[0+1*n] = -3.12; - a[0+2*n] = 0.56; - a[0+3*n] = -0.10; - - a[1+1*n] = 5.03; - a[1+2*n] = -0.83; - a[1+3*n] = 1.18; - - a[2+2*n] = 0.76; - a[2+3*n] = 0.34; - - a[3+3*n] = 1.18; - - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - /* Solve the equations Ax = b for x */ - - F07FA f07fa = new F07FA(); - info = 0; - f07fa.eval("Upper", n, 1, a, lda, b, n, info); - info = f07fa.getINFO(); - - if (info == 0) { - - /* Print solution */ - - System.out.println(" Solution"); - for (i = 0; i < n; i++) { - System.out.printf(" %11.4f", b[i]); - } - System.out.printf("\n"); - - /* Print details of factorization */ - - System.out.println(); - X04CA x04ca = new X04CA(); - ifail = 0; - x04ca.eval("Upper", "Non-unit diagonal", n, n, a, lda, "Cholesky factor U", ifail); - - } - else { - System.err.printf(" The leading minor of order %d is not positive definite \n", info); - } - - } - -} diff --git a/simple_examples/F07FBJE.java b/simple_examples/F07FBJE.java deleted file mode 100644 index 09bbd37..0000000 --- a/simple_examples/F07FBJE.java +++ /dev/null @@ -1,122 +0,0 @@ -import com.nag.routines.F07.F07FB; -import com.nag.routines.X04.X04CA; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * F07FB example program text. - * @author ludovic - */ -public class F07FBJE { - - public static void main(String[] args) { - String fact,uplo,equed; - int n, nrhs,lda,ldaf,ldb,ldx; - int[] iwork; - double rcond; - double[] a,af,s,b,x,ferr,berr,work; - int info,ifail; - lda = 4; - ldaf = lda; - ldb = lda; - ldx = lda; - nrhs = 2; - n = 4; - a = new double[lda*lda]; - af = new double[ldaf*ldaf]; - b = new double[ldb*nrhs]; - berr = new double[nrhs]; - ferr = new double[nrhs]; - s = new double[lda]; - work = new double[3*lda]; - x = new double[ldx*nrhs]; - iwork = new int[lda]; - info = 1; - rcond = Double.NaN; - fact = "E"; - uplo = "U"; - equed = "Z";//dummy value - /*A = 4.16 -3.12 0.56 -0.10 - 5.03 -0.83 1.18 - 0.76 0.34 - 1.18*/ - a[0] = 4.16; - - a[4] = -3.12; - a[5] = 5.03; - - a[8] = 0.56; - a[9] = -0.83; - a[10] = 0.76; - - a[12] = -0.10; - a[13] = 1.18; - a[14] = 0.34; - a[15] = 1.18; - - /*B= 8.70 8.30 - -13.35 2.13 - 1.89 1.61 - - 4.14 5.00*/ - b[0] = 8.70; - b[1] = -13.35; - b[2] = 1.89; - b[3] = -4.14; - - b[4] = 8.30; - b[5] = 2.13; - b[6] = 1.61; - b[7] = 5.00; - - System.out.println(" F07FBJ Example Program Results"); - System.out.println(); - - F07FB f07fb = new F07FB(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, - ldb, x, ldx, rcond, ferr, berr, work, iwork, info); - f07fb.eval(); - fact = f07fb.getFACT(); - uplo = f07fb.getUPLO(); - equed = f07fb.getEQUED(); - rcond = f07fb.getRCOND(); - info = f07fb.getINFO(); - - - if ((info == 0) || (info == n+1)) { - ifail = 0; - (new X04CA()).eval("General"," ",n,nrhs,x,ldx,"Solution(s)",ifail); - System.out.println(); - System.out.println(" Backward errors (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",berr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimated forward error bounds (machine-dependent)"); - System.out.print(" "); - for (int ii = 0; ii < nrhs; ++ii) { - System.out.printf(" %11.1e",ferr[ii]); - } - System.out.println("\n"); - System.out.println(" Estimate of reciprocal condition number"); - System.out.printf(" %11.1e\n",rcond); - System.out.println(); - if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has not been equilibrated"); - } - else if (equed.equalsIgnoreCase("N")) { - System.out.println(" A has been row and column scaled as diag(S)*A*diag(S)"); - } - - if (info == n+1) { - System.out.println(); - System.out.println(" The matrix A is singular to working precision"); - } - - } - else { - System.out.printf(" The leading minor of order %3d is not positive definite\n"); - } - - } - -} diff --git a/simple_examples/F08BTJE.java b/simple_examples/F08BTJE.java deleted file mode 100644 index 43c219b..0000000 --- a/simple_examples/F08BTJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import static java.lang.Math.*; - -import com.nag.routines.F06.F06JJ; -import com.nag.routines.F06.F06ZJ; -import com.nag.routines.F08.F08AU; -import com.nag.routines.F08.F08BT; -import com.nag.routines.Routine; -import com.nag.routines.X04.X04DB; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * F08BT example program text. - * @author ludovic - */ -public class F08BTJE { - - public static void main(String[] args) throws FileNotFoundException, IOException { - int incl = 1, nb = 64; - double tol; - int ifail, info = 0, k, lda, ldb, lwork, m, n, nrhs; - NAGComplex[] a, b, tau, work; - double[] rnorm, rwork; - int[] jpvt; - String[] clabs = new String[]{" "}, rlabs = new String[]{" "}; - - // Setup complex constants - NAGComplex one = new NAGComplex(); - NAGComplex zero = new NAGComplex(); - one.setRe(1.0); - one.setIm(0.0); - zero.setRe(0.0); - zero.setIm(0.0); - - // Inform the Routine class of the type of complex in use - can use any complex object - Routine.complex = one; - - System.out.println(" F08BTJ Example Program Results"); - System.out.println(); - - // Read values from data file - BufferedReader br = new BufferedReader(new FileReader(args[0])); - String line = br.readLine(); - line = br.readLine().trim(); - line = br.readLine().trim(); - String[] vals = line.split("\\s+"); - m = Integer.parseInt(vals[0].trim()); - n = Integer.parseInt(vals[1].trim()); - nrhs = Integer.parseInt(vals[2].trim()); - lda = ldb = m; - lwork = (n + 1) * nb; - a = new NAGComplex[lda * n]; - b = new NAGComplex[ldb * nrhs]; - tau = new NAGComplex[n]; - work = new NAGComplex[lwork]; - rnorm = new double[nrhs]; - rwork = new double[2 * n]; - jpvt = new int[n]; - - // Actually initialize the complex arrays - for (int i = 0; i < a.length; ++i) { - a[i] = new NAGComplex(); - } - for (int i = 0; i < b.length; ++i) { - b[i] = new NAGComplex(); - } - for (int i = 0; i < tau.length; ++i) { - tau[i] = new NAGComplex(); - } - for (int i = 0; i < work.length; ++i) { - work[i] = new NAGComplex(); - } - - /* Read A and B from data file */ - - readCompMatrix(br, a, lda, n); - readCompMatrix(br, b, ldb, nrhs); - br.close(); - - /* Initialize JPVT to be zero so that all columns are free */ - - for (int i = 0; i < n; ++i) { - jpvt[i] = 0; - } - - /* Compute the QR factorization of A */ - - F08BT f08bt = new F08BT(m, n, a, lda, jpvt, tau, work, lwork, rwork, info); - f08bt.eval(); - - /* Compute C = (C1) = (Q**H)*B, storing the result in B (C2) */ - - String side = "Left"; - String conjTrans = "Conjugate Transpose"; - F08AU f08au = new F08AU(side, conjTrans, m, nrhs, n, a, lda, tau, b, ldb, work, lwork, info); - f08au.eval(); - a = (NAGComplex[])f08au.getA(); - - /* Choose TOL to reflect the relative accuracy of the input data */ - - tol = 0.01; - - /* Determine and print the rank, K, or R relative to TOL */ - - for (k = 1; k < n + 1; ++k) { - if (abs(a[k - 1 + lda * (k - 1)]) <= tol * abs(a[0])) { - break; - } - } - k = k - 1; - - System.out.println(" Tolerance used to estimate the rank of A"); - System.out.printf(" %11.2E\n", tol); - System.out.println(" Estimated rank of A"); - System.out.printf(" %8d\n", k); - - /* Compute least squares solutions by back-substitution in R(1:K,1:K)*Y = C1 - * storing the result in B */ - - String upDown = "Upper"; - String trans = "No transpose"; - String unit = "Non-Unit"; - F06ZJ f06zj = new F06ZJ(side, upDown, trans, unit, k, nrhs, one, a, lda, b, ldb); - f06zj.eval(); - - /* Compute estimates of the square roots of the residual sums of squares - * (2-norm of each of the columns of C2) */ - - int mMinusK = m - k; - NAGComplex[] btmp = new NAGComplex[b.length]; - for (int i = 0; i < btmp.length; ++i) { - btmp[i] = new NAGComplex(); - } - System.arraycopy(b, k, btmp, 0, b.length - k); - - F06JJ f06jj = new F06JJ(mMinusK, btmp, incl); - rnorm[0] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp, 0, b, k, b.length - k); - for (int j = 1; j < nrhs; ++j) { - System.arraycopy(b, k + j * ldb, btmp, 0, b.length - k - j * ldb); - rnorm[j] = f06jj.eval(mMinusK, btmp, incl); - System.arraycopy(btmp,0, b, k + j * ldb, b.length - k - j * ldb); - } - - /* Set the remaining elements of the solutions to zero (to give the - * basic solutions) */ - - for (int i = k; i < n; ++i) { - for (int j = 0; j < nrhs; ++j) { - NAGComplex tmp = new NAGComplex(); - tmp.setRe(0.0); - tmp.setIm(0.0); - b[i + j * ldb] = tmp; - } - } - - /* Permute the least squares solution stored in B to give X = P*Y */ - - for (int j = 0; j < nrhs; j++) { - for (int i = 0; i < n; i++) { - work[jpvt[i] - 1] = b[j*ldb + i]; - } - for (int i = 0; i < n; i++) { - b[j*ldb + i] = work[i]; - } - } - - /* Print least squares solutions */ - - X04DB x04db = new X04DB(); - ifail = 0; - x04db.eval("General"," ",n,nrhs,b,ldb,"Bracketed","F7.4","Least squares solution(s)", - "Integer",rlabs,"Integer",clabs,80,0,ifail); - - /* Print the square roots of the residual sums of squares */ - - System.out.println(); - System.out.println(" Square root(s) of the residual sum(s) of squares"); - System.out.printf(" "); - for (int i = 0; i < nrhs; ++i) { - System.out.printf("%11.2E", rnorm[i]); - } - System.out.println(); - - } - - private static void readCompMatrix(BufferedReader br, NAGComplex[] mat, int row, - int col) throws IOException { - - // matches one complex number (without the brackets...) - String complexPat = "\\(([,0-9\\.\\-\\+\\s]*)\\)"; - String fullPattern = complexPat; - for (int i = 0; i < col -1; ++i) { - fullPattern = fullPattern + "\\s*" + complexPat; - } - fullPattern = fullPattern + ".*"; - Pattern comppat = Pattern.compile(fullPattern); - - for (int i = 0; i < row; ++i) { - String line = br.readLine().trim(); - if (line.equalsIgnoreCase("")) { - line = br.readLine().trim(); - } - Matcher m = comppat.matcher(line.trim()); - if (m.matches()) { - for (int j = 0; j < col; ++j) { - String[] numbers = m.group(j + 1).trim().split(","); - mat[i + j * row].setRe(Double.parseDouble(numbers[0].trim())); - mat[i + j * row].setIm(Double.parseDouble(numbers[1].trim())); - // System.out.print("mat["+i+","+j+"]=("+numbers[0].trim()+","+numbers[1].trim()+") "); - } - // System.out.println(); - } - - - } - } - - private static double abs(NAGComplex z) { - return sqrt(z.getRe() * z.getRe() + z.getIm() * z.getIm()); - } - -} diff --git a/simple_examples/F08FAJE.java b/simple_examples/F08FAJE.java deleted file mode 100644 index 028f854..0000000 --- a/simple_examples/F08FAJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.routines.F08.DDISNA; -import com.nag.routines.F08.F08FA; -import com.nag.routines.F16.F16JQ; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * F08FA example program text. - * @author ludovic - */ -public class F08FAJE { - - public static void main(String[] args) { - int n = 4, LWork = n*64, lda = n; - double[] a, w, work,zerrbd,rcondz, colVector; - int info = 0, ifail = 0, k = 0; - a = new double[n * n]; - w = new double[n]; - work = new double[LWork]; - zerrbd = new double[n]; - rcondz = new double[n]; - colVector = new double[n]; - - System.out.println(" F08FAJ Example Program Results\n"); - - //array a : Stored in column major way - - a[0] = 1.0; - a[1] = 2.0; - a[2] = 3.0; - a[3] = 4.0; - - a[4] = 2.0; - a[5] = 2.0; - a[6] = 3.0; - a[7] = 4.0; - - a[8] = 3.0; - a[9] = 3.0; - a[10] = 3.0; - a[11] = 4.0; - - a[12] = 4.0; - a[13] = 4.0; - a[14] = 4.0; - a[15] = 4.0; - - //initializing the info parameter - info = 0; - w[0] = Double.NaN; - w[1] = Double.NaN; - w[2] = Double.NaN; - w[3] = Double.NaN; - F08FA f08fa = new F08FA("V", "U", n, a, n, w, work, LWork, info); - f08fa.eval(); - info = f08fa.getINFO(); - - if (info == 0) { - System.out.println(" Eigenvalues"); - System.out.print(" "); - for (int i = 0; i < n; ++i) { - System.out.printf(" %8.4f",w[i]); - } - System.out.println(); - - // Normalize the eigenvectors: largest element positive - F16JQ f16jq = new F16JQ(); // aka blas_damax_val - for (int i = 0; i < n; i++) { - System.arraycopy(a, 4*i, colVector, 0, 4); // Form vector to evaluate - f16jq.eval(n, colVector, 1, k, 0.0); // Get index of largest (absolute) value - k = f16jq.getK() - 1; // Make index zero based - - // Invert sign of column if largest element is negative - if (a[(4*i)+k] < 0) { - for (int j = 0; j < n; j++) { - a[(4*i)+j] = (-1) * a[(4*i)+j]; - } - } - - } - - (new X04CA()).eval("General"," ",n,n,a,lda,"Eigenvectors",ifail); - - double eps = (new X02AJ()).eval(); - double eerrbd = eps*Math.max(Math.abs(w[0]),Math.abs(w[n-1])); - - (new DDISNA()).eval("Eigenvectors",n,n,w,rcondz,info); - for (int i = 0; i < n; ++i) { - zerrbd[i] = eerrbd/rcondz[i]; - } - - System.out.println(); - System.out.println(" Error estimate for the eigenvalues"); - System.out.printf(" %11.1e\n",eerrbd); - System.out.println(); - System.out.println(" Error estimates for the eigenvectors"); - for (int i = 0; i < n; ++i) { - System.out.printf(" %11.1e",zerrbd[i]); - } - System.out.println(); - - } - else { - System.out.printf(" Failure in DSYEV. INFO =%4d",info); - } - - } - -} diff --git a/simple_examples/F08XPJE.java b/simple_examples/F08XPJE.java deleted file mode 100644 index cc894d3..0000000 --- a/simple_examples/F08XPJE.java +++ /dev/null @@ -1,297 +0,0 @@ -import com.nag.routines.F06.F06UA; -import com.nag.routines.F06.F06BN; -import com.nag.routines.F06.ZGEMM; -import com.nag.routines.F08.ZGGESX; -import com.nag.routines.M01.M01DA; -import com.nag.routines.M01.M01ED; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.X04.X04DB; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * F08XPJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class F08XPJE{ - - public static boolean chkfac = false; - public static boolean prcond = false; - public static boolean prmat = false; - public static int nb = 64; - - /* - * F08XPJ Example main program - */ - public static void main(String[] args){ - NAGComplex alph, bet; - double abnorm, anorm, bnorm, eps, normd, norme, tol; - int ifail, info = 0, lda, ldb, ldc, ldd, lde, ldvsl, ldvsr, liwork, lwork, n, sdim = 0; - boolean factor; - NAGComplex[] a, alpha, b, beta, c, d, e, vsl, vsr, work, dummy; - double[] rconde, rcondv, rwork; - int[] idum, iwork; - boolean[] bwork; - String[] clabs, rlabs; - - //Placeholders - idum = new int[1]; - rconde = new double[2]; - rcondv = new double[2]; - dummy = NAGComplex.createArray(1); - - System.out.println("F08XPJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - //Tell wrappers what time of complex type is going to be used - Routine.setComplex(new NAGComplex()); - - //n declared here for neater code but can be read in from data file - n = 4; - lda = n; - ldb = n; - ldc = n; - ldd = n; - lde = n; - ldvsl = n; - ldvsr = n; - - //Allocate - a = NAGComplex.createArray(lda * n); - alpha = NAGComplex.createArray(n); - b = NAGComplex.createArray(ldb * n); - beta = NAGComplex.createArray(n); - c = NAGComplex.createArray(ldc * n); - d = NAGComplex.createArray(ldd * n); - e = NAGComplex.createArray(lde * n); - vsl = NAGComplex.createArray(ldvsl * n); - vsr = NAGComplex.createArray(ldvsr * n); - rwork = new double[8 * n]; - bwork = new boolean[n]; - clabs = new String[1]; - clabs[0] = " "; - rlabs = new String[1]; - rlabs[0] = " "; - - //Use routine workspace query to get optimal workspace - lwork = -1; - liwork = -1; - //The NAG name equivalent of zggesx is f08xpf - selctg selctg1 = new selctg(); - ZGGESX zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, dummy, lwork, - rwork, idum, liwork, bwork, info); - zggesx.eval(); - - //Make sure that there is a enough workspace for block size nb - lwork = Math.max((n * nb) + (n * n/2), (int) Math.rint(dummy[0].getRe())); - liwork = Math.max(n + 2, idum[0]); - work = NAGComplex.createArray(lwork); - iwork = new int[liwork]; - - //Read in matrices A and B - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - line = reader.readLine(); //skip n (set manually for neater code) - String[] sVal; - - for(int i = 0; i < 2; i++){ - for(int j = 0; j < n; j++){ - line = reader.readLine(); - sVal = line.split("\\)"); - for(int k = 0; k < n; k++){ - if(i == 0){ - a[(k * n) + j] = parseComplex(sVal[k]); - } - else{ - b[(k * n) + j] = parseComplex(sVal[k]); - } - } - } - } - - } - catch(FileNotFoundException err){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException err){ - System.err.println("***FATAL: Can't read " + filename + "\n" + err.getMessage()); - } - - if(chkfac){ - for(int i = 0; i < a.length; i++){ - //Copy A and B into D and E respectively - d[i] = a[i]; - e[i] = b[i]; - } - } - - //Find the Forbenius norms of A and B - //The NAG name equivalent of the LAPACK auxiliary zlange is f06uaf - F06UA f06ua = new F06UA(); - anorm = f06ua.eval("Frobenius", n, n, a, lda, rwork); - bnorm = f06ua.eval("Frobenius", n, n, b, ldb, rwork); - - if(prmat){ - //Print matrices A and B - //ifail : behaviour on error exit - // =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft - ifail = 0; - X04DB x04db = new X04DB("General", " ", n, n, a, lda, "Bracketed", "F8.4", "Matrix A", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - - ifail = 0; - x04db = new X04DB("General", " ", n, n, b, ldb, "Bracketed", "F8.4", "Matrix B", "Integer", - rlabs, "Integer", clabs, 80, 0, ifail); - x04db.eval(); - System.out.println(); - } - - factor = true; - //Find the generalized Schur form - //The NAG name equivalent of zggesx is f08xpf - zggesx = new ZGGESX("Vectors (left)", "Vectors (right)", "Sort", selctg1, "Both reciprocal condition numbers", - n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, - rwork, iwork, liwork, bwork, info); - zggesx.eval(); - - //update - sdim = zggesx.getSDIM(); - - if(info != 0 && info != (n + 2)){ - System.out.printf("Failure in ZGGESX. INFO = %d\n", info); - factor = false; - } - else if(chkfac){ - //Compute A - Q*S*Z^H from the factorization of (A,B) and store in matrix D - //The NAG name equivalent of zgemm is f06zaf - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - ZGEMM zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, a, lda, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, d, ldd); - zgemm.eval(); - - //Compute B - Q*T*Z^H from the factorization of (A,B) and store in matrix E - alph = new NAGComplex(1, 0); - bet = new NAGComplex(0, 0); - zgemm = new ZGEMM("N", "N", n, n, n, alph, vsl, ldvsl, b, ldb, bet, c, ldc); - zgemm.eval(); - - alph = new NAGComplex(-1, 0); - bet = new NAGComplex(1, 0); - zgemm = new ZGEMM("N", "C", n, n, n, alph, c, ldc, vsr, ldvsr, bet, e, lde); - zgemm.eval(); - - //Find norms of matrices D and E and warn if either is too large - f06ua = new F06UA("0", ldd, n, d, ldd, rwork); - normd = f06ua.eval(); - X02AJ x02aj = new X02AJ(); - if(normd > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of A-(Q*S*Z^T) is much greater than 0."); - factor = false; - System.out.println("Schur factorization has failed"); - } - f06ua = new F06UA("0", lde, n, e, lde, rwork); - norme = f06ua.eval(); - if(norme > Math.pow(x02aj.eval(), 0.75)){ - System.out.println("Norm of B-(Q*T*Z^T is much greater than 0."); - factor = false; - } - } - - if(factor){ - //Print eigenvalue details - System.out.printf("Number of eigenvalues for which SELCTG is true = %d\n", sdim); - System.out.println("(dimension of deflating subspaces)"); - - System.out.println(); - //Print selected (finite) generalized eigenvalues - System.out.println("Selected generalized eigenvalues"); - - //Store absolute values of eigenvalues for ranking - for(int i = 0; i < n; i++){ - work[i] = alpha[i].divide(beta[i]); - rwork[i] = NAGComplex.abs(work[i]); - } - - //Rank eigenvalues - ifail = 0; - M01DA m01da = new M01DA(rwork, 1, sdim, "Descending", iwork, ifail); - m01da.eval(); - - //Sort eigevalues in work - M01ED m01ed = new M01ED(work, 1, sdim, iwork, ifail); - m01ed.eval(); - for(int i = 0; i < sdim; i++){ - System.out.printf(" %d\t(%.2f, %.2f)\n", i + 1, work[i].getRe(), work[i].getIm()); - } - - if(info == n + 2){ - System.out.println("*** note that rounding errors mean that leading eigenvalues in"); - System.out.println("the generalized Schur form no longer satisfy SELCTG = TRUE"); - System.out.println(); - } - - if(prcond){ - //Compute the machine precision and sqrt(anorm^2 + bnorm^2) - X02AJ x02aj = new X02AJ(); - eps = x02aj.eval(); - F06BN f06bn = new F06BN(anorm, bnorm); - abnorm = f06bn.eval(); - tol = eps * abnorm; - - //Print out the reciprocal condition numbers and error bound for selected eigenvalues - System.out.println("Reciprocal condition numbers for the average of the selected"); - System.out.println("eigenvalues and their asymptotic error bound"); - System.out.printf("rcond-left = %.1e, rcond-right = %.1e, error = %.1e\n", rcondv[0], rcondv[1], tol/rcondv[1]); - } - } - else{ - System.out.println("Schur factorization has failed"); - } - - } - - /** - * Converts String read in from data file to NAGComplex value. - * @param s - * Complex number string - * @return new NAGComplex representing s - */ - public static NAGComplex parseComplex(String s){ - s = s.trim(); - double re = Double.parseDouble(s.substring(1, 7)); - double im = Double.parseDouble(s.substring(8)); - return new NAGComplex(re, im); - } - - /** - * Class representing function selctg implementing ZGGESX_SELCTG to pass to ZGGESX. - */ - public static class selctg extends ZGGESX.Abstract_ZGGESX_SELCTG{ - public boolean eval(){ - return (NAGComplex.abs((NAGComplex)this.A) < (6 * NAGComplex.abs((NAGComplex)this.B))); - } - } - -} diff --git a/simple_examples/G01ALJE.java b/simple_examples/G01ALJE.java deleted file mode 100644 index 672a151..0000000 --- a/simple_examples/G01ALJE.java +++ /dev/null @@ -1,55 +0,0 @@ -import com.nag.routines.G01.G01AL; - -/** - * G01ALJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G01ALJE{ - - /** - * G01ALJ Example main program - */ - public static void main(String[] args){ - int ifail, n; - double[] x, res; - int[] iwrk; - - res = new double[5]; - - System.out.println("G01ALJ Example Program Results"); - System.out.println(); - - //Problem size - n = 12; - - //Allocate - x = new double[n]; - iwrk = new int[n]; - - //Data - x[0] = 12; - x[1] = 9; - x[2] = 2; - x[3] = 5; - x[4] = 6; - x[5] = 8; - x[6] = 2; - x[7] = 7; - x[8] = 3; - x[9] = 1; - x[10] = 11; - x[11] = 10; - - //Calculate summary statistics - ifail = 0; - G01AL g01al = new G01AL(n, x, iwrk, res, ifail); - g01al.eval(); - - System.out.printf("Maximum %.4f\n", res[4]); - System.out.printf("Upper Hinge (75%% quantile) %.4f\n", res[3]); - System.out.printf("Median (50%% quantile) %.4f\n", res[2]); - System.out.printf("Lower Hinge (25%% quantile) %.4f\n", res[1]); - System.out.printf("Minimum %.4f\n", res[0]); - } -} diff --git a/simple_examples/G02AKJE.java b/simple_examples/G02AKJE.java deleted file mode 100644 index 8ddaff2..0000000 --- a/simple_examples/G02AKJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.G02.G02AK; -import com.nag.routines.X04.X04CA; - -/** - * G02AK example program text. - * @author joed - * @since 27.0.0.0 - */ -public class G02AKJE { - - /** - * G02AKJ example main program. - */ - public static void main(String[] args) { - - G02AK g02ak = new G02AK(); - X04CA x04ca = new X04CA(); - double errtol, f, rankerr, ranktol; - int i, ifail, ldg, ldx, maxit, maxits, n, nsub, rank; - double[] g, x; - - System.out.println("G02AKJ Example Program Results\n"); - - // Problem size - n = 4; - ldg = n; - ldx = n; - - // Rank constraint - rank = 2; - - // Matrix G (column-major) - g = new double[]{ - 2.0, -1.0, 0.0, 0.0, - -1.0, 2.0, -1.0, 0.0, - 0.0, -1.0, 2.0, -1.0, - 0.0, 0.0, -1.0, 2.0 - }; - - // Use the defaults for errtol, ranktol, maxits, maxit - errtol = 0.0; - ranktol = 0.0; - maxits = 0; - maxit = 0; - - // Calculate rank constrained nearest correlation matrix - ifail = 0; - x = new double[ldx*n]; - f = 0.0; - rankerr = 0.0; - nsub = 0; - g02ak.eval(g, ldg, n, rank, errtol, ranktol, maxits, maxit, x, ldx, f, - rankerr, nsub, ifail); - nsub = g02ak.getNSUB(); - f = g02ak.getF(); - rankerr = g02ak.getRANKERR(); - - // Display results - ifail = 0; - x04ca.eval("General", " ", n, n, x, ldx, "NCM with rank constraint", ifail); - System.out.println(); - System.out.printf("Number of subproblems solved: %12d\n\n", nsub); - System.out.printf("Squared Frobenius norm of difference: %9.4f\n\n", f); - System.out.printf("Rank error: %35.4f\n", rankerr); - - } - -} diff --git a/simple_examples/G02BJJE.java b/simple_examples/G02BJJE.java deleted file mode 100644 index 3de843e..0000000 --- a/simple_examples/G02BJJE.java +++ /dev/null @@ -1,303 +0,0 @@ -import com.nag.routines.G02.G02BJ; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G02BJ example program text. - * @author ludovic - */ -public class G02BJJE { - - public static void main(String[] args) { - int i, ifail, ldcnt, ldr, ldssp, ldx, ncases = 0; //, m = 0, n = 0, nvars = 0; - double[] cnt, r, ssp, std, xbar;//, xmiss; - - if (args.length != 1) { - G02BJJE.usage(); - } - - String dataFile = args[0]; - DataHolder data = new DataHolder(); - readDataFile(dataFile, data); - System.out.println(" G02BJJ Example Program Results"); - System.out.println(); - - ldcnt = ldr = ldssp = data.nvars; - ldx = data.n; - cnt = new double[ldcnt * data.nvars]; - r = new double[ldr * data.nvars]; - ssp = new double[ldssp * data.nvars]; - std = new double[data.nvars]; - xbar = new double[data.nvars]; - - - //Display the data - - System.out.printf(" Number of variables (columns) = %5d\n", data.m); - System.out.printf(" Number of cases (rows) = %5d\n", data.n); - System.out.println(); - System.out.println(" Data matrix is:-"); - for (int ii = 0; ii < data.m; ++ii) { - System.out.printf(" %12d",ii+1); - } - System.out.println(); - for (int ii = 0; ii < data.n; ++ii) { - System.out.printf(" %3d ",ii+1); - for (int jj = 0; jj < data.m; ++jj) { - System.out.printf("%12.4f ",data.x[ii + jj * data.n]); - } - System.out.println(); - } - - ifail = 0; - G02BJ g02bj = new G02BJ(data.n, data.m, data.x, ldx, data.miss, data.xmiss, - data.nvars, data.kvar, xbar, std, ssp, ldssp, r, ldr, ncases, cnt, - ldcnt, ifail); - g02bj.eval(); - - data.n = g02bj.getN(); - data.m = g02bj.getM(); - data.x = g02bj.getX(); - ldx = g02bj.getLDX(); - data.miss = g02bj.getMISS(); - data.xmiss = g02bj.getXMISS(); - data.nvars = g02bj.getNVARS(); - data.kvar = g02bj.getKVAR(); - xbar = g02bj.getXBAR(); - std = g02bj.getSTD(); - ssp = g02bj.getSSP(); - ldssp = g02bj.getLDSSP(); - r = g02bj.getR(); - ldr = g02bj.getLDR(); - ncases = g02bj.getNCASES(); - cnt = g02bj.getCNT(); - ldcnt = g02bj.getLDCNT(); - ifail = g02bj.getIFAIL(); - - //Display results - System.out.println(); - System.out.println(" Variable\tMean\tSt.dev."); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %5d %11.4f %11.4f\n",data.kvar[ii], xbar[ii], std[ii]); - } - System.out.println(); - System.out.println(" Sums of squares and cross-products of deviations"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",ssp[ii + ldssp * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.println(" Correlation coefficients"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",r[ii + ldr * jj]); - } - System.out.println(); - } - System.out.println(); - System.out.printf(" Minimum number of cases used for any pair of variables: %5d\n", ncases); - System.out.println(); - System.out.println(" Numbers used for each pair are:"); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %12d",data.kvar[ii]); - } - System.out.println(); - for (int ii = 0; ii < data.nvars; ++ii) { - System.out.printf(" %3d",data.kvar[ii]); - for (int jj = 0; jj < data.nvars; ++jj) { - System.out.printf(" %12.4f",cnt[ii + ldcnt * jj]); - } - System.out.println(); - } - System.out.println(); - } - - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - /** - G02BJF Example Program Data - 5 4 3 :: N, M, NVARS - 3.0 3.0 1.0 2.0 - 6.0 4.0 -1.0 4.0 - 9.0 0.0 5.0 9.0 - 12.0 2.0 0.0 0.0 - -1.0 5.0 4.0 12.0 :: End of X - 1 1 0 1 :: MISS - -1.0 0.0 0.0 0.0 :: XMISS - 4 1 2 :: KVAR - */ - private static void readDataFile(String filename, DataHolder data) { - try { - BufferedReader br = new BufferedReader(new FileReader(filename)); - String line = br.readLine(); // skip header - line = br.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvars(Integer.parseInt(sVal[2])); - - data.x = new double[data.n * data.m]; - data.miss = new int[data.m]; - data.xmiss = new double[data.m]; - data.kvar = new int[data.nvars]; - - for (int i = 0; i < data.n; ++i) { - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.x[i + j * data.n] = Double.parseDouble(sVal[j]); - } - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.miss[j] = Integer.parseInt(sVal[j]); - } - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.m; ++j) { - data.xmiss[j] = Double.parseDouble(sVal[j]); - } - - line = br.readLine().trim(); - sVal = line.split("\\s+"); - for (int j = 0; j < data.nvars; ++j) { - data.kvar[j] = Integer.parseInt(sVal[j]); - } - } - catch (FileNotFoundException ex) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch (IOException ex) { - System.err.println("***FATAL: Can't Read " + filename + "\n" + ex.getMessage()); - System.exit(-3); - } - - } - - private static class DataHolder { - private int n; - private int m; - private int nvars; - private double[] x; - private int[] miss; - private double[] xmiss; - private int[] kvar; - - /** - * @return the n - */ - public int getN() { - return n; - } - - /** - * @param n the n to set - */ - public void setN(int n) { - this.n = n; - } - - /** - * @return the m - */ - public int getM() { - return m; - } - - /** - * @param m the m to set - */ - public void setM(int m) { - this.m = m; - } - - /** - * @return the nvars - */ - public int getNvars() { - return nvars; - } - - /** - * @param nvars the nvars to set - */ - public void setNvars(int nvars) { - this.nvars = nvars; - } - - /** - * @return the x - */ - public double[] getX() { - return x; - } - - /** - * @param x the x to set - */ - public void setX(double[] x) { - this.x = x; - } - - /** - * @return the miss - */ - public int[] getMiss() { - return miss; - } - - /** - * @param miss the miss to set - */ - public void setMiss(int[] miss) { - this.miss = miss; - } - - /** - * @return the xmiss - */ - public double[] getXmiss() { - return xmiss; - } - - /** - * @param xmiss the xmiss to set - */ - public void setXmiss(double[] xmiss) { - this.xmiss = xmiss; - } - - /** - * @return the kvar - */ - public int[] getKvar() { - return kvar; - } - - /** - * @param kvar the kvar to set - */ - public void setKvar(int[] kvar) { - this.kvar = kvar; - } - } -} diff --git a/simple_examples/G02BRJE.java b/simple_examples/G02BRJE.java deleted file mode 100644 index 084f478..0000000 --- a/simple_examples/G02BRJE.java +++ /dev/null @@ -1,134 +0,0 @@ -import com.nag.routines.G02.G02BR; - -/** - * G02BRJ Example Program Text - * @author willa - * @since 27.1.0.0 - */ -public class G02BRJE{ - - /** - * G02BRJ Example main program - */ - public static void main(String[] args){ - int ifail, itype, ldrr, ldx, m, n, ncases = 0; //placeholder - double[] rr, work1, work2, x, xmiss; - int[] incase, kworka, kworkb, kworkc, miss; - - System.out.println("G02BRJ Example Program Results"); - System.out.println(); - - //Problem size - n = 9; - m = 3; - itype = 0; - - ldrr = m; - ldx = n; - - //Allocate - rr = new double[ldrr * m]; - work1 = new double[n]; - work2 = new double[n]; - x = new double[ldx * m]; - xmiss = new double[m]; - incase = new int[n]; - kworka = new int[n]; - kworkb = new int[n]; - kworkc = new int[n]; - miss = new int[m]; - - //Data - //X = (1.70, 1.00, 0.50) - // (2.80, 4.00, 3.00) - // (0.60, 6.00, 2.50) - // (1.80, 9.00, 6.00) - // (0.99, 4.00, 2.50) - // (1.40, 2.00, 5.50) - // (1.80, 9.00, 7.50) - // (2.50, 7.00, 0.00) - // (0.99, 5.00, 3.00) - x[0] = 1.7; - x[1] = 2.8; - x[2] = 0.6; - x[3] = 1.8; - x[4] = 0.99; - x[5] = 1.4; - x[6] = 1.8; - x[7] = 2.5; - x[8] = 0.99; - x[9] = 1; - x[10] = 4; - x[11] = 6; - x[12] = 9; - x[13] = 4; - x[14] = 2; - x[15] = 9; - x[16] = 7; - x[17] = 5; - x[18] = 0.5; - x[19] = 3; - x[20] = 2.5; - x[21] = 6; - x[22] = 2.5; - x[23] = 5.5; - x[24] = 7.5; - x[25] = 0; - x[26] = 3; - - //Missing value flags - miss[0] = 1; - miss[1] = 0; - miss[2] = 1; - xmiss[0] = 0.99; - xmiss[1] = 0; - xmiss[2] = 0; - - //Display data - System.out.printf("Number of variables (columns) = %d\n", m); - System.out.printf("Number of case (rows) = %d\n", n); - System.out.println(); - System.out.println("Data matrix is:-\n"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", x[(j * n) + i]); - } - System.out.println(); - } - System.out.println(); - - //Calculate correlation coefficients - ifail = 0; - G02BR g02br = new G02BR(n, m, x, ldx, miss, xmiss, itype, rr, ldrr, ncases, incase, kworka, kworkb, kworkc, - work1, work2, ifail); - g02br.eval(); - - //Update - ncases = g02br.getNCASES(); - - //Display results - System.out.println("Matrix of rank correlation coefficients:"); - System.out.println("Upper triangle -- Spearman's"); - System.out.println("Lower triangle -- Kendall's tau"); - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf("\t %d", i + 1); - } - System.out.println(); - for(int i = 0; i < m; i++){ - System.out.printf(" %d\t", i + 1); - for(int j = 0; j < m; j++){ - System.out.printf("%.4f\t", rr[(j * m) + i]); - } - System.out.println(); - } - System.out.println(); - System.out.printf("Number of cases actually used: %d\n", ncases); - } -} diff --git a/simple_examples/G02DAJE.java b/simple_examples/G02DAJE.java deleted file mode 100644 index c390197..0000000 --- a/simple_examples/G02DAJE.java +++ /dev/null @@ -1,187 +0,0 @@ -import com.nag.routines.G02.G02BU; -import com.nag.routines.G02.G02DA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G02DAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02DAJE{ - - /** - * G02DAJ Example main program - */ - public static void main(String[] args){ - double aic, arsq, en, mult, rsq, rss = 0, sw = 0, tol; - int idf = 0, ifail, ip, irank = 0, ldq, ldx, lwt, m, n; - boolean svd = false; - String mean, weight; - double[] b, cov, h, p, q, res, se, wk, wt, x, y, c, wmean; - int[] isx; - - System.out.println("G02DAJ Example Program Results"); - System.out.println(); - - c = new double[1]; - wmean = new double[1]; - - //Problem size (can be read in from data file - n = 12; - m = 4; - weight = "U"; - mean = "M"; - - if(weight.toLowerCase().equals("w")){ - lwt = n; - } - else{ - lwt = 0; - } - ldx = n; - - x = new double[ldx * m]; - y = new double[n]; - wt = new double[n]; - isx = new int[m]; - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip n, m, weight, mean - - //Read in data - String[] sVal; - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - x[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - if(lwt > 0){ - wt[i] = Double.parseDouble(sVal[m + 1]); - } - } - - //Read in variable inclusion flags - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int i = 0; i < m; i++){ - isx[i] = Integer.parseInt(sVal[i]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Calcluate IP - ip = 0; - for(int i = 0; i < m; i++){ - if(isx[i] == 1){ - ip++; - } - } - if(mean.toLowerCase().equals("m")){ - ip = ip + 1; - } - - //Allocate - ldq = n; - b = new double[ip]; - cov = new double[((ip * ip) + ip)/2]; - h = new double[n]; - p = new double[ip * ip * (ip + 2)]; - q = new double[ldq * (ip + 1)]; - res = new double[n]; - se = new double[ip]; - wk = new double[ip * ip + (5 * (ip - 1))]; - - //Use suggested value for tolerance - tol = 0.000001; - - //fit general linear regression model - ifail = -1; - G02DA g02da = new G02DA(mean, weight, n, x, ldx, m, isx, ip, y, wt, rss, idf, b, se, cov, res, h, q, - ldq, svd, irank, p, tol, wk, ifail); - g02da.eval(); - ifail = g02da.getIFAIL(); - if(ifail != 0){ - if(ifail != 5){ - System.exit(-3); - } - } - - //Calculate (weighted) total sums of squares, adjusted for mean if required - //If in G02DAF, an intercept is added to the regression by including a comlumn of - //1's in X, rather than by using the MEAN argument then MEAN = "M" should be used - //in this call to G02BUF - ifail = 0; - G02BU g02bu = new G02BU(mean, weight, n, 1, y, n, wt, sw, wmean, c, ifail); - g02bu.eval(); - - idf = g02da.getIDF(); - irank = g02da.getIRANK(); - //Get effective number of observations (=N if there are no zero weights) - en = (double) idf + irank; - - rss = g02da.getRSS(); - //Calculate R-squared, corrected R-Squared and AIC - rsq = 1 - rss/c[0]; - if(mean.toLowerCase().equals("m")){ - mult = (en - 1) / (en - irank); - } - else{ - mult = en / (en - irank); - } - arsq = 1 - mult * (1 - rsq); - aic = en * Math.log(rss/en) + (2 * irank); - - svd = g02da.getSVD(); - //Disply results - if(svd){ - System.out.printf("Model not of full rank, rank = %d", irank); - System.out.println(); - } - System.out.printf("Residual sum of squares = %.4e\n", rss); - System.out.printf("Degrees of freedom = %d\n", idf); - System.out.printf("R-squared = %.4e\n", rsq); - System.out.printf("Adjusted R-squared = %.4e\n", arsq); - System.out.printf("AIC = %.4e\n", aic); - System.out.println(); - System.out.printf("Variable\tParameter estimate\tStandard error\n"); - System.out.println(); - if(ifail == 0){ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), b[i], se[i]); - } - } - else{ - for(int i = 0; i < ip; i++){ - System.out.printf(" %d\t\t %.4e\n", (i + 1), b[i]); - } - } - System.out.println(); - System.out.printf(" Obs\t\t Residuals\t\t H\n"); - System.out.println(); - for(int i = 0; i < n; i++){ - System.out.printf(" %d\t\t %.4e\t\t %.4e\n", (i + 1), res[i], h[i]); - } - - } -} diff --git a/simple_examples/G02EEJE.java b/simple_examples/G02EEJE.java deleted file mode 100644 index 5856fde..0000000 --- a/simple_examples/G02EEJE.java +++ /dev/null @@ -1,184 +0,0 @@ -import com.nag.routines.G02.G02EE; -import java.io.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G02EE example program text. - */ -public class G02EEJE { - - public static void main(String[] args) throws Exception { - int vnlen = 3; - double chrss, f, fin, rss; - rss = chrss = f = Double.NaN; - int idf = 0, ifail = 0, ifr = 0, istep = 0, ldq, ldx, lwt, m, maxip, n, nterm = 0; - boolean addvar = false; - String mean, weight, newvar; - newvar = " "; - double[] exss, p, q, wk, wt, x, y; - int[] isx; - String[] free, model, vname; - - System.out.println(" G02EEJ Example Program Results\n"); - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - String line = dataIn.readLine(); - - String[] data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - - n = Integer.parseInt(data[0]); - m = Integer.parseInt(data[1]); - mean = data[2].substring(1,2); - weight = data[3].substring(1,2); - fin = Double.parseDouble(data[4]); - - if (weight.equalsIgnoreCase("W")) { - lwt = n; - } - else { - lwt = 0; - } - ldx = n; - - x = new double[ldx*m]; - y = new double[n]; - wt = new double[lwt]; - isx = new int[m]; - vname = new String[m]; - - for (int i = 0; i < vname.length;++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - vname[i] = tmp.toString(); - } - - if (lwt > 0) { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - wt[i] = Double.parseDouble(data[m+1]); - } - } - else { - for (int i = 0; i < n; ++i) { - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int j = 0; j < m; ++j) { - x[i+j*ldx] = Double.parseDouble(data[j]); - } - y[i] = Double.parseDouble(data[m]); - } - } - data = dataIn.readLine().trim().split("::")[0].trim().split("\\s+"); - for (int i = 0; i < m; ++i) { - isx[i] = Integer.parseInt(data[i]); - } - - data = dataIn.readLine().trim().split("::")[0].trim() - .replaceAll("^'","").replaceAll("'$","").split("'\\s+'"); - for (int i = 0; i < m; ++i) { - vname[i] = data[i].substring(0,3); - } - - dataIn.close(); - - maxip = 0; - for (int i = 0; i < m; ++i) { - if (isx[i] > 0) { - ++maxip; - } - } - - if (mean.equalsIgnoreCase("M")) { - maxip += 1; - } - - ldq = n; - model = new String[maxip]; - free = new String[maxip]; - exss = new double[maxip]; - q = new double[ldq*(maxip+2)]; - p = new double[maxip+1]; - wk = new double[2*maxip]; - - for (int i = 0; i < model.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - model[i] = tmp.toString(); - } - for (int i = 0; i < free.length; ++i) { - StringBuilder tmp = new StringBuilder(); - for (int j = 0; j < vnlen; ++j) { - tmp.append(" "); - } - free[i] = tmp.toString(); - } - istep = 0; - ifail = -1; - - - G02EE g02ee = new G02EE(istep,mean,weight,n,m,x,ldx,vname,isx,maxip,y,wt,fin, - addvar,newvar,chrss,f,model,nterm,rss,idf,ifr,free,exss,q,ldq,p, - wk,ifail); - for (int i = 0; i < m; ++i) { - g02ee.setIFAIL(0); - g02ee.eval(); - - System.out.printf(" Step %2d\n",g02ee.getISTEP()); - if (!g02ee.getADDVAR()) { - System.out.printf(" No further variables added maximum F =%7.2f\n",g02ee.getF()); - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - break; - } - else { - System.out.println(" Added variable is "+g02ee.getNEWVAR()); - System.out.printf(" Change in residual sum of squares = %12.4E\n",g02ee.getCHRSS()); - System.out.printf(" F Statistic = %7.2f\n",g02ee.getF()); - System.out.println(); - System.out.print(" Variables in model:"); - for (int j = 0; j < g02ee.getNTERM(); ++j) { - System.out.print(" "+g02ee.getMODEL()[j]); - } - System.out.println("\n"); - System.out.printf(" Residual sum of squares = %13.4E\n",g02ee.getRSS()); - System.out.printf(" Degrees of freedom = %2d\n",g02ee.getIDF()); - System.out.println(); - if (g02ee.getIFR() == 0) { - System.out.println(" No free variables remaining"); - break; - } - System.out.print(" Free variables: "); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.print(" "+free[j]); - } - System.out.println(); - System.out.println(" Change in residual sums of squares for free variables:"); - for (int j = 0; j < g02ee.getIFR(); ++j) { - System.out.printf(" %9.4f",g02ee.getEXSS()[j]); - } - System.out.println(); - - } - - } - - } - -} diff --git a/simple_examples/G02MAJE.java b/simple_examples/G02MAJE.java deleted file mode 100644 index 4a8bfcb..0000000 --- a/simple_examples/G02MAJE.java +++ /dev/null @@ -1,130 +0,0 @@ -import com.nag.routines.G02.G02MA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; - -/** - * G02MAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G02MAJE{ - - /** - * G02MAJ example main program - */ - public static void main(String[] args){ - int ifail, ip, ldb, ldd, lisx, lropt, m, mnstep, mtype, n, nstep = 0, pred, prey; - double[] b, d, fitsum, ropt, y; - int[] isx; - - isx = new int[0]; //placeholder - - System.out.println("G02MAJ Example Program Results"); - System.out.println(); - - //data (Could also read in from data file) - //Problem size - n = 20; - m = 6; - - //Model Specification - mtype = 1; - pred = 3; - prey = 1; - mnstep = 6; - lisx = 0; - - //Variable inclusion flags aren't needed in this example - ip = m; - - //Optional arguments (using defaults) - lropt = 0; - ropt = new double[lropt]; - - //D and Y - ldd = n; - y = new double[n]; - d = new double[ldd * m]; - - //Read in D and Y from data file (too large to write out) - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - line = reader.readLine(); //skip N, M - line = reader.readLine(); //skip mtype, pred, prey, mnstep, lisx - - String sVal[]; - - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < m; j++){ - d[(j * n) + i] = Double.parseDouble(sVal[j]); - } - y[i] = Double.parseDouble(sVal[m]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Allocate output arrays - ldb = ip; - b = new double[ldb * (mnstep + 2)]; - fitsum = new double[6 * (mnstep + 1)]; - - //Call the model fitting routine - ifail = -1; - G02MA g02ma = new G02MA(mtype, pred, prey, n, m, d, ldd, isx, lisx, y, mnstep, ip, nstep, b, ldb, - fitsum, ropt, lropt, ifail); - g02ma.eval(); - ifail = g02ma.getIFAIL(); - if(ifail != 0){ - if(ifail != 112 && ifail != 161 && ifail != 162 && ifail !=163){ - //ifail = 112, 161, 162, 163 are warnings, so no need to terminate - System.exit(-2); - } - } - - //update - nstep = g02ma.getNSTEP(); - - //Display the parameter estimates - System.out.printf(" Step\t\t\tParameter Estimate\n"); - System.out.println("------------------------------------------------------"); - for(int i = 0; i < nstep; i++){ - System.out.printf(" %d", (i + 1)); - for(int j = 0; j < ip; j++){ - System.out.printf("\t%.3f", b[j + (i * nstep)]); - } - System.out.printf("\n"); - } - System.out.println(); - System.out.printf("alpha: %.3f\n", fitsum[nstep * 6]); - System.out.println(); - System.out.printf(" Step Sum\tRSS\t df\t Cp\t Ck\tStep Size\n"); - System.out.println("---------------------------------------------------------"); - for(int k = 0; k < nstep; k++){ - System.out.printf(" %d %.3f\t%.3f %d\t %.3f\t %.3f %.3f\n", (k + 1), fitsum[k * nstep], fitsum[(k * nstep) + 1], - (int)(Math.floor(fitsum[(k + nstep) + 2] + 0.5)), fitsum[(k * nstep) + 3], - fitsum[(k * nstep) + 4], fitsum[(k * nstep) + 5]); - } - System.out.println(); - System.out.printf("sigma^2: %.3f\n", fitsum[(nstep * 6) + 4]); - } -} diff --git a/simple_examples/G03GAJE.java b/simple_examples/G03GAJE.java deleted file mode 100644 index ba20592..0000000 --- a/simple_examples/G03GAJE.java +++ /dev/null @@ -1,355 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; -import com.nag.routines.G03.G03GA; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * G03GAJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G03GAJE{ - - /** - * G03GAJ example main program. - */ - public static void main(String[] args){ - int i, ldx, lprob, riter, lds, sds, ifail = 0; - double[] w, g, s, f; - double tol, loglik = 0; - - if(args.length != 1){ - G03GAJE.usage(); - } - - // Data file name as argument - String filename = args[0]; - // DataHolder object to hold data read in from data file - DataHolder data = new DataHolder(); - - readDataFile(filename, data); - - System.out.println(" G03GAJ Example Program Results"); - System.out.println(); - - // Leading dimensions - ldx = data.n; - lprob = data.n; - - - switch(data.sopt){ - case 1: - s = new double[data.nvar * data.nvar * data.ng]; - lds = data.nvar; - sds = data.nvar; - break; - case 2: - s = new double[data.nvar * data.nvar * 1]; - lds = data.nvar; - sds = data.nvar; - break; - case 3: - s = new double[data.nvar * data.ng * 1]; - lds = data.nvar; - sds = data.ng; - break; - case 4: - s = new double[data.nvar * 1 * 1]; - lds = data.nvar; - sds = 1; - break; - default: - s = new double[1 * 1 * 1]; - lds = 1; - sds = 1; - break; - } - - // Allocate array size - g = new double[data.nvar * data.ng]; - w = new double[data.ng]; - f = new double[data.n * data.ng]; - tol = 0.0; - riter = 5; - - ifail = 0; - - // Create g03ga object with variables from data file - G03GA g03ga = new G03GA(data.n, data.m, data.x, ldx, data.isx, data.nvar, data.ng, data.popt, data.prob, - lprob, data.niter, riter, w, g, data.sopt, s, lds, sds, f, tol, loglik, ifail); - - // Run routine - g03ga.eval(); - - // Update variables - data.n = g03ga.getN(); - data.m = g03ga.getM(); - data.x = g03ga.getX(); - ldx = g03ga.getLDX(); - data.isx = g03ga.getISX(); - data.nvar = g03ga.getNVAR(); - data.ng = g03ga.getNG(); - data.popt = g03ga.getPOPT(); - data.prob = g03ga.getPROB(); - lprob = g03ga.getLPROB(); - data.niter = g03ga.getNITER(); - riter = g03ga.getRITER(); - w = g03ga.getW(); - g = g03ga.getG(); - data.sopt = g03ga.getSOPT(); - s = g03ga.getS(); - lds = g03ga.getLDS(); - sds = g03ga.getSDS(); - f = g03ga.getF(); - tol = g03ga.getTOL(); - loglik = g03ga.getLOGLIK(); - ifail = g03ga.getIFAIL(); - - // Results - X04CA x04ca = new X04CA(); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", 1, data.ng, w, 1, "Mixing proportions", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, g, data.nvar, "Group means", ifail); - - System.out.println(); - switch(data.sopt){ - case 1: - for(i = 0; i < data.ng; i++){ - ifail = 0; - // Wrapper returns a 1-dimensional array so X04CA has to be called like this to mimic - // calling X04CA along the 3rd dimension - x04ca.eval("g", "n", data.nvar, data.nvar, - Arrays.copyOfRange(s, (i * (data.nvar * data.nvar)), (data.nvar * data.nvar * data.ng)), - lds, "Variance-cavariance matrix", ifail); - } - break; - case 2: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.nvar, s, lds, "Pooled Variance-covariance matrix", ifail); - break; - case 3: - ifail = 0; - x04ca.eval("g", "n", data.nvar, data.ng, s, lds, "Groupwise Variance", ifail); - break; - case 4: - ifail = 0; - x04ca.eval("g", "n", data.nvar, 1, s, lds, "Pooled Variance", ifail); - break; - case 5: - ifail = 0; - x04ca.eval("g", "n", 1, 1, s, lds, "Overall Variance", ifail); - break; - } - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, f, data.n, "Densities", ifail); - - System.out.println(); - ifail = 0; - x04ca.eval("g", "n", data.n, data.ng, data.prob, data.n, "Membership probabilities", ifail); - - System.out.println(); - System.out.println("No. iterations: " + data.niter); - System.out.printf("Log-likelihood: %.04f\n", loglik); - } - - /** - * Read data from given filename and puts into DataHolder object - * @param filename - * Name of data file (absolute or relative path) - * @param data - * DataHolder object to store data from data file - */ - public static void readDataFile(String filename, DataHolder data){ - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - // Problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - data.setN(Integer.parseInt(sVal[0])); - data.setM(Integer.parseInt(sVal[1])); - data.setNvar(Integer.parseInt(sVal[2])); - - // Number of groups - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNg(Integer.parseInt(sVal[0])); - - // Scaling option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setSopt(Integer.parseInt(sVal[0])); - - // Initial probabilities option - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setPopt(Integer.parseInt(sVal[0])); - - // Maximum number of iterations - line = reader.readLine(); - sVal = line.split("\\s+"); - data.setNiter(Integer.parseInt(sVal[0])); - - // - data.x = new double[data.m * data.n]; - data.prob = new double[data.ng * data.n]; - data.isx = new int[data.m]; - - //Data matrix X - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.m; ++j){ - data.x[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - - //Included variables - if(data.nvar != data.m){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int i = 0; i < data.m; ++i){ - data.isx[i] = Integer.parseInt(sVal[i]); - } - } - - - //Optionally read initial probabilities of group memebership (included in example data) - if(data.popt == 2){ - for(int i = 0; i < data.n; ++i){ - line = reader.readLine().trim(); - sVal = line.split("\\s+"); - for(int j = 0; j < data.ng; ++j){ - data.prob[i + (j * data.n)] = Double.parseDouble(sVal[j]); - } - } - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - } - - /** - * Stores data from data file for later reference - */ - private static class DataHolder{ - private int n; - private int m; - private int nvar; - private int ng; - private int sopt; - private int popt; - private int niter; - private int isx[]; - private double x[]; - private double prob[]; - - public void setN(int n){ - this.n = n; - } - - public int getN(){ - return n; - } - - public void setM(int m){ - this.m = m; - } - - public int getM(){ - return m; - } - - public void setNvar(int nvar){ - this.nvar = nvar; - } - - public int getNvar(){ - return nvar; - } - - public void setNg(int ng){ - this.ng = ng; - } - - public int getNg(){ - return ng; - } - - public void setSopt(int sopt){ - this.sopt = sopt; - } - - public int getSopt(){ - return sopt; - } - - public void setPopt(int popt){ - this.popt = popt; - } - - public int getPopt(){ - return popt; - } - - public void setNiter(int niter){ - this.niter = niter; - } - - public int getNiter(){ - return niter; - } - - public void setIsx(int[] isx){ - this.isx = isx; - } - - public int[] getIsx(){ - return isx; - } - - public void setX(double[] x){ - this.x = x; - } - - public double[] getX(){ - return x; - } - - public void setProb(double[] prob){ - this.prob = prob; - } - - public double[] getProb(){ - return prob; - } - } - - /** - * No arguments supplied when example runs - */ - private static void usage() { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} - diff --git a/simple_examples/G05KFJE.java b/simple_examples/G05KFJE.java deleted file mode 100644 index 18ce755..0000000 --- a/simple_examples/G05KFJE.java +++ /dev/null @@ -1,105 +0,0 @@ -import com.nag.routines.G05.G05KF; -import com.nag.routines.G05.G05SA; -import com.nag.routines.Routine; -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -/** - * G05KFJ example program text. - * @author willa - * @since 27.0.0.0 - */ -public class G05KFJE{ - - /** - * G05KFJ example main program. - */ - public static void main(String[] args){ - //genid, subid only initilised so they can be set in try{} without java throwing error - int lseed = 1, nin = 5, nout = 6, genid = 0, n = 0, subid = 0; - int ifail, lstate; - int[] seed, state; - double x[]; - - System.out.println("G05KFJ Example Program Results"); - System.out.println(); - - //No file input given - if(args.length != 1){ - G05KFJE.usage(); - } - - seed = new int[lseed]; - - //Read in data from data fiel - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the base generator information and seed - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - genid = Integer.parseInt(sVal[0]); - subid = Integer.parseInt(sVal[1]); - seed[0] = Integer.parseInt(sVal[2]); - - //Read in sample size - line = reader.readLine(); - sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - lstate = 0; - ifail = 0; - state = new int[lstate]; - - //Initial call to get size of STATE array - G05KF g05kf = new G05KF(genid, subid, seed, lseed, state, lstate, ifail); - g05kf.eval(); - - //Update local variables - lstate = g05kf.getLSTATE(); - state = g05kf.getSTATE(); - - //Reallocate STATE - state = new int[lstate]; - - //Update object variables - g05kf.setSTATE(state); - g05kf.eval(); - - //Update local variables - state = g05kf.getSTATE(); - - x = new double[n]; - - //Generate the variates - ifail = 0; - G05SA g05sa = new G05SA(n, state, x, ifail); - g05sa.eval(); - - //Display the variates - for(int i = 0; i < x.length; i++){ - System.out.printf("%.4f\n", x[i]); - } - } - - /** - * Print usage information. - */ - private static void usage(){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } -} diff --git a/simple_examples/G13AWJE.java b/simple_examples/G13AWJE.java deleted file mode 100644 index 9e829bd..0000000 --- a/simple_examples/G13AWJE.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.nag.routines.G01.G01EW; -import com.nag.routines.G13.G13AW; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * G13AW example program text. - */ -public class G13AWJE { - - public static void main(String[] args) { - - int n = 30, type = 1, p = 1, ifail = 1, method = 1, nsamp = 0; - double[] y = {-217.,-177.,-166.,-136.,-110.,-95.,-64.,-37.,-14.,-25.,-51., - -62.,-73.,-88.,-113.,-120.,-83.,-33.,-19.,21.,17.,44.,44.,78., - 88.,122.,126.,114.,85.,64}; - int[] state = new int[1]; - G13AW g13aw = new G13AW(type, p, n, y, ifail); - System.out.println(" G13AWJ Example Program Results\n"); - double ts = g13aw.eval(); - G01EW g01ew = new G01EW(method,type,n,ts,nsamp,state,ifail); - double pvalue = g01ew.eval(); - ifail = g01ew.getIFAIL(); - if (ifail == 0 || ifail == 201) { - System.out.printf("Dickey-Fuller test statistic = %6.3f\n", ts); - System.out.printf("associated p-value = %6.3f\n", pvalue); - } - - } - -} diff --git a/simple_examples/G13MEJE.java b/simple_examples/G13MEJE.java deleted file mode 100644 index a768a46..0000000 --- a/simple_examples/G13MEJE.java +++ /dev/null @@ -1,160 +0,0 @@ -import com.nag.routines.G13.G13ME; - -/** - * G13MEJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13MEJE{ - - /** - * G13MEJ main program - */ - public static void main(String[] args){ - double tau; - int ifail, lrcomm, m, nb, pn; - double[] iema, rcomm, sinit, t; - int[] inter, nbVal; - - inter = new int[2]; - - System.out.println("G13MEJ Example Program Results"); - System.out.println(); - - //data (can read in from data file) - //Number of iteration required - m = 2; - - //Decay parameter and interpolation method - tau = 2; - inter[0] = 3; - inter[1] = 2; - - //Initial values - sinit = new double[m + 2]; - sinit[0] = 5; - sinit[1] = 0.5; - sinit[2] = 0.5; - sinit[3] = 0.5; - - //Array of NB values in order - nbVal = new int[3]; - nbVal[0] = 5; - nbVal[1] = 10; - nbVal[2] = 15; - - //First block - double[] t1 = new double[nbVal[0]]; - double[] iema1 = new double[nbVal[0]]; - t1[0] = 7.5; - t1[1] = 8.2; - t1[2] = 18.1; - t1[3] = 22.8; - t1[4] = 25.8; - iema1[0] = 0.6; - iema1[1] = 0.6; - iema1[2] = 0.8; - iema1[3] = 0.1; - iema1[4] = 0.2; - - //Second block - double[] t2 = new double[nbVal[1]]; - double[] iema2 = new double[nbVal[1]]; - t2[0] = 26.8; - t2[1] = 31.1; - t2[2] = 38.4; - t2[3] = 45.9; - t2[4] = 48.2; - t2[5] = 48.9; - t2[6] = 57.9; - t2[7] = 58.5; - t2[8] = 63.9; - t2[9] = 65.2; - iema2[0] = 0.2; - iema2[1] = 0.5; - iema2[2] = 0.7; - iema2[3] = 0.1; - iema2[4] = 0.4; - iema2[5] = 0.7; - iema2[6] = 0.8; - iema2[7] = 0.3; - iema2[8] = 0.2; - iema2[9] = 0.5; - - //Third block - double[] t3 = new double[nbVal[2]]; - double[] iema3 = new double[nbVal[2]]; - t3[0] = 66.6; - t3[1] = 67.4; - t3[2] = 69.3; - t3[3] = 69.9; - t3[4] = 73.0; - t3[5] = 75.6; - t3[6] = 77.0; - t3[7] = 84.7; - t3[8] = 86.8; - t3[9] = 88.0; - t3[10] = 88.5; - t3[11] = 91.0; - t3[12] = 93.0; - t3[13] = 93.7; - t3[14] = 94.0; - iema3[0] = 0.2; - iema3[1] = 0.3; - iema3[2] = 0.8; - iema3[3] = 0.6; - iema3[4] = 0.1; - iema3[5] = 0.7; - iema3[6] = 0.9; - iema3[7] = 0.6; - iema3[8] = 0.3; - iema3[9] = 0.1; - iema3[10] = 0.1; - iema3[11] = 0.4; - iema3[12] = 1.0; - iema3[13] = 1.0; - iema3[14] = 0.1; - - //Print some titles - System.out.printf("\t\t\tIterated\n"); - System.out.println("\t\tTime\t EMA\n"); - System.out.println("--------------------------------"); - - lrcomm = 20 + m; - rcomm = new double[lrcomm]; - - pn = 0; - - //Loop through 3 blocks - for(int i = 0; i < nbVal.length; i++){ - //nb for given block - nb = nbVal[i]; - - //Use data for current block - if(i == 0){ - t = t1; - iema = iema1; - } - else if(i == 1){ - t = t2; - iema = iema2; - } - else{ - t = t3; - iema = iema3; - } - - ifail = 0; - G13ME g13me = new G13ME(nb, iema, t, tau, m, sinit, inter, pn, rcomm, lrcomm, ifail); - g13me.eval(); - pn = g13me.getPN(); - - //Display results for this block of data - for(int j = 0; j < nb; j++){ - System.out.printf("\t%d\t%.1f\t%.3f\n", pn - nb + (j + 1), t[j], iema[j]); - } - System.out.println(); - } - } -} - diff --git a/simple_examples/G13NAJE.java b/simple_examples/G13NAJE.java deleted file mode 100644 index 2032eb1..0000000 --- a/simple_examples/G13NAJE.java +++ /dev/null @@ -1,123 +0,0 @@ -import com.nag.routines.G13.G13NA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * G13NAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class G13NAJE{ - - /** - * G13NAJ example main program - */ - public static void main(String[] args){ - double beta = 0; - int ctype = 0, ifail, iparam = 0, minss = 0, n = 0, ntau = 0; //placeholder - double[] param, sparam, y; - int[] tau; - - param = new double[1]; - //Placeholder y to be read in from data file - y = new double[0]; - - System.out.println("G13NAJ Example Program Results"); - System.out.println(); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Read in the problem size - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - n = Integer.parseInt(sVal[0]); - - //Allocate enough size to hold the input series - y = new double[n]; - - //Read in the input series - for(int i = 0; i < 10; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - for(int j = 0; j < 10; j++){ - y[(i * 10) + j] = Double.parseDouble(sVal[j]); - } - } - - //Read in the type of change point, penalty and minimum segment size - line = reader.readLine(); - sVal = line.split("\\s+"); - ctype = Integer.parseInt(sVal[0]); - iparam = Integer.parseInt(sVal[1]); - beta = Double.parseDouble(sVal[2]); - minss = Integer.parseInt(sVal[3]); - - //Read in the distribution parameter (if required) - if(iparam == 1){ - line = reader.readLine(); - sVal = line.split("\\s+"); - param[0] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - System.exit(-2); - } - - //Output arrays - tau = new int[n]; - sparam = new double[(2 * n) + 2]; - - ifail = -1; - - //Call routine to detece change points - G13NA g13na = new G13NA(ctype, n, y, beta, minss, iparam, param, ntau, tau, sparam, ifail); - g13na.eval(); - - //update - ifail = g13na.getIFAIL(); - ctype = g13na.getCTYPE(); - ntau = g13na.getNTAU(); - - if(ifail == 0 || ifail == 200 || ifail == 201){ - //Display the results - if(ctype == 5 || ctype == 6){ - //Exponential or Poisson distribtion - System.out.printf(" -- Charge Points -- Distribution\n"); - System.out.printf(" Number Position Parameter \n"); - System.out.println("====================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t%.2f", i + 1, tau[i], sparam[i]); - } - - } - else{ - //Normal of Gamma distribution - System.out.printf(" -- Charge Points -- --- Distribution ---\n"); - System.out.printf(" Number Position Parameters\n"); - System.out.println("================================================="); - for(int i = 0; i < ntau; i++){ - System.out.printf(" %d\t %d\t %.2f\t %.2f\n", (i + 1), tau[i], sparam[2 * i], sparam[(2 * i) + 1]); - } - } - } - if(ifail == 200 || ifail == 201){ - System.out.println("Some truncation occured internally to avoid overflow"); - } - } -} diff --git a/simple_examples/H02BBJE.java b/simple_examples/H02BBJE.java deleted file mode 100644 index 04f4207..0000000 --- a/simple_examples/H02BBJE.java +++ /dev/null @@ -1,92 +0,0 @@ -import com.nag.routines.H.H02BB; - -/** - * H02BBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class H02BBJE{ - - /** - * H02BBJ example main program - */ - public static void main(String[] args){ - double bigbnd, objmip = 0, tolfes, toliv; - int ifail, intfst, itmax, lda, liwork, lrwork, m, maxdpt, maxnod, msglvl, n; - double[] a, bl, bu, cvec, rwork, x; - int[] intvar, iwork; - - System.out.println("H02BBJ Example Program Results"); - System.out.println(); - - //Data (can be read in from data file) - n = 2; - m = 3; - lda = m; - - a = new double[lda * n]; - bl = new double[m + n]; - bu = new double[m + n]; - cvec = new double[n]; - x = new double[n]; - intvar = new int[n]; - - itmax = 0; - msglvl = 10; - maxnod = 0; - intfst = 0; - maxdpt = 4; - tolfes = 0; - toliv = 0; - - cvec[0] = -3; - cvec[1] = -4; - - //A = ( 2, 5) - // ( 2, -2) - // ( 3, 2) - a[0] = 2; - a[1] = 2; - a[2] = 3; - a[3] = 5; - a[4] = -2; - a[5] = 2; - - bigbnd = 1E+20; - - bl[0] = 0; - bl[1] = 0; - bl[2] = -1E+20; - bl[3] = -1E+20; - bl[4] = 5; - - bu[0] = 1E+20; - bu[1] = 1E+20; - bu[2] = 15; - bu[3] = 5; - bu[4] = 1E+20; - - intvar[0] = 1; - intvar[1] = 1; - - x[0] = 1; - x[1] = 1; - - liwork = ((25 + n + m) * maxdpt) + (5 * n) + m + 4; - //Math.pow() needs to be casted to int in java - lrwork = (maxdpt * (n + 1)) + (2 * (int)Math.pow(Math.min(n, m + 1), 2)) + (14 * n) + (12 * m); - iwork = new int[liwork]; - rwork = new double[lrwork]; - - ifail = 0; - - H02BB h02bb = new H02BB(itmax, msglvl, n, m, a, lda, bl, bu, intvar, cvec, maxnod, intfst, maxdpt, toliv, - tolfes, bigbnd, x, objmip, iwork, liwork, rwork, lrwork, ifail); - h02bb.eval(); - } -} - - - - - diff --git a/simple_examples/H02DAJE.java b/simple_examples/H02DAJE.java deleted file mode 100644 index 6e90401..0000000 --- a/simple_examples/H02DAJE.java +++ /dev/null @@ -1,228 +0,0 @@ -import com.nag.routines.H.H02DA; -import com.nag.routines.H.H02ZK; -import com.nag.routines.H.H02ZL; -import com.nag.routines.X04.X04CA; -import java.util.Arrays; - -/** - * H02DAJ exmaple program text - * @author willa - * @since 27.1.0.0 - */ -public class H02DAJE{ - - /** - * H02DAJ example main program - */ - public static void main(String[] args){ - double acc, accqp = 0, objmip = 0; - int ifail, ivalue = 0, lda, liopts, lopts, maxit, n, nclin, ncnln, optype = 0; - String cvalue; - double[] a, ax, bl, bu, c, cjac, d, objgrd, x, opts, ruser; - int[] iopts, iuser, varcon; - - System.out.println("H02DAJ Example Program Results"); - System.out.println(); - - opts = new double[100]; - ruser = new double[1]; - iopts = new int[200]; - iuser = new int[1]; - - //Blank 40 character string to represent ```Character (40) :: cvalue``` - char[] ch = new char[40]; - Arrays.fill(ch, ' '); - cvalue = new String(ch); - - n = 8; - nclin = 5; - ncnln = 2; - lda = nclin; - - a = new double[lda * n]; - d = new double[nclin]; - ax = new double[nclin]; - bl = new double[n]; - bu = new double[n]; - varcon = new int[n + nclin + ncnln]; - x = new double[n]; - c = new double[ncnln]; - cjac = new double[ncnln * n]; - objgrd = new double[n]; - - //Set variable types: continuous then binary - varcon[0] = 0; - varcon[1] = 0; - varcon[2] = 0; - varcon[3] = 0; - varcon[4] = 1; - varcon[5] = 1; - varcon[6] = 1; - varcon[7] = 1; - - //Set continuous variable bounds - bl[0] = 0; - bl[1] = 0; - bl[2] = 0; - bl[3] = 0; - bu[0] = 1000; - bu[1] = 1000; - bu[2] = 1000; - bu[3] = 1000; - - //Bounds for binary variables need not be provided - bl[4] = 0; - bl[5] = 0; - bl[6] = 0; - bl[7] = 0; - bu[4] = 1; - bu[5] = 1; - bu[6] = 1; - bu[7] = 1; - - //Set linear constraint, equality first - varcon[n] = 3; - varcon[n + 1] = 4; - varcon[n + 2] = 4; - varcon[n + 3] = 4; - varcon[n + 4] = 4; - - //Set Ax=d then Ax>=d - //( 1, 1, 1, 1, 0, 0, 0, 0) - //(-1, 0, 0, 0, 1, 0, 0, 0) - //( 0,-1, 0, 0, 0, 1, 0, 0) - //( 0, 0,-1, 0, 0, 0, 1, 0) - //( 0, 0, 0,-1, 0, 0, 0, 1) - a[0] = 1; - a[1] = -1; - a[5] = 1; - a[7] = -1; - a[10] = 1; - a[13] = -1; - a[15] = 1; - a[19] = -1; - a[21] = 1; - a[27] = 1; - a[33] = 1; - a[39] = 1; - d[0] = 1; - d[1] = 0; - d[2] = 0; - d[3] = 0; - d[4] = 0; - - //Set constraints supplied by CONFUN, equality first - varcon[n + nclin] = 3; - varcon[n + nclin + 1] = 4; - - liopts = iopts.length; - lopts = opts.length; - - //Initialize communication arrays - ifail = 0; - H02ZK h02zk = new H02ZK("Initialize = H02DAF", iopts, liopts, opts, lopts, ifail); - h02zk.eval(); - - - //Optimization parameters - maxit = 500; - acc = 0.000001; - - //Initial estimate (binary variables need not be given) - x[0] = 1; - x[1] = 1; - x[2] = 1; - x[3] = 1; - x[4] = 0; - x[5] = 0; - x[6] = 0; - x[7] = 0; - - //Portfolio parameters p and rho - iuser[0] = 3; - ruser[0] = 10; - - ifail = 0; - //Create objfun1, confun1 to pass to H02DA representing repsecitve subroutines - objfun objfun1 = new objfun(); - confun confun1 = new confun(); - H02DA h02da = new H02DA(n, nclin, ncnln, a, lda, d, ax, bl, bu, varcon, x, confun1, c, cjac, objfun1, - objgrd, maxit, acc, objmip, iopts, opts, iuser, ruser, ifail); - h02da.eval(); - - //Results - ifail = h02da.getIFAIL(); - if(ifail == 0){ - X04CA x04ca = new X04CA("G", "N", n, 1, x, n, "Final Esimate:", ifail); - x04ca.eval(); - - //Query the accuracy of the mixed integer QP Solver - ifail = -1; - H02ZL h02zl = new H02ZL("QP Accuracy", ivalue, accqp, cvalue, optype, iopts, opts, ifail); - h02zl.eval(); - - //Update values to print - accqp = h02zl.getRVALUE(); - objmip = h02da.getOBJMIP(); - ifail = h02zl.getIFAIL(); - if(ifail == 0){ - System.out.printf("Requested accuracy of QP subproblems\t%.4e\n", accqp); - } - System.out.printf("Optimised value:\t%.3f\n", objmip); - } - else{ - System.out.printf("h02daf returns ifail = %d\n", ifail); - } - } - - /** - * objfun class extending Abstract_H02DA_OBJFUN to represent objfun subroutine for passing to H02DA - */ - public static class objfun extends H02DA.Abstract_H02DA_OBJFUN{ - public void eval(){ - if(this.MODE == 0){ - //Objective value - this.OBJMIP = (this.X[0] * ((4 * this.X[0]) + (3 * this.X[1]) - this.X[2])) - + (this.X[1] * ((3 * this.X[0]) + (6 * this.X[1]) + this.X[2])) - + (this.X[2] * (this.X[1] - this.X[0] + (10 * this.X[2]))); - } - else{ - //Objective gradients for continous varaiables - this.OBJGRD[0] = (8 * this.X[0]) + (6 * this.X[1]) - (2 * this.X[2]); - this.OBJGRD[1] = (6 * this.X[0]) + (12 * this.X[1]) + (2 * this.X[2]); - this.OBJGRD[2] = (2 * (this.X[1] - this.X[0])) + (20 * this.X[2]); - this.OBJGRD[3] = 0; - } - } - } - - /** - * confun class extending Abstract_H02DA_CONFUN to represent confun subroutine for passing to H02DA - */ - public static class confun extends H02DA.Abstract_H02DA_CONFUN{ - public void eval(){ - if(this.MODE == 0){ - //Constraints - int p = this.IUSER[0]; - double rho = this.RUSER[0]; - - //Mean return rho: - this.C[0] = (8 * this.X[0]) + (9 * this.X[1]) + (12 * this.X[2]) + (7 * this.X[3]) - rho; - //Maximum of p assets in portfolio - this.C[1] = p - this.X[4] - this.X[5] - this.X[6] - this.X[7]; - } - else{ - //Jacobian - this.CJAC[0] = 8; - this.CJAC[2] = 9; - this.CJAC[4] = 12; - this.CJAC[6] = 7; - //c[2] does not include continuours varaibles which requries that their derivatives are zero - this.CJAC[1] = 0; - this.CJAC[3] = 0; - this.CJAC[5] = 0; - this.CJAC[7] = 0; - } - } - } -} diff --git a/simple_examples/M01CCJE.java b/simple_examples/M01CCJE.java deleted file mode 100644 index fda5e2f..0000000 --- a/simple_examples/M01CCJE.java +++ /dev/null @@ -1,42 +0,0 @@ -import com.nag.routines.M01.M01CC; -import java.io.*; - -/** - * M01CC example program text. - */ -public class M01CCJE { - - public static void main(String[] args) throws Exception { - - String[] ch; - String order = "Reverse ASCII"; - int m1,m2,l1,l2; - int ifail = 0; - - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - m2 = Integer.parseInt(dataIn.readLine().trim().split(":+")[0].trim()); - ch = new String[m2]; - m1 = 1; - for (int i = m1-1; i < m2; ++i) { - ch[i] = dataIn.readLine(); - } - dataIn.close(); - l1 = 7; - l2 = 12; - - System.out.println(" M01CCJ Example Program Results"); - M01CC m01cc = new M01CC(ch, m1, m2, l1, l2, order, ifail); - m01cc.eval(); - ifail = m01cc.getIFAIL(); - System.out.println(); - System.out.printf(" Records sorted on columns %2d to %2d\n",l1,l2); - System.out.println(); - for (int i = m1-1; i < m2; ++i) { - System.out.println(" "+ch[i]); - } - - } - -} diff --git a/simple_examples/S01BAJE.java b/simple_examples/S01BAJE.java deleted file mode 100644 index 4bf2823..0000000 --- a/simple_examples/S01BAJE.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.nag.routines.S.S01BA; - -/** - * S01BAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S01BAJE{ - - /** - * S01BAJE main program - */ - public static void main(String[] args){ - double y; - int ifail; - double[] xVal; //data - - //store data - xVal = new double[6]; - xVal[0] = 2.5; - xVal[1] = 0.125; - xVal[2] = -0.906; - xVal[3] = 0.00129; - xVal[4] = -0.00000783; - xVal[5] = 0.000000001; - - System.out.println("S01BAJ Example Program Results"); - System.out.println(); - System.out.printf("\tX\t\tY\n"); - - for(double x : xVal){ - ifail = -1; - S01BA s01ba = new S01BA(x, ifail); - y = s01ba.eval(); - - System.out.printf("\t%.4e\t%.4e\n", x, y); - } - } -} diff --git a/simple_examples/S10AAJE.java b/simple_examples/S10AAJE.java deleted file mode 100644 index 2a0878a..0000000 --- a/simple_examples/S10AAJE.java +++ /dev/null @@ -1,40 +0,0 @@ -import com.nag.routines.S.S10AA; - -/** - * S10AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10AAJE{ - - /** - * S10AAJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[4]; - xVal[0] = -20; - xVal[1] = -5.0; - xVal[2] = 0.5; - xVal[3] = 5.0; - - System.out.println("S10AAJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AA s10aa = new S10AA(x, ifail); - y = s10aa.eval(); - ifail = s10aa.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/S10ABJE.java b/simple_examples/S10ABJE.java deleted file mode 100644 index dd84ab7..0000000 --- a/simple_examples/S10ABJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AB; - -/** - * S10ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ABJE{ - - /** - * S10ABJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ABJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AB s10ab = new S10AB(x, ifail); - y = s10ab.eval(); - ifail = s10ab.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/S10ACJE.java b/simple_examples/S10ACJE.java deleted file mode 100644 index cc0c04c..0000000 --- a/simple_examples/S10ACJE.java +++ /dev/null @@ -1,41 +0,0 @@ -import com.nag.routines.S.S10AC; - -/** - * S10ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S10ACJE{ - - /** - * S10ACJ example main program - */ - public static void main(String[] args){ - double y; - double[] xVal; - int ifail; - - //x values (can be read in from data file) - xVal = new double[5]; - xVal[0] = -10; - xVal[1] = -0.5; - xVal[2] = 0; - xVal[3] = 0.5; - xVal[4] = 25.0; - - System.out.println("S10ACJ Example Program Results"); - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - for(double x : xVal){ - ifail = -1; - S10AC s10ac = new S10AC(x, ifail); - y = s10ac.eval(); - ifail = s10ac.getIFAIL(); - - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } -} diff --git a/simple_examples/S14ABJE.java b/simple_examples/S14ABJE.java deleted file mode 100644 index 673a4b3..0000000 --- a/simple_examples/S14ABJE.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.nag.routines.S.S14AB; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ABJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ABJE{ - - /** - * S14ABJ example main program - */ - public static void main(String[] args){ - double x, y; - int ifail; - - System.out.println("S14ABJ Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\t\tY"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //loop until break - while(true){ - line = reader.readLine(); - - //if finished looping through file break - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[1]); - - ifail = -1; - S14AB s14ab = new S14AB(x, ifail); - y = s14ab.eval(); - //update ifail - ifail = s14ab.getIFAIL(); - - if(ifail < 0){ - break; - } - System.out.printf("\t%.3e\t%.3e\n", x, y); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/S14ACJE.java b/simple_examples/S14ACJE.java deleted file mode 100644 index e2fff05..0000000 --- a/simple_examples/S14ACJE.java +++ /dev/null @@ -1,68 +0,0 @@ -import com.nag.routines.S.S14AC; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14ACJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14ACJE{ - - /** - * S14ACJ example main program - */ - public static void main(String[] args){ - double f, x; - int ifail; - - System.out.println("S14ACJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - System.out.println(); - System.out.printf("\tX\tpsi(X)-log(X)\n"); - System.out.println(); - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //Loop until break... - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - - x = Double.parseDouble(sVal[0]); - - ifail = -1; - S14AC s14ac = new S14AC(x, ifail); - f = s14ac.eval(); - ifail = s14ac.getIFAIL(); - - if(ifail < 0){ - break; - } - - System.out.printf("\t%.4f\t%.4f\n", x, f); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/S14AFJE.java b/simple_examples/S14AFJE.java deleted file mode 100644 index 9005cc1..0000000 --- a/simple_examples/S14AFJE.java +++ /dev/null @@ -1,80 +0,0 @@ -import com.nag.routines.S.S14AF; -import com.nag.routines.Routine; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S14AFJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class S14AFJE{ - - /** - * S14AFJ Example main program - */ - public static void main(String[] args){ - NAGComplex y, z; - int ifail, k; - - //Tell the wrapper the type of complex being used before calling a routine - Routine.setComplex(new NAGComplex()); - - y = new NAGComplex(); - z = new NAGComplex(); - - System.out.println("S14AFJ Example Program Results"); - - //Supply file path as terminal input - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); - - System.out.println(); - System.out.println("\tZ\t\tK\t(d^K/dz^K)psi(Z)"); - System.out.println(); - - //loop until break... - while(true){ - line = reader.readLine(); - - //end of file reached - if(line == null){ - break; - } - - String[] sVal = line.split("\\s+"); - z.setRe(Double.parseDouble(sVal[0])); - z.setIm(Double.parseDouble(sVal[1])); - k = Integer.parseInt(sVal[2]); - - ifail = -1; - S14AF s14af = new S14AF(z, k, ifail); - y = (NAGComplex) s14af.eval(); - ifail = s14af.getIFAIL(); - - //ifail < 0 => error - if(ifail < 0){ - break; - } - System.out.printf("\t(%.1f, %.1f)\t%d\t(%.4e, %.4e)\n", z.getRe(), z.getIm(), k, y.getRe(), y.getIm()); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} diff --git a/simple_examples/S17DCJE.java b/simple_examples/S17DCJE.java deleted file mode 100644 index ba01290..0000000 --- a/simple_examples/S17DCJE.java +++ /dev/null @@ -1,69 +0,0 @@ -import com.nag.routines.S.S17DC; -import com.nag.types.NAGComplex; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class S17DCJE{ - private static int n = 2; - - public static void main(String[] args){ - double fnu; - int ifail, nz = 0; - String scal; - NAGComplex z; - NAGComplex[] cwrk, cy; - - z = new NAGComplex(); - //initiate complex arrays like this to save looping through and doing it manually by looping through - cwrk = NAGComplex.createArray(n); - cy = NAGComplex.createArray(n); - - System.out.println("S17DCF Example Program Results"); - - //Supply file path as argument - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - System.out.println(); - System.out.printf("Calling with N = %d\n", n); - System.out.println(); - System.out.printf("FNU\tZ\t\t\tSCAL\tCY[0]\t\t\tCY[1]\t\t\tNZ"); - System.out.println(); - - while(true){ - line = reader.readLine(); - if(line == null){ - break; - } - String[] sVal = line.split("\\s+"); - fnu = Double.parseDouble(sVal[0]); - z.setRe(Double.parseDouble(sVal[1])); - z.setIm(Double.parseDouble(sVal[2])); - scal = sVal[3].substring(1,2); - - ifail = 0; - S17DC s17dc = new S17DC(fnu, z, n, scal, cy, nz, cwrk, ifail); - s17dc.eval(); - - System.out.printf("%.4f\t(%.4f, %.4f)\t%s\t(%.4f, %.4f)\t(%.4f, %.4f)\t%d\n", fnu, z.getRe(), z.getIm(), scal, cy[0].getRe(), cy[0].getIm(), cy[1].getRe(), cy[1].getIm(), nz); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - } -} - diff --git a/simple_examples/S17DGJE.java b/simple_examples/S17DGJE.java deleted file mode 100644 index b93c9e0..0000000 --- a/simple_examples/S17DGJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.routines.S.S17DG; -import com.nag.types.NAGComplex; -import java.io.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * S17DG example program text. - */ -public class S17DGJE { - - public static void main(String[] args) throws Exception { - String deriv,scal; - int ifail = 1; - NAGComplex z,ai; - int nz = -1; - z = new NAGComplex(); - ai = new NAGComplex(); - ai.setRe(Double.NaN); - ai.setIm(Double.NaN); - - System.out.println(" S17DGJ Example Program Results"); - BufferedReader dataIn = new BufferedReader(new FileReader(args[0])); - - dataIn.readLine(); - System.out.println(); - System.out.println(" DERIV Z SCAL AI NZ"); - System.out.println(); - String line = dataIn.readLine(); - Pattern linePatt = Pattern.compile("\\s*'([A-Z]{1})'\\s+\\(\\s*([0-9\\.\\-]+)\\s*," - + "\\s*([0-9\\.\\-]+)\\s*\\)\\s+'([A-Z]{1})'\\s*"); - Matcher m; - S17DG s17dg = new S17DG(); - while (line != null) { - m = linePatt.matcher(line); - if (m.matches()) { - deriv = m.group(1); - z.setRe(Double.parseDouble(m.group(2))); - z.setIm(Double.parseDouble(m.group(3))); - scal = m.group(4); - ifail = 1;// SOFT AND SILENT FAILURE - s17dg.eval(deriv,z,scal,ai,nz,ifail); - if (s17dg.getIFAIL() == 0) { - System.out.printf(" %s (%8.4f,%8.4f) %s (%8.4f,%8.4f) %4d\n", - s17dg.getDERIV(), s17dg.getZ().getRe(), s17dg.getZ().getIm(), s17dg.getSCAL(), - s17dg.getAI().getRe(), s17dg.getAI().getIm(), s17dg.getNZ()); - } - else { - System.err.println("Something went wrong - S17DG returned IFAIL = "+s17dg.getIFAIL()); - System.exit(-1); - } - } - else { - System.out.println("Can't match:\n"+line); - } - line = dataIn.readLine(); - } - - } - -} diff --git a/simple_examples/S30AAJE.java b/simple_examples/S30AAJE.java deleted file mode 100644 index 7e01ffe..0000000 --- a/simple_examples/S30AAJE.java +++ /dev/null @@ -1,109 +0,0 @@ -import com.nag.routines.S.S30AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * S30AAJ Example program text - * @author willa - * @since 27.1.0.0 - */ -public class S30AAJE{ - - /** - * S30AAJ main program - */ - public static void main(String[] args){ - double q = 0, r = 0, s = 0, sigma = 0; - int ifail, ldp, m = 0, n = 0; - String calput = ""; //placeholders - double[] p, t, x; - - //placeholders - t = new double[0]; - x = new double[0]; - - System.out.println("S30AAJ Example Program Results"); - - //Supply file path as arugment - if(args.length != 1){ - System.out.println("Please specify path to data file"); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - calput = sVal[0].substring(1,2); - - line = reader.readLine(); - sVal = line.split("\\s+"); - s = Double.parseDouble(sVal[0]); - sigma = Double.parseDouble(sVal[1]); - r = Double.parseDouble(sVal[2]); - q = Double.parseDouble(sVal[3]); - - line = reader.readLine(); - sVal = line.split("\\s+"); - m = Integer.parseInt(sVal[0]); - n = Integer.parseInt(sVal[1]); - - t = new double[n]; - x = new double[m]; - - for(int i = 0; i < m; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - x[i] = Double.parseDouble(sVal[0]); - } - for(int i = 0; i < n; i++){ - line = reader.readLine(); - sVal = line.split("\\s+"); - t[i] = Double.parseDouble(sVal[0]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - ldp = m; - p = new double[ldp * n]; - - ifail = 0; - S30AA s30aa = new S30AA(calput, m, n, x, s, t, sigma, r, q, p, ldp, ifail); - s30aa.eval(); - - System.out.println(); - System.out.println("Black-Scholes-Merton formula"); - - if(calput.toLowerCase().equals("c")){ - System.out.println("European Call : "); - } - else if(calput.toLowerCase().equals("p")){ - System.out.println("European Put : "); - } - - System.out.printf(" Spot =\t%.4f\n", s); - System.out.printf(" Volatility =\t%.4f\n", sigma); - System.out.printf(" Rate =\t%.4f\n", r); - System.out.printf(" Dividend =\t%.4f\n", q); - - System.out.println(); - System.out.printf(" Strike\tExpiry\tOption Price\n"); - for(int i = 0; i < m; i++){ - for(int j = 0; j < n; j++){ - System.out.printf(" %.4f\t%.4f\t%.4f\n", x[i], t[j], p[i + (j * 3)]); - } - } - } -} - diff --git a/simple_examples/S30ACJE.java b/simple_examples/S30ACJE.java deleted file mode 100644 index 8d994dc..0000000 --- a/simple_examples/S30ACJE.java +++ /dev/null @@ -1,129 +0,0 @@ -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Arrays; - -import com.nag.routines.S.S30AC; - -/** - * S30AC example program text. - */ -public class S30ACJE { - - public static void main(String[] args) { - - int i, ifail, mode = 0, n = 0; - String calput; - - double[] k = null, p = null, r = null, s0 = null, sigma = null, t = null; - int[] ivalid = null; - - // Strings must be length expected by Fortran - calput = getBlankString(1); - - /* Header */ - System.out.println(" S30ACJ Example Program Results"); - - // Specify path to data file - if (args.length != 1) { - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); // skip header - - System.out.println(); - System.out.println(" SIGMA IVALID"); - System.out.println(); - - line = reader.readLine(); - String[] sVal = line.trim().split("\\s+"); - calput = sVal[0].replaceAll("\'", ""); - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - n = Integer.parseInt(sVal[0]); - mode = Integer.parseInt(sVal[1]); - - line = reader.readLine(); // skip empty line - - p = new double[n]; - k = new double[n]; - s0 = new double[n]; - t = new double[n]; - r = new double[n]; - sigma = new double[n]; - ivalid = new int[n]; - - // Read p, k, s0, t and r from data file - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - p[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - k[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - s0[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - t[i] = Double.parseDouble(sVal[i]); - } - - line = reader.readLine(); - sVal = line.trim().split("\\s+"); - for (i = 0; i < n; i++) { - r[i] = Double.parseDouble(sVal[i]); - } - - } catch (FileNotFoundException e) { - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } catch (IOException e) { - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - // Find the implied volatilities, sigma - ifail = 0; - S30AC s30ac = new S30AC(); - s30ac.eval(calput, n, p, k, s0, t, r, sigma, mode, ivalid, ifail); - - // Print solution - for (i = 0; i < n; i++) { - System.out.printf(" %12.3E%5d\n", sigma[i], ivalid[i]); - } - - } - - /** - * Returns a new String, filled with spaces to the specified length. - * - * @param len the required length of the String - * @return a blank String of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } -} diff --git a/simple_examples/X03AAJE.java b/simple_examples/X03AAJE.java deleted file mode 100644 index b03f1ab..0000000 --- a/simple_examples/X03AAJE.java +++ /dev/null @@ -1,87 +0,0 @@ -import com.nag.routines.X03.X03AA; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * X03AAJ example program text. - * @author willa - * @since 27.1.0.0 - */ -public class X03AAJE{ - - /** - * X03AAJ example main program. - */ - public static void main(String[] args){ - int n = 3; - double c1 = 0, c2 = 0, d1 = 0, d2 = 0; //placeholder - int ifail, isizea, isizeb, istepa, istepb; - boolean sw; - double[] a, b; - - a = new double[n * n]; - b = new double[n]; - - System.out.println("X03AAF Example Program Results"); - System.out.println(); - - if(args.length != 1){ - System.err.println("Please specify the path to the data file."); - System.exit(-1); - } - - String filename = args[0]; - try{ - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line = reader.readLine(); //skip header - - //stored column wise - //a = (-2, -3, 7) - // ( 2, -5, 3) - // (-9, 1, 0) - for(int i = 0; i < n; i++){ - line = reader.readLine(); - String[] sVal = line.split("\\s+"); - for(int j = 0; j < n; j++){ - a[i + (j * n)] = Double.parseDouble(sVal[j + 1]); - } - } - - line = reader.readLine(); - for(int i = 0; i < n; i++){ - String[] sVal = line.split("\\s+"); - b[i] = Double.parseDouble(sVal[i + 1]); - } - } - catch(FileNotFoundException e){ - System.err.println("***FATAL: Can't find " + filename); - System.exit(-2); - } - catch(IOException e){ - System.err.println("***FATAL: Can't read " + filename + "\n" + e.getMessage()); - } - - - c1 = 1; - c2 = 0; - isizea = n; - isizeb = n; - istepa = 1; - istepb = 1; - sw = true; - - ifail = 0; - X03AA x03aa = new X03AA(a , isizea, b, isizeb, n, istepa, istepb, c1, c2, d1, d2, sw, ifail); - x03aa.eval(); - - //update - c1 = x03aa.getC1(); - c2 = x03aa.getC2(); - d1 = x03aa.getD1(); - d2 = x03aa.getD2(); - - System.out.printf("D1 = %.1f D2 = %.1f\n", d1, d2); - } -} diff --git a/simple_examples/X04CBJE.java b/simple_examples/X04CBJE.java deleted file mode 100644 index fa77c3a..0000000 --- a/simple_examples/X04CBJE.java +++ /dev/null @@ -1,53 +0,0 @@ -import com.nag.routines.X04.X04CB; - -/** - * X04CBJ example program text - * @author willa - * @since 27.1.0.0 - */ -public class X04CBJE{ - - /** - * X04CBJ example main program - */ - public static void main(String[] args){ - int nmax = 5, lda = nmax, ifail, indent, ncols; - double[] a; - - a = new double[lda * nmax]; - - String[] clabs = {"Un ", "Deux ", "Trois ", "Quatre ", "Cinq "}; - String[] rlabs = {"Uno ", "Due ", "Tre ", "Quattro", "Cinque "}; - - System.out.println("X04CBJ Example Program Results"); - System.out.println(); - - //generate an array of data - for(int i = 0; i < nmax; i++){ - for(int j = 0; j < lda; j++){ - a[(i * lda) + j] = (double) ((10 * (j + 1)) + i + 1); - } - } - - ncols = 80; - indent = 0; - - //Print 3 by nmax rectangular matrix with default format and integer row and column labels - ifail = 0; - X04CB x04cb = new X04CB("General", " ", 3, nmax, a, lda, " ", "Example 1", "Integer", rlabs, "Integer", - clabs, ncols, indent, ifail); - x04cb.eval(); - System.out.println(); - - //Print nmax by namx upper triangular matrix with user-supplied format and row and column labels - ifail = 0; - x04cb.eval("Upper", "Non-unit", nmax, nmax, a, lda, "F8.2", "Example 2:", "Character", rlabs, "Character", - clabs, ncols, indent, ifail); - System.out.println(); - - //Print 3 by nmax lower triangular matrix in MATLAB format - //Row and column labelling is ignored - ifail = 0; - x04cb.eval("Lower", "Non-unit", 3, nmax, a, lda, "MATLABF8.2", "A", " ", rlabs, " ", clabs, ncols, indent, ifail); - } -} diff --git a/simple_examples/X05ABJE.java b/simple_examples/X05ABJE.java deleted file mode 100644 index acb3804..0000000 --- a/simple_examples/X05ABJE.java +++ /dev/null @@ -1,25 +0,0 @@ -import com.nag.routines.X05.X05AB; - -/** - * X05AB example program text. - */ -public class X05ABJE { - - public static void main(String[] args) { - - int[] itime = new int[7]; - - itime[0] = 1789; - itime[1] = 7; - itime[2] = 14; - itime[3] = 13; - itime[4] = 11; - itime[5] = 48; - itime[6] = 320; - - System.out.println(" X05ABJ Example Program Results"); - System.out.println((new X05AB(itime)).eval()); - - } - -} From 4e8e89f1e226d4b633fcf2d715cbdb880ac90b63 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Wed, 20 Jan 2021 16:55:14 +0000 Subject: [PATCH 135/196] Simple Examples Synced --- simple_examples/data/tmptest.d | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 simple_examples/data/tmptest.d diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d new file mode 100644 index 0000000..0d7c25f --- /dev/null +++ b/simple_examples/data/tmptest.d @@ -0,0 +1,22 @@ +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs From eb742f013728210e1fa7408679af3d9997b2ba6c Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Wed, 20 Jan 2021 17:27:57 +0000 Subject: [PATCH 136/196] Simple Examples Synced --- simple_examples/data/tmptest.d | 1 + 1 file changed, 1 insertion(+) diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d index 0d7c25f..6328091 100644 --- a/simple_examples/data/tmptest.d +++ b/simple_examples/data/tmptest.d @@ -1,3 +1,4 @@ +Dummy test file E04TCJ Example Program Data 30 : nres -1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 From 98becffb4b00310fec2da9409786c29fb0ca69f4 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Wed, 20 Jan 2021 18:19:11 +0000 Subject: [PATCH 137/196] Simple Examples Synced --- simple_examples/data/testdir/testtmp2.d | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 simple_examples/data/testdir/testtmp2.d diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d new file mode 100644 index 0000000..1cc90f5 --- /dev/null +++ b/simple_examples/data/testdir/testtmp2.d @@ -0,0 +1,7 @@ +Dummy test file 2 +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' From 5a18d7dff1c3f92cbb16bf8bbd224d712a426e52 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Wed, 20 Jan 2021 15:09:51 -0600 Subject: [PATCH 138/196] finalized Readme removed "under development" line --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 8124f07..e6940cf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ > ## Important Information -> This repository is still under development. -> > This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). # Examples using the NAG Library for Java From 0964f0151bf2171ce6ef7d0d2893d27ee7015486 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 10:55:50 +0000 Subject: [PATCH 139/196] Simple Examples Synced --- simple_examples/data/testdir/testtmp2.d | 7 +++++++ simple_examples/data/tmptest.d | 23 +++++++++++++++++++++++ simple_examples/data/tmptest3.d | 3 +++ simple_examples/data/tmptest3.d~ | 2 ++ 4 files changed, 35 insertions(+) create mode 100644 simple_examples/data/testdir/testtmp2.d create mode 100644 simple_examples/data/tmptest.d create mode 100644 simple_examples/data/tmptest3.d create mode 100644 simple_examples/data/tmptest3.d~ diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d new file mode 100644 index 0000000..1cc90f5 --- /dev/null +++ b/simple_examples/data/testdir/testtmp2.d @@ -0,0 +1,7 @@ +Dummy test file 2 +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d new file mode 100644 index 0000000..6328091 --- /dev/null +++ b/simple_examples/data/tmptest.d @@ -0,0 +1,23 @@ +Dummy test file +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/tmptest3.d b/simple_examples/data/tmptest3.d new file mode 100644 index 0000000..cc85772 --- /dev/null +++ b/simple_examples/data/tmptest3.d @@ -0,0 +1,3 @@ +3rd dummy test file +C02AJJ Example Program Data + 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/tmptest3.d~ b/simple_examples/data/tmptest3.d~ new file mode 100644 index 0000000..c24b295 --- /dev/null +++ b/simple_examples/data/tmptest3.d~ @@ -0,0 +1,2 @@ +C02AJJ Example Program Data + 1.0 3.0 -10.0 :A B C From df1c10edfcd7b489f59bd5897b4784da79117a05 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 11:05:44 +0000 Subject: [PATCH 140/196] Simple Examples Synced --- simple_examples/data/testdir/testtmp2.d | 7 ------- simple_examples/data/tmptest.d | 23 ----------------------- simple_examples/data/tmptest3.d | 3 --- simple_examples/data/tmptest3.d~ | 2 -- 4 files changed, 35 deletions(-) delete mode 100644 simple_examples/data/testdir/testtmp2.d delete mode 100644 simple_examples/data/tmptest.d delete mode 100644 simple_examples/data/tmptest3.d delete mode 100644 simple_examples/data/tmptest3.d~ diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d deleted file mode 100644 index 1cc90f5..0000000 --- a/simple_examples/data/testdir/testtmp2.d +++ /dev/null @@ -1,7 +0,0 @@ -Dummy test file 2 -S17DGF Example Program Data - 'F' ( 0.3, 0.4) 'U' - 'F' ( 0.2, 0.0) 'U' - 'F' ( 1.1, -6.6) 'U' - 'F' ( 1.1, -6.6) 'S' - 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d deleted file mode 100644 index 6328091..0000000 --- a/simple_examples/data/tmptest.d +++ /dev/null @@ -1,23 +0,0 @@ -Dummy test file -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/tmptest3.d b/simple_examples/data/tmptest3.d deleted file mode 100644 index cc85772..0000000 --- a/simple_examples/data/tmptest3.d +++ /dev/null @@ -1,3 +0,0 @@ -3rd dummy test file -C02AJJ Example Program Data - 1.0 3.0 -10.0 :A B C diff --git a/simple_examples/data/tmptest3.d~ b/simple_examples/data/tmptest3.d~ deleted file mode 100644 index c24b295..0000000 --- a/simple_examples/data/tmptest3.d~ +++ /dev/null @@ -1,2 +0,0 @@ -C02AJJ Example Program Data - 1.0 3.0 -10.0 :A B C From 5ccc79acbf920613b11148ac185edb095534f9a4 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 11:31:46 +0000 Subject: [PATCH 141/196] Simple Examples Synced --- simple_examples/data/testdir/testtmp2.d | 7 +++++++ simple_examples/data/tmptest.d | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 simple_examples/data/testdir/testtmp2.d create mode 100644 simple_examples/data/tmptest.d diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d new file mode 100644 index 0000000..1cc90f5 --- /dev/null +++ b/simple_examples/data/testdir/testtmp2.d @@ -0,0 +1,7 @@ +Dummy test file 2 +S17DGF Example Program Data + 'F' ( 0.3, 0.4) 'U' + 'F' ( 0.2, 0.0) 'U' + 'F' ( 1.1, -6.6) 'U' + 'F' ( 1.1, -6.6) 'S' + 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d new file mode 100644 index 0000000..6328091 --- /dev/null +++ b/simple_examples/data/tmptest.d @@ -0,0 +1,23 @@ +Dummy test file +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs From 487baffaa64c83878f7c8ec3aef258fb7fe51b45 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 11:34:52 +0000 Subject: [PATCH 142/196] Simple Examples Synced --- simple_examples/data/tmptest4.d | 23 +++++++++++++++++++++++ simple_examples/data/tmptest4.d~ | 23 +++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 simple_examples/data/tmptest4.d create mode 100644 simple_examples/data/tmptest4.d~ diff --git a/simple_examples/data/tmptest4.d b/simple_examples/data/tmptest4.d new file mode 100644 index 0000000..bb12d36 --- /dev/null +++ b/simple_examples/data/tmptest4.d @@ -0,0 +1,23 @@ +Dummy test file 4 +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/tmptest4.d~ b/simple_examples/data/tmptest4.d~ new file mode 100644 index 0000000..6328091 --- /dev/null +++ b/simple_examples/data/tmptest4.d~ @@ -0,0 +1,23 @@ +Dummy test file +E04TCJ Example Program Data +30 : nres +-1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 +-7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 +-5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 +-3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 +-1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 + 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 + 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 + 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 + 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 + 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x +-4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 +-3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 +-5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 + 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 +-2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 + 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 + 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 + 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 + 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 + 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs From c033e3beae97ed3b5634f98e87bedff30df264d9 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 11:35:28 +0000 Subject: [PATCH 143/196] Simple Examples Synced --- simple_examples/data/tmptest4.d~ | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 simple_examples/data/tmptest4.d~ diff --git a/simple_examples/data/tmptest4.d~ b/simple_examples/data/tmptest4.d~ deleted file mode 100644 index 6328091..0000000 --- a/simple_examples/data/tmptest4.d~ +++ /dev/null @@ -1,23 +0,0 @@ -Dummy test file -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs From 27af57d314a7c66833b06ec04d5bda648b49fd04 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 11:53:57 +0000 Subject: [PATCH 144/196] Simple Examples Synced --- simple_examples/data/testdir/testtmp2.d | 7 ------- simple_examples/data/tmptest.d | 23 ----------------------- simple_examples/data/tmptest4.d | 23 ----------------------- 3 files changed, 53 deletions(-) delete mode 100644 simple_examples/data/testdir/testtmp2.d delete mode 100644 simple_examples/data/tmptest.d delete mode 100644 simple_examples/data/tmptest4.d diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d deleted file mode 100644 index 1cc90f5..0000000 --- a/simple_examples/data/testdir/testtmp2.d +++ /dev/null @@ -1,7 +0,0 @@ -Dummy test file 2 -S17DGF Example Program Data - 'F' ( 0.3, 0.4) 'U' - 'F' ( 0.2, 0.0) 'U' - 'F' ( 1.1, -6.6) 'U' - 'F' ( 1.1, -6.6) 'S' - 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d deleted file mode 100644 index 6328091..0000000 --- a/simple_examples/data/tmptest.d +++ /dev/null @@ -1,23 +0,0 @@ -Dummy test file -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/data/tmptest4.d b/simple_examples/data/tmptest4.d deleted file mode 100644 index bb12d36..0000000 --- a/simple_examples/data/tmptest4.d +++ /dev/null @@ -1,23 +0,0 @@ -Dummy test file 4 -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs From 7200b370c8415894f64afb70bd5e9481a0bc0b1a Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Thu, 21 Jan 2021 12:05:12 +0000 Subject: [PATCH 145/196] Simple Examples Synced --- simple_examples/source/{int64 => int64_unsupported}/A00AAJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/A00ADJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/C05AYJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/C05AZJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/C05MBJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/C05QBJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/D01BDJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/D02NEJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/DTFSMJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/E01DAJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/E04FCJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/E04MTJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/E04NFJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/E04UCJE.java | 0 simple_examples/source/{int64 => int64_unsupported}/F02EKJE.java | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename simple_examples/source/{int64 => int64_unsupported}/A00AAJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/A00ADJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05AYJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05AZJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05MBJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05QBJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/D01BDJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/D02NEJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/DTFSMJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E01DAJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04FCJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04MTJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04NFJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04UCJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/F02EKJE.java (100%) diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64_unsupported/A00AAJE.java similarity index 100% rename from simple_examples/source/int64/A00AAJE.java rename to simple_examples/source/int64_unsupported/A00AAJE.java diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64_unsupported/A00ADJE.java similarity index 100% rename from simple_examples/source/int64/A00ADJE.java rename to simple_examples/source/int64_unsupported/A00ADJE.java diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64_unsupported/C05AYJE.java similarity index 100% rename from simple_examples/source/int64/C05AYJE.java rename to simple_examples/source/int64_unsupported/C05AYJE.java diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64_unsupported/C05AZJE.java similarity index 100% rename from simple_examples/source/int64/C05AZJE.java rename to simple_examples/source/int64_unsupported/C05AZJE.java diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64_unsupported/C05MBJE.java similarity index 100% rename from simple_examples/source/int64/C05MBJE.java rename to simple_examples/source/int64_unsupported/C05MBJE.java diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64_unsupported/C05QBJE.java similarity index 100% rename from simple_examples/source/int64/C05QBJE.java rename to simple_examples/source/int64_unsupported/C05QBJE.java diff --git a/simple_examples/source/int64/D01BDJE.java b/simple_examples/source/int64_unsupported/D01BDJE.java similarity index 100% rename from simple_examples/source/int64/D01BDJE.java rename to simple_examples/source/int64_unsupported/D01BDJE.java diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64_unsupported/D02NEJE.java similarity index 100% rename from simple_examples/source/int64/D02NEJE.java rename to simple_examples/source/int64_unsupported/D02NEJE.java diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64_unsupported/DTFSMJE.java similarity index 100% rename from simple_examples/source/int64/DTFSMJE.java rename to simple_examples/source/int64_unsupported/DTFSMJE.java diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64_unsupported/E01DAJE.java similarity index 100% rename from simple_examples/source/int64/E01DAJE.java rename to simple_examples/source/int64_unsupported/E01DAJE.java diff --git a/simple_examples/source/int64/E04FCJE.java b/simple_examples/source/int64_unsupported/E04FCJE.java similarity index 100% rename from simple_examples/source/int64/E04FCJE.java rename to simple_examples/source/int64_unsupported/E04FCJE.java diff --git a/simple_examples/source/int64/E04MTJE.java b/simple_examples/source/int64_unsupported/E04MTJE.java similarity index 100% rename from simple_examples/source/int64/E04MTJE.java rename to simple_examples/source/int64_unsupported/E04MTJE.java diff --git a/simple_examples/source/int64/E04NFJE.java b/simple_examples/source/int64_unsupported/E04NFJE.java similarity index 100% rename from simple_examples/source/int64/E04NFJE.java rename to simple_examples/source/int64_unsupported/E04NFJE.java diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64_unsupported/E04UCJE.java similarity index 100% rename from simple_examples/source/int64/E04UCJE.java rename to simple_examples/source/int64_unsupported/E04UCJE.java diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64_unsupported/F02EKJE.java similarity index 100% rename from simple_examples/source/int64/F02EKJE.java rename to simple_examples/source/int64_unsupported/F02EKJE.java From be0b4b6ea1d34bf3ee8e506b4f2da64b224b685d Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Thu, 21 Jan 2021 12:21:50 -0600 Subject: [PATCH 146/196] Update Readme tidying up Important Information --- QCQP/Readme.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/QCQP/Readme.md b/QCQP/Readme.md index 989f982..4d7a5cd 100644 --- a/QCQP/Readme.md +++ b/QCQP/Readme.md @@ -1,15 +1,12 @@ > ## Important Information -> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/QCQP) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP/) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/QCQP) +> +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/QCQP/portfolioOptimizationQCQP.java). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). # Quadratically constrained quadratic programming and its applications in portfolio optimization -# Correct Rendering of this notebook -This file has a lot of Latex and GitHub currently cannot render it on Markdown files. [Here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/QCQP/) you can read it clearly. - -The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/QCQP/portfolioOptimizationQCQP.java). - # Introduction Quadratically constrained quadratic programming (QCQP) is a type of optimization problem in which both the objective function and the constraints involve quadratic functions. A general QCQP problem has the following form From 174b94e5d7b3c24e60d9e357c25630e248b51f6b Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Thu, 21 Jan 2021 12:25:35 -0600 Subject: [PATCH 147/196] Update Readme.md tidying up Important Info section --- nearest_correlation_matrices/Readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index 7a1e27d..aadbbb9 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,5 +1,7 @@ > ## Important Information -> This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices). +> +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). @@ -7,8 +9,6 @@ This notebook looks at computing *nearest correlation matrices* using the NAG Library for *Java*. -The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). - ## Correlation Matrices * An $$n$$ by $$n$$ matrix is a correlation matrix if: From e3b5eefaf6b6855bf69975f0ef6125540a77dec3 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Fri, 22 Jan 2021 11:18:32 +0000 Subject: [PATCH 148/196] Simple Examples Synced --- simple_examples/data/testfile.d | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 simple_examples/data/testfile.d diff --git a/simple_examples/data/testfile.d b/simple_examples/data/testfile.d new file mode 100644 index 0000000..7479ef6 --- /dev/null +++ b/simple_examples/data/testfile.d @@ -0,0 +1,6 @@ +This is my dummy data file. +S14ACJ Example Program Data +0.1 +0.5 +3.6 +8.0 From c9cd217560cc9e9c70c3dd1f5f0a435a0c808062 Mon Sep 17 00:00:00 2001 From: Sarah Turner Date: Fri, 22 Jan 2021 12:21:31 +0000 Subject: [PATCH 149/196] Simple Examples Synced --- simple_examples/data/testfile.d | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 simple_examples/data/testfile.d diff --git a/simple_examples/data/testfile.d b/simple_examples/data/testfile.d deleted file mode 100644 index 7479ef6..0000000 --- a/simple_examples/data/testfile.d +++ /dev/null @@ -1,6 +0,0 @@ -This is my dummy data file. -S14ACJ Example Program Data -0.1 -0.5 -3.6 -8.0 From 85349709742de39e64baad3eb13bb895a1efef29 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 8 Feb 2021 11:25:46 +0200 Subject: [PATCH 150/196] Added Fast Implied Volatilities example --- README.md | 1 + opt_imp_vol/Readme.md | 205 ++++++++++++++++++++++++++++++++++++ opt_imp_vol/graphs.PNG | Bin 0 -> 101498 bytes opt_imp_vol/impVolDemo.java | 157 +++++++++++++++++++++++++++ opt_imp_vol/impvolsurf.png | Bin 0 -> 439262 bytes opt_imp_vol/output.txt | Bin 0 -> 844 bytes 6 files changed, 363 insertions(+) create mode 100644 opt_imp_vol/Readme.md create mode 100644 opt_imp_vol/graphs.PNG create mode 100644 opt_imp_vol/impVolDemo.java create mode 100644 opt_imp_vol/impvolsurf.png create mode 100644 opt_imp_vol/output.txt diff --git a/README.md b/README.md index e6940cf..1d7bda9 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ This repository contains examples and demonstrations using the [NAG Library for * [Nearest Correlation Matrices](./nearest_correlation_matrices) * [Quadratically constrained quadratic programming and its applications in portfolio optimization](./QCQP) +* [Fast Implied Volatilities](./opt_imp_vol) ## Examples that ship with the product diff --git a/opt_imp_vol/Readme.md b/opt_imp_vol/Readme.md new file mode 100644 index 0000000..d02eb07 --- /dev/null +++ b/opt_imp_vol/Readme.md @@ -0,0 +1,205 @@ +> ## Important Information +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices). +> +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# Fast Implied Volatilities using the NAG Library + +The Black-Scholes formula for the price of a European call option is + +$$P = S_0\Phi\left(\frac{\ln\left(\frac{S_0}{K}\right)+\left[r+\frac{\sigma^2}{2}\right]T}{\sigma\sqrt{T}}\right) - Ke^{-rT}\Phi\left(\frac{\ln\left(\frac{S_0}{K}\right)+\left[r-\frac{\sigma^2}{2}\right]T}{\sigma\sqrt{T}}\right),$$ + +where $$T$$ is the time to maturity, $$S_0$$ is the spot price of the underlying asset, $$K$$ is the strike price, $$r$$ is +the interest rate and $$\sigma$$ is the volatility. A similar formula applies for European put options. + +An important problem in finance is to compute the implied volatility, $$σ$$, given values for $$T$$, $$K$$, $$S_0$$, +$$r$$ and $$P$$. An explicit formula for $$\sigma$$ is not available. Furthermore, $$\sigma$$ cannot be directly measured from +financial data. Instead, it must be computed using a numerical approximation. Typically, multiple values +of the input data are provided, so the Black-Scholes formula must be solved many times. + +As shown in the figure below, the volatility surface (a three-dimensional plot of how the volatility varies +according to the price and time to maturity) can be highly curved. This makes accurately computing +the implied volatility a difficult problem. + +

    + +
    + +Before introducing our new NAG Library routine, let’s demonstrate how one might naively +compute implied volatilities using a general purpose root finder. + +Let's generate some input data using a random number generator from the NAG Library: + +```java + G05KG g05kg = new G05KG(); + G05SQ g05sq = new G05SQ(); + int ifail = 0; + int lstate = 17; + int[] state = new int[lstate]; + int n = 10000; // This is the number of volatilities we will be computing + + double[] p = new double[n]; + double[] k = new double[n]; + double[] s0 = new double[n]; + double[] t = new double[n]; + double[] r = new double[n]; + + g05kg.eval(1, 0, state, lstate, ifail); + g05sq.eval(n, 3.9, 5.8, state, p, ifail); + g05sq.eval(n, 271.5, 272.0, state, k, ifail); + g05sq.eval(n, 259.0, 271.0, state, s0, ifail); + g05sq.eval(n, 0.016, 0.017, state, t, ifail); + g05sq.eval(n, 0.017, 0.018, state, r, ifail); +``` + +We have chosen the limits of the various uniform distributions above to ensure the input data takes +sensible values. + +There are various standard root finding techniques that we could use to compute implied volatilities, +a common example being bisection. The NAG Library routine ```C05AW```, is a general +purpose root finder based on the secant method. It uses a *callback*, with data passed in via a communication object: + +```java + public static class BlackScholes extends C05AW.Abstract_C05AW_F { + public double eval() { + double[] price = new double[1]; + int ifail = 1; + + S30AA s30aa = new S30AA(); + s30aa.eval("C", 1, 1, new double[]{this.getRUSER()[1]}, this.getRUSER()[2], new double[]{this.getRUSER()[3]}, this.getX(), this.getRUSER()[4], 0.0, price, 1, ifail); + + ifail = s30aa.getIFAIL(); + + if (ifail != 0) + price[0] = 0.0; + + return price[0] - this.getRUSER()[0]; + } + } +``` + + ```C05AW``` operates on scalars, so we need to call the routine +once for every volatility we want to compute. We will time the computation and count how many errors are caught: + +```java + int[] iuser = new int[5]; + double[] ruser = new double[5]; + int errorcount = 0; + double sigma; + + C05AW c05aw = new C05AW(); + BlackScholes blackScholes = new BlackScholes(); + + long tic = System.currentTimeMillis(); + for (i = 0; i < n; i++) { + //System.out.println("Info: i = " + i); + ruser[0] = p[i]; + ruser[1] = k[i]; + ruser[2] = s0[i]; + ruser[3] = t[i]; + ruser[4] = r[i]; + + ifail = 1; + c05aw.eval(0.15, 1.0e-14, 0.0, blackScholes, 500, iuser, ruser, ifail); + + sigma = c05aw.getX(); + ifail = c05aw.getIFAIL(); + + if ((sigma < 0.0) || (ifail != 0)) { + errorcount++; + } + } + long toc = System.currentTimeMillis(); + + System.out.println("Using a general purpose root finder:"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", errorcount); +``` + +Can a bespoke implied volatility routine do better? Our new routine at Mark 27.1 is called ```S30AC```. We call it as follows: + +```s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 2, ivalid, ifail);``` + +The return argument ```ivalid``` is an array recording any data points for which the volatility could not be computed. The argument ```mode``` allows us to select which algorithm to use – more on that in a moment, but +for now we choose ```mode=2```. This selects the algorithm of Jäckel (2015), a very accurate method based +on third order Householder iterations. + +Here is the call surrounded by some timing code: + +```java + S30AC s30ac = new S30AC(); + double[] sigma_arr = new double[n]; + int[] ivalid = new int[n]; + + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 2, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 2 (Jäckel algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); +``` + +The new routine is several orders of magnitude faster than the root finder, with no failures reported. We could try +tweaking the convergence parameters and iteration limits in ```C05AW```, and we could certainly +improve the way data is passed through the callback, but we are unlikely to match the +performance of ```S30AC```. + +Recently NAG embarked upon a collaboration with mathematicians at Queen Mary University of +London, who have been developing an alternative algorithm for computing implied volatilities. The new +algorithm (based on Glau et. al. (2018)) uses Chebyshev interpolation to remove branching and give +increased SIMD performance. We access it by setting ```mode=1``` in the call to ```S30AC```: + +```java + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 1, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 1 (Glau algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); +``` + +Depending on your system, you should find that, for similar accuracy, there is a modest speedup over the Jäckel algorithm. Our numerical experiments have shown that for very small arrays (containing fewer than 100 elements) the Jäckel algorithm actually +outperforms that of Glau et.al., but for larger arrays the converse is true. As vector units continue +to improve in the future, we expect the performance of the highly vectorizable Glau et.al. approach to +improve similarly. + +So far, we have been computing implied volatilities with a relative accuracy as close as possible to +double precision. However, in some applications implied volatilities are only required with a few decimal +places of precision. One advantage of the Glau et.al. algorithm is that it can be run in a lower accuracy +mode, aiming only for seven decimal places of accuracy. This is accessed by setting ```mode=0``` in the call +to ```S30AC```. It roughly doubles the speed of the routine: + +```java + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 0, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 0 (lower accuracy Glau algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); +``` + +The charts below summarize the results, using timings collected on an Intel Skylake machine. We can see that the Glau et.al. algorithm outperforms the Jäckel algorithm for large arrays but not for small arrays. Note that the general purpose root finder +is omitted here as it is so much slower ```S30AC```. + +
    + +
    + +In summary, NAG’s new state-of-the art algorithm can be run in three different modes, according to +the length of the input arrays and the required accuracy. For more information, and to access the NAG +Library, go to: https://www.nag.co.uk/content/nag-library. + +### References + +P. Jäckel (2015). Let’s be rational. *Wilmott* 2015, 40-53. + +K. Glau, P. Herold, D. B. Madan, C. Pötz (2019). The Chebyshev method for the implied volatility. +*Journal of Computational Finance*, 23(3). diff --git a/opt_imp_vol/graphs.PNG b/opt_imp_vol/graphs.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0b51c1c74c62ca39797b8f11ef24e22abc222ee0 GIT binary patch literal 101498 zcmeEvXIN8d7cG|2;Zt;k85;=zF{r8Xmm#oIHM8q}_22c;y-A*NKl0!UTLtE^`==6SmFB0CaApRXm8Hx4k1TB3UH3#5|+ z2Cf!^w#1=&Q}&BQdwG&|vAYI($nHUR#wK5GS(qWriO!3G%Wa`&Hswq) zqhKHQgd2D~{Ian6>edV09LCL@fu@@Vl~aXGQLT=kpjuTY*+R69*h%s09@wUMTuu(Z z9c|jA?}E!6nO&t-XKbl{^w?4lq98*6x1|55uhd=qhAu58_LgwH1mhja24$_`?y-3Z z9mG^RhE9?a6P5k4!}c}>S4wId;0cJmg=~Gn<U8Jc~ut` zlugp32OgKHM18(ud`V*ipEEn@@fh!sH1<|@_}Y#A4}B8NmUtfDnY|{BzU5LkGe>&3V?nr>LT?^ilrYhCi`&OB!D*atg*O$3F_Sw%QG}R&S-pzduNYjevq*3) z*=jAUTR6qY&jr)_;8`s$({t})-F-X!+AU;LLt)}VBaTJUi*vT;El1y9)Auh8YAxs8 z4`58iu==!GG)h%szWgdE@5$3~wH(<)>?`4RzYdHyrlh=~e{;Mgr21X5bCO-WDVD5j z6hUy8w_IpFbqrg6yenOuU7)$ic+oDyEvt>v70V5Kv~1Qk8$hV)(12ey*`GIU)#M#_ z!}DT9EN#JA<)GDEujs(XcI;d9xcw%9ANG*6d}Aj2$^_XFyfv8~1c&UB)J=rC_0{QR zZE=qxblkPdDD?I5>m`~^iW{vady6Kf9Cy^#nDFC@RQ6jLgmh*3=iRZUYU$HW*7JPN zzQhP=yMynMHttTeaePq!HrZObkF4juH#3Lbn={0*uB5?z7`H?8dt!!;{=Y+DD|tY? z#5-nZrYoCs(ne9!D^4tkQplX0TBpUzrP*H8%Mdo7UTC%Nn)6jB{0N_6y85QZagDlO zIDy8?HOHO23IlgAS*Zcdn>W7~WO{q4yOHCfyKZFG{@~`Z^I0O~tb{a_xK^y>9nXw> zrsl9u{PFa{ZbQ7h2F0N;aPM_?}%r5=Gv(~ARX+nGQ40Zse zifWs#muMQlo^gqU|H7ZZgbEw<@*yX^Y!*XIVNZ#N{Cgd~XO)C#y~r`CqE1cKC0uTa z7_DD(i?%B>W)iYvm9pIBMJRt9KNI=Jvt5CtF^GS6_otBwBMI(}SLCOk^(um#;u?I# zC0iC?uD_tdjTU(M_`MhTdy^z#jINv1qf^_=%m z$7(X&UM;q`B2V!sx{&;zE@b3GNTlkzlQ$8j2CKOgP4~4|aI92K0i2oK!Or40E>r@m zxFROz*Hhn&EXQEY^=7Oo3YqwH_-nPY7rF;FD_%#J zS@ZQ}e4m|F5Hz|6-*?Q!jj~6$-ro71MK=^r8tQ0r%N@?MjE@%j6chO@9GzsSh5skHY(3%b;H}soKR`Yz z+oW6KqzX~ln+OSo4Vz+5hog6#RAAB;JJwpB`++|=+8oT?VHDy%WMo*DQC%pLPG-(k zjl5hz*2;1o)S47`BwOp>bIUiG@AITarmg11C{~fa{z-6oi2*&Vo6zze>g+Az=+k3F4wA7uFRG3y5fwD5XyG4@2+k7@@rf;6?J6R1iZ&Ot*E5C>w9M-_V1 zzH{^T98h<>tgxK&Dvh3);@z)N)mt&yFE}x4!EN>fL0I~_H0}?=$1%5%)IGc3Icwbpt<3Pc|rIl*RmD0N&64MK{-nvuPZ0qRHq@1u0QruvIsOhZ1 z94nJ&>nfV2WWpxfKhplet5xZyyvS<}#~hAt`)(rB)HD_CVvYlddB<)^h}mPCG= z(LJqCT4R|#ABSh{={G7mYB~1^rIpCUZV;{o~txug0>+-oo7Ux{ZHVxK*yx}Zd^@@mG$0S@Sdk^<9ODH5# zdK&mc!iH>jzg(x7oFsK#KztS1;;d1F*|i{!TH=|kfM`4X!W94@M<#4cTaImMbukJ) z5dK~8iBfb{{tY;4a#PPxXUEqabMSpQ{MxYxBUv4?(nfRrYR)Z|Hy!s{|KZ0|=JPbi z!dRM_Z<~xy^TP}4KG@7%vFDl7)7N}lV`(@u-Xaeof3DX@()*g{$p#hU?Gt87RfVoa z{QXwsYFgl2{M^Aghn4@xX*ZiimL!Bmv3}ViaIPheYh21F7BI z5#L%KRvE9ySRI$QGL2$MNlc}z=2**O5-pW*%Ze;Xkjn1ho_Ot?ap&2!oU9h%kz3h&{n~tKgxWPIfrZ`N zj=#b8+u3go35L%K^C3_fjdgtgDyJk!LZbmY1S{yI z(cLJ6Ly%OtKc+1+W89C4lYLmXOx{#H_QuuvaU2hpapX~t(6)c*`4aEkm8+XGnpxb= z(wocW*C0UsILJ9o@n{gNZ~6D0cG7<1IYj`aioZ&1Z#=Q5bR9GF_C2`V0@oHKZS21^ z`f#9PvYYb@i$h6NHYHc9M(4I1f8#9pb*@@&<&sO=@gJFEyy)q;3D*z907UL7iJ0EE zKAO!XN8jBw5B1yeFn((CLy5ot$7RLYr(eLjc={Z&}qmLz6OsCbkPGcYGeaVqqlr^sV4qvNn z{8q=EJvthB`NE&Ctt_|H<`_8oZTX zvDP}U#Z0H#z*_P)T0?H#rRnlWZoW28E)WjwaEvU1?#Y4Q*td1G-@@6;qOQkdwf9IPZn!S%Nxz~X3mHd7Z2I!v=dt}vxzq8ekd}LL z?6(lSDLHc1lTjf0^dUo@Rr)PGN5Lj9jrhx_!hJk=tb}0We_s6w)xkL@`m+CWvw$iB z2B!H0xdUdu<=)Ho%ozuwfpW}*GU8dh>857*B1_1N%^Ux`ik|@-yyyKtaf?eIdB=%w zBq3gDsD@;E@aEW?w#Kd`Eq=J4Xz5b5zpvc7z48m&;wA&JkHQ0E+HKf-KzzfW^VjOU&J5)8z`TKi)mY`Xy@t!YVeBjqp1R%6B9Q7I3X(2C`3HWKQ`iKr=wEv=0 ztDbDJiymMUZzh=pRT+HuGS1eaA=&uEcY)?ewT^jN3WNm0T zl(GTQAb*N*2_&>kMB;jmDe{)kxRc+5+fE7;F-v5{YSaz5yQM8cdc(Fu=NBt zGQIBpx~;0|A2#E&1dXIzY|+h@h_+Zk`fiss(S0RufaE-DX_(O3phtasWi4S`&z{N^ z0Je-jCM>sBT;F)#-7Q$X0FTJJGHUZc8wV;F519n0gZnGj6z!k$JQ*c;YH$T3uGM8@ z-yZ4kE$esrD@-Pu=@iRrwbI)8SCoSuUQr2qyAubc?d|4PHKIimc}h~Fo~#?u8s;X3 z6~lkeykzwcueNaZ&$_$AVdcnBftK|GB*FnTlY3Azq#e?CzB-AcOGD*i19{nqI91pJ zlxOYAb1J)L*|+cL@A=@Le?O(;?!COV)heM*3O^!}Pr{6es|YHz&8~aM>eJw<9D6bY zahhu84c4+LU`X>5n3DKyh&O5VZgQ2kNA(2b&yxW{1p-3ixd=)>h z-Mi}V$J>tFq_fa!{D6X5yn_59SnG(`Rhmf}dwlr=ND6suQh&Q>o5&c8?}bwJb^#7v zWL|+fH=Z?e7)cc(P*Avn*M+_No^C7cs#0>zb<7sTTkR}e<9KC6eaFllrO_kZ?{+8A zKF0wZSLdAS;;7Wdu819eC4llgznMyLB+hTTIVAzI^=`p!wPS|Y))a*u&iQ-5TI!Hv z7QY7gsQV{ZI{t#A6wb~L@xG>6mf2iy>{m$J*Io~B&h7L|{>9WDR_?xnt1pu4DjY7c z0_auQ@mepax}KxJ15N3F+3@L{THNjCO#e~-bCcDx1tl5Fwg5fi8atm7I|P_LA+}N! z{r9kSP=m5FjiMgEh9XFv*DG8#b**9hGOaQOK~QUc0SYtjyJ?D(^9af!*Sy_nW@#_e z(%#0G{={@R!7>g#>p7;KY#O3n6e@}=BGDt;*?C2}_&T z1ELi>v3@=)APXUQ%IbJMpsidR@9>9|A{JPDd9vJk0c@1zB&`p72l3{GYKZ(Wk6ztO zZ`$H&CH7T6n9v5??_Z;>yKa%4qJJUHjXY9oj7LN%&%Sy9$|9Wz9??%>>!aR6$H(|O zK(o1z4CzQnIDE9|wWEPVOTPre)3DNWFU?gs{?cY-y^u2%u{$Ke8z|Dh)u_8Z)rme)Rvv(@7N__qABWjD9-0(LkVll^F30g zyU}EjXpZ6W2a8woe7!ZDT7gd*DZo!cZ8kMwevSAKujfLnR4f$04c_1B3!7Ab-V%LX zWz!&Cq}&lZ5>2~xGl8@%kWwxT<$FCYkBfPWt5h_~d)WTV^5DWV`^Y=kVLmrgkLvBI^+edoBgRYj(Kn<1AGSXUCGl?;X3&43TZcV6Mxgl3|%VB|O~iUiLp({v=y zk7XwOL!Nzq2=i&<$lKjLxm1sHop5Ax2RrJFIJ)Ol2-}+c^B>pdME7H5PBAq?9+Fak z*uFCZ=jhjtLZ8R6U%#Pt)I;TCIgH6{_AU$ZWOU!X2RFCNUw#!zBLhZp%E2Nt7mL9v z^JW1EE#lUiQiJ`)w{yKK<6ab{Z!Ax#vbNHh{kXeHZb7B!gP zV~&3CAIZ{pZ--o#e{l7nR*^4adMB!~w{Nz`*ZJNliDNo=)XvYUh#%A{qXyQs-C9nx zfTF8^AHL0ZQt>*FPqgy3!sH3{qCinF!^;)FG|_13VD&%bvc=S;!HSj>MYchel2LP= zPN)?P*qH|T>{ujs;QCt_)N8h6L$={zcSQ}61-oyo!EI8c>H&Dp#r=Q8QDAgS#zsy+X z#K3b9y+1Zao|AuHGg;HIJn;R4EB$YptgMKG&kK7i#ldr4q?9HLr6L2ieMGDAmyl&Z zu+}F`$qZy_EvX$@fzE%zV($;Z&5-RLL5XN;O%$EkzK^x-Sd9qB;5p%i8p9f?NR)B^ zUY($qJv%*)$r?F+_BnNGrr=(F#ogw2$)*b-5TvtjYLY!5MTMPp?e~8<4rzi7y35PS zZc^&xzS00JqDgP5G&RO^KXkDJV}YO;S#A^W$;dvFuRB0KoF@2ONHR)W!(CGAuQyp5 zD2lC#8wW|PyCe}m897!^T{}-U;k__HJy4A!eeRu}L5fpd807)aWoM)=ld+R2ns-xe|D41#nK4rr3@R=)8iXlsR=lKmVX?l) zKE&MBH)r+?YMd$Q%iPk`sk<}Nd!|NQ{b)fqhm+Q%63nZRPMl0;gXVu2&zF(f6^efT z1D^&I(7t3Nk>^D(Fc-!N^QjJLpD$w9$s15&)BIn}&q_4R&@Bo_3}R&34X!GYpVC%$ zm7-g@2?2px;2@YpM(J#Ne6v|nWE#Z?aS)!OfR|=pp3Leo;g=h`uWF`y&&GAS1ZhtO z@R&p#K&35yDuMHw8qX91hy0E%Ulf}Q&_*Px6r0ZK*w$=McAn&OI2|^B+;gDkhvRDj zsS7YV0P5fVR-c#dlO3AGCh30a06us5#DxpG_W%w>ywl_;9>{~#yj=UH&Y(J%#^T}^ z*Q3zOy+q$W)1GXI8LBh#XR;)CY+?MsFDvYstmR{j@Or*x6jV zHVoBtEP@m6W&8rs-#FkvD=7{}JMp)4fdrb9T$KZtFARESTeOnLFA3ujh3{gSpj4CL zXV8UFW%qxKj=({;#S|eSl$u|S@}h!=s&2t2xXe8|^^0Lde~Sp9x>P@XIP*tGU)DEY zw7r@&NhHK}g@qH8;|=4DC_fuwKJqI=H)rij4|M!OY>(HDD{FaQ`im*$N^wZX3+tGA zUvK=KG8AyFlC~_gEbbpF^&G-S|3j4qsKH?s8^D-%hy9^ifYtjAKGKDot#VS16#+jr zQBZe+RpOUd-hEdDn|4a8Tw@zzBS(e|F9;FMb@G}FBQ~-TmNp07D@!>M3PCV)iC5&o z(9d0MZQvyELNW}J-`;YjvzbyfVffP0U?3usT>6c;?UbV$i|aLVhSmJ~b&3uX+G$HX zNRvjQF=lCDoqMT4Q3fIKiY}epj01TP;YR%*Z$D6oOXZ)vqhWGyolW4@R@#p60 zp~3-)vPWk-1k@yC>L!LmEaq-|RoPIFnBE+yi6&-KEuu9BwYcD%aySlW_D%_lbI(GE zXlepvU2bz9r_*86_Ad^_NVJ!X1-!Xm#xoZLWPtde35g(TD7KT+()b{ynG=ZbD%#0^ zJ_>?uW=GP-ydXc-EkUM^k5+`gKNu!vpyEX8UaCE*XOuvQy;AqDtN(QC;5N{iAxyDX zUE@a!u~S$muN}WKUMYSp!==97w9O+Qo7QB0dh_-i>tw5m!-I zELDG2N@^K142J z?5k*vC!?GGl$X&WXML%C@lN2a#|!=VYglu2<$k6caj2)V?|<^yAmf=#i``#SfoHYO zn{J{``*gmh7q=(@C~^K9A9w})885Z|#xcH}4UD1E-$=p3r-0jx{~OV`0nAk&Z2$f= zU~vpw_4g(D?`9D;)joI;F`=k9jv0KuB#ci?B`Ke4X#nSfcVoV{Hy8&e z&vmd3Ds`2ehmKah`0Z=FzE;zNY8c_|r zxXHeg91bwGj2Or~(+RxU{Bw_Xvb4j2c64*;5#Xr=Ko{z|d4z0z%&|BtU}th~&-z{6 z1rGhIP5#;Op}6~Ael2{yhd%Sm(?XDhGqS@!+(B+aCa*pDUF z%Mp}dfRNY|8df;fyTAPS5z5Ah{wMh>HXxTF0Zf|QzNKZo&w%WcegGGeNgE*0ek@Wm z%};;(yKD$i@T)_3@#Dp&b&{r4khzXG1(vlQJ^udSxfR`XFm_7bw>y(fH$tJprUTDe z2wZa}0+C2n7QEf_y^VR{GY?uReFZXt`Hl8SK2C=5lvXt3cCe7r^c8dTWwaGLVp$&yscRO|aHHRE$l#5k7SS zlwBUVQIfJP18dsh^;CD#(D9)sY%$|TmB^1L1z?QJJGq^CvI!C;(!3!r{t-r;%QVkV z8$Q7Lb?@X#c5*9Hb-|=`k9*M}@~|OKqugRt=<{x8aP%Q2D?BH(0VDX$<|{^a zsY1Q@U4TLTF~FO2i$G4P3;K_w^3`@I*UOjaI*@@C%BCWcsbM>|GAa3BbeU3QSSJp#(V zyCfL2g=i4#mHz3mmiqcXry{ucA`_LWLhpW`L$(v@&E`Dc&Rv_GPdSgi1EXqfA&%YM zvF-Mv-~*E=Cc}vx{?lo-Dc#F#g8e-0GDVi)9M~37lI#o}x5hSYji)g{*Bf7S!V#D( zV?U8m0Ql=>L7l2B9I`0#p9a7mPtI-BeA5q%dX#k&{ts`#pAY5I>s^tdU>xN}76I%f zBWFUx6V|pf4&P$BZ(pnZW{JlR1hwHS=uX5okUE?({bUO)kQeqoN282-x!<9xyAxltM{;lDaLlX63nbbjXsXENA#ZIevev z$$PIJ{ZZ6N_et(^%F;OSidpX~VTN9PyRsZ)GpnFR+yB(a|%tc6|fU5yYg#7}>|8R#qB3ACz9k4Hb; z^9XzQlK`T#q*d`~T8H!I?G>ZISE`sbfE*-(m?!ODvVqY$JK>;)x_uJ zcoYREHeQUUn^N1I<3ci)?S%b$M`o~Yen(kHuuM8o`?F5Jj*N9m=JQd!6VQiy6ahO@ zHn0#`)}~^!1(UGH=X>5Q0cXUYL)^M;X@goKcFI%>MP-{P7@9QhhG=u2vYaTkl)Bff z5}a1>Ghk`^>IeZkdvk9uI`p!}z)wV@uP&odEE)YS{XU{dP_Swp4Ib|y-BD^94eM!q zw+_ma&U&g_#~c2S8{m%f^o9qk)wq(2^to_5;kgskN_}BPlrT5ZRQBeLcDkwCW6SAf zHVs?$R%H^D&7zB6Cj_+jjGW>^QiX>$KSjoIFb9WwfH64iY>jPNM}3nY-4pTbZCkIz z`-lwiqJ2tx3Ch5M90n`-qOj;yGqeh{93N}eqFPme(pIZP9nm%YSaASK8}>{ zU0D$WEO(d;-gomL%a2ZW+-tQ@n)XdmXj3ss*0M%$+Ep6<(Z^_hM^RyT--q(yJCU>2 z&5Qp!ciNQVm|c#aA0orK1xs`UtkqFX4?{YF;|dHhJQ~D6<4pna`IXXgB(H_Z7e8CD zG2mlOs=s)Jeg8)G1)R9VV~h3-ZKF`bYuc4ltk^MouiX&zLL^K~Xy;pstr$a1E(ttB zo_(X2JvATR|5(SQY^3U=UPt)S{cZehFBGiNJ8s;DilZPK$Lq~d2p8fW87{!^FB$^%6ctMYA?RVi`v(X2{?*fm_hX9Nye!M6 z&e7vGhAz6)`u9!g-d_Lvp*0^u=Hh#f(TUNW&U_Q23CA2~Rmo(XL=a^`Nlc4Pdqu|@ z9rk6F+2$lnS<_DG5OZilL5M-c?`t{iW_ zfb83o_4Bj9t_JdM_s?RbSY$^Rfvg(1U@;?qD(52rDm{BuqOa%XfKN|<#x)h28<}H5vA6sgH5oX0uO zblL2H=h{M4ZkSfzF{LeWIbhKR|!1^}^`p;qdxI2oXh|?uNigS)uK^iZ_R9QXem#Pe1 zEcpi8aF*65&7$L44GpYRoMWc`eaEYU4(PKxmbgaVYFWIg{1(uuVjefRJl&OZ?etS; zpo2CvlLKTejL@DyzxXmO!AN?~u&+1H0*vo(%7eap`ETpxpN~zs-cF7DvDp_9fB8Y( zF&o#pJuciS9czM}sdut7(Uf@M=&NIMlk(Q2m3LhF->hw%u49RZCZbh;vbOh>-JCi#31yjoFAR+w2wpX-K zTwLnw^uteDyhgR3Gh z5{QIf`D*@KNB_6{|HI4mRpIg9P4d@j<4*>+tpA|kKRMF=$V~sGw!j(F4dc z*g3o#Rrz2JEkzX`0Xn%dpnT2k1#pMFn7TlAMkAWEHt$jYe(1luCAwuTxl>0mx+QhD zDn;F;rx%#tMm;X5^;ZCPEnOr6L$i1|a_ma%O2YQKjBdd%#cAz)`csaMJhsDv!3q?Z zgsOps*T6ewaBHFmqtZ67tHmv6itcUwV**I{lJ<21ZtZq`SOe~r4q!(DeYFY=3Z3Bz1AzaGu7&Tx zqK0qOF9|bmP9i&Z6r0w#KiM4D}PC zE_+>?=_x_|9#l%As;YLktL0C~(-qZ_;xhsa2s0-du@NIv>N0XlhnRLvU?zoKlq*yx z#*VnT9&=jwGH#l+te+2d)pPg3)Q9wYq)X!$3{JhEmtvuY(^xvHlh*nsJ|Is|zm2vnQ&435?x! zQMmO`J(MDB)#%=x_NrURr<`O26`Rt1Nq|xL`BQk0=TmFzhLUK526JjH0i#6$D zfTK&E;`@navAufHWyR>TTd!EB3Z2L=-J#i1lH=zd+AOKQXg$={$aptEp&MrcI>nyxSctG80SFL$TLyi{JeP?8oWo3-32kT_4bmI&yZXqkx z4>`QC%*YT0J<9qt%Ic;;tiF!+zm{Q5dXU9$?ij<$g;z3yW;#%V%I~~5U)PBlez~Q` zV0`l6>Vw+a-xIl9IOIG0jtAWH9@ci^hu|n>H0JQEy`yZz!)DH<#?$sZMx{0K3}4Yw zPg(t{2Ws%V^}6ddCauRPvWC}Trw_3qC}G=-GXv}5>c(`+j05c+ z9GJEbZL?_KcdkdJtpNGFVWL2K^~IN&LYs>G4X$6ujmlc_uD##X3|Z%&W{P!%Ixxk- z*0Z9Vq-qp0Jj*%hlXfzVp4uDw`%Lk3mu zH2F*bzKZKT>?dC`J3$(6gYWZ=B2|RD*UV4RU2{=#QIh&GrBB(7$?9;u-c?Pha{^EC z5z86%VP{3N8#Y2y<7fIl+*ud0IhC2O6s*V;5u0Abc#+*5<)}xe{X8o|ul2VDY?fG}2SjB}QqH zX|a?WF9?S+(&%+}!Q-X)s?fWTRH#6l>34Ix3r$4C5NqSIVjgFM-&A{V{A$TS(;oFQ z>$F(#o{n0ABo=1(6CSHs>pVYN9KFhA)xJ_4?Pv(iWq;l=vJLaB9M^dtf3-Di61f;dqRG41%6ySlE;Hp`<)&#+%4*X5=U6J|q9|1EC_F`>E87H0$Ho@0)79aFZ4L%80>5I*D!Yxs0sBAFEs_ zuN-fWA->OQ{*F;e%jNUcwO3IVr7zpe_>M%DzjTDz)fT5eJ4@*v%@=pp*`;ER!zD&% zmVbBr&i+Z{;+n)=WesXMF6BReS!_Yh4YTZ>uoYKyW=CR6S0=A?>=0Ci_y>4%zvhN- zz7@vhZFy69^KgTw$d1Vz>;b%>P<1H|=sumMZV;f=>!wPec z=TRyC8F*rs?X|cX)-T^M+L$}%p9plFrW}{;T<|gUK+b8AN`ULwiMSR*CB~s&c$Wso{~5@)GhjNQs(B{ z%Eivs>ACw$?w-v8-j&wNUnPrQ%1Cm)>PXhVw4KzsoqPy@=m9f zlnf;?d!KoPp6mSc>f$(sn>XQ~@-0k)H?#c@`9EG{FqSsSChpuDQd29BeZI0NTJHVm zZ{!+YgLB%WQuE|W^~D0PJG@qDzXwg?q!j{Qtb8EA{=!1$xPn&^r2oG}Akn%sGb_PPcE}#EBHT z@>6Ku?Ly_(B>R2MzEm{C0Zq~fUa$fC%a7XX9SNpb9dmzMZJuvzH*>fCr0-gW%;WTJ zH9y5*(Sk?u{tm85reiIkuB`)@lgl@VR5*P}yIoX^7KXNyQzpleUJjtdEpum0DXwt` zFGaXS$Nk)&-`T$_#GBDlEneNGI0yQ%0x&|Bx6RplV#=L2gB%+LJ?iPma*pzr0D6(` z8o4WO{ZL9rG;O(EXgdgSD!Y)#sJ11+i02z$+I%akeA2+Xe;zH$<;*U zX%2g+bXBWi`BhB2!XI41k-ZHzgu0yd{id-q9zgC!grEX@L4#E}m;$;-4k+Ra2ecd$ zBEd}TUyQ8(-2`u}q0YgTOA2Y=5YaR&bZHt<}vM*i34u^jepw^b_f%TG<$-)n) z9GTq46cau@1@H9x(vIf_Z91}d9Yq^>Q^ZH!-ZJTvYTVKn$s;mSQJ=!%X@`%yesv$| z`$M8ZW*#9g#ne+kTOGVyDMStrZE%OFT{)HUrs}nE-ZS(vqY?g-4H zio?Lh@jtxn`nEka27{2=mJqH;!Lg8!I_aCIG=9`xC23mMl&4E2KiDvsxdiqi%!$hx z?x+XAzu~wV--jWq+uv19MI8>NW7g0+GGQ36O|jW<7&W?$d}Em8{nB?*bakVU7Fvs7 z9$i^75O&qGbj=vC-k6&Xu=Re$>SmB;twk!X3AL>505#I1<41^HmD2pV|FQFTHwP(? zKTHVRsEU;w5-+(Bt{i!+b#&0%s@$C@lDN&W(tozj>OT14*H@QXnKUa-ugsfF?(tE# zhA^W-+Q?-t(aV+MECZ;L0k>XU@kv*BoS4=K!q!eJK#a?YGcK+8EiarET(|mkMGa$k z!B=F^9{QT@pXd9+*;<2tXfl2w03#v>sR;%nLl>m8Qw}02)Au5i%~N)(sHCb z8;ja&H->7nOMP$tL_W%nD@WeTpWHluave8R)}AyjI)=srpq9SIw5K6wu7$8oaOB6^Dc5*H^P)*jJg2DY->o*sz*xTtlDL1l)=H%s`xTu+~O@AgZGZRKp`sjkBNgeIsw#ZBpyIK@_$V8GL z_u25b=w*Ys%rTG*vBzhhf{8VUJ}&6z=ysi>>e`TN(m3_cCqnBp>i)%Y*yN&0cv^Bl zE`_e`bhT=FXwh=EVQ`a_)oj!dnO04$ZmsNe&QmbzT@ir6>_;XJsDAxvtOT-cYWyqz zLrez^haXv~#~H16UhvcMVvV-cmIyYTSAqg_xzCI{O4(DDY-o~rPO$J$JxFn zJ6-lEW*6G-Q?<7u$3D<(rsEtG9SFP9zbyqUt(yGl4Yk1(A&ct(PW+esK^PXomnMr!opqvev<+{AA#3HYkd!``n zd{({BvtND?WRQk_>#*?{>Kr?T{@eU#<9Sk9 zaQoo%fQudT2X9iVs9mfI=+s%#BX)lQAXiFVHkIP@5eg~u49s4RxB(hZ+%u0hP+t&K zQ*Wmw<3@f~sSfU9%#m}a{|*hPi+qK6)_vV*m`KFGY<+N5kGk-LwT;HF>Le_8mH^{ zokot68~zo4!XVyM5}SUb{AQ{oD}t@LR8UdWhWe`7&Lo5U4V|ownk~=-V|EOVqdJlt zE5$jkZlz(+V-n^q4AGtgmW|N+vG;NG;DsH{5p8<;(s$kpsD&rqv}cLl^67Q+;(aj{ zfEQHw$$^`{d1=WOCEmR$}Cv%e0q%GSpBz^29O)-@c%s5DQb| z-gX+NDw%0{k6ROFrhIqt+Z6A1121MI6=5vkR!(gu5l`H)o9PM|IxdL(VdZd0U0gcqruYXtFR_DV`gKf0SRlb=(6(!A;M_7@CiRc zvfhiziw@pfO;t#?Y>d_@X6Y!qalbYE{IR^R1MIN(nBtMPQC0Z|meXSeDLKp(eeQ4_ zu^Nrr;&8NbwE5#!MSP=K)8Nu(O2%nZw9m@`xd+o zy~3``W&IkBKgwT$ZF+@SRP*z=($a~YtBgXl*z=QV-}#F3>zFLX1At>SqWD=Bj7Avc z=Rd9?;)jg+b)hcn5g+;Wm?N}2i%P}Z!ueR2i-pA=Inletpr@LW;`$*^aAd8LL>=CS zE;PjoDV>R?SnG{fg4@HQms)>K%sIJwDWUmMu|uBtw=gh>Ah}Y zuNbV@S1Kq;D&PEdMgJzv)DcG!+GavO-a}L-jHs+8B;@=cN3d+5Q3X@|zv$$xRyGN^ ztv0|G3c|=e-kpFc2AEMUb2mNu&9f^{B;#>uE;Ov z5~Uz5_R>ehKu(;gXZ=)RMNiWXwK6c;Gcj<+v3L7yii#yNE!b;wZ?Zy(cT>_zDOG7P zfnG+$TVA~QOzum5b6r~~fI~gD&Txkt{;*Y(vrP z(5uc#)uFtLrh5f6eK1Hh(kwPwRSy%5n!)ep!SN>W4t6SRn*8ml-EBr)UE~zkLD!A+ zQL&+p##||5DXD#H#j-RUtN2WIOk7+F2_CBcmm5W;8a#~yzSxJe7MNW=n+}evQ2+Ly zZ9-?Jhh0O{DVO6!MC>lzE7}8x+#z2|vViJ%pznDx?T)T7`C}T4f>Z^xQK1%Z6K^H2 zvpcbcgdcHA&~sna)`q%L_34>dTQpy*RZ5%P*%~GG68f4OJ6*@y4R4&C)>N4)0ZejyFWm$TI&@OkN7NDOJ<)XbTI| z27IUZQ4>b47+Q2;V;B9vKVUVvT6??vY%uA0dXAaR9fYw`hhmp-t9Gp4`P4Q~Ee*#d z6n+5$rT&+uCGJp6?eTDlnJ7vz^zQ`WU)(yhHbmVh6irB4?g_(rmpNef>kb@sEM~=R zf5@sP(1}S4emR6;ZU2$gH|(=x73)EY=0G8HKmK#Vs`0;cWq)GjtvK(I>1PGPh-;;jwJ6T$`JGUSOu zbEb1>!qIBsepTfY;ftnceUx6UdtYN9<$}+Lv`hxm+uofXKUkU0F%C6! zw$@%Kk0}ydwr0?mOv)NWRW&~@`(D8Vl}R@J115MI_w9Y5FhX4xjy9je{f zq-bs^8jF!2_b2!%_R;CP`|{6Rm!{5TWOpSnL;KOl*W|$O#a4ckp$gZlZr0^GJn0IS zRaIY%CC{Vb6Z>N7FUvh2|GGTJv-y`uU9WG9JhTk9b9}<8aiZmZf6?@lbC}mfT>j9D z{1~Z&cJ`i3r%^lI6QjQkG1;#_R~)}|cYWQFd%8c9)6#**y>0R z=PeJ^$1#?B;&p;`8Wf5faR+X4GHtA1Jn)_W2kqZ+pwo-aA-N(iK?4HTQ-W7zVDg;`>eFXwx_nNvUiCTd5Eul zo1%S)#~^EeJbr5Hp}o+zbq6Q;EH(BKjl4H{@z7kbhY=P#|1ugTIXwTqGS~4J#{$ctbd-;HPu9p@t&=+H1TUI z`P|Y@_DT##uvPvn@u`xJM3+P_7sq))>zP?huu{ zs7qAq9+qzSggEok;hw*(H?_&_Yn9+;I;{9@)c!gW(+#FF zJv4gP@)n!n*1*X!Pp<9hM?K?XGU!*$KvPhV#}7?yT#ZcbewAv|=4Pl5>NcrH;JIMw zorlK!-gCT-TU-Z&CU*Ee_0`A&I>c(k2eXL|tOauavB9|JUWtFX?K%U#!T&Y}=oB{e zQ+m&GCY^P*>sK$!J{$@w(MYi(&dtP{t~37{pQK0iXAKq5>;)}HK?!VPMmKb!%FuWwo;D-As$ zMXisp8?LFQBRA;C0Ve4{&imJD61gFJpLXuBt3H}$Vg5#2dj*;xnoUWI2oWgD*Cl+t z1*AusiqV>M2@h=dQj$m@^P8z9z^O}>epF$+~bKO6sgOLWrt1w!L5AhV>S0X!A!^@U!N&;qG=-)6_XJItVRV526~ zOf36f|3cICg6(G3L5r|QgIPyH`Rk`A=c?}Gd?F|>Q{spT){Mu92Wxo2A_VSrk^7xG zT-j7W^mF6=j3(hl?W{u{#5H0HB@|rOjkCsd<4eKM{w}3b*y?qQM%a!4X01o@DCnxW z-qhxr5kl$cR^uy&{YQnQ&dY@cN^Ksd0Zs|VO0#zC zb-833?B%(560)=&lHrWPMK7$mYri?XWSSMg>(tl~$$QyW?2}QaT*9Mn^2Q=!Na%Qt z_=su92A7hao(;AHL^- zBsSrPf6H$h8jRtg)~iZ=Z-WnVb^8C*-SK;zo&$rszEanJ5BmR?+JcG{AR-wEAYiTq zXcjAmJ{~r5G05snXT1;qdXxRf66U`1YCYJ;-NvATW=~JSLQ#6!sL&kr=ziQRtpT=e z4w~tX!nKqln*%M#|KONv+OFt{m>m%`_+)}|eQVlwkpFmeEwUY;E-*A#*Z&Ecq#f-& z=sN8^MkBePBV&4)KF@B|ck4jY{)1Cq=Gjn*29gvWd2@3ji-q|B)Af6-B+%y{P5#r6m5@_%3Sak0)sr2I z#SllPhmCoGXgocx3pp}q5PbyjI0mqUp<<{yNfB{m&4N&`Oz!>$;fFXW8H@wAc5i~e zuj5?SRpY5KT!m$u+SKrv2JjyCgNLK24?#=s^II$w;sz%ZQ9pFl1#EWT#Mirj~AZ2|J#t&Bl~#H!zc&L znndOclp2w1BzJBu=AnDZ(Vr}r)i^x49I1pFi!i9ork5rj5^|OF2V7455BA;jEwU97Wr?w`m1q-LQZ#m9jHRgTBg=3kVeI?& zc~5mt&ij1M`R{lA{^$?ab=J(hUibZ69}A4R|Kh6EMiM#u5dIkHIn847<4Ket7q8jI zq|aVLG(OyJB~5Y?=)9(nVv^#pgOvC@o1&WfdT$iQ#u^s0$TSN6gmHY6Zmp|TWQ-f+ zn`$I4&kT&qt4G^;T5ckkLmpr^sv-5uQ#dy{?p>=4_zq8|i!C3Ox60EO4W_@oqmDSr?^y5Dc#t0b-QgKZf{M>)Sc+Z<7xuG+aa92SZ|1=ZMfH>E`+qhU-S z?!7@}e&l|XtQfw!)xGE1=rUZ-IAtq#;ll%EXsuBdTFty=Ds}$#@`2-@sA@BZJn?(y0pR#28EyH zZF2dWn5t(S$X}Y3Ej*!y@w!qN=P?T^b?-eA+m1{h7RUq4M=BSp9)s*=5`*+?r9=3y zgEG^cn}3;;p5uy0rVT+eB0*S*WiaVE<|ZP}q)xJQIX zK(*IoEoYu=&2txgQwv<N17Z zMSrPlx}dw6a^E77>6-1U_(Ez|pVV8*-@l-HG%x*_`5G-|aTqQr4X0(-Jy9k(=)pS; zZ`a;7Cr6o!6C|_7QWwy&e{kIv`F?g#riKewtUNWJHX z^Kj_%7XetN>blykRSP~nT;*EvtCTui@VBvjynB=IJ|AdOII@z4-{W)4*AnG6o>B9w zRMKL(?>wuL296TDgY7`6Q@2*>LGzH_sM(nti#ON}d$_rozujxpcoIzL%Pf`_bxWyjZqe@RP;W4rcc zYSCsz&oYSF0MUxCN#n3nm8<@KEki6ixd9tuY{HC2gf8?lxwf6CQygn{P>R*vwJ=5$ z)sy||f}cA=s9q###+FB`J~vk3?|+lG?Pw&9)NnCClg&cm1;_*0KLc5|#FzbZv1X%G z{i@5iu+Kdpy4`XqdsH6hN8wgS0#J$^b#EBQ#2<3;R`R@o1v6;GtaD{P&xVt7>jzw0 z8qewqjpdKnD#i4pdR=|i`~=Laa$Wkg3@vo;gLw*-H1F#lU-sfS+bAYP`RPG{RzS6- z)8k{5*!Y`Gk?v!G?6FB5(DW9ev}Sk!S#HL)rPHqlQ|)@Su89pSGMbg37dS{TKGm&N z=I}Q1g)fqG@6lLvN0>}hI6my{zvc++=kP(UX!E7M@=L&8q5zoi>G0Vj^H3eL_?rLR zO_*Pm;umC3u9xVSMkveKJp)CqwtFC~%p#}}u9);f+wo}A$EI^9;rbSX-NN}GEL@yR zOuNd+*P=a;1S3Q!M^ODL$BNkwg7L_~bQ324Vt(*&M(nSod#-8U7)G&tWXYYQsmAin zHG4{FW%CLXW*JA8xW{8OuOUbqgV&9iS7ZyEV|Iv=Ffv4N#`T9F7Ix0=UaK5ag2zSb zV&5_@i%mx60SE&)!6l~QRRF1f;{L4sdd|&YmoeY42**zhrM(~)`6M^!;w-pSV;fWn zhb>)^RLvq$scOb{vQu)#r7mO&1_)c-v#ednBXS_{s7j=E>ka_%RDN16slP=VsVD~7 z({no=Lm0Y*lubW>CFn|CJ7p!Y8bQ)r-CQ0G;Z;S5zFK}?ZPERd2!&kkybj7WhqGo%BK@+x=X+UN)%QTrHW^*H<>i;0iT_t0blz z6~jgIE+aP}tNXp~U!i!*SR#MKe%cKvn~4@LSTIBtfL5sN&EUrZWSXc=(&BLfamI=7 zNFjZIwU3(lSJQ!9`*`L42{gBPZ`E$9Y(@!8i+8-)sHbIbO!Is?lhsOsg?LhW$~KIWg>` zypG0~sw~tviwFsbk9Yb;jTM$B$PN#KjL5cOBuU#D9qkc{-4!fN?(J#$D5^+akHM># zzBBPsl3h%mTj0-IQhgm?*?(EOXXmJGw-WODs2{R+D^!OKs;B!@*%ZYuBvI5Wb7YCj z#q<5-Xc58va?5mwGMHynZUpXGT3Q*4vSM0b!5{{-qkZni(dXFouuQby2<+0Q#iy#Wj4_|LfTUEQPB#0zh zQBbt(Hw|EMH8EJFUe`kXeYV_Zk?{_ce4W%$-y4ME5*k*Nd~D3)#*ez#cOSoz+O1kO zcaLG_u+ryQkI)5`=YT=V2gi}ZdBqGLeT{w)#^aC!S>Tbl%FfR8^1BL&@ktg*TJwo@ zsV?~81KYgJnSnDrH#%jtSg1eVw?I+W9r0pRP`)%beMLiihu7E?4>RriOAr>0&v+%~ zStA6Jb+M792#XRoIJaIEls3Ea zFWZud*+8hgdLd##w7vM_&z(}7Sd@{IMN$Wh&LF*oqfB|jj%#|+F(zU&z^8ESn| z6hLqD{-X>2gAlc%5~)SDAq??HD>jO&q9w9^DstmO4DhD-T9X>hSQUQhr&N#I?!yi| zc^L}9qBo;H$WR@f?ze12P#DtFdGS)oz|N4=#`$Bm~25RU3JYzqV?nUio5nm0|C5NhUXCL zm`6QV1edGn8|zY-80y8j5!X7sP=9#>GW$7A#9yE9h%J&}Pp_(pYss^2MO^!t!J@hI zzzokFf`3@FXDkIN`SDBRzFr;0(J7_3$kq^6M!)&FKbFpq|0HzCR8~E`jAlQ8w6EwA zKv<-J01e#)`>KG|GY1!YW473Qqy&seWU@j+^ z)!R8+0ikEX4PIz9(riJ{iR=8N`;^OLsnzpo3SGWzpQT)4HaGzu=e>;!WGF9bR%fbf zOaeYsuoH!MlT(rVmXdYV^-gZnFI|Rb}ZqCw~Jl~CJ+FspYiC0f|#kVN6)U|h3M~Dn+ z#s`qPDTVYw?$*?P!Tkm>7oIRE%$}H8X)qR2G_P-~oBd#(!oSp1JeHgrvb6BQk>oY~ zSg|D9$m99qYieh`mksSeYKM3hDrC<-CG#6w!L7T_^=e{0L-z2Ah19*&-OTfMw=6G4 z{ZwN8u`wN?NfHR#9JD1sE-z85&f;NMjD}Ex(}@m0#BQiNci3`(Q=KqCni+q-VMaHm zNh94k2lVpZr+oAas(A$AED=o)fQZvN3XCIxp z+RueoGD(8UCL`r2fO|mVq^9o88gD9Rcqf}&5%=Zxy!a=??>;$*dM-Nk9ZC%@GZNxAa^vhaKL&gNZX%DJ3AVe@|x|0)NKq-vu4Jo6nW7s zyrvY4#p}JYGcNGcvURJAm!Bv^V(AW$I-06Nu|hCwOPt`6PnrTa7IVAK0%S*(uhN}9 z@jPe~domb=kM7y(@Erwge6#0YwKJO4p^4xJpI2O_ef2OR{@n@?qs}&+ggMJSJur8B z3<^Dc`=ysfP!HDxQ)TF!aIZL>DZYX6OC11!ZBrok)_S>~G`?_HS;|!4k*2%*g4O$R z^$SF>4ga7qzv7>Kqe_SC&4| zkNmtqe2Y?y-Pxy<1o`sn-n{yNIhQA)l@47u*kua|=k{yy>1;E)f1+-ppyK>xC`f*E zEc-^Gg-@rCmX9WtnC#cQ?8I!FJxmq9KM?F*hB>NBU-4r$`~wHnneROKxxo@GwSrcx zWsczvJIyB5#(%F14rJU%IW)YuF(_1jq@|TrHA}T+cay%f-QI^=^H`Q(xa!Gf4jtE6 zyXvj@K|>T1^RYg4C&zFxGhrTgI3n9>p0EZ;LS4|ZYb_5bkX&U_J((~#`Em)IARie? zyY8hALc4Ci6XVDh(<4In+{~O)I_DbL>>oH;&Z#B{;5Pc`JS8pWBaUyAeBN`t zZ#8;*^yi@}0DO$U!rEFGP0T!28=CtGeC%!AohP>h_;M16o@0$pQbHS>S%l4^RuBDwT|M-IERJ1`cE-9%bKKseKW8U=NU@2_EN%5 z$y@3Pg}580Kf~MDoXFkVq*jgAcEw)={)`4NX>g)0zW*v36?w(}MOQKRwBpYpQ&Zb> zbP;$OA5#h(n4|3Qy8H|KLYwZ4<-IfOG~+pUdX**rw<~xF`SsQ^IPk_U;BO0>Kk?|+ z`Z(`=Z54ZApOPBP3B=#uY|J%>Vq) zhYu5o2PfDZzDQiN{j29SyX5h4tk!7`v|nhrY~+;W94q%0Rt|rSv11aUHoS*~T#-$j z8O)zV&=D`NUALkQLf*GNzhzxk23o5)pi1YOBf9msrTa=l0_60hJQrsyNa-pEmfbEz z`OaCm#nm*q9j(1EU9ARe&&m2XE1C-dSwQQ0YtP(ayM}xW(ImgnM?~XMZIW`4s6l=X zXvSvM)x>@ z_Gd_5E#J?gZp)zu09N#$lHABBF4i=$!=vx=4_{%Rm|>6AGeD z615GN^rYfnudHE)XGd$T8lQ7b_pexjM6?6E>dXzWt^j{W_OE4|Ly+3s(KatAEfZGk zTmAEc$u@H+jA%My-qFitiMR z|Ii10CWK~0U<_aoU<>r_V8G$C|zZ>_RgL5T?ue>33??)9yQ@e~Q1o5S;b{Mdk!OEbO z%eb#5<|Ol;Kkgz;XR)pD0`v{`h|Tf*^!Vt^E@s1o;_0@W{%cDxI}t%ABS>-;BZ^6E zfK&LUjF~Ew5sHdvq(VIrn+%Suh?j`gEDG?rkyH%%K7wNBZ}l76HI*{_W%Mw1U9(O9ObSt|8?=7ff$uO zis1=*$abWFtQD!Xy7fo8_=bDOHf;0HW;xrB4KWsiH!+L3mb3EbsB0 z&D;E{GQU4o*DhOjjrY2X%nhLR1e_Qv`JO=O&sKu{7gkt<3d^5Er|J5w#1D zWTTskG{VL2O~N8q(~af^2NG&my8pIE1LS%pfSw(SSJHCKPI%aVv7cQvJuB z{_+s2u^hiRq&5v4|kBMI)6iZuevJ4%(YmwUxVwHrd6;2|!nY3N} zioXqJu1dYe%n9||)8ZPUNdO4%1nf_Xkb`CvLPQ~Xp4J`&OG)yaz34Ht@~!P(Uketb z?^iF1Mj#q>jb*Q|F?g6d!*Xx=Ml&W+^mqY6$^bZkW}cc@X-4rS#E9c629u(+u5cld z>b1E@8uZHg6*&<RS{@jDKAKFMu z0rba9t(eYl{&5HXrcO%{&wh-j*WBqZGvIv8R8F=*L6UaoB>?XgzQ^;z#MR+>AH zTSREZUs3-bHt*jfLB;v*z1egH**ljKE>e3q$S;0dcC?w0nb`O1Wpc*@#gZ&AU!npS zHv%Q#sn8QX8cK^0tRs*Tpjr={KrwKF4Z5~^S)Bd(&ygO7+(#pv(-^kM4HZB!wun(@ zl@svgEvicw=fGxjcd|XWc!a}Q%m5J6nd0koKhKT(bmXI|t+wOxNmZRfKp`B~J-xmE zY7a+U#|rT7{9XaX+ykP0E*)(%OtVjd@UsI!$T~7JJr`yjVE^_Zq}J&Rh^?AagjY7WUt6Lan6&ISzW_aP z1d)zJNi!I+dq6}$Xu>4M9v`t0d9+ADY({BhOAtKNLXa1ec3xWj*Bz2R&~hDCrfN(w zv^ao_oc6w)wHF-zgv4TL_Z^nzyOTrPs%!)qVy>?5Sq2U@GE?rI7sC~jKGUK0f8k|S zT09ujSbI8>H7k)}Ry_q3A2^F(#nE#R;YQGWaZd31o4DZ>KdyS*F2EnHuSROPmqD=>2}^v~A_sD?%M#Yi z>HW2+(cT8g0i+EVfr^6k)D`<){wPUmIZPktcoO6xdcEO{PWicN8+%%luM2Vj2J*(J zK1MPM1>#IAI-n5$Ha;-n1zk9mW$)t%0m=(5k0{ocOKy+r>f?ZvClOKu%7Ke1HC4$z5cca00;mM36v8M_$jiyjPe%S1Y|P zCkO+W(LNn8=kWQSd>R$K*l>Q}5W%cC{+0^QE)qQpsJR`|df*~G6WS!-vSRsApa^79 zIN-c}D|#yK^5Bp=TLfSNQ;^RT#h*WzV@?h!xdIT?=wq6$iLR{WwPhD@w>()NBp4HOpqCtfk($mBopy1_e#^T_0$5u;%##?VBV?`|I6YNNEoC4;7{q|nGc{Q>iA0k z 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 WGg=*%Qj;YCer{{(BTLn7BK`-~x6b|m literal 0 HcmV?d00001 diff --git a/opt_imp_vol/impVolDemo.java b/opt_imp_vol/impVolDemo.java new file mode 100644 index 0000000..7b46843 --- /dev/null +++ b/opt_imp_vol/impVolDemo.java @@ -0,0 +1,157 @@ +import com.nag.routines.G05.G05SQ; +import com.nag.routines.G05.G05KG; +import com.nag.routines.S.S30AA; +import com.nag.routines.S.S30AC; +import com.nag.routines.C05.C05AW; + +import java.util.Map; +import java.util.HashMap; + +public class impVolDemo { + + public static void main(String[] args) { + + int i; + + + + // Let's generate some input data using a random number generator from the NAG + // Library: + G05KG g05kg = new G05KG(); + G05SQ g05sq = new G05SQ(); + int ifail = 0; + int lstate = 17; + int[] state = new int[lstate]; + int n = 10000; // This is the number of volatilities we will be computing + + double[] p = new double[n]; + double[] k = new double[n]; + double[] s0 = new double[n]; + double[] t = new double[n]; + double[] r = new double[n]; + + g05kg.eval(1, 0, state, lstate, ifail); + g05sq.eval(n, 3.9, 5.8, state, p, ifail); + g05sq.eval(n, 271.5, 272.0, state, k, ifail); + g05sq.eval(n, 259.0, 271.0, state, s0, ifail); + g05sq.eval(n, 0.016, 0.017, state, t, ifail); + g05sq.eval(n, 0.017, 0.018, state, r, ifail); + + + int[] iuser = new int[5]; + double[] ruser = new double[5]; + int errorcount = 0; + double sigma; + + C05AW c05aw = new C05AW(); + BlackScholes blackScholes = new BlackScholes(); + + long tic = System.currentTimeMillis(); + for (i = 0; i < n; i++) { + //System.out.println("Info: i = " + i); + ruser[0] = p[i]; + ruser[1] = k[i]; + ruser[2] = s0[i]; + ruser[3] = t[i]; + ruser[4] = r[i]; + + ifail = 1; + c05aw.eval(0.15, 1.0e-14, 0.0, blackScholes, 500, iuser, ruser, ifail); + + sigma = c05aw.getX(); + ifail = c05aw.getIFAIL(); + + if ((sigma < 0.0) || (ifail != 0)) { + errorcount++; + } + } + long toc = System.currentTimeMillis(); + + System.out.println("Using a general purpose root finder:"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", errorcount); + + System.out.println(); + + + S30AC s30ac = new S30AC(); + double[] sigma_arr = new double[n]; + int[] ivalid = new int[n]; + + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 2, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 2 (Jäckel algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); + + System.out.println(); + + + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 1, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 1 (Glau algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); + + System.out.println(); + + + tic = System.currentTimeMillis(); + ifail = 0; + s30ac.eval("C", n, p, k, s0, t, r, sigma_arr, 0, ivalid, ifail); + toc = System.currentTimeMillis(); + + System.out.println("S30AC with mode = 0 (lower accuracy Glau algorithm):"); + System.out.printf(" Time taken: %.5f seconds\n", (toc-tic)/1000.0); + System.out.printf(" There were %d failures\n", nonZeroLength(ivalid)); + + System.out.println(); + } + + public static class BlackScholes extends C05AW.Abstract_C05AW_F { + public double eval() { + double[] price = new double[1]; + int ifail = 1; + + S30AA s30aa = new S30AA(); + s30aa.eval("C", 1, 1, new double[]{this.getRUSER()[1]}, this.getRUSER()[2], new double[]{this.getRUSER()[3]}, this.getX(), this.getRUSER()[4], 0.0, price, 1, ifail); + + ifail = s30aa.getIFAIL(); + + if (ifail != 0) + price[0] = 0.0; + + return price[0] - this.getRUSER()[0]; + } + } + + public static int nonZeroLength(int[] a) { + int c = 0; + for (int i = 0; i < a.length; i++) { + if (a[i] != 0) { + c++; + } + } + return c; + } + + public static void printVector(double[] a) { + for (int i = 0; i < a.length; i++) { + System.out.printf("%8.4f ", a[i]); + } + System.out.println(); + } + + public static void printVector(int[] a) { + for (int i = 0; i < a.length; i++) { + System.out.printf("%5d ", a[i]); + } + System.out.println(); + } +} diff --git a/opt_imp_vol/impvolsurf.png b/opt_imp_vol/impvolsurf.png new file mode 100644 index 0000000000000000000000000000000000000000..20b4c230b347a6fb8dec1ccfbaa063024e28e802 GIT binary patch literal 439262 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

    N=&Ry72dHhh6mronvZDbX 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 literal 0 HcmV?d00001 From 7e727cb521380adbadcf68d2f04d491db321ec5e Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 8 Feb 2021 11:30:30 +0200 Subject: [PATCH 151/196] Removed int64 folder --- simple_examples/source/int64/A00AAJE.java | 14 - simple_examples/source/int64/A00ADJE.java | 113 ------ simple_examples/source/int64/C05AYJE.java | 45 --- simple_examples/source/int64/C05AZJE.java | 65 ---- simple_examples/source/int64/C05MBJE.java | 104 ------ simple_examples/source/int64/C05QBJE.java | 178 ---------- simple_examples/source/int64/D01BDJE.java | 57 --- simple_examples/source/int64/D02NEJE.java | 393 -------------------- simple_examples/source/int64/DTFSMJE.java | 61 ---- simple_examples/source/int64/E01DAJE.java | 177 --------- simple_examples/source/int64/E04FCJE.java | 415 ---------------------- simple_examples/source/int64/E04MTJE.java | 134 ------- simple_examples/source/int64/E04NFJE.java | 223 ------------ simple_examples/source/int64/E04UCJE.java | 207 ----------- simple_examples/source/int64/F02EKJE.java | 230 ------------ 15 files changed, 2416 deletions(-) delete mode 100644 simple_examples/source/int64/A00AAJE.java delete mode 100644 simple_examples/source/int64/A00ADJE.java delete mode 100644 simple_examples/source/int64/C05AYJE.java delete mode 100644 simple_examples/source/int64/C05AZJE.java delete mode 100644 simple_examples/source/int64/C05MBJE.java delete mode 100644 simple_examples/source/int64/C05QBJE.java delete mode 100644 simple_examples/source/int64/D01BDJE.java delete mode 100644 simple_examples/source/int64/D02NEJE.java delete mode 100644 simple_examples/source/int64/DTFSMJE.java delete mode 100644 simple_examples/source/int64/E01DAJE.java delete mode 100644 simple_examples/source/int64/E04FCJE.java delete mode 100644 simple_examples/source/int64/E04MTJE.java delete mode 100644 simple_examples/source/int64/E04NFJE.java delete mode 100644 simple_examples/source/int64/E04UCJE.java delete mode 100644 simple_examples/source/int64/F02EKJE.java diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java deleted file mode 100644 index 490c163..0000000 --- a/simple_examples/source/int64/A00AAJE.java +++ /dev/null @@ -1,14 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AA; -import com.nag.routines.Routine; - -public class A00AAJE { - - public static void main (String[] args) throws NAGBadIntegerException { - Routine.init(); - A00AA a00aa = new A00AA(); - System.out.println(" A00AAJ Example Program Results\n"); - a00aa.eval(); - } - -} diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java deleted file mode 100644 index 8250321..0000000 --- a/simple_examples/source/int64/A00ADJE.java +++ /dev/null @@ -1,113 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.A00.A00AD; -import com.nag.routines.Routine; -import java.util.Arrays; - -public class A00ADJE { - - /* Parameters */ - public static final int MSGLEN = 15; - - /** A00ADJ Example Program */ - public static void main (String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - int i; - long mkmaj, mkmin; - boolean licval; - String fcomp = getBlankString(80), hdware = getBlankString(80), - impl = getBlankString(80), opsys = getBlankString(80), - pcode = getBlankString(80), prec = getBlankString(80), - vend = getBlankString(80); - /* Local Arrays */ - int[] itime = new int[7]; - String[] msg = new String[MSGLEN]; - - // Instantiate arguments - mkmaj = 0; - mkmin = 0; - licval = false; - // Strings must be length expected by Fortran - fcomp = getBlankString(80); - hdware = getBlankString(80); - impl = getBlankString(80); - opsys = getBlankString(80); - pcode = getBlankString(80); - prec = getBlankString(80); - vend = getBlankString(80); - for (i = 0; i < MSGLEN; i++) msg[i] = getBlankString(102); - - Routine.init(); - System.out.println(" A00ADJ Example Program Results\n"); - - A00AD a00ad = new A00AD(); - a00ad.eval(impl, prec, pcode, mkmaj, mkmin, hdware, opsys, fcomp, vend, licval); - impl = a00ad.getIMPL(); - prec = a00ad.getPREC(); - pcode = a00ad.getPCODE(); - mkmaj = a00ad.getMKMAJ(); - mkmin = a00ad.getMKMIN(); - hdware = a00ad.getHDWARE(); - opsys = a00ad.getOPSYS(); - fcomp = a00ad.getFCOMP(); - vend = a00ad.getVEND(); - licval = a00ad.getLICVAL(); - - /* Print implementation details */ - - System.out.println("*** Start of NAG Library implementation details ***"); - System.out.println(); - System.out.println("Implementation title: " + impl.trim()); - System.out.println(" Precision: " + prec.trim()); - System.out.println(" Product code: " + pcode.trim()); - - if (mkmin < 10) { - System.out.printf(" Mark: %2d.%1d\n", mkmaj, mkmin); - } - else { - System.out.printf(" Mark: %2d.%2d\n", mkmaj, mkmin); - } - - if (vend.trim().equals("(self-contained)")) { - System.out.println(" Vendor Library: None"); - } - else { - System.out.println(" Vendor Library: " + vend.trim()); - } - - System.out.println("Applicable to:"); - System.out.println(" hardware: " + hdware.trim()); - System.out.println(" operating system: " + opsys.trim()); - System.out.println(" Fortran compiler: " + fcomp.trim()); - System.out.println("and compatible systems."); - - if (!licval) { - System.out.println(" Licence query: Unsuccessful"); - } - else { - System.out.println(" Licence query: Successful"); - } - - System.out.println(); - System.out.println("*** End of NAG Library implementation details ***"); - - } - - /** - * Returns a new String, filled with spaces to the specified length - * - * @param len the required length of the String - * @returns a String of spaces of the specified length - */ - public static String getBlankString(int len) { - - if (len > 0) { - char[] arr = new char[len]; - Arrays.fill(arr, ' '); - return new String(arr); - } - - return ""; - - } - -} diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java deleted file mode 100644 index a3bd5f1..0000000 --- a/simple_examples/source/int64/C05AYJE.java +++ /dev/null @@ -1,45 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AY; -import com.nag.routines.Routine; - - -public class C05AYJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - C05AY c05ay = new C05AY(); - OBJFUN f = new OBJFUN(); - double a = 0.0, b = 1.0, eps = 1.0e-5, eta = 0.0, x = 0.0; - long ifail = 0; - long[] iuser = new long[1]; - double[] ruser = new double[1]; - - System.out.println("C05AYJ Example Program Results"); - System.out.println(); - - Routine.init(); - c05ay.eval(a, b, eps, eta, f, x, iuser, ruser, ifail); - x = c05ay.getX(); - - switch ((int)ifail) { - case 0: - System.out.printf("Zero at x = %12.5f\n", x); - break; - case 2: case 3: - System.out.printf("Final point = %12.5f\n", x); - break; - default: - System.out.println("Unexpected ifail = " + ifail); - } - - } - - private static class OBJFUN extends C05AY.Abstract_C05AY_F { - - public double eval() { - return Math.exp(-X) - X; - } - - } - -} diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java deleted file mode 100644 index bec1b03..0000000 --- a/simple_examples/source/int64/C05AZJE.java +++ /dev/null @@ -1,65 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05AZ; -import com.nag.routines.Routine; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class C05AZJE { - - public static void main (String[] args)throws NAGBadIntegerException{ - double tolx = 0.00001, x = 0.0, y = 1.0, fx; - long ir = 0, ind = 1, ifail = -1; - double[] c = new double[17]; - boolean keepOn = true; - - Routine.init(); - - C05AZ c05az = new C05AZ(); - fx = fun(x); - int ite = 0; - - System.out.println(" C05AZJ Example Program Results\n"); - System.out.println(" Iterations\n"); - while (keepOn) { - ++ite; - - c05az.eval(x,y,fx,tolx,ir,c,ind,ifail); - - x = c05az.getX(); - y = c05az.getY(); - tolx = c05az.getTOLX(); - ir = c05az.getIR(); - ind = c05az.getIND(); - ifail = c05az.getIFAIL(); - - if(ind == 0){ - keepOn = false; - } - else{ - fx = fun(x); - System.out.printf(" X = %7.5f FX = %11.4E IND = %1d\n", x, fx, ind); - } - } - - - - switch ((int)ifail) { - case 0: - System.out.println("\n Solution\n"); - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - case 4: - case 5: - System.out.printf(" X = %8.5f Y = %8.5f\n",x,y); - break; - default: - System.out.printf("Unexpected error ifail=%d\n",ifail); - } - } - - private static double fun(double x) { - double res = (Math.expm1(-x) + 1) - x; - return res; - } - -} diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java deleted file mode 100644 index 08dd454..0000000 --- a/simple_examples/source/int64/C05MBJE.java +++ /dev/null @@ -1,104 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.C05.C05MB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.X02.X02AJ; - -/** - * C05MBJ Example Program Text - * @author joed - * @since 27.0 - */ - /* ** There have been at least 200*(n+1) calls to fcn. - ** Consider restarting the calculation from the point held in x. - ** ABNORMAL EXIT from NAG Library routine - ** NAG soft failure - control returned -*/ -public class C05MBJE { - - private static final int n = 4; - - private static class FCN extends C05MB.Abstract_C05MB_FCN { - - public void eval() { - - FVEC[0] = Math.cos(X[2]) - X[0]; - FVEC[1] = Math.sqrt(1.0 - Math.pow(X[3],2)) - X[1]; - FVEC[2] = Math.sin(X[0]) - X[2]; - FVEC[3] = Math.pow(X[1], 2) - X[3]; - - // Set iflag negative to terminate execution for any reason - IFLAG = 0; - - return; - - } - - } - - /** - * C05MBJ Example Main Program - */ - public static void main(String[] args) throws NAGBadIntegerException { - - C05MB c05mb = new C05MB(); - DNRM2 dnrm2 = new DNRM2(); - X02AJ x02aj = new X02AJ(); - FCN fcn = new FCN(); - long cpuser; - double atol, cndtol, fnorm, machpr, rtol; - long astart, ifail, m; - int i; - double[] fvec, x; - double[] ruser = new double[1]; - long[] iuser = new long[1]; - - System.out.println("C05MBJ Example Program Results\n"); - - // Initialise NAG for Java - Routine.init(); - - // Get machine precision from X02AJ - machpr = (new X02AJ()).eval(); - - fvec = new double[n]; - x = new double[n]; - - // The following starting values provide a rough solution - x = new double[]{2.0, 0.5, 2.0, 0.5}; - - m = 2; - atol = Math.sqrt(machpr); - rtol = Math.sqrt(machpr); - cndtol = 0.0; - astart = 0; - cpuser = 0; - - ifail = -1; - c05mb.eval(fcn, n, x, fvec, atol, rtol, m, cndtol, astart, iuser, ruser, - cpuser, ifail); - ifail = c05mb.getIFAIL(); - - if (ifail==0 || ifail==8 || ifail==9) { - if (ifail==0) { - // The NAG name equivalent of dnrm2 is f06ej - fnorm = dnrm2.eval(n, fvec, 1); - System.out.println(); - System.out.printf("Final 2-norm of the residuals = %12.4e\n", fnorm); - System.out.println(); - System.out.println("Final approximate solution"); - } - else { - System.out.println(); - System.out.println("Approximate solution"); - } - System.out.println(); - for (i = 1; i <= n; i++) { - System.out.printf("%12.4f", x[i-1]); - } - System.out.printf("\n"); - } - - } - -} diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java deleted file mode 100644 index d7a6435..0000000 --- a/simple_examples/source/int64/C05QBJE.java +++ /dev/null @@ -1,178 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.C05.C05QB; -import com.nag.routines.F06.DNRM2; -import com.nag.routines.Routine; -import com.nag.routines.X02.X02AJ; - -/** - * - * @author ludovic - */ -public class C05QBJE { - - /** - * @param args the command line arguments - */ - public static void main(String[] args) throws NAGBadIntegerException { - try { - Routine.init(); - - C05QB c05qb = new C05QB(); - - System.out.println(" C05QBJ Example Program Results"); - - int n = 9, ifail = -1; - - double xtol, fnorm; - - long[] IUSER = new long[1]; - double[] fvec = new double[n]; - double[] x = new double[n]; - double[] RUSER = new double[1]; - - - FCN fcn = new FCN(); - - for (int i = 0; i < n; ++i) { - x[i] = -1.0; - } - - xtol = Math.sqrt((new X02AJ()).eval()); - - c05qb.eval(fcn, n, x, fvec, xtol, IUSER, RUSER, ifail); - - ifail = (int)c05qb.getIFAIL(); - - switch (ifail) { - case (0): - fnorm = (new DNRM2(n, fvec, 1)).eval(); - System.out.println(); - System.out.printf(" Final 2-norm of the residuals = %11.4E\n", fnorm); - System.out.println(); - System.out.println(" Final approximate solution"); - int count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - break; - case (2): - case (3): - case (4): - System.out.println("Approximate solution"); - count = 0; - for (int i = 0; i < n; ++i) { - System.out.printf(" %12.4f", x[i]); - ++count; - if(count == 3){ - System.out.println(); - count = 0; - } - } - - break; - } - - } catch (NAGBadIntegerException ex) { - System.err.println("Something went wrong!\n" + ex.getMessage()); - } - - - } - - public static class FCN implements C05QB.C05QB_FCN { - - private long N, IFLAG; - private double[] X, FVEC, RUSER; - private long[] IUSER; - - //@Override - public void setN(long N) { - this.N = N; - } - - //@Override - public long getN() { - return N; - } - - //@Override - public void setX(double[] X) { - this.X = X; - } - - //@Override - public double[] getX() { - return X; - } - - //@Override - public void setFVEC(double[] FVEC) { - this.FVEC = FVEC; - } - - //@Override - public double[] getFVEC() { - return FVEC; - } - - //@Override - public void setIUSER(long[] IUSER) { - this.IUSER = IUSER; - } - - //@Override - public long[] getIUSER() { - return IUSER; - } - - //@Override - public void setRUSER(double[] RUSER) { - this.RUSER = RUSER; - } - - //@Override - public double[] getRUSER() { - return RUSER; - } - - //@Override - public void setIFLAG(long IFLAG) { - this.IFLAG = IFLAG; - } - - //@Override - public long getIFLAG() { - return IFLAG; - } - - //@Override - public void eval(long N, double[] X, double[] FVEC, long[] IUSER, double[] RUSER, long IFLAG) { - /* - * fvec(1:n) = (3.0_nag_wp-2.0_nag_wp*x(1:n))*x(1:n) + 1.0_nag_wp - * fvec(2:n) = fvec(2:n) - x(1:(n-1)) - * fvec(1:(n-1)) = fvec(1:(n-1)) - 2.0_nag_wp*x(2:n) - */ - for (int i = 0; i < N; ++i) { - FVEC[i] = (3.0 - 2.0 * X[i]) * X[i] + 1.0; - /*if (i >= 1) { - FVEC[i] = FVEC[i] - X[i - 1]; - } - if (i < N - 1) { - FVEC[i] = FVEC[i] - 2.0 * X[i + 1]; - }*/ - } - for(int i=1;i Math.max(epsabs,epsrel*Math.abs(result))) { - System.out.println("Warning - requested accuracy may not have been achieved"); - } - - } - - - public static class D01BDJE_FUN implements D01BD.D01BD_F { - - private double x; - - public double eval(double x) { - return (x * x * Math.sin(10.0 * Math.PI * x)); - } - - public double getX() { - return x; - } - - public void setX(double d) { - x = d; - } - - - } - -} diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java deleted file mode 100644 index b32ae64..0000000 --- a/simple_examples/source/int64/D02NEJE.java +++ /dev/null @@ -1,393 +0,0 @@ -import java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.Routine; -import com.nag.routines.D02.D02MC; -import com.nag.routines.D02.D02MW; -import com.nag.routines.D02.D02NE; -import com.nag.routines.D02.D02NEZ; -import com.nag.routines.D02.D02NP; - - -/** - * @author joed - */ -public class D02NEJE { - - public static final double ALPHA = 0.04; - public static final double BETA = 1.0E4; - public static final double GAMMA = 3.0E7; - public static final int ML = 1; - public static final int MU = 2; - public static final int NEQ1 = 3; - public static final int NEQ2 = 1; - - public static JAC1 jac1 = new JAC1(); - public static JAC2 jac2 = new JAC2(); - public static RES1 res1 = new RES1(); - public static RES2 res2 = new RES2(); - - public static void main(String[] args) throws NAGBadIntegerException { - - // Initialise wrappers - Routine.init(); - - System.out.println(" D02NEJ Example Program Results"); - - ex1(); - ex2(); - - } - - private static void ex1() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - D02NP d02np = new D02NP(); - double h0, hmax, t, tout; - long ifail, itask, maxord, ijac, itol, licom, neq, lcom; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[3]; - - System.out.println(); - System.out.println(" D02NEF Example 1"); - System.out.println(); - - maxord = 5; - - neq = NEQ1; - lcom = 40 + (maxord + 4) * neq + (2 * ML + MU + 1) * neq - + 2 * (neq / (ML + MU + 1) + 1); - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - Arrays.fill(rtol, 1.0E-3); - Arrays.fill(atol, 1.0E-6); - Arrays.fill(ydot, 0.0); - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Set initial values - y[0] = 1.0; - y[1] = 0.0; - y[2] = 0.0; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.02; - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Specify that the Jacobian is banded. - ifail = 0; - d02np.eval(neq, ML, MU, icom, licom, ifail); - ifail = d02np.getIFAIL(); - - // Use the iuser array to pass the band dimensions through to jac. - // An alternative would be to hard code values for ml and mu in jac. - iuser[0] = ML; - iuser[1] = MU; - iuser[2] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" Y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - // Obtain the solution at 5 equally spaced values of T. - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res1, jac1, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.02; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - private static void ex2() { - D02MC d02mc = new D02MC(); - D02MW d02mw = new D02MW(); - D02NE d02ne = new D02NE(); - double h0, hmax, t, tout; - long ifail, ijac, itask, itol, lcom, licom, maxord, neq; - String jceval; // length 8 - double[] atol, com, rtol, y, ydot, ruser; - long[] icom, iuser; - - ruser = new double[1]; - iuser = new long[1]; - - System.out.println(); - System.out.println(" D02NEF Example 2"); - System.out.println(); - - maxord = 5; - neq = NEQ2; - lcom = 40 + (maxord + 4) * neq + neq * neq; - licom = 50 + neq; - - atol = new double[(int)neq]; - com = new double[(int)lcom]; - rtol = new double[(int)neq]; - y = new double[(int)neq]; - ydot = new double[(int)neq]; - icom = new long[(int)licom]; - - ijac = 1; - itol = 1; - rtol[0] = 0.0; - atol[0] = 1.0E-8; - ydot[0] = 0.0; - - // String length = 8 - jceval = (ijac == 1) ? "Analytic" : "Numeric "; - - // Initialize the problem, specifying that the Jacobian is to be - // evaluated analytically using the provided routine jac. - y[0] = 2.0; - hmax = 0.0; - h0 = 0.0; - t = 0.0; - tout = 0.2; - - ifail = 0; - d02mw.eval( - neq, maxord, jceval, hmax, h0, itol, icom, licom, com, lcom, ifail - ); - ifail = d02mw.getIFAIL(); - - // Use the iuser array to pass whether numerical or analytic Jacobian - // is to be used. - iuser[0] = ijac; - - System.out.printf(" t "); - for (int i = 1; i <= neq; i++) { - System.out.printf(" y(%1d) ", i); - } - System.out.println(); - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - itask = 0; - - for (int j = 0; j < 5; j++) { - ifail = -1; - d02ne.eval( - neq, t, tout, y, ydot, rtol, atol, itask, res2, jac2, icom, - com, lcom, iuser, ruser, ifail - ); - itask = d02ne.getITASK(); - ifail = d02ne.getIFAIL(); - t = d02ne.getT(); - - System.out.printf(" %8.4f ", t); - for (int i = 0; i < neq; i++) { - System.out.printf("%12.6f", y[i]); - } - System.out.println(); - - if (ifail != 0) { - System.out.printf( - " ** D02NEF returned with IFAIL = %5d\n", ifail - ); - break; - } - - tout += 0.2; - d02mc.eval(icom); - - } - - System.out.println(); - System.out.printf( - " The integrator completed task, ITASK = %4d\n", itask - ); - - } - - /** - * Converts a 2D, 1-based Fortran index to its corresponding 1D, 0-based - * Java index. - * - * Fortran array definition: - * a(dimX, *) - * - * Conversion: - * a(x, y) --> A[result] - */ - private static long getIdx(long x, long y, long dimX) { - return ((y-1) * dimX) + (x-1); - } - - public static class RES1 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - - this.R[0] = -(ALPHA * this.Y[0]) + (BETA * this.Y[1] * this.Y[2]) - - this.YDOT[0]; - this.R[1] = (ALPHA * this.Y[0]) - (BETA * this.Y[1] * this.Y[2]) - - (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[1]; - this.R[2] = (GAMMA * this.Y[1] * this.Y[1]) - this.YDOT[2]; - - } - - } - - public static class JAC1 extends D02NE.Abstract_D02NE_JAC { - - private double[] myjac1( - long neq, long ml, long mu, double t, double[] y, double[] ydot, - double[] pd, double cj - ) { - - long md, ms, pd_dim1; - - pd_dim1 = (2 * ml) + mu + 1; - - // Main diagonal pdfull(i,i), i=1, neq - md = mu + ml + 1; - pd[(int)getIdx(md, 1, pd_dim1)] = -ALPHA - cj; - pd[(int)getIdx(md, 2, pd_dim1)] = (-BETA * y[2]) - (2.0 * GAMMA * y[1]) - - cj; - pd[(int)getIdx(md, 3, pd_dim1)] = -cj; - - // 1 subdiagonal pdfull(i-1,i), i=2, neq - ms = md + 1; - pd[(int)getIdx(ms, 1, pd_dim1)] = ALPHA; - pd[(int)getIdx(ms, 2, pd_dim1)] = 2.0 * GAMMA * y[1]; - - // First superdiagonal pdfull(i-1,i), i=2, neq - ms = md - 1; - pd[(int)getIdx(ms, 2, pd_dim1)] = BETA * y[2]; - pd[(int)getIdx(ms, 3, pd_dim1)] = -BETA * y[1]; - - // Second superdiagonal pdfull(i-2,i), i=3, neq - ms = md - 2; - pd[(int)getIdx(ms, 3, pd_dim1)] = BETA * y[1]; - - return pd; - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac, ml, mu; - - ml = this.IUSER[0]; - mu = this.IUSER[1]; - ijac = this.IUSER[2]; - - if (ijac == 1) { - myjac1( - this.NEQ, ml, mu, this.T, this.Y, this.YDOT, this.PD, - this.CJ - ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - - public static class RES2 extends D02NE.Abstract_D02NE_RES { - - public void eval() { - this.R[0] = 4.0 - Math.pow(this.Y[0], 2.0) - + (this.T * 0.1E0 * Math.exp(this.Y[0])); - } - - } - - public static class JAC2 extends D02NE.Abstract_D02NE_JAC { - - private void myjac2( - long neq, double t, double[] y, double[] ydot, double[] pd, - double cj - ) { - - pd[0] = -(2.0 * y[0]) + (0.1E0 * t * y[0] * Math.exp(y[0])); - - } - - public void eval() { - D02NEZ d02nez = new D02NEZ(); - long ijac; - - ijac = this.IUSER[0]; - - if (ijac == 1) { - myjac2(this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ); - } - else { - d02nez.eval( - this.NEQ, this.T, this.Y, this.YDOT, this.PD, this.CJ, - this.IUSER, this.RUSER - ); - } - - } - - } - -} diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java deleted file mode 100644 index d1feabb..0000000 --- a/simple_examples/source/int64/DTFSMJE.java +++ /dev/null @@ -1,61 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F01.DTRTTF; -import com.nag.routines.F06.DTFSM; -import com.nag.routines.X04.X04CA; -import com.nag.routines.Routine; - -/** - * Adapted from f06wbfe.f90 - * - * @author joed - * - */ -public class DTFSMJE { - - public static void main(String[] args) throws NAGBadIntegerException { - - double alpha = 4.21; - long ifail = 0, info = 0, m = 6, n = 4; - String side = "L", trans = "N", transr = "N", uplo = "L"; - - // Init NAG Java - DTFSM dtfsm = new DTFSM(); - DTRTTF dtrttf = new DTRTTF(); - X04CA x04ca = new X04CA(); - Routine.init(); - - System.out.println(" DTFSMJ Example Program Results\n"); - - // Set lower triangle of matrix A - double[] a = new double[(int)(m*m)]; - for (int i=0; i=i) ? j+1 : 0; - } - } - - // Set matrix B - double[] b = new double[] { - 3.22, 1.64, 1.87, 5.20, 1.83, -1.10, - 1.37, 1.80, 2.87, -2.99, -2.71, -0.63, - 2.31, 0.38, 2.02, -0.91, -2.81, -0.50, - 0.29, -1.52, -0.80, -3.87, -1.13, 0.81 - }; - - // Convert A to rectangular full packed storage in ar - double[] ar = new double[((int)(m*(m+1)))/2]; - info = 0; - dtrttf.eval(transr, uplo, m, a, m, ar, info); - info = dtrttf.getINFO(); - - // Perform the matrix-matrix operation - dtfsm.eval(transr, side, uplo, trans, "N", m, n, alpha, ar, b, m); - - // Print result - ifail = 0; - x04ca.eval("General", " ", m, n, b, m, "The Solution", ifail); - ifail = x04ca.getIFAIL(); - - } - -} diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java deleted file mode 100644 index 89a89e4..0000000 --- a/simple_examples/source/int64/E01DAJE.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * E01DA Example Program - NAG Copyright 2016 - */ - import com.nag.exceptions.NAGBadIntegerException; - import com.nag.routines.E01.E01DA; - import com.nag.routines.E02.E02DF; - import com.nag.routines.Routine; - -public class E01DAJE { - - public static void main (String[] args)throws NAGBadIntegerException { - Routine.init(); - - int mx = 7, my = 6, ifail = -1; - double[] x = new double[mx]; - double[] y = new double[my]; - double[] f = new double[mx*my]; - double[] lamda = new double[mx+4]; - double[] mu = new double[my+4]; - double[] c = new double[mx*my]; - double[] wrk = new double[(mx+6)*(my+6)]; - - int nx = 6, ny = 6, px = 0, py = 0; - double xlo = 1.0, xhi = 2.0; - double ylo = 0.0, yhi = 1.0; - - E01DA e01da = new E01DA(); - - // Input X, Y and function values on X-Y grid - x[0] = 1.00; - x[1] = 1.10; - x[2] = 1.30; - x[3] = 1.50; - x[4] = 1.60; - x[5] = 1.80; - x[6] = 2.00; - - y[0] = 0.00; - y[1] = 0.10; - y[2] = 0.40; - y[3] = 0.70; - y[4] = 0.90; - y[5] = 1.00; - - // On entry: F[my*(q-1)+r-1] must contain f(q,r), for q=1,2,...,mx - // and r=1,2,...,my. - f[0] = 1.00; - f[1] = 1.10; - f[2] = 1.40; - f[3] = 1.70; - f[4] = 1.90; - f[5] = 2.00; - f[6] = 1.21; - f[7] = 1.31; - f[8] = 1.61; - f[9] = 1.91; - f[10] = 2.11; - f[11] = 2.21; - f[12] = 1.69; - f[13] = 1.79; - f[14] = 2.09; - f[15] = 2.39; - f[16] = 2.59; - f[17] = 2.69; - f[18] = 2.25; - f[19] = 2.35; - f[20] = 2.65; - f[21] = 2.95; - f[22] = 3.15; - f[23] = 3.25; - f[24] = 2.56; - f[25] = 2.66; - f[26] = 2.96; - f[27] = 3.26; - f[28] = 3.46; - f[29] = 3.56; - f[30] = 3.24; - f[31] = 3.34; - f[32] = 3.64; - f[33] = 3.94; - f[34] = 4.14; - f[35] = 4.24; - f[36] = 4.00; - f[37] = 4.10; - f[38] = 4.40; - f[39] = 4.70; - f[40] = 4.90; - f[41] = 5.00; - - System.out.printf(" E01DAJ Example Program Results\n\n"); - e01da.eval(mx, my, x, y, f, px, py, lamda, mu, c, wrk, ifail); - - ifail = (int)e01da.getIFAIL(); - switch (ifail) - { - case 0: - System.out.printf(" I Knot LAMDA(I) J Knot MU(j)\n"); - for (int i = 3; i <= Math.max(mx,my); ++i) - { - if (i <= mx) - System.out.printf("%4d %9.4f", i+1, lamda[i]); - else - System.out.printf(" "); - if (i <= my) - System.out.printf("%8d %9.4f\n", i+1, mu[i]); - else - System.out.printf("\n"); - } - System.out.printf("\n The B-Spline coefficients:\n"); - for (int i = 0; i < mx*my; ++i) - { - System.out.printf("%9.4f", c[i]); - if ((i+1)%8 == 0) - System.out.printf("\n"); - } - System.out.printf("\n"); - break; - default: - System.out.printf("\n Error detected by E01DA: %d\n", ifail); - } - - /* Evaluate the spline on a regular rectangular grid at nx*ny points - over the domain [xlo,xhi] x [ylo,yhi]. */ - px = (int)e01da.getPX(); - py = (int)e01da.getPY(); - int liwrk; - int lwrk = Math.min(4*nx+px,4*ny+py); - if (4*nx+px>4*ny+py) - liwrk = ny + py - 4; - else - liwrk = nx + px - 4; - double tx[] = new double[nx]; - double ty[] = new double[ny]; - double ff[] = new double[nx*ny]; - wrk = new double[lwrk]; - long iwrk[] = new long[liwrk]; - - /* Generate nx/ny equispaced x/y co-ordinates */ - double step = (xhi-xlo)/(nx-1); - tx[0] = xlo; - for (int i = 1; i 0) ? datafile.n : 1; - - // This particular example problem is of type QP2 with H stored explicitly, - // so we allocate CVEC(N) and H(LDH,N), and define LDH and LWORK as below - ldh = datafile.n; - - if (datafile.nclin > 0) { - lwork = 2 * datafile.n * datafile.n + 8 * datafile.n + 5 * datafile.nclin; - } - else { - lwork = datafile.n * datafile.n + 8 * datafile.n; - } - - istate = new long[(int)(datafile.n + datafile.nclin)]; - ax = new double[(int)Math.max(1, datafile.nclin)]; - iwork = new long[(int)liwork]; - // h, bl, bu, cvec, x, a: already read from data file - clamda = new double[(int)(datafile.n + datafile.nclin)]; - work = new double[(int)lwork]; - - // Init routine - E04WB e04wb = new E04WB(); - long lcwsav = 1, liwsav = 610, llwsav = 120, lrwsav = 475; - String[] cwsav = new String[(int)lcwsav]; - cwsav[0] = " "; - long[] iwsav = new long[(int)liwsav]; - boolean[] lwsav = new boolean[(int)llwsav]; - double[] rwsav = new double[(int)lrwsav]; - ifail = 0; - e04wb.eval("E04NFA", cwsav, lcwsav, lwsav, llwsav, iwsav, liwsav, rwsav, lrwsav, ifail); - - // Set print level to match E04NFF example output - E04NH e04nh = new E04NH(); - int inform = 0; - e04nh.eval("Print Level = 10", lwsav, iwsav, rwsav, inform); - - // Solve the problem - E04NF e04nf = new E04NF(); - double[] ruser = new double[1]; - long[] iuser = new long[1]; - iter = 0; - obj = Double.NaN; - ifail = 0; - e04nf.eval(datafile.n, datafile.nclin, datafile.a, datafile.lda, datafile.bl, - datafile.bu, datafile.cvec, datafile.h, datafile.ldh, new QPHESS(), istate, - datafile.x, iter, obj, ax, clamda, iwork, liwork, work, lwork, - iuser, ruser, lwsav, iwsav, rwsav, ifail); - - ifail = e04nf.getIFAIL(); - - } catch (Exception ex) { - Logger.getLogger(E04NFJE.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - /** Using E54NFU as a default */ - public static class QPHESS extends E54NFU implements E04NF.E04NF_QPHESS { - - public void eval() { - - super.eval(); - - } - - } - - public static class DataFile { - - public String filename; - public long n, nclin, lda, sda, ldh; - public double[] cvec, a, bl, bu, x, h; - - public DataFile(String filename) { - this.filename = filename; - } - - public void read() throws FileNotFoundException, IOException { - BufferedReader dataIn = new BufferedReader(new FileReader(filename)); - String line = dataIn.readLine(); // skipping header - line = dataIn.readLine().trim(); - String[] lines = line.split(":");//removing comments - String[] dataLine = lines[0].split("\\s+"); - if (dataLine.length != 2) { - System.err.println("Something went wrong when reading the data file - can't read n and nclin!"); - System.exit(1); - } - n = Integer.parseInt(dataLine[0]); - nclin = Integer.parseInt(dataLine[1]); - - lda = Math.max(1, nclin); - - if (nclin > 0) { - sda = n; - } else { - sda = 1; - - } - ldh = n; - - cvec = new double[(int)n]; - a = new double[(int)(lda * sda)]; - bl = new double[(int)(n + nclin)]; - bu = new double[(int)(n + nclin)]; - x = new double[(int)n]; - h = new double[(int)(ldh * n)]; - - //reading cvec - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for cvec"); - System.exit(1); - } - - for (int i = 0; i < n; ++i) { - cvec[i] = Double.parseDouble(dataLine[i].trim().replaceAll("D", "E")); - } - - //reading a - for (int i = 0; i < lda; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != sda) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for a"); - System.exit(1); - } - for (int j = 0; j < sda; ++j) { - a[(int)(i + j * lda)] = Double.parseDouble(dataLine[j].trim().replaceAll("D", "E")); - } - } - - //reading bl - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bl"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bl[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - //reading bu - //it's on two lines in the data file, so we need to merge them - line = dataIn.readLine().trim().split(":")[0].trim() + " " + dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n + nclin) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for bu"); - System.exit(1); - } - for (int i = 0; i < n + nclin; ++i) { - bu[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for x"); - System.exit(1); - } - for (int i = 0; i < n; ++i) { - x[i] = Double.parseDouble(dataLine[i].replaceAll("D", "E")); - } - - for (int i = 0; i < ldh; ++i) { - line = dataIn.readLine().trim().split(":")[0].trim(); - dataLine = line.split("\\s+"); - if (dataLine.length != n) { - System.err.println("Something went wrong when reading the data file - not enought or too many data for h at line " + i); - System.exit(1); - } - for (int j = 0; j < n; ++j) { - h[(int)(i + j * ldh)] = Double.parseDouble(dataLine[j].replaceAll("D", "E")); - } - } - - - } - } - -} diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java deleted file mode 100644 index 20ad573..0000000 --- a/simple_examples/source/int64/E04UCJE.java +++ /dev/null @@ -1,207 +0,0 @@ -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.E04.E04UC; -import com.nag.routines.E04.E04WB; -import com.nag.routines.F06.DGEMV; -import com.nag.routines.Routine; -import java.util.Arrays; - -/** - * @author joed - */ -public class E04UCJE { - - public static final double ONE = 1.0, ZERO = 0.0; - public static final long INC1 = 1, LCWSAV = 1, LIWSAV = 610, LLWSAV = 120, LRWSAV = 475; - public static CONFUN confun = new CONFUN(); - public static OBJFUN objfun = new OBJFUN(); - - public static void main(String[] args) throws NAGBadIntegerException { - /* Local Scalars */ - double objf; - long i, ifail, iter, j, lda, ldcj, ldr, liwork, lwork, n, nclin, ncnln, sda, sdcjac; - /* Local Arrays */ - double[] a, bl, bu, c, cjac, clamda, objgrd, r, work, x; - double[] ruser = new double[1], rwsav = new double[(int)LRWSAV]; - long[] istate, iwork; - long[] iuser = new long[1], iwsav = new long[(int)LIWSAV]; - boolean[] lwsav = new boolean[(int)LLWSAV]; - String[] cwsav = new String[(int)LCWSAV]; - Arrays.fill(cwsav, " "); - - System.out.println(" E04UCJ Example Program Results"); - Routine.init(); - - /* Set scalars */ - n = 4; - nclin = 1; - ncnln = 2; - liwork = 3*n + nclin + 2*ncnln; - lda = Math.max(1, nclin); - sda = (nclin > 0) ? n : 1; - ldcj = Math.max(1, ncnln); - sdcjac = (ncnln > 0) ? n : 1; - ldr = n; - - if (ncnln == 0 && nclin > 0) { - lwork = 2*n*n + 20*n + 11*nclin; - } - else if (ncnln > 0 && nclin >= 0) { - lwork = 2*n*n + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln; - } - else { - lwork = 20*n; - } - - /* Set arrays */ - istate = new long[(int)(n + nclin + ncnln)]; - iwork = new long[(int)liwork]; - c = new double[(int)(Math.max(1, ncnln))]; - cjac = new double[(int)(ldcj * sdcjac)]; - clamda = new double[(int)(n + nclin + ncnln)]; - objgrd = new double[(int)n]; - r = new double[(int)(ldr * n)]; - work = new double[(int)lwork]; - - a = new double[]{1.0, 1.0, 1.0, 1.0}; - bl = new double[]{1.0, 1.0, 1.0, 1.0, -1.0E+25, -1.0E+25, 25.0}; - bu = new double[]{5.0, 5.0, 5.0, 5.0, 20.0, 40.0, 1.0E+25}; - x = new double[]{1.0, 5.0, 5.0, 1.0}; - - /* Initialise E04UC */ - E04WB e04wb = new E04WB(); - ifail = 0; - e04wb.eval("E04UCA", cwsav, LCWSAV, lwsav, LLWSAV, iwsav, LIWSAV, rwsav, LRWSAV, ifail); - - /* Solve the problem */ - E04UC e04uc = new E04UC(); - iter = 0; - objf = 0.0; - ifail = -1; - e04uc.eval(n, nclin, ncnln, lda, ldcj, ldr, a, bl, bu, confun, objfun, iter, istate, c, - cjac, clamda, objf, objgrd, r, x, iwork, liwork, work, lwork, iuser, ruser, - lwsav, iwsav, rwsav, ifail); - iter = e04uc.getITER(); - objf = e04uc.getOBJF(); - ifail = e04uc.getIFAIL(); - - if ((0 >= ifail && ifail <= 6) || ifail == 8) { - System.out.println(); - System.out.println(" Varbl Istate Value Lagr Mult"); - System.out.println(); - - for (i = 0; i < n; i++) { - System.out.printf(" V %3d %3d %13.6G %13.4G\n", i+1, istate[(int)i], x[(int)i], clamda[(int)i]); - } - - if (nclin > 0) { - - /* A*x --> work. - * The NAG name equivalent of DGEMV is F06PA */ - DGEMV dgemv = new DGEMV(); - dgemv.eval("N", nclin, n, ONE, a, lda, x, INC1, ZERO, work, INC1); - - System.out.println(); - System.out.println(); - System.out.println(" L Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n; i < n+nclin; i++) { - j = i - n; - System.out.printf(" L %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], work[(int)j], clamda[(int)i]); - } - - } - - if (ncnln > 0) { - System.out.println(); - System.out.println(); - System.out.println(" N Con Istate Value Lagr Mult"); - System.out.println(); - - for (i = n+nclin; i < n+nclin+ncnln; i++) { - j = i - n - nclin; - System.out.printf(" N %3d %3d %13.6G %13.4G\n", j+1, istate[(int)i], c[(int)j], clamda[(int)i]); - } - - } - - System.out.println(); - System.out.println(); - System.out.printf(" Final objective value = %11.7G\n", objf); - - } - - } - - /** Routine to evaluate objective function and its 1st derivatives */ - public static class OBJFUN extends E04UC.Abstract_E04UC_OBJFUN { - - public void eval() { - - if (MODE == 0 || MODE == 2) { - OBJF = X[0] * X[3] * (X[0]+X[1]+X[2]) + X[2]; - } - - if (MODE == 1 || MODE == 2) { - OBJGRD[0] = X[3] * (X[0]+X[0]+X[1]+X[2]); - OBJGRD[1] = X[0] * X[3]; - OBJGRD[2] = X[0] * X[3] + ONE; - OBJGRD[3] = X[0] * (X[0]+X[1]+X[2]); - } - - } - - } - - /** Routine to evaluate the nonlinear constraints and their 1st derivatives */ - public static class CONFUN extends E04UC.Abstract_E04UC_CONFUN { - - public void eval() { - - if (NSTATE == 1) { - - /* First call to CONFUN. Set all Jacobian elements to zero. - * Note that this will only work when 'Derivative Level = 3' - * (the default; see Section 11.2). */ - - for (int i = 0; i < CJAC.length; ++i) { - CJAC[i] = 0; - } - - } - - if (NEEDC[0] > 0) { - - if (MODE == 0 || MODE == 2) { - C[0] = X[0]*X[0] + X[1]*X[1] + X[2]*X[2] + X[3]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[0] = X[0] + X[0]; - CJAC[(int)LDCJ] = X[1] + X[1]; - CJAC[(int)(2*LDCJ)] = X[2] + X[2]; - CJAC[(int)(3*LDCJ)] = X[3] + X[3]; - } - - } - - if (NEEDC[1]>0) { - - if (MODE == 0 || MODE == 2) { - C[1] = X[0]*X[1]*X[2]*X[3]; - } - - if (MODE == 1 || MODE == 2) { - CJAC[1] = X[1]*X[2]*X[3]; - CJAC[(int)(1+LDCJ)] = X[0]*X[2]*X[3]; - CJAC[(int)(1+2*LDCJ)] = X[0]*X[1]*X[3]; - CJAC[(int)(1+3*LDCJ)] = X[0]*X[1]*X[2]; - } - - } - - } - - } - -} diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java deleted file mode 100644 index d8f152c..0000000 --- a/simple_examples/source/int64/F02EKJE.java +++ /dev/null @@ -1,230 +0,0 @@ -emacimport java.util.Arrays; - -import com.nag.exceptions.NAGBadIntegerException; -import com.nag.routines.F02.F02EK; -import com.nag.routines.F12.F12AD; -import com.nag.routines.X02.X02AJ; -import com.nag.routines.Routine; -import com.nag.types.*; - - -/** - * @author joed - */ -public class F02EKJE { - - public static MYMONIT mymonit = new MYMONIT(); - public static MYOPTION myoption = new MYOPTION(); - - public static void main(String[] args) throws NAGBadIntegerException { - F02EK f02ek = new F02EK(); - X02AJ x02aj = new X02AJ(); - double h, rho, s, sigma; - int ifail, imon, k, ldv, maxit, mode, n, nconv, ncv, nev, nnz, nx, - prtlvl; - NAGComplex complex = new NAGComplex(); - double[] a, resid, v, ruser = new double[1]; - int[] icolzp, irowix, iuser = new int[4]; - NAGComplex[] w; - - // Initialise wrapper library - Routine.init(); - Routine.setComplex(complex); - - System.out.println(" F02EKJ Example Program Results"); - System.out.println(); - - nx = 10; - nev = 4; - ncv = 20; - rho = 10.0; - sigma = 5.5; - - n = nx * nx; - nnz = 3*n - 2; - ldv = n; - - resid = new double[ncv]; - a = new double[nnz]; - icolzp = new int[n + 1]; - irowix = new int[nnz]; - w = (NAGComplex[]) complex.getArrayOfInstances(ncv); - v = new double[ldv * ncv]; - - // Construct A in compressed column storage (CCS) format where: - // A{ i , i } = 2 + i - // A{i+1, i } = 3 - // A{ i , i+1} = rho/(2n+2) - 1 - - h = 1.0 / (double)(n+1); - s = (rho * h / 2.0) - 1.0; - - a[0] = 2.0 + 1.0; - a[1] = 3.0; - icolzp[0] = 1; - irowix[0] = 1; - irowix[1] = 2; - k = 3; - - for (int i = 1; i < n - 1; i++) { - icolzp[i] = k; - irowix[k - 1] = i; - irowix[k] = i + 1; - irowix[k + 1] = i + 2; - a[k - 1] = s; - a[k] = 2.0 + (double)(i + 1); - a[k + 1] = 3.0; - k += 3; - } - - icolzp[n - 1] = k; - icolzp[n] = k + 2; - irowix[k - 1] = n - 1; - irowix[k] = n; - a[k - 1] = s; - a[k] = 2.0 + (double)(n); - - // Set some options via iuser array and return routine argument OPTION - // iuser[0] = print level - // iuser[1] = iteration limit - // iuser[2] > 0 means shifted-invert mode - // iuser[3] > 0 means print monitoring info - - prtlvl = 0; - maxit = 500; - mode = 1; - imon = 1; - - if (prtlvl > 0) { - imon = 0; - } - - iuser[0] = prtlvl; - iuser[1] = maxit; - iuser[2] = mode; - iuser[3] = imon; - - nconv = 0; // placeholder value, nconv is output only - ifail = 0; // hard exit on error - - f02ek.eval( - n, nnz, a, icolzp, irowix, nev, ncv, sigma, mymonit, myoption, - nconv, w, v, ldv, resid, iuser, ruser, ifail - ); - ifail = f02ek.getIFAIL(); - nconv = f02ek.getNCONV(); - - System.out.println(); - System.out.printf( - " The %4d Ritz values of closest to %13.5E are:\n", nconv, sigma - ); - - // Get machine precision - double mp = x02aj.eval(); - - for (int i = 0; i < nconv; i++) { - if (resid[i] > (double)(100*n*mp)) { - System.out.printf( - " %8d ( %13.5E , %13.5E ) %13.5E\n", - i + 1, w[i], resid[i] - ); - } - else { - System.out.printf( - " %8d ( %13.5E , %13.5E )\n", - i + 1, w[i].getRe(), w[i].getIm() - ); - } - } - - } - - public static class MYOPTION extends F02EK.Abstract_F02EK_OPTION { - - public void eval() { - F12AD f12ad = new F12AD(); - int ifail1; - String rec = " "; - - this.ISTAT = 0; - - if (this.IUSER[0] > 0) { - System.out.printf("Print Level=%5d\n", this.IUSER[0]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[1] > 100) { - System.out.printf("Iteration Limit=%5d\n", this.IUSER[1]); - ifail1 = 1; - f12ad.eval(rec, this.ICOMM, this.COMM, ifail1); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - if (this.IUSER[2] > 0) { - ifail1 = 1; - f12ad.eval ( - "Shifted Inverse Real ", this.ICOMM, this.COMM, ifail1 - ); - ifail1 = f12ad.getIFAIL(); - this.ISTAT = Math.max(this.ISTAT, ifail1); - } - - } - - } - - public static class MYMONIT extends F02EK.Abstract_F02EK_MONIT { - - public NAGComplexInterface[] getW(){ - return this.W; - } - - public void eval() { - - if (this.IUSER[3] > 0) { - - if (this.NITER == 1 && this.IUSER[2] > 0) { - System.out.printf( - " Arnoldi basis vectors used:%4d\n", this.NCV - ); - System.out.printf( - " The following Ritz values (mu) are related to the\n" - + " true eigenvalues (lambda) by lambda = sigma + 1/mu\n" - ); - } - - System.out.println(); - System.out.printf(" Iteration number %4d\n", this.NITER); - System.out.printf( - " Ritz values converged so far (%4d) and their Ritz" - + " estimates:\n", this.NCONV - ); - - for (int i = 0; i < this.NCONV; i++) { - System.out.printf( - " %4d (%13.5E,%13.5E) %13.5E\n", - i + 1, this.W[i].getRe(), this.W[i].getIm(), - this.RZEST[i] - ); - } - - System.out.printf(" Next (unconverged) Ritz value:\n"); - - System.out.printf( - " %4d (%13.5E,%13.5E)\n", - this.NCONV + 1, this.W[NCONV].getRe(), this.W[NCONV].getIm() - ); - - } - - this.ISTAT = 0; - - } - - } - -} From 4fb81670a2626f97c0ec6ce0f63e595f2b921d9c Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 8 Feb 2021 11:32:39 +0200 Subject: [PATCH 152/196] Fixed links --- opt_imp_vol/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opt_imp_vol/Readme.md b/opt_imp_vol/Readme.md index d02eb07..a6d1c6f 100644 --- a/opt_imp_vol/Readme.md +++ b/opt_imp_vol/Readme.md @@ -1,5 +1,5 @@ > ## Important Information -> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). > > The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). > From 1cf6350f8809371fa002ec4e5a316ed5596ac1cb Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 8 Feb 2021 11:35:25 +0200 Subject: [PATCH 153/196] Fixed links --- opt_imp_vol/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opt_imp_vol/Readme.md b/opt_imp_vol/Readme.md index a6d1c6f..375d85e 100644 --- a/opt_imp_vol/Readme.md +++ b/opt_imp_vol/Readme.md @@ -1,7 +1,7 @@ > ## Important Information > This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). > -> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/impVolDemo.java). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). From ee71c5942360f4982a54a3ae56884fa8bf90c393 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 8 Feb 2021 11:38:42 +0200 Subject: [PATCH 154/196] Fixed links --- nearest_correlation_matrices/Readme.md | 2 +- opt_imp_vol/Readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nearest_correlation_matrices/Readme.md b/nearest_correlation_matrices/Readme.md index aadbbb9..8c987ae 100644 --- a/nearest_correlation_matrices/Readme.md +++ b/nearest_correlation_matrices/Readme.md @@ -1,7 +1,7 @@ > ## Important Information > This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/nearest_correlation_matrices) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/nearest_correlation_matrices). > -> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). diff --git a/opt_imp_vol/Readme.md b/opt_imp_vol/Readme.md index 375d85e..a057bf2 100644 --- a/opt_imp_vol/Readme.md +++ b/opt_imp_vol/Readme.md @@ -1,7 +1,7 @@ > ## Important Information > This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). > -> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/impVolDemo.java). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/impVolDemo.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). From b82caaf795935d056fe75988153709eadca51225 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 11:51:32 +0200 Subject: [PATCH 155/196] Added BXNL example --- BXNL/Readme.md | 106 ++++++++ BXNL/images/b-ral_sif-e04gg-e04gb-NF.png | Bin 0 -> 21369 bytes BXNL/images/b-ral_sif-e04gg-e04gb-NG.png | Bin 0 -> 21314 bytes BXNL/images/b-ral_sif-e04gg-e04gb-NT.png | Bin 0 -> 20131 bytes BXNL/images/est_orbit.png | Bin 0 -> 96501 bytes BXNL/images/estw_orbit.png | Bin 0 -> 96706 bytes BXNL/images/fig-unfolding.png | Bin 0 -> 60378 bytes BXNL/images/tracks.png | Bin 0 -> 94615 bytes BXNL/orbit_ex/Readme.md | 227 +++++++++++++++++ BXNL/orbit_ex/img/dat_orbit.png | Bin 0 -> 93378 bytes BXNL/orbit_ex/img/earth.png | Bin 0 -> 77733 bytes BXNL/orbit_ex/img/est_orbit.png | Bin 0 -> 96501 bytes BXNL/orbit_ex/img/estw_orbit.png | Bin 0 -> 96706 bytes BXNL/orbit_ex/img/ltx_optprb.png | Bin 0 -> 1618 bytes BXNL/orbit_ex/output.txt | Bin 0 -> 3926 bytes BXNL/orbit_ex/source/OrbitEx.java | 263 +++++++++++++++++++ BXNL/simple_BXNL/Readme.md | 310 +++++++++++++++++++++++ BXNL/simple_BXNL/data/density.d | 1 + BXNL/simple_BXNL/data/dh.d | 1 + BXNL/simple_BXNL/data/diameter.d | 1 + BXNL/simple_BXNL/data/gopt.d | 1 + BXNL/simple_BXNL/data/lopt.d | 1 + BXNL/simple_BXNL/data/w.d | 1 + BXNL/simple_BXNL/data/x.d | 1 + BXNL/simple_BXNL/generate_img.py | 75 ++++++ BXNL/simple_BXNL/img/fig2.png | Bin 0 -> 22406 bytes BXNL/simple_BXNL/img/fig3.png | Bin 0 -> 40289 bytes BXNL/simple_BXNL/img/fig4.png | Bin 0 -> 59739 bytes BXNL/simple_BXNL/output.txt | Bin 0 -> 2764 bytes BXNL/simple_BXNL/source/SimpleBXNL.java | 301 ++++++++++++++++++++++ 30 files changed, 1289 insertions(+) create mode 100644 BXNL/Readme.md create mode 100644 BXNL/images/b-ral_sif-e04gg-e04gb-NF.png create mode 100644 BXNL/images/b-ral_sif-e04gg-e04gb-NG.png create mode 100644 BXNL/images/b-ral_sif-e04gg-e04gb-NT.png create mode 100644 BXNL/images/est_orbit.png create mode 100644 BXNL/images/estw_orbit.png create mode 100644 BXNL/images/fig-unfolding.png create mode 100644 BXNL/images/tracks.png create mode 100644 BXNL/orbit_ex/Readme.md create mode 100644 BXNL/orbit_ex/img/dat_orbit.png create mode 100644 BXNL/orbit_ex/img/earth.png create mode 100644 BXNL/orbit_ex/img/est_orbit.png create mode 100644 BXNL/orbit_ex/img/estw_orbit.png create mode 100644 BXNL/orbit_ex/img/ltx_optprb.png create mode 100644 BXNL/orbit_ex/output.txt create mode 100644 BXNL/orbit_ex/source/OrbitEx.java create mode 100644 BXNL/simple_BXNL/Readme.md create mode 100644 BXNL/simple_BXNL/data/density.d create mode 100644 BXNL/simple_BXNL/data/dh.d create mode 100644 BXNL/simple_BXNL/data/diameter.d create mode 100644 BXNL/simple_BXNL/data/gopt.d create mode 100644 BXNL/simple_BXNL/data/lopt.d create mode 100644 BXNL/simple_BXNL/data/w.d create mode 100644 BXNL/simple_BXNL/data/x.d create mode 100644 BXNL/simple_BXNL/generate_img.py create mode 100644 BXNL/simple_BXNL/img/fig2.png create mode 100644 BXNL/simple_BXNL/img/fig3.png create mode 100644 BXNL/simple_BXNL/img/fig4.png create mode 100644 BXNL/simple_BXNL/output.txt create mode 100644 BXNL/simple_BXNL/source/SimpleBXNL.java diff --git a/BXNL/Readme.md b/BXNL/Readme.md new file mode 100644 index 0000000..4b21542 --- /dev/null +++ b/BXNL/Readme.md @@ -0,0 +1,106 @@ +[![NAG Logo](../nag_logo-removebg.png)](https://www.nag.com) + +> ## Important Information +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/BXNL) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/BXNL). +> +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# Nonlinear Least-Squares Trust-Region Method (BXNL) + +[ [`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | +[`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl) ] + +Data fitting and calibrating parameters of complex numerical models is one of the most common +problems found in numerous industries such as physics, space exploration, simulations, engineering, amongs many others. +[NAG](https://www.nag.co.uk/) introduces to the [NAG Library at Mark 27.1](https://www.nag.co.uk/content/nag-library) a novel [nonlinear least-square](https://en.wikipedia.org/wiki/Non-linear_least_squares) [trust-region solver](https://en.wikipedia.org/wiki/Trust_region) for unconstrained or bound-constrained fitting problems, [`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html). It offers a significant variety of algorithms and regularisation techniques. + +The solver [`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) is aimed at small to medium sized fitting problems (up to 1000s of parameters) bound-constrained nonlinear least-squares problems +and is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04intro.html#optsuite) common handle interface. It offers clarity and consistency of the interface of the solvers within the suite, making it trivial to switch among compatible solvers. + +Figure 1 shows an illustrative simple problem of data fitting ([more details](./orbit_ex/Readme.md)). The task is to find the optimal orbit path given a variety of measurements for which the orbit has to approximatly pass-by. + + + + + +
    Optimal orbit from data orbit measurements. + Weighted optimal orbit from data orbit measurements.
    + +**Figure 1.** Example of a NLLS orbital data fitting. + Given a set of 7 orbital data points the task is to estimate an optimal orbit path that minimizes the error between the path and the fixed data points. For this example assume that expert knowledge provides insight on the reliability of each measument and that for this satellite configuration operational orbit height should around 250 +/-3 units. Center plot shows a simple fit where each measurement (data point) contributes the same amount and provides an optimal orbit height of 238.76 units. The fit is quite poor in the sense that it does not satisfy expert advice. Evidently data point 0 (yellow cross closest to earch surface) unreliablity should be taken into account while doing the fitting. Weights for the residuals should be proportional to the inverse of their variability. For this example suppose we are provided with the accuracy for each of the data measurements, this can be factored using weighted nonlinear least-squares. The rightmost plot shows the weighted optimal solution with orbit height of 254.90 units wich is withing the suggested tolerance. Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was taken from [EUMETSAT, Copyright 2020](https://pics.eumetsat.int/viewer/index.html#help). + + +# More Info + 1. [BXNL information leaflet](https://www.nag.com/content/faster-data-fitting-solver) + 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) + 3. Examples [[Java example](../simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] + + # Unfolding Nuclear Track Data + + [[More details for this example](./simple_BXNL/Readme.md)] + +This example illustrates the usage of [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) ([`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html)) to fit PADC +etched nuclear track data of alpha particles to a convoluted distribution. A target +sheet is scanned and track diameters are recorded (red wedges, +left in Figure 2) into a histogram (Blue bars right plot of Figure 2) +and a mixed Normal and log-Normal model is to be fitted +to the obtained experimental histogram. + +The [example](./simple_BXNL/Readme.md) uses `e04gg` to fit the +six parameter model φ(t, x = (a,b,Al,μ,σ,Ag)) = Al log-Normal(a, b) + Ag Normal(μ, σ) with 0 ≤ x, +using as data the histogram heights. The NLLS solution provides the unfolded +parameters for the two distributions (red and blue curves in right plot in Figure 2). +Adding these together produces the green curve which is the one used to perform the fitting with. + + + + + + +
    PADC etch track diameter histogram unfoldingExperimental histogram of track diameter
    + +**Figure 2.** Left: example of a PADC target with alpha +particle etched tracks, wedges in red show the track diameter. +Right: experimental data histogram of track diameters (blue bars), +aggregated model used in the fitting (green curve) and unfolded models (blue and red curves). +Optimal parameter values are reported in the legend. + + +# Modern Replacement Alternative +Solver [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) ([`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html)) is a modern and attractive replacement for the unconstrained nonlinear least-squares solver [`lsq_uncon_quasi_deriv_comp`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04gbc.html) ([`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html)). + +More recent and modern methods have been incorporated into [`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) making it much faster than [`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html). Our benchmarks comparing [`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) to [`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html) using 68 unconstrained nonlinear least-squares CUTEst problems is reported in Figure 3 using performance profiles. + +Contrasting the three plots, it can be seen that the new solver is more efficient in time: solves 60% +of the problems faster (left plot). In general terms it is more robust (solves 25% more problems) and less expensive in terms of user call-backs: 55% of problems +require less function calls (center plot) and 65% of the problems require less gradient evaluations (right plot). + + +[`e04gg`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) +should present significant improvement for unconstrained or bound-constrained nonlinear +least-squares solvers in the NAG Library and current users of [`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html) +are highly encourage to try out the new solver. + + + + +
    Performance Profile (time:seconds) + Performance Profile (number of function calls) + Performance Profile (number of gradient calls) +
    + +**Figure 3.** Performance profiles comparing solvers e04gg and e04gb over 68 CUTEst unconstrained nonlinear least-squares problems. +Performance measure are: time in seconds (left), number of function calls (center) and number of gradient calls +(right). For the time plot (left), higher line indicates faster solver. For the center and right plots, higher line +represent less functions and gradients calls. + + + +# References + + * Gould N I M, Rees T, and Scott J A (2017) _A higher order method for solving nonlinear least-squares problems_. Technical report, RAL-P-1027-010 RAL Library. STFC Rutherford Appleton Laboratory http://www.numerical.rl.ac.uk/people/rees/pdf/RAL-P-2017-010.pdf + * Kanzow C, Yamashita N, and Fukushima M (2004) _Levenberg-Marquardt methods with strong local convergence properties for solving nonlinear equations with convex constraints_. Journal of Computational and Applied Mathematics 174 375–397 + * Nocedal J and Wright S J (2006) _Numerical Optimization_. (2nd Edition) Springer Series in Operations Research, Springer, New York + * Adachi S, Iwata S, Nakatsukasa Y, and Takeda A (2015) _Solving the trust region subproblem by a generalized eigenvalue problem_. Technical report, METR 2015-14. Mathematical Engineering, The University of Tokyo https://www.keisu.t.u-tokyo.ac.jp/data/2015/METR15-14.pdf + * Conn A R, Gould N I M and Toint Ph L (2000) _Trust Region Methods_. SIAM, Philadephia diff --git a/BXNL/images/b-ral_sif-e04gg-e04gb-NF.png b/BXNL/images/b-ral_sif-e04gg-e04gb-NF.png new file mode 100644 index 0000000000000000000000000000000000000000..4175ee1f3260da16b770c43fce9e4254afb7d752 GIT binary patch literal 21369 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%0AE|7My-T1Z{=h+5BHxxW1n@-2O7^PrzK^ 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 II;Vst0Egh15&!@I literal 0 HcmV?d00001 diff --git a/BXNL/images/est_orbit.png b/BXNL/images/est_orbit.png new file mode 100644 index 0000000000000000000000000000000000000000..b922ba5a0f9aade3695e75cb3cdd0f196f3fb80e GIT binary patch literal 96501 zcmeFZWmFVg6eudvFto(b3E{^9fG8kbSMm6L)V?} zgYVw^*8BC=dT+fycNWXVZ1>r9cAj%IQdL<72a6o*$&)8IaBJWy3rpeow;LSS-9X z;+BmD&xSzU{x^}jU;Td}QqG>Y%&yFR*#D+*V%s$rLHl&=nI$NI)gO^4VTTE^Zbh>n zAhITY+C75)M|uQ1Zp7%u`Q4Jd6Dj7%Adt}s0)&t`N>>J4$oiJvh?$obG@+eCTod=_ zpCzDtQl&>!hr@Z$^w`M};!k`65tYXsun8tRIw{mM?-?Z`5K(vpwqhW@CwUOj2V_HF zLyt1RyjSaF0*_`1$7>&x?szRo`bKz*iF0i;5)wfATUI9u2Lfq(f%v}VO!&`Y*+o1$tn#=?aFia74zVi?oO) z@UHqW2>Lxx$?uMwL7nh0Ecl;J#M76Yn0CgQJhS3YJ69BHbPt6<&J<5Q+4;2Fdb0l4*+GrII2`b_E$TqTUA@JOz)h7ak10%C>vK7E{a*sI1!cLLdc-aQvIjKj8sIW<- zF(BIxJog_RYGIYg*CCtKiB^xy)B8`7WQA_5dPWJxPaf1rtoLroq#+Xf;^bvaXv3bJ z17?qVFw)!x2cSimCejUkR40E^<$;Ss!2vS+s3d5y$MqBJGVx!(lAVX`bPTyB$etew zGx~@=m~?{oiudq%fqp_v_)BCq>%*>oj}^sf5#EHrNzb+Nt!4friH9J`m){+-DK!3x z>0jd}){mbCecA+$ulBg+z@n4>{SHzahFVr6zSlMvw@Z!OCBLG`2$l zPWSG8=q4e7zj2Er{_W_03e5>09#ewy*+XXV^Ou$X6TSi=JPpW)#EX^AC;icK((`D> zi0y-yA2mt9mmiE@=b(UG*Ejhj9H&qh5RLnk4S@2FKWZe$Mx-DZzkXh9A=c0^Q+ z5Ai@{CCmho%{U^LiU@lUFM?nc9W+7QVmxj}`!A(&v+k1*5I2GHQyaV`AHy4`Po#%m_}PKS;MlU+E4)a2uvKdfa)@RY3$w)QsqavbR9f*#~;g4lhA$Wm8*F5G*Rm&dRl49=mc$|@XwggiIw27^r~tMUpf9wEer?Fa~U zRZ(H=BLvm384Mo9ttu&Wc!YQuHXtC>RTYIwj}R-vS_A~Is^-7+I-zY?g@Djh)fM7A z;z%2ofx+y!RgHx<51QLhRB9knZ~Tn$1jC~r;LI=+Bw8I_DWroQoPc+g{5fcX(l|s; z(5rsKTOM2hp6^0MNU%k1+`Q%eur)BLHF5+U zqn7YrCl7SSqq|NKMdjLy^~>f%Udks8+lhxDl7+tVXvl+v>`!N?2@>yCc(Ss29u&>y zs}ur(ZoBP-{wpUUDu%9L@KyATmyh;?rasxw4G1EaR2{*~AN&B`;@nC=uq9@^v!(YS zG|YQNpB^MA>^1y_UE$x5&EE{Ni-o|PSKV{k0FTUgD!D=V-4QbZS6q*zQ=xqj2rm0R z5?tz0*K%in#29e?^a}Kdq77|Bj1j&_{sa%ZC4y~e00zTR&QY#f9#F2nK`S8;*`C%Q zQM?CEZGcK<5a{aF0=;bNgX$(|GtUSJ{7Lo+7#`(gk3tkPL?PTKW_YO2`Ru`V2*_KP z(cI;SWS>78y@TK_%Dztp7kfy;u#+`G5D4)XzUa4);ddnr4TnHr(QDKaIsdH-u|uqD zd$CUk*L#rhWACXX!k|jA?m>#?Km@71O%-w7F=Z?5-hH-H$e9f{G$G;un;ZO8IfKI#0zBQPS56bAHqbvl0&knm}8K z$EA6oq6y_itTAv_`L9b*U!9``fgHO0x11kr4%rDt%#k?f#odoJxDp#dLV6(w_hGwX z&g<#_tmqZler&;T`6@9HC{_z!aMAze0y|vu`3I%Hb=&#DV{zFl(Ge)93svx(e{JH% z@4|{tkXX5rU3CAi#<|^*c0mw`8|FFdE#tpgfJ)R59bp1HsOQ#$m0*Xff(WukJ+}&h z51SZ)J@W(+8ZY6!e8r zc>JR%hqFWkiES&{#et8a1odabhP=0mJ{_V59-?1#i`_`J91pTwY?M{4X@!0M3=|d? zURhs9W@l%IHaB-qO%b!Pu{nEqgxA&aAPxw^odQlWYyq*{% zqDJHpWO_2H?5;l-udKdoq|5*nV}?!NdOht9v49;=NV{54l$LF)>gxw}1#^Kz`$4aF zxq^d7yXX6LfKd+4a2V%JugT5xyNmdHGL!4Mne3}tg7LuqR;9<;<0`&C3)XPGta z+-aY6d)B%HrO}x0J+axR z{KSO!sFs$*Un@(*y``QIN5vzP-54(zr8Zyx3{KvOCSPT*6_zI)FB8J#^5r z_eW47kz#W4d$`K|v*O}nsMirlUS2*q$b+(3s2S>i&AY$US{5L}&)+dUO|oIN$tlVe zwx4P|nZjF8SBku-B=X`%=^IHoZjyeT>bj=*+bratqparUepp0AM6d%Iu(dVK;NVWe zXT4m&#B*7tAt@he(TNGy@ulC9OP$7m7+iB7N3>`bh3%QjAV)wfo`pw%`0Xhgdbpa& z3QX99w+UuK86ff%gYu;f-OagoK3S zQ&V9@MV7m}yJi-y=qzOvv%1UbXbVQ=m5$6b?cqY6`)hj*2Ntfb*uQ?&zH{1n<1WQx zt3WY6Hx|}6=P{}E-Tb=~Aq)4;Y}$O!#vtyrPD4#ieOO8g&(C3Yb7M{s?&$GEO!ygY zew7oxq$K_9+*03k9G7YptEsccGlen*-QT)W2A&k^wOp#II-yIEqKcyrJ5saDd zlc23_Vic*+jvqs)($=v@pO$YF{PuSIZh{b1#O3NClTSDaZ@B5U-W(5YZ#vV1Kx5O> z#nkU*q?tHps{lDh1!X+jNqp#c@_R-$jGi_6b9P1UpUA3!Ybnk z;BN5+?XHB9gPT^xGs$Ki$lW1C?`&W_U6UXWzH?3y&iKexW&j*uZfh=oNxm+h1GIN= zv~Y5w$(Ya3UH;uMxee$eVdQAx2rsD<*fpNlK%4XNLPzVG`-S>xC~1siE^0MW?I%0C zskJ8swgNV6cTd{gpLMQDa9r#)WDeI7V?;T)^^?fml|f+G{b^m5=;`^J!cl1d)2;k=UT zaH(&pZk`|NO(EpVS6$<+bSZMJtG}d!HqE0Lf&(Q(NKa*ao`+A2e{a(C-w z;cbKSyjKensVr@7SjuJC4-#vCs-(1-mSfbly)8&W^2vE;#6kGxOcKBf&+{%OV2!4N z8BmKa-#n?u^QiXrC$;(gySmyV)b0Zx7R69?LwkG%pVQi+=W?%S`?ZnZ@eihpi}m=U z)d-rk+w*0etL6R*gNEcL5k*$Ty!^(en-=U{16Qx^{@ht`HIUEOKy z%9?fOXZyCVaCv!gt6RO%cUbsp+WaJe;mdu)6bCCK8S&01XU$NTLtICe_5gS%)5U81 z9f{aQ=NIVx%KYqnYk2<0m&rPlblO0l^>uDFo%y(}5>)sp&bqBOlHgTSO?`7{{{HK? z=a!&WZtPg1VcoX2@V{AF<<$1M9_2u}A{&T`l7x|@2+60^>eku_@KcnceMAYL-k)!i++*Wn7%Qoyx?VY3GgH+JpU9s4(K%9OjeR7Zn$RfidivIj0z zzwrJow+VM^M~wboe0b06=$Tgj62(kT`b}y!n0j~+6cqd-+s)}wJpdFl@p1^X#jOTe z{#14}clSmw8{{bW=`nk6i*_4A58J2en!TXh*sSLiYYu5Fp(-DyG4)?X)842w^RUNW z_gBzOo9mmNL*h*q_qMVUzZA^Sozv}K>3QK3j-Hrd64!I_D%2!K#>|nJYvOoypX3SN z{TncYOsCigp0c=O^@&H2(Fgj$h?g7Fwn1B4UbBKBicdb^2d630SLP^goMry1^7)Xh}#+eme_?$6RF*hlfXS3JV7Z1*rk> zM$Dm}T2{63uv6F?H}5so_Np5D-*7u3vBipqp+OuYqGxkw?+^f0|G86_Fy zn~{hW2{6jUM^_Hv*ClNs&0hiaC%z|Xzca*l^oeY>SrSCEAmNw#iWQ3H{=UR4c6PH1 zOMMmd4IHn9YIkQme1mW|rq6Y@D8FilecmC1zv8>d)UzdLCA)&pNegI?GX!n`a@>}YbY2@$O< zQhrD{;|TSX0#yp3eIln{dA1tbE^zwt;Nqk4>i^YR;L~+K){64PBqPXHq`)h-a#KHh z+>qPaG;)L9!DAk{+h}fmvC4RvpC4{gL8+(NZ2unLa@YJh&6?8bj=!+i1^z+XHTBZ{ z3VqA{s^=jh|CO{O**gYM1A(6*Eze>L|GZAt(k$R_e=61Z_g&>d$D0F;vnr~UiU_Cm zEWBm4fO~Y9?T)mWI3}Yt)6sN+FEqfDMrn_=y3V!xD2b8Zf9`4D;EJ8oLF9*o=xTTP z2ZdZdF2PEW6BnsXEb!}2m5iDZW_}VOJ_$j{kPYU5!^^&lg=b4XJFJuo(4gC9zUm4< zZBp5CPE0$=PP&vMcd8Yu=%qdzfzswx7W*!6ZTW zQ0urXWsJC+6GO1=X!olgtiZc%6X8=&rNU_F=9cKc4Y}<7A%9Yvs(*LN_LtnE;$m}q zdjR%{0vW|;DZ3$jAD=IrLanhitHj?u6?0#->jCAht6Qo=dK-=Gt7u+y?=?eRcN|U& zF!&r>A`Kc2R<2GB5Je4-&oPj~bH6Ph-Kq6POz=X#dlMB^3L_yl4Wba!LmVo9ib1Fk>DQXo=;!CoClwiA?Hs^fngGf@ ze^Za9ow|hczv9Ku1G`;edDc*;dRYJvu({`22RU;r}MtL0=j*$EB+!rXpmhLZNH_w*u@6M-|p=W2^zG<`DlFRS0QyVrp>gVFyPCWp7XLRli&=1*`|C?z<{yK% zdtLErWlG1Sw@BgBq}U7dw{KBGZr9)0k%4uF82TcnIk{^>67#g&JQWM7{K=7xPSUa# zx?mmoSCt2`6z9(8`;sy65wmJ1a{7Y755n!?HRI3W=ff6nor#5n&JRa?m%Ba1E(zMo z0BtmW7gP%^?i52qECWOA;T5ge_PbfDu+^xs@+WV<_tL{{Ur-_&nmMdvD0otU`Ope% zMJVVS=4oKu^Mq!e;$_Nr#+<&EQw~#g1_n+orleKc*UY zUt(WRz8WtFT<(lPju!6dx>om_6?CzV<=e&ORYVVaa1@<$|MdQ%Hn3+j@Xqz-f=R5C z%JQr6LN>VHo@Y?z{TNg=GV=!*<(z+AA_sfqybd(MaK6K}2Ss-M28nxWUwb=)I6FL=@6sCf#1kt(zG1oRZb{PbFzaAF=^(Ha z(6Ou|+KwyM9(^c88Z$Ir1H~sm<71~u`#it)$A&1AgCF~v7Txd_23XgTgYcLTKZhh9 zcA*;@Y6Ld@i1+Q9Xsk&;y2v+Lx4AtuyVWCR569xnl(5;!!Tf%e+R91M;`WTN-m$`L zGw!&?_uA{e8}G0-=N9nKG!travqpNc8F*)XGt_<)y=HP$aDPoN?6n!hMW&K(Qwfmj z-Ws4%mN56kmzbv{;9dDpZEOvWX`;2C!!hHghH|WiCvfti#9wp<&eDh?52`L~N3ztd zLLB(x$I_!QSff5%3+S{QZ?mXS5rK?4MN~Z>M(C@s{xrAW4Q;0{7laqo4Ap~=Ctg0= z&;l{FKHalyO;bmktNU!HYb4wOzaU{uq4WIi3iNk4A$yl2sj~>>+Kn@N|4s|&aXvoJ z8`8BP_-9i)udPYLn^i_$9t{mm=4hp}+3WuHz|?M?oW!aD(f#3J|C%`*DL7bb#S`s3 zrNA320rY;N*GNc62#3R8WwztTCFDjsyPgEcW)Uf}mb(o0kTKyXI>XcGep0~#Jv& zA)?U9jhF!vzR)wFwXS3;3F|!q&aKd|n0SWdr*Cf3Xw0Q=@s|!Fs>T0WQ0+qv_hT=P zpD<{K)93M0f9BCiNX^3VMK|y}ExRdkDD;J*Z?iol}a5A`vT}Vu&}$O zZo6G#^4biEukqc(o%kicvgb~)4!><>t?<8%^ zgwiRb$7gur>xpxx|i1{5-QM4S8*HQ&2g)nT&} zYv~5YD|!c~zgZup5z8rS%D8sAKXbbGwm$zNcFVkU4-?s4GLYOe=iT1?rB>^V>OEBR z!Z1qauRh~3sd)-tD~uyZWLEHbsq3XGUDinvwyte74gFY`FKsnjTK! zCuoG*3hj&o_b}KZ`g5CGNr~O35Yw%=-#fIqLEjp##^|i!=GotE(J4iCv$IWcdy58$ z=Dzn&4_a|?!| z(CKUEWNvN>M0U`4SGgx0U<~|LmC6!wU;qug7t&3imo!vl{2A-8>bQ={q(DlR%^Ok^ zgjzmKIf;Cb$OkyQ8vo^WJHXsh>~#xc=8s4RmCX}qtyjLF_LNu+rI(ki(?zETEm|RR%1r)UnUElT7 znEC{wXZ+@lBuS#qHyB2z>58>FSnkSo9Q(;1bpyu$$- z7tnmOy-hUUj4k)E9IMa>Fgl10CJ)rq%92sAL@9NZ7*8dQyIitT1f1oU6_K#wNWl(D z-}p-MzKkMVU9%6X3d~v_lWq#~&2xM>_=Ka!vu}NzF%b$sJW(4MeJSqe_*6oJK7lMN za^oZ0E0tYS*S{p%+UF_aIzSITO)*?Abi0fhj@REIcWqMe)1P@I-$~z=s%h$bp0{S^R*EzIAu_+?4VzrL+i(8w6=UZQi2BX*dERa&b_Ry|0=$xVL^h)k@ zj3Ui3Y(Y(?P(`24Y8pWBt5}w-R{HL%*vo#2u|}$jplW-c`ETcqiU=^T@v zq;l(CQPQ94aPlq0UM2>(@oDCLX~U4r(t-w#$M1HBy|d#G02=M5-%x)FBJ4_3OAnfyeD!@2Zf@yFYOvFQI1mWi+IqfwVA5Z= zgFZXg7@j!p{bzG})mBnH#kY5O;?nF|PjT!2EGxK`C?Gm?XP6i)F ziexS1^rvT&?&S*-($?-VuR0RTNGaL)pI`|ua`I#SM1mA-7H+0YVHXnIjgiBe^Pqw- zZh&&e+V?In&})=T|0|WhBo93M&gq}nT2xw&2Wh2~e) zzp_MekFHAOvW%qbb#!);c%$BZt!n$Q-y{o|mbS>h;o7j};+WEm3A^)9bmKKEuSM#1 z;DOn_lF_hX%$M|ch7a)N2o{6q!hQ4iAFev!$nmUO!D3ehV!;_nLiudZ=|$R5e*d=o zT4Ez%E025ZT3RjK9$%M&Y+t^&K3yT?bzRYLbaso5IMD=4c_T|m5$x zeRYDp2^>XHC;XPu$%8y~>5xXLFXMDV_CC4F!Eqmj)YqvetoQ}80foGV{P@S^(5o^Y z2v&@m=w|fc2QtIhA0f?I>_3z9ru%x3DzzQAO>$Jjm+55yDM&N;;o8!N@YA4plP7+D z$g3+bG!{D<-Fd;zfk{e_{Xx}vcc4R=ciNoen*()TeXEqJ#l2t!)M?0&`y2TZE{vIL zQ2QO0eA!?^azfmPu_u|M9$hKQIt){dolIRM8`>NE{u{4u*nY3bCo!?%UDKNX#KcT$ zlO;QU1Fyzm!~G1>1invdvQL~ai)Pt78?g6~u&H1wwHu-1|B2fVh;e~K31VWETrPvT z*OClZx9xF!Whi>AnnCRo*i&^u@2c7$ZPwy7T)rSl``M>en9Q+kYMXG{T`UfF0CX*myWtoPe$ zYLk$;Z@l)e7P|)FqE`K>HH|eP=y+|h=S#kLA;=aOm@%QTu|m7M3j~yuXgZ!IhH^i8 zFJPee+%H#mTnO~!{=TaMO6zo!8B+PBm`$N9u_3*XWs^3O$NWZkGM+gPxjS}rOZ5aj z=Oqd--c-x_1xZ~~W-ycu&qzUUacEh6yA`Fuq~yFi3v6-e!k?y-#;ANPssHKtG&!%{ zn;)5n>gcPD{2L8xl9zMlY7691sYjYW_i@cPN3gWdm^fRIaXI)rMVF;*Y(MyPyyp1+-?xRAK>7fhFGW*bby5)%f0P*tv+l zpmwRzgT15d8vKJx($81(x;e776?s7?d{HJ|w4wV}50MCt;~f^=<7qp&0&BnOR!H z4110OErBc}s4%T;Fy{-7t5LLUQyM_V)mj%g-?g-W8Arm#!EX~j6HnGbKmAOtE>-sH zcX9nhktTf!jwPzdn*Dd*-TDji1yF|F#bJ(EQoj9`ny<5D#BWjGx`RQqBS=gt6swS9 zcTE!o_kP`5pGkb{;ZYF7I53=%k>7P1B_L>8cFh;KiWT0;7|O`xG4i3Kdm^>YrUB&feRMJ5;6jv*nzMp)jQ*<-|hA%2k9uCRuV>; z;I)@Fx5>lAd)C~-6D>vQA* zTC$|P-?0yi`x_HxRwzw5F*8v+fgBE{&ieY-ClPN9VV4gbfE!Ibi%o43lM0AO@3g(Q ze|&}`vTq_F6oqjmQ-{Bj@mX$dJ}I(;1+?B3IezK>2_B7T4?2w>L`C!xWu|hu<4+Ia zT0WPl?e-HE3Z^jb_gpMvi$dWfmaweP#(igJtZoglh`AAv&4wf!Hwc!pBIZh_FrRKvNRXe2SRR{2QkQ|U>eIxPq<$EG5wFJ%bwz4uGtC{%`^e{EOLziO>yf39r z>L-!)67Nf>N~0FW^!`RSw!M3WQ)K>?iQv{~i)>d`T165?dcJ^j(gRaUY6%kK{2`=S zKsn3%SjllP_qu7Vu3yvSI++VY=sJV>-m#e9<+%KKw79yy=7VQ4uuEY#VTK@h;u{7E zx=_bJkEVbB*&m>!myAAL;Kfs{@TaO11Rp}JWJ0HO*WS0{V5R%1POrqm6#3GA&wY(p zU_!3EI)wvU^7vf_QTmg!oiaK4fEw7D(O7T%op4ARn5r8^B7S_Pd%IyM<)~b8OhccP zw!hn>Z-Ty&QO3DA9ln%~HTj33TkGigRC`>M*4kY!nA(q&=Duc12l$JJC_*@E-oddd4yFblL6^*I4H%^07dnDqr5X8w$ zg&L-Xfq@YbSwfYW>A$k$P2Ff?35k@G3_M^6xLMCJwQ-?Z?W}=lpy^Ke9*`93boBE) zS#sP|O;(G#NtSrq`!=sM7mWwC?u9aow9kT8GU;SN+gIS-e&==&-`FK3TT_mVw;{D+ z?5nAeZDwTpP=-0WiU9%~;x?E)Zr>Y~XVOh;918)MNk&I7n>Yy-g;z}mYpVLsP}pf$ zD8ss_PY=tlW{IY?83&rSLtTTkx1D0R1ugOd94}xLX#6g7_#>OI z64hZLS8*7H#z&zM87arUuS^f@qq@%C{5id(Z(qbN*~68sY>+Xn0ZN?MyVU(8;)&gK zW}c?mUs|d@ck2OC5b0)%VSiDyfPVSh`TQr=2JXgorw$Jwhu;#7$XcjCg!g&ygD>+6SBv3|%k%(w+_WPE&=Oj|W~Ev9iCNMK(-u1; z;d25q3z6?BU#a)JH~q*x*SD_9m6#x49F-XIf$QKCz1^U>QhY!|Z+<(E1aP8&<99~f z)M^=2G$Z71rx%QaMU2*6h(z_lpux$)-vPT-BxGQS8EhfNV>O@7 zxvU=FnJN!Y*~~4XB@!JRyPlY7znc`KohTe_mU+K2MfuQdG#sUUL(D&C`(Q-@Zk0h}1zoZ=o7S#YEI>FA|pQo%=Fs+`W|~9M&A7{L#xkbfsLxabh2(mTbIM!KJGNWZuAJ)- zjRm=+k?U2CcDN4m=~!7)_jRAk)H*?Ud?4bcr$3H@`Chrt*`+2tva#eU5q-+YWNJRE zBw#rZrxlHZ@+9X`gd)2xC{d z@{OM&~Y8u{1vBPp{MzFqFFexKrb4`nA2aG(EV?QC|&}tu;&%W z-siHoE$I*MUblFuH70liPxzK4mT3vlZ z$-tRvuAA_ek|n61E+RFZUtvGmynmjLSmaq#b316jSPvvD^#$ezgpuz`cs8B|GO zUCE#xBjqr})#gYhZ%AU-Vjr@&@+STkX%IAle>P2MZ5ERr|RyZ*HK)-re;>f0iNjelGyyZOa_g ztd#C=yfnGKkh3^-ZN`nu=685kN$q7K_MV(cnXIG#m$(@o-ruR-QKW#xIF8rqBKyu) zVp;s|ci(t!Mh&_LM>KEA!XhIvN5W?5M3#|zEjK5{^eT#ZWiN%~JKUCu z72UpATh0ADYe4h9$D!?zo{e}8hOdyG{T-g-z`LJ@mZy465kq=zxohi|_1h`@^u0 zFiztowbbb4qe>GIPTCtb*x^=$5?kj#h(8?_9Q^XsARY%VKEJ{9Nn_)43;>o6nz4|V zcX-Frhz9UR!g~H)6=h;CWr6QP%s8rkvu65CjUXt@!>lSJ{6^~QTZ-*TyBL-!WbWfP^zJQ{> zl&mkgaxBTHMLqs#lt{1>)uO2a_zo`3na|oC?l84x+-6x*{Y)B(jpWE7VprP6ZTA&W zRj*y?tlgGf#PwZBSEzew4#~=Dn%~A0Kz~v@*q(!_IILu5X&DkM{8tRHwr1)j&GSqw z;2CIa8C5{%>9{&oCYPqjeOc4G@AeUuvE_=tPJwoD@5NnrbS#ZV03r_d{=92A4m+qeFBxO<|FN@G2 zqIV_BQbU`pO?7tpCN5?3?ASFwfs86Fx|4ME?*^ujosgw0Pv23J^;DIyW1KuYd!gZ3 z-xPyb@+L}wFgyOG-lpnDs$eTihy!c<8~@*^lPM8q0WT=*B&7zFaMjV?POalhw+Hmi z$O54itE;xxJIzh;=*CkPxGLesQ(`&l;l`u1u9?_1nrQBle@7iZa9hW?Y)=Ap=h6^! zc<8!@QObSVq1Ih@H;q)7C~P-Q`d*hX+~?QWL_%o#HW}P~(;QlbMRmFbvsKm(Uv`_E zwlZ_IBVfV)l}5GGJN8CQf(=aj0u1a~pBPiskB+QlQ>>e`D9w9zJM8|otSqQiB*J(C zH^;i_Pe+-+!)4t5+7W}p(eV&FOSdft;z@>@u5M&spK?#1u~ztmY2g=Q+7nw*zgt8N zghfmyOK7He(h9$p1Gc>6@XCL$x(r_}|9{?a&BGntLq|EBzm;TbI}8!75%EhuGn@Ym|M&x%v%#5ie=NC};p zWr1%OLss5xBCT_$A`T9HZU;V!OHbH zR}Lfj7Q*8T&mzaO6_a%e>FN0Zb?!F0pJ_V1oN$UGSU7(hK$hwaV`6#C{JzuR5I2%- zm&qt=3xc}V@m-mLm;{kz6}BC+8bpk924fm}kc~O6JzsbSt1q8%Z}Ktuv`Tw*-Fqx6s;zS5!l-i zMR4%rm~nRaL^=O!60o^7Ki&)@mWy36*?Fq%(P|xmpBG1@XM^w2sw1B05>=O{XSj=X zDTx!C+xqx42X(pU>YYB(((iZbca2m)7t+bmGto;l-YLG4l6Ezv+p9l`;r+|dVsfu| zN`J*$&y&7&@tIjT;3un=XHo2wQ+%;cKjc@qwaZO1!AN=u^^~fJq&)_yr_jX(|4Mm@ zz;2ddLWVnLEi$q0ZbiqSDzSD%S%hME=G%mjND=<9mdMwN-8V80G~~w=1i)vpPpYtGBNb&JT!*Fm)7e@+{46HR z!_(NChEG)~KSgYOe_x2!51PHC%uf*{DllnhuRON3ssyYQ^B%gnOBgxQrV4(n7B!6P z%_Ceevh6n5S%iL}*3UTVJVg?2;)Tfg`g;`upfvkm!{?O!HhsiITe*Yo&zC>}ex5iv zyA>iONzy>4q4i_B|!%K!U!x9%l(wy;fpTdgk~_M<S%Vy)?st0TSK?T$mTDayC3R$?%QdjivgR$$ScdCVTL#BQ>{#5ZW^=KhZ3Srev z``kDAhb*09eoS2}xNSoo&O4J^mxp0AtVMRPCoOG-X6*ep<;yhAc=Ykxs%H^X*5bQT zCYcXMY#Cm!hbFhwiiPTg+K z)ZS2bc0CR$Dxs?Ev&v)qg8Lcs5)vaTZ7Ijyq#r&${yMa>Dd3qQb9ieC3*|GLPh1H; z%v2+YJmFBFCmS8&AYM`Fg^k zd5j_$*i=7e4PZU7v1axvGwZ7(PefY;;tm!w`r@g7u1DZ)9R65z@!OOZ6J6Np^Q^>K zL3dJKyB9U=P+8LJTW+llzdy(lx%qR4b92+FbW^Yvfj)n+zb|-qHZ7RyW1H}a5=TeI zGgH_ySc7S_6n&vUh8nL$=I$h}a(f(Y3a^esyPdwrt|~_zucb7;49#?E>^eP)3xh@t zZ!n%F#OpZq-L_B*Q|y$8uwmxv{w@mQm2y!P-u6(Hsq0sOrxm%2>o+9yLFZ=fSx7~v zemO3mx!HG|f>vVPOsbB#!B>pZ*PMJjai?JdZmA^sbnFzZr$w-mpOPw4oOgj|OF}Oy zU#X16dUHD!pF7yMlhz0|JNa7qHu*M{$!k52e?tO9k$oyBD?v+#FHMGtf`P>4h4@bh z65f1FU|>92@@0<+_57%+H8Z04v*(6$BmN*u@ib#r^_H_o8mI-%hOjGd47(mQe%_SM zJjfP4_xz@zQT_e+48DTZ&`nAv@h#;%a_$6Ivw-zSZ@*JmYNwp)kIqnc&DRN#Xf zt(#l=1o^+vMv-+_y21WuaOMVd!53nUrz6vO}&nkl;Py}NAjm@`ZQ|T z**%yNDq|+x zmoPn~o4x3l+JO!hMP)I+`}_t!b{#f34NYNhhC1gw3$99^IAU&B`%$U?PD_JA6R(a+ zRVGvwv&uI4yrKQtkZMAar&auUpY7IdioDl7hy1I6(dAOff)bKWRaTyxFdt($Qw}x0 zL*a9j``4o)4kheZ#qC_NcTo&JMUmhC_Nsp(k7C#s_^500zJNL@3l8x1rmmaPD(nwW zBBhd#iDwsgqy~|8QNUv+SFE2E^?+DddM~~mHB{2!kO#c*n76ild)9B!U^DYvto%*4 z3Xzh5?FHv$lGvq~fXC#M5LZuue0KuYy%QM4f+}{Ut=sttd))iOG2r*Q(~Gqs3tObS z_XnJDuuS62)gETaU`g|V5$29fZwwuFgKsK+cYjIeGKK7Zs_k*#*OUJaLhk4Hor7G* z#S8erUy;Hqb3KorjxHj5Z>&XRrC{%~jYb0GK?0!Y>Rj+2%h=bGZUn129g902lrw^? zU{%>AYu_=!@{r3S1F&!`IQ<3PoCw*v#wUJ{Lx#EQI2W&~IDLj#xUw3_#v7w!i&72b zk^!t@VKFotX$H$k@z+-27#72Usa|L$xq;ayU!uNKWUt*8o~5*4UwQh@1zf6-$XiHe1i zEl0q1velw@+lRM^pO%pqX~`XC*;z;8Rnzh9b0QhXQ3@2YGUz2=PhG1S6Tc+Tj^Nf% zidK~gz6cgs+pt*PobzjwQCLL7qZ%Giffow01S3gdwOTT}eX{(ekuI+1_k>wIegMN$ z^5actaLk)Q`ELoS&yr|}6k299)^e^ARw!gYBFa{$Ch4 zUZ>-=V(j6a*Z&ORtvnkUL;7^n@w`gH zFaBN5dahR$;c7^Pii<4dOVFx&W~Q*S`+48k7)n9(hQ!;`(3q0D_c|hJ^)js&!P|M| zME$4ytbb;2idnT&l_d)CEUe5UBa-+M^W-kP!`Ify-`LvY%1a3qp-#OmB+<}Xl2BNG zf+Z(18urYD`*rU{OQcWX%;Z4kLa3iDmYw(ZO4urRA55hZz#hyB;lshH>jKO!rDT< zbLThX(g;tjfEMeYhL5p7Ue+_(dW%$Q)^bk`jJRPRSf&5=9v?gdQ&HG5SDGsEaJ>Rw zTFM{|i99bqlmCHxzPgKPB&sE%%2asTuy(GlWXE4xA*tkn&o0$im-tdU;-%UjFt*%T z$I@Eyiz@O<|MrOt`M70v-&SXnvFZk!(#$ z+xD49fJXH>#;$4R@3zQLoRul0V!pQ+; z1lv^!l8038hn=6Ogsqg)w5YRIuz+`~r!hyec-AH{ku!INovU3pS31|zj2c6#d}+ml z#u;R+6A7{;wIz^Z>x>Xr0qUtH^v367zj)*{ESci>TBm9}olNT1N}}1H>v0L%HbtIC zuI?8Z81g$p_KJk~$(R4$sQD{LeLHI?e-Y~sVL0QIIx@z5*ZP-|gqNKc z%U~OkEn%v`Uzu-5l%0lKD5#;JP3#lKB(e{bUTiRP_`hIq_f`(fv5G%qfe}Z2uem1>IedmK;fI zyu+dav0He;J8p;Fib{;m^EZjl+dL;-x4A=L6$5Xp>lImBS|V?s#FNj4GPbpPWPBRv^YXM4n-f?Cbw`ng(NlUT)eM(8I#5q5f6J08(==ATvX9I zF=-dhr~Z2@fpI`;KHqqv!`W`xkE6jtrzL3n`*!c(tb`_8J$9pXBezugGNc|%D8wrECu==_Vk`H&G#RpA$ZD+tb!S9G4E|Hhu!Mq zXj#894sZi@?CSaT{|8%t6&7dMERDiR2niD0JrgvzJ0T42?hbm+1?_unP99b+k<6jKl66(!IM0RZgh&q@RsQqm6WSRA`D^GR%KvAq(SgjKv! zLFJrvY#SphkDM;Jyt7ta<_5-jIzx8wRY4b>7+Y;@RfM-VJ$#y@+JHajeT`MPgn>7l zS1zrw3s@XhQBs;@-;JzG{B8k=M868HqDPhpD_}@1g8_#;am-mF6zytYygT@)2Q)7R zULvl-dqzGyWl{{k($X)D(L;p%+TtG|BmmRqQ*gvp7c=rB*Z#HHA&_a0y1wY-!N{_~ z9uyEy#S#JwePJNzo;3^1AN!Ioo;39P+by>&I`Si{yI&a^aaq9*e~_u zNp*NkSX@^b@+mY9|Nd)U#w!itXdbVoRA9KJk0t9IfzpW4uh>DsLRMOIQ8${A5(Gl5 zyaQT=VLeW)MEHoreKrU^sFgK5^++ZO=G@Q1{>C>)Ur?7c2ly^6u+(l9X;#Q3Y!#1i zSYfbVDCI%4m{q2Rd=5pv^wAn70{pSeCHZbFJajgoKnjLyDM#C@;i1Q0&E7iZ`0B$o}A(t-}gkdKRF;Ewjy&F zoh8J37S~v<-`#|hKU-4%|hx$IpRljV=D(*gibgb)VuWYhJj_RLFsKYrcv z){jEpJ+1k~8B(TkPKWor5O#VRpaz)!mThHX zTpy)c<6Wtl;aC^=xCb;PLc%YT5YEE+3i^@sG`4u(qn#?Htj8`q4f-^Kd5{o1rA{y* zqD#dVx#e0iZm1*i_M2b!Bw51ef(onG|q%>e^Fx;HWvz@`(-D@-{ z<}=!FcaLm4eKec2^~pfmnTuc7=eN24_vZ|p2`2RU@&q~K z@NW29ws%}6<|z1h!rb+`6XO9r!#KVECRn5gI9>4VP$&5$-NBj?qpez*HjopydM~|m zhGEjcLrZZ#*}Z+FQB574-MdrEvp+$wxpe>lEriqIRbt&xBqUt0!z>ox=_(4#@(?ZL z;A_hr;y%P*cwP{HcKobky?W_zF>s$tRvdkt>${9DPUmS=eujyKFVt*CvzKg>=X=FJ zao!qtMAQ!gGyR(OB2@ZdE`eP1ohuF?%3H_K-+odFvdGCwtdW~9`lNYg4XUY3;Ashj zFU;6gqdZ=VEN?)%v`((0*>P&53Xc6oRz%mUQ4)>qK-}$Ni%LWeln5EsJWfU`O+;3# zP}(P=-8@aKo+ii0PQEm4ObMB{dvOSra2Z}Z|(!;Ihl-d5Xtk7G6SITIp~j1Y0|3x z>mD-T&(^E$M%7Va-1_~czN(|EDw>w}qtANf(EaJc=1^?BDN$dX^#81dZg8E)q)hA8JiVkYrK@zN)CG^^!0m$mmhE!U1?kv7H_M*WDV zGsL_(y_;}@vuNN$a|_3(5>o1h3A@KJ%8|U@loCdxcGmPF4O@>ZVS-W#gLcl$p!p9; zt)rS}r8}x25p!>ZxV(@Qt8(1k(Udrx>glh>`T1EDXD*z4%bFJD*beCvkYIM)qd1LI zM%*5)zR@BXTs~DGM9W&%YdvXVASR+IUe)T0gr?<$X$xKYtxt`2wZsr4ArlW69Q0Bd z>W!;?74#Ce@QS47F&dO0hP8PnCU=2lN<`UCYOyn}QAb0!ZQ_j!&SYJW;OxTN1n^Xe zgM%J8YdI8|3fh9_I+2oi3%A;@4of1oMTJR?aU=`)@4wE@#TMUjs!)kfXOPN(&C)`$y6&-vx+?&P4e8p@^itN0shCwy z#!Q66HXI=oH_6f^lCr|7Ns_jjJaBRRNkk)o2=}#1YXhe0c%$RD?Ut3MHF7-;-TTaLmxt*t0AeQm~H(^v#y_K)l&T#st3or0kEq>pNehoY~G>7gyu z&S{USbtQ0Z%UT|;5my*`D*$%1psnaTm%+rJuuI3dKvOZe0sCuh#5`^Z+IW#exAyt$ zLz)ujShqA6aWVVqul>L$wiNUa{Ce?F36s{Cb@n6W{1!9I5dfe=K7&jlfl%B7_|YO@ z$nPidSouY*(@sqT){pzl3-6tQ!O1((#o}i@5422^jZS5+*8Sh;YI8$pKYS_(yHy#S>H6-PvQO2K&uj&k28*-Fl)_H| z_8Aj*#F)EirH*sG;4&H%UU6tng>#rP&;=zh;)r-k^j|qfR3lm_LIfpOgI`pUO zFjh}GVWymvMp;a$(e03po(if-Dr*6ONgscB&s`CTs|ro*Kvs@lv0)BHBS;#S^k&vh3FH1h0GS=-vg6gf_i_DDQ$3Z@6vk1!JnbO^Icx!o zx7k5~LOQOn^^P@JQh||LPzYLxNvaj zJB?yEQAN!enE-Q}ZU;rOkR{zPq_CH18SJ5jwtSJ0f3d=&}+HUjN zoS=xw+unW z-W+CQcG$}WKo=DeL!cPkC#1^1j`g(K>65HH2({PQ|00H0Y3Mu})jkWX#d5fGyagO- za=(vOp>v~DO3;%M0sB!M%%UgyP zAx(2|FQ;eML-VQeylIMhD1yXkoj2Q{|46c*WuGk`0Ez-azA)=JlxQ8ezlhVh2pR4E zWi~ZGZ#ID^K3C(ST0)_YEgE0W8W@&{zIp(z_S=)#u9M3)tX9+D?PHCP zj~31DQ6WqvmXbYqr@ya1;yBVZ(`5&EW`JOMKS%J|>)n!G@nR$vzqXqvGaR2%-p5WP4o^G@WzXo$RPa z5wjTm^LIR1sX`K>+PRaqz9Z!x@E0!Tc9YOFwu=#j=aGaV$7r6KkK!Ce&TFv3wv)YH0zJj{i>_vpE4A#jc-8Mgs zc;$-1C4L1 zEP$t)Dm5==t-xo?KmO?1Qah;!l?Jq3%Rb5^nXyp8xK!4Jh$;Y?0cWgfBq#xwnX%8I zoGN?1{o_uJj|ycl5({)sRXH)H{}XP|B4ZPK_3~P;hdkcODT!a<{=XleK3J-JqMJhDAWZUvh)s$`3oETb&>jS_*=l=STC)$`gD!RYH;`4v`Z90;4%+iM`|;|`qi z`h7$IBdAgi2dg=y;*uB8KDX6Qmx87AFR#-tH5jPpETMTsYpO5=;lE?~eujE*obh*| zYpItfQ<=ZbQTnB5Z!ukOzx0%3I=cn&&|A(?kKVgh2Z*>UY z{@{0I^C!j}Pbo5WBI+#O<}LdbBqqMtm6mOz-LQ2QZ`l-96hValrDo*9VhA3woF?$? zol-o>i)*=I9-D zEa1wY!QWzkScFc=mBlBZD42lz!mT0D3K^;>V9)){p6zy99|SRDyuK(BIF!#1wY#Kd zqDV~&AY7I@3ca|XrtAw*&t%12mP)~@ea>TyPL+zK3rm6EeORU6RRy=WG2rB-N$Xn> zTJub?n|_>8PwE542llsO>ZvBzXlO&rXo)q=J`=(9mZN^DUdq=Zbjzq(KdHWQ2yMV~ zw4$%5zPq9Xv$3@wog3w~MB)8MkltzbqE@!sL7bA!x$s5;8J~8-phos81OX)y*hjZS zT!PI?Z>*L|6O}peBvHuSsKd}fx8~sdG3-(8a%}~4REjz?-l9S!kV~@&m)(X-%vaKD z`}X8W9~p_@TGKnR^r`DJ=MKEPBJQEIt_KB4oQMZ(5EQ;q-bJ4pTgGnx3te(Z7*8&n z^QZLwmsaZA8fMo1;n}49CSrHf(>K32qf0zH>qHT4<3E90C%%7&CZvw{Qw&G*OHwgX>9}bbZ?t+D zhCU4BI*ZDL-z#&te^D>#v8H4$9K+2afNTog*EYlrmjREI z@=B$`a;cfp3LA|$1Bsa$u#uK3jIH8$bCLM<+qY^bT!sr7HX%9(R;MN z1$K$d(ixXA5^0V(TE@fC+_?765B=VF*>n8y>?F7sjCbi;zgcr?eYqm|Rq!H|29NP5 zI){@oqcMP@Rhl)>jha;>NlsP=f1YcMr@%XG^wR)$`o`u#&9%-9TlZs{K(uYkw#^+n znlu-bY+*n8U$o%c{B4O)uWMwH{OiO22+KcbTwv2-6<<2CXU)Xttg(vbwsWCRMUH=(V&+(KaZE7FI)Y5}&3!4Jeb(KuhujlgGR`q&}i~&^% zk3gpx5gtk=B5(@*h+!i|w228kc&(xw74`aQ?wjpKyNRQtw!|4&O?*HzJxh5 zso~QXKryZ?Rmm_TM?P(!ucz&^zq0r~RH%k0wnHA zyEVMj^+XCf7@0e73I=N&R$<&Gvs8@b>L-o-bjO??G6Nd?Dv`UP?3qg2{v3U!-nHCY z<#XE-qw3vGKkjA(78=1)$7T^y5qVI=e2GX4{OKXB)Hfc0zV2|zw@-n-fBE~liT={L zS-v&-vpNc+qsB8mwH$%H;y+Y%#zh0BO1w60xtCog_WX9jPG5HKqrv|fH+@QLoVgIb z-2ZpmWq%aG!h00EhD^*`Fp=9^_8p~oF3k#+gq%9;g`iN=wU=N46yx~p-7oe)aJjm%C%^1kKR0)MdMk5rU17A0lqSn0GW9JBHYOJLIyolmp}$Ax)%zDek1NWOGUjVEgHx zJix7oaZRPY(Ih-M3{n3?NLnFGg0Z=I?0}A?2o*E78J#~4O;RsMOT?whgC*X4rCPD& ziVOiqrSHllK3TKkf`hDR13%v1)=kbs>vcw?-QORNJ8)_x(BIzGvHXjxh_vnoH|o<@ zPfzzK{fZeb@@Q07Tf$&{v9t_U&o>^szpYiEHf|9m?$RHA^5c%ifVV9o?Bgkc7A8gJ zO5FzF)QxcCdS1B|dc;)ZhvAXPjf5YR>XPE7)bbu z9s45z-fi33H0lgv&TE}%@!u{WqbmKcv1>XFmw4DqM`(;e^G^HomkAw_{gmA1EE|X6KZMudd;99UKa+nkeQ(5lZz_(J zVC)rBHv8%Feu)0dIGS5%xE zyIy1(?D_eCVZyk8J?(a#Rna#Vecg!jxnRrlH?InLTV`Pd5~A)AJw~23pfQy9Gd3^= zqH$PaP$Sx-qWa^sp)C)A(_PtQu4WTuf1SeKgC{#(~%&3J0e_=enMZ*=)EAvpALb z%LaDqn2wJ2j@!o*`fr7%3F^J~;r~mML4fI^|I*paWG4kYGq;41JX6m%}w&_A{#Eht9f{89*~*18-|YWI#c1O$|UbiWvBO)l*bg-DB=cD zRDD6KD+^m$sWhl)h~ofk5LxeTb)ZlFpyZpW@Zwk*fF?+JKxU`g<{@E!73e>9L_@+h(_C7$AOt2?$-e!5 zpo8j)YPc%G;VHzVLKzU)6zHD^(o!uuPsJGem4)Pw z%O&M{(&9dqK{RmRCmV+&Cf4}y9OBS@vDH*53!9Bd|8HFe_8vQT+WmQ`on!+q^!EPd zvYiO#jK-1&1A+9+U58_dqw_jlHpNf|n--+aNGeW>DoAKJ^D;+r&Qc~S5tKsyQGL;C3mQzkY8CyQ;ZU4Nfn!_L`|9Q zYd5t&XoDgw=p6*qB)KdFDUVERCnPKwr(qR!S5%AD02ZPfnFukwMalEH%8-#%%&c;B z41;6=L~C>Oh}{{=*sO7QgCKj%l@4bwf%)-s@wSIoJ8FHjCgkOh3|;~h_*UDHT$}aC z$V*dDMAfHHj~+Q8RURvD3v+$ib2L>36^g?~+DvqgRf{@Wh7xMuj(!(1F{Es+(&!;d z>RQkncT}W}-_dev(P@C=YIKzUwDX6ThUwt)VS5Q|^e-T9Jvg4Wr5aHJ6aHDMIHdiR|Tw#M8ntO4{I%v z^Y5*HJX#4ti@1g^I^}zesXvgMDIFY3w$N;35sCXsVv=8d;dL;c?ODl8rWq=z`1d?Qc00ZhvQYd9WdkSe$L;oi{ECCoMQboG z%*$c+8$q!XQ(kdcquumJlFV?R6UrnezHa+y0|XW5VBPFK;}2f2YB4nm8GU{CA&W9L zmWEtFGAy&5sbUpojgS?Jy2}GGM1K z2S5voi8YP1c1aR@98N6VNO3F)>=p%2^3^QTNc>2N1SF@jId(aZ_m*ET@dj69FJ?12 zkX1N}f+F02nr!+7s}x%P^=~IyjeK_X6gjA=MuVXRInjM=q&9_4)~us4A@l5$kKpX( z=S`ePiQ=aQ%aw)Rj`q|{W6w7n+kt_gcdpm6zI+=9o3E{HK~=ozOBRsb27`)F-t%uon)GWh`Lq}2kI(^ASv#vM*b8?>`#XO_D72yRs2 zZe$VwX0edgqiEgfL|$a|;i^0>-PZK0NQ2hTaN~6KCFLFXWos~Kz6F>|qnH*pY5lHH zV(6$6?c`CJ5bMgg^_eTPgyk6Yvpmr*9bxWIs{%mkR5l-_G)rI;g>(sDIoACCrHF)r zsW{@wr1jv%pCbY7p|wq0TcI;vt!8B6^-)_!F2Bai&I%qq6friVSs7EJ@2LY;v`>2TBzj-SHp>;A+)%5N*c zD*p{bHlFPN14FjOXKV<45Z+!U{(bm`yq7V@Cc0mOF&L%0wP;Tc&1CCep2mWEUBM?@ z-HHmL!v%s)1BZTi6AM@S5~hB~0re#txejI`2k#vzu0zC<7S~*Qp*3x{ki zXT!z(&O+Xp`n1YwAiEq;&+ZdWXkmiLjv|AIN4Yhog%KhbiVf!9GpIwjC6a&4SdkK^ z_Q;Zr>P1n$+K$7zQ`ka>bNi|7-kP7KNKiN^^o*BzRmqB?EW(d0U-0^nY8VXbRLgMJonxySUi?k%e+1NQ zfzq&qOQO-tswq+<4Jq}<8?WagN~94k)Uh&8B3v$PL^2jc@HS*_FK?TXg)S*oahhfgvZ^I!lwf*)p=<(Pizfql%ZPD59`0A*1sTNoGDjNeLqqcNLWyW z)}pVgJ3rpw_06PWP(r_lZ*Dp9)@_;pMi#<&A`Xq_QTsV``FRGv!?HDn68zkM9)LH621w3MzQ#L`baT1m; zP;|d4o((>akp)#H*1lOvN(yYfupCjbX!BWkrpZU=KU(U;RDF8zInkW*W%lV5P=14W zjcs9SzU5DM@BZwiYb1;cS%E6D20iaiIAki9?MKH5)RPVP$wbj{Q{;?5?;lGY0@}Bm zoqJ=C)vc;kWnJCS14BBp(e+*FZC3}c(#YqzGMGC+p`|rAm1@!MXFDO`yW|-*f;*l4 z!mAZz+a~vccF_nxfu5i*#c_Dbf&6Vq?nMD%5mHBCM~4bdQ_2hS#Y2hi4GAK<gEu9&WE|gWC zD}fS?wKFqgD`#r!x6Vl2rk5v8)GcoaUFpl%peXLRy0PrRMFqvsl0>i>k&39!chu1hNJuE zjXHg%dKVnYfgT}`uTEX)YowhRk6diOUVLixCEP#TdJqQwQHPKVjWxO=O<5Z@iXqrI z!a+!+l01nt2@i}+RB$x&!U{Qg(mOcXNvxFq;Sy!C&Myc3Zc414)#-r*0|&z651yO#l*{^rZ}#$ev-c9NHIidBvtw~(4KZ8ePl%S^wOA%e16QD*t!!($^NoUqiPA| z<1qlx((C==QxM`B&?F3u2;%QNt2Am8?k^xe30$d|kLjk-YN;+B-3uV94XsNQ26GbvuRztNGJ?ENH#2 zzCH1_nnOp6IH=MZFA%m!NDX|Z(pJRoTPzI*Ga;2aQ+QY4t&v>e!7k?t%gGDf+(T_a zMwfIK-K$3q(l0YTmM*3)6m$xcp8!~8@Tr<5d;}PiVr9z#l2ROAW-ED7F zoN2rCs>!VCYCZKbP^Z`kQFnN4Ha06;tD3ro@vB7y%E{&TGt!N2TA%ICi>UAR)>Cxq@wg;_UQ8QX6Fzr!wz^d?(H_tIX+Apq|A_Wv zf@v-@7v6RH`|k#D)hFAWg5rxKrUa}5P6b>80=BE`?e_Bg;qjPOH{)XT=Zvt>$UdU) zWCtW`x1%KVOPoL+{a^H=tSm!WEH{ zlKB_tpOaBG75W|q!^a22bvYjxd8U{Y&|zp(6-8lJcb(B#5=!vpe_Izy*j3L>-~>!0 zK=v=y%+!^!^&|M32sIl6#O36disRPc1}CTHx2N5W69}ecMrKkOc56aj5Sjv#d$51^w;E9@ht9;c*6$+%G^RVPwv)ZqD`=j;^u`YqSBsy=enN<#Tu z63jVfSgA4sbVi1t$etjyta~-|Nx6ogZvpq{YExs1*p|w6RDC~d!^yUvsn)J(!;sdI zcS>XBC$$x@rcK#SVQoTbt%}%{asR!%X#ss`VWz5h(A3(bl&~0YBnt+6@YANn z;h#dsJ^lvNouv+DuQPE&+slL%F5Uj|M69l-+o~?-j{mAUIsaGHSv6mlfmNM}x88sK z!)%{2rrLT4evM}Ed#54;l?3>`?HxQQDDF{%_ian@GAHLcdN#?;=B}O2k%gR_pYa73 zn9Ik`j9pGi7lLNfQh5z+e6s11&+}a0TD3gp?A;^JjX-Y5@zP1n8psw%64b+jiEbMp z=S9}JUMrRfESd;9u{Z^(+?d6H#cvd${lGHgYWAAVWl=WLb!W;Q!>^J)h$^PEB}^7n zZVta3V(XQcI(Z zTN$Gd%f0|=S(AzfH1%|hEUhvK04+pB>0{CItm{+5Zf2k314`4r4UAx>l* zQ%y(p5cCSkwo$K+v2()1434e=ST3!cLMv+`lLR#iiA&u4G2f<2*Tzw^TnuWd2q?Vc zP2$ydqm1IB_9?~-Ga4{?{DN&Vlb-$4QHz=KeU=C}H|G9{#9Mp_wtzk5btqr={mJA! z?{F3q>g8^-Rtk|WIUVmOO(7Op_|&Z?bx|vHrR+_4Peo!~*^2svgdCaQMf{wI+HBNv zq+PUkj(v|%wmkkg`zEx$t42E4a^k5eo~H`18jMLH$&x)^R{tM6(ze))DPgDW+f}mf zIOR592A^-da&eV|nnc;7wYYP+uJEh2&TP})@-t^>RwuNDZDCTtq&!JI@njkCdku%{ zUO;YYjIOo~(jf4ytj4h4CpjnTy2lee1xN~+~`#$ z9vvTu--o{65!uB$&mMD}yZMwY(vvM>NI9~&T0b~@z!`1bf#8IQ-IGy(s;HKwDLL8u zl`*qxp!1hF4^!W3QfX$49$dXMG%i=m3HaSiZD~lv8S6Ffn@3pOA;V~n{`VbcuM95R z^$U4eochag*BjkG7*QPiuMB$@&ROZ8nEJdD@q~WCBJzz8fCaZV<>gHxax5J}Vb|B6 zzrloT97{4yDmDDi0qXHsG92p6tIL1PH{M<6V~yRQv8~MX>c~^q-QwJUf~PYX?il2E zRJ|+FW#`yKFmcmI7f;FzAmV_MEoWN>ZQU}R(k#!mHB}~1L*y>hMJ)}id29}n9y;9{ zrEFZ_+z1g#$2Ts`kJ{x$3{TW-r;#<4$+%W=XJtALb6Z;f12N@Mu4ou@;;7^QG2{iS zsmtl9)@6pZWjY8gfi)vat>F$9646DRoPL^> zsKoo%9ae~@REPm1Ju&(w5Y#)R)P zO!9%FvMO8L&V%bZm|Pm8TfoO-yL9T0sis=62ZZ>)J)k?U+@LIff?{Zj-4;wJUaQ{e ztos}clpD7}_}<|2;!_g}xl7S?-3o{?@a`Z=Nz*VkJ`3>AqTM^Qwn5nJurV6l9Zgzo zwwK>g)4_@Jd>w%uhYGqOT>U$iI%)}xWPTLHPKZudisER zMS0^;Tn)s_PM_fnPh7NSs;d<$wFl3SvGGbWa+WMvm7Vw*Z9Uz>)P44q_D6m2_0d_v z`-|@FBqynr3Cz0M-6geAol@{9CX};@cvC8LW(Ed+iHSIGu;6SphSo9+J=M4W3X7*_ zVp2{a5j8yV9>F40NZ%By>dW3^=OR=RFo!x7bDU#%n*hEfQZv&_8;T^21bz!Y3qnJ;8_@rrG6Gt3E9eoEv@L@k8f!Uu`j5hSa0jW}mNv*gYK;I@QR_@312jwvLS<;A zQxrkW#R<#{3gb?yh{|EWRwQL}Mw#L+?q8)NABv=B@abhtnAIh`_4wBaSX2g|;OrJWQEI z88m5iSu-&>q3n}z+E~&z^6B=H69MT1_jb*@-6-UqU-~_f?a57y523Hm^3|=!e_%Gq za9iD`{~z>Oj1Kt^^x;b5gh8JxGv7P5C{n?RL&pUk_vMdkYy&U8Cmm)Hy6PT9$ZjW> z(Z|fFaI4*~Qw$9hdkX%Ej!>TcjQ{^ntSByIh!$5)_3L#D z_!JXfpOcy9=eWfiH<4S-jFxAnBc{!%w)!WX2a@NR<0{1PJ$keX3YB`DaLLlcH{ zSo5y!@&1C%7;=^;Q61Uv;N6^W%O~e+e#&oXEpc(V^z{P#G8R8ff2+d@4@j>-6MIri z30>Iz{*I4|KC&bS^dis;pAqh{mC+guz?-{G5V9=VdLm34(3xf(RCwnsra{xTP0qj6 zGTuGFscyQTlC5oEXy`vaE=wxl(Z{vnmA{A&3RM44rSos4>y_xg3*Frw`f`kevUWLrbZ+WP`(-@(+dZ@%vxXF9FDZMk-x3uQXqfVp7@NFxk^&D5B_sGp|PQ`u_}BfgY1}7 zW8M19NMbB*<=q~Oc05qX{Oj2~Dfi+-Zmyw!xa_;#VGfX30_IVo6wr+^baSas6oio- z6SY?;-Q{>*Rxo`oTxNC>lE2M3$oOajN9(<)bek%5uI&4~@$a*ksa#4*3-Vv*o@HqK zY(4P{Tt4EL2y#x&@RJNye*SNlH@|yy%S~>^H@HGC{8W0pFl(yqx_hQiX#&7!CFR~7 z`5#k?6uw;_;JU^TW`;+5;zxZj$UO04!SgH62ZvTx;_&h&X&@lDG~D*DuaYnoe+}@? zvv>XSQ+nm2w6eIDsIFkN9lVQf<_r7@lEysO;Nl{x0G#yA7lwYYE7pZgXs3VV7D*#! zRqr5qLR6Xu=Yrazj=q_XXY8_YdJ^foXD(3ppCR$ruA;W7TJXQpqsb1>d*5}`m4)-N7Iq{ zH}FkuE0a4Qbo{<|8Md8o@XF8q7ZW?C2aETmOv8Z@nl?T z3wWoR{cxdR2@ZqZ9WbkgZA1jqe+t_|uyS(Apb75j<>lb9!YM2(V|kwp_sKU zV`9VRZn4`p2#Swa4s42!w!}nATn|^7SVR*a)Q!@;TKlB(R9$$)mbhLlm(lJQ6p1%b zbap_*^LK|(!axCg?*l){$t&VbbniM8jW5-to19QvTaX`=#*%Ee>t$v4$wtn9aR{8U zhOK2fTbT^(j%|BY2W*+wppI|w^)FiC(ohr}d zn2Z+jO$7_iS4fp@shgd(2#+=qT1JMKy**;z3Ri^RUz(mgOv&*fN?Iz6u0M7G!2IgE zd)#-{L6v^y%2?v<0v~V=j!w!A?D8^`a%q=C2oDL5^L%TwQ*SkGPSzCu+_#-~ZtK52 z>SIqPPSU-9xSkL+GrRwUwGB5G=~T_iG0-!H4VG5s_qd5^d*)iw(b-vE<>%THYvGxh zke!0wnInUHo$0^KS92@;iA;64+k>?5=tEEYjVfjFYB_X!5)WA`ClYJ<^m{h72++8s z+!pvn+sk%qA(5d;1_yvC7-hE}A4*%<?CNZ zsN^2p#4vGFC=3?f(}B^->DQPOsx8gK6BE<@Ol%#LM`7XGx!>BNKD_T3&P{DbvTI~^ z#c}8!8hRUYgcvh^U66Wj1_uY8Wg^J0w8&c|{UU1xAMw1oM<61jgM^bfSMTaHGc_fu z?1*fFGxq?GaDWmfd>luB2R$~-F$+phC-crhCN9VJJQ>7F zhk{nf@6~dAEpT|~?G^cAH<}q6b-7HrM09w;*B_*K(%`XM86I!Fc;$V@&<0$*Ig~zu zz2A^uf{2?0eL)4WnHn zrx@taSRiAVB$8sA@lAdKJp&$}XX(kn z6toS zr)>?M9+P4J)uvl++?s_QMFpPh;*9J@%C37orX{A2I#s#Ux>?6w-Xf;q5tgQv7JC%= z_tQ!9yIuJG*D0;APMn;F^o%geVrt}fL^wDa>BfyJNl@+9$Cy(cGn`_MH$qYk>C zSDf0%VEQi&b?nn)Ph057Y#n0}oYOi)V)l(3nW|Z1C_Bgsr}7kuY9-do=HmD}m z0tqdhZhO!1Ev&Hv<4eS-xU|hp^go?CvU?-t&U7tymaTp$3(wI*(by)nCtg-*M(aB0 z@As=GW5-k+KhnkDuC}#6*IvOdN9Uc&e(GXwh0d@=Y}>Qb8fL+X=@<56ED|f^za4eU z{rPi0Y!LA`@Fh%Y84~W|-g(e%9neYSeE%NDu1_710e=ykvYBZkWzdPz-A@`w^?*sT zEe{4Wg!&7K@IIq&?u0{H$X$x&7gLuU?(%Sp;SaKSA-M+;AN5e+K6HHhjVw+1oiU{L zgfK3zc4(BIoRT(u@i+U{*39q(Q{Ml>*gFPS9yi~<$)4D@ZQD*JwzFe%l8Gj^Z9AFR zwmIR%wmC8He$Kh|KUJrmTXn1UtNr>{{q0`s)4f_+um}kkt8D4IiOX}Fi9=&M2|5ot z5r5zB$}Sqxbt`>rf9-$uk8FKIcR^;T>aKT37#f&B7xaOilHX*VZIxDdG4gvXBdGvM2tz&6O(Z2NUz!;yKX?TjV|s1?Czi!@WS*v2UBKs@ zQF9Rkq8lKRadwGI++YDkoLsMK0}_V+1(bCcn^4bFYZ==UKzWoJ+t&7if}bbx<2&tX z1^|be8k0WoetV+HWInO3%Nv&(T>py57ZeqHdpCUi{+Q=mxq|NdZ+)9)=XH^}2W_@< zU|@-Du(C+LN(tU-b9ZDqmMvTX_-{B0+xvDHd&1THua?;LIk#h5L;LjoMKE9#E%NEn zJ>4+-V6C}Qzq4avWRD^3cm$WYqM)r%#i_o zW|ySuDc4c9%`{O*Kibyo4P~;wjy>;Up2&BCU;hy}{Jx(2W{O7Rw1EaDMjr8tDUzB) z=Nm+{dslY6?rHow#7u=n15tq-a(7AkIOpZXjSMMkRW$SBIpIGWM}_|aX3)?FY`bNc z6iIn#gJVA}Iy&{jAD*bz{$x2(Gm8-j%(k0R7-{Jx5KOt9Rh5##cAeq&d9-5?a?w20xFWpWsK8wBu`HIg?~X`5P*k55O82$PMR`2zEwl zh^~wEHImw7LS<_$A9iIjVGlPmhd->s>qeTXD^KrHE*Riutn6JJRlW}k@^TLUJDzzd z^LwR+JSzSW0c;)}VWp%rSJl+eV?kOgdAz0d+#kuJyx&#kxxBn$I&5sHkad#VqU*1A zOl(!_ZFKr6-L}e}_`E;Yn|zC3PFYTv17^$_e;FA@q)zNR``LQslxF}z7w&a1Z#sK; zs5quqw7((x@HV-b%`c=XDY>)yeB+EpjQi1F*hG6z=`FbbMLd{*d)|puaTWM2JOX5#$~|YXjTb{n;YD(9V@G`YwX> zXL!0$*q&wv(Zr%ED>hRf&LvPL&V`b1B4JitdcJe7Jd>sr6ws&(KFo<|o~(t1g1;*l z9EMz=mn{)py=X^)VxgcKzTDz1`< zGLNSxq^wzMNr|K{`e(lTwP}j_YrU$VtuO+iJFnZgJHGPiU`j==`Y*#*&{SfIfT)ms z>W7G6P~Y;P>D~1TrO3nkW_rC7R$5AHIeoHYavc*=4sSVg?tB%Pt9=f0vN$-kfoqut z78r;Yfiy`bMZ-&{m5i(`vbw4xWtPMW+Ju^zCv;J>M1YjAJxzz-;nXzJDn(E7)T6uy zws~+6-n7H>Web)KL)I_-WgA#q)96xUo@f7;k)CO8Ya3PD`>6|Vz}qG-#bVy{&}!my z{wNd_WJ*9Fu(Q@o2<}yj88yHTKB|-}pi$Vb8uoPMx)6iOoJlvh+|7hLF{ zpJ?M*rV`-^yDF97%SucqvPDzw9a~$&SXjtGaJ8HR9xKV&G7#=R06fAlg&U$}8VUB`Zl=vPvWTraD=UW$j$aRTT7zi3AW% z7W3PSGNwLEuFWq88j`4**3#ZuFoWlS%vwd|MME)lDX`&^_5(92v}=5s;zn%it)2s@ zFjE?8usOEAsg-0AE&RJe?{Y=BQc^|)adLJJ*JxIjmi~2S9O7P>0kSRGL9zptbum>5tx)`YHbp*S(PTud~XJJ)3v z6d;0ss+gH!s2Xez4eY_;r`67_^N&qWGtJ}*s*!cF+0auKb)tz-Ld;At!HVD++x&{? z)`NyCo}js`)XMu;Y4{-)fq6-7Te6t+kFW zKF3hVL_+E{q?h2^APpZ*KsG#CWvjOLCDkz84f$%z`0x%OSJ^l1Gn*e=Q<-Wbm+#>r=MTMlm_>X& zO+yy{Ofu9k&C&XExAG>f<>EoT>WzPQC*fYq-uQ_x6?SfYO+&^u68M{fS{0tG+`ek( zY!NZH*So*y_$hsZfV77nC69_9ZGC{|bc~8=Gwk56(S)pv3>+efFj;iPkjyXV{V{lW zQtF|wkprVwS@I0)akF;Pq=EqodBmx<-{o;FxwtKER}jxbs6<3cnk`e)$`T3+hzbe{ zcUd>k-CoR<|7)=NFWvCG;n#y9Iv$#ogc(K+(dUX++deUx>`!?*W8?939Ddjp&Vz$f zIji6JQTE_vY4Wqntr~@mmP}Ugpzi@_z|j=#^aGiSjV@^{Tpq0m?l+yi*}pZc;bBg7 zO|H4c&9GWW97Q)@i09$Gi@jQZR~u(mTw3$z7YW$e?}dd`2~B@ZR2S|tvJ7|D9sSBB zRLn8l?YuLyxSueLQsxYJQRD#C(K{3U+H8gGJ-#8ES#MR<_B5jxbe@9erPfwn&@8u1C=5KV+Pgl2R|F{8Uy{MNTnPoG% z&gYNzM8dvg6Wx2`jo2Gr&;EL#F@3eO|6qWIztzp-Q;Y!HmAjR@-EE%^KWh@eLk*b> zN0Vz~?$MP^j}K2kv|;XJn(%U{g2k-F-pxj_FkUHr z&(w;#aH`}K^v(B$EBJ^fNrgbtB$8OAfa#!YMA;yINXC*7olxOExn$M=XI$GA;G(d~ zz-hKXZM34jtsQZbnZ9m%yd&zNjV9EyYi4E<^;W7HV1Rj3ao zc$3-DZ&)xPA4NIb;9_mmzYlc{KL(eXrRtf-7!V;}Gyv*rG_>VveaeB$ck>z(vTMJq z&x`z=RKXPZAt4_)IGX(Fet#wQn`G{N!)!%K+ z?ml$G9DJO+t)~-|3MZW8Le9WA19w7vc=wvE{j@NbASv$7Wc~n~%w0Oip)9qo z&3RaDeUIP{XVp`+BB;5%ly0b_p0DMrdFR^o`QE&z)YH)XebWh(wR$f3Nn?RqNJc+~ zS=94aaY=@<3XzP4H28}`IY*>(7&4O1hJJAyV-`L%{{(Vq@7u$6y_-wMMSw)$xq*yr zbeT(G1}FICFePm8@ETgqp_pb5vjM;X8ZQdBf;qp8BJ*~F!orp+|MbB!|E&-HuBVq3T_xWo zwh0>rThdf4(I<&}X{wn0cjsQmp2<4n$6YiP_TPKVs6k0i)9LI5&HSf# zNx|Vg66owxTy3B0Nlp>HWi(Di9|A%j9iYzfP zPwwG^qy?6Ax-O21wY^kVZDkc)JVDlV(Qn?!fh!8)uSr#@ z0rKKe;pyMas_8A?wTr!DP{Y+vU8#yVk(0|1fi*^xqGWzOYS0SgZdk3n(0~X zXlQt%nr^XxPC`P$|GZWot9c)**Bdh+0mroXzf~VI6B99A3%&%{gkp-~_{>yAc^d($ zM>oJv$g$kzuq&&c^t7X|zoa291b5bs5DUrG!s8UmIvOIH{_2Z~o4~?_ z4-ag>axa6S?KRTSRgiM`24`gOGCArSdzeMX))1|&@zc_k=l2vyMkG%EsrvD9M`h@f zC#@xAnkVSjKX5_!v1w}OxNY)N0&Mp^5>T=2{jb_2F8+qTwHMRreQ|mF&K(eFzFFJz zNm&c@BQ<*FAFh0p?YmF1obkNr_S4d(>UllG_9pGqlnOH(`)MK8`h=W(QW3m!%$!Rf z|F$!ycD2zty0r^>-TdfkJ`nSIUjjGR`KM~4X_dR&JVOF@xunWEaPzLroeEQ8E+?mI z5Y@OfM`mrf4O|d8qLXLY*X7T(X}cR4@0lN2Sh!`@Ww?vb_x0PILtcg<%^3r%O9-qsOWAhxJDZXqIdYTGNmi6aO|+`r|GX%q^h5;3F^FEW9MTj z8qNpHPbSUJjgt7|u9O9J#LRMtL#lCyD7{cpjg>qSd97h%F(~=wk_ly99B}L*jqfq3 z7LwA&l#K!V!x0#vFX6;;dqik`m6fJ3EwS>#$6`)a2;;QY6Zy?YsaSl&aamsoU4FON zUzhGzmY~^+^}o$l#EI?l_Lp|!W78B|yb1RQcB*O(GBQd-yek^xF_pEpF|U%}z-!k| z&ex5s&jNE}A@gWe3<;UwPEu5Wf8U0ait1i75g0nKq$qyf5_V%IPPQ0$u$>QpIW-i+!)JRFIG*X2qDG1oWBt zJGf=Xjh&GgLN_-@=eH%o%=6CinVN&M#jN{Bc~yPo!GmXjT$C0rUV34zOY+EsA{<*~ zIgMjUb9LB9&^Pb^L;3_IT*%M6$vpa?H6Yxk*L^xOB+2Jd>(|gSz(23|U0>$)XC5u8 zp^nlTErqh&Y>LpPpqk2OiT_Rz$WHRR34eugkNrOq+og{|RcWfT{brEDdLE-fu-_crwJ?vlQ}y+uMwIBfSc zDqa7iru4CvSnAx0zlB>1+zOb1>Xrdtl^pXG&7vkJ2iE)le(B zAlN|Z)05KGL%?-4ra1OYGC=!o*MhI3^ZB>fb0L#ZUeA|8K}VFMENnIdUEB{SAPyNJ z;n_hKMC6LdSXbu;Qt${Jw^0%k8^fcNDB1WF@4X-m3=IBP_4%{?9=F|I_W${Oo&1Nj zfki?p?dZtdOGKliqZ^-O&adbQEv~`<1d-J@I1S7A*W~0tXPgc{drHC?aqb*gD@^AJ zM{ecv`9#2DKeQLyN7m$W>aJPrrBj{Zg=VAYGg$KT|BzKkUItC&iY&(VyP@6H*hi(Y zzYS&w*QPR9z90(45^sLOlJT&lhGuf*3i*s&O@puMNMammz?00BHMNCiSBasSsFjyH zl(e^mEtP_&rg5KI;TH4s#{TZZko||Rlifb@e1evQF4xp@uL@kF=(F}W0G~k9F1dax z0bBi3*~!3Q=k#>-4e0xsx%r_d;P;Sd$qaP%v3;4b!a|?fojWdwC>~48Fjl~QyA`x9g z@r6|Zvx=&FqqlCMN-f_o_y=d@sjJab81yqrOnWjqBAlK16Cw1a5*KmhY%G(tsq0A2 zfbG5-U>D#E=Pt#r7%KBBa?Wy0bBMQp?>XjX7bl)CDAZio?HmkDEiJ>cS{>&(H>I3n z*nLwpAvAb*49;a797!{}Gcb_V>wDS@5IWY|+bbo)Mwdrmt9}l3Zl$M&=z{m*o4HA% z8yw61jKE+0gNmT^bADb&RtHE?&0BDvLIJlEQ_40T^@?Hm>&_&dX41T{3j-P2666XQ z*`G(|`9W;?8bgE)Cu(Vn`386p>hP*-YA$SSF!aLu&6efmyykf6Ql|JutIw<Qr*ZoU#>G49&*G6#Mw-c6hy)n+u$ns5~LYDQsv7ogJeYZUq&)h};@VA)ql2|BH(* z*i}X&ni=ztyW~<6m*@KfNg@7{8nC+P$BA)DP{ZUbM(}me*cfSMwz4##mcgfeo(P+Y zHNDq?^&1|>4ecf?*Bhc4yl3vC3{yKbdjk@nHS@KkT(5KQwl96d(}1z4d-UZ*_gDMo>-uK5gCh8FcS` zj~#q##m%%Sv&|3K)Z^FR?wNSr0P8l*X;M&UuUk>nRbrqu_(9PsoivLk)d99u{D`Bf zx0kV*Zu&A&vDbWw`k>l*H+C^e*&`U3Z^OTLHYigSRnS!#y_DdV%3NF5R6p>3C@F;< z7U6JD+Dx7u9V>%2{IJho7;cY9TEd=ibu08r1zk??yTG(GD!3G4W0G*(E~3P%Dx+Z4 zVLmH}_DY_#ogvtH?&?Mz``f1Ly*eh`Y>aU}Lqg3S4IbNv)%3k_9Z%|NrfR6%U44C> zsNAxI@8rkU!;u7b9 z%HVf9S%I2QAs&y;f`Zzx^73y;NLyA`IP`U1x_y@+@V|Z=aA2TRm5ba^f_LWSw2hTf zGu@1r9Y3#@Sz`K7Jm^X>i8%^U&v{$b^=A01>2k9`#7 zT58E4GBh(YN_=T|jdVG4s{4uEm!)9s#^`BnPBC(Xf|)3<7`YNVO-jlTMFKwc$hGAG zC-QWQOwHRK-?8RkV#*c~u9#odl=?m;Yct9BJ%+h&lN3x&jk-!9Cjvo+jJ`d)Bm{)| zyk(a$Z-+m?UkUx{oAJ9v+=k)tx!Wse`?!g@%(4TnnwZ!mN35dO*j2ljUh~1*E-*|p zs3z+~HkPn6wQMD){G|aN+G@F6~SO~N|?GR1kPgcReq_hW^OGRb9 zdBLSmS1YmA%}REIZFkJ^*^E@so-^my(dW$fFo35IM>8t2G;4jPxi) zmZQdWvB@fOAd{ukmNX=uelojXZE7^g-~YK^5Kt92Q3LaFxh!^o4E9P zbd-&A{5r4D$3+*QeSX5}F1Z6Rg61ZSd2H77l-$IVy)f{npO_GQyi6iPNl1`6Ut7(; z4jNHI5X15>$|1IruQRP@#vu>P3YvNW`7%uDuBO+u<6!d$Qmwv#GDkcm2DdNXOy{4b8?-(CT z|1?75)saMqi~jdKt_Jk}ObnOfX+Y)qQw#DQfS+c}bINwbL`-Bjiw|bw*e?vq5{{dS5yY^V~ms%H(S& zzT^QjwPvcJp&10)EFaaw@loTQ=3JWnvJWh12iN4*$}q??H>%O{e-v1lOlpe$t0Jr{ zCF&x8tI&Ti8E#*V%xf^Nju7!_Kwx(Kh%^{Q{!__KO;A~0UmWbig%DzSeP7c$QY(cV zm9hVs>lt+xN9N6$TJKGdLs30poH9S>x>=>X?N{I_ciG$39nWg)DA|ZFL`mS{gs< z_AW2^lCOXNm!czde_EE8n47C8Dhlr75!J$QG9p-0NqBTsvf7Jva(6O{&bKmh*7P19jTuWj$}M9I^F zbDY!~Ao0P%-lPWho(<;A2;RMB19f79Q&i*-oC0<{HcPW-0&#Ml1w+z8wZV<#x6G2w zun~S6QP5kQR8#1-2A63)RYf|$3xN+l9a}o>5%IKlj27O#^5_mv%0?6L`G`6KZTY*> zv825uY8}+Tc8glLC>v>AI2x>%6tznC+42s`8Qjaa%yBPHY}`RiYGI}5ciXO4UJzbI zJdi~#TeLC7#xTarbLcBMNYmZAf)D-urLvYJ<={o|Vvr%-5}e?07KSHduUODV9k*9w z=ghCx*3l?BEdtnDwD3sIfPHo)&+kv0on{f!8w@{fho-BFUSM*a0r z8UPTC%fpqju*>&33TSxl9#HY9r5;iGFK4}WiJUdOThWFWR`R5L?)@C8n7na+RK7y> z!oMAy;KZZuG`e@a1QDG_fo;N7_WBV~N+>J_1siE!xE3Gp@5vc}?e5zD-4}O#44(fF zp;M~v10rayLJ3 z4LE(TdboK)7}fPZcmWwt=zVnLU2KK)q$5LPM4a_sjY`vZbE9Q1&z91Ov-I8F(kh$e zlR?oilQ1_SE}%pn>YD1Bu+&skHzWrLNJ+Z7b0&(X#lNngov3V#S#Ka%OJg?=E zb_~E;n%mir02`N#1~(6Iq<@(+Z~AcP=xuTFh|Jv_au*jhYJlAn?*oY@mhrs)hCT1u zm(_%BwcDD`k2MZVja|H>e_tU8_b(4zEoRvl|LlzbkckD&o*otO!p_I6<;mOm0@Gy; z$z%m-ZLxgx52ZczurPBD5B?sb8(_;zD1c=!!eY3asm!KKq~vg#tbN>8)c5x;<<{|8 z!a=j0>f4i-(nr33ia{Mod)%HunpSovyB8;=pUQey;nyI!N&M;zCq`8)mexzawUyNk zCN&>ly2tXGOU9QGcS9hgY;QWCp3}-y&@;xhkmAzD>D)2FkFGA^e&yq`vek9IEsS9E zX%1;?9Uw1CISp}faXD<=MQ&*RvD5pWCj6Q6_Ww4(8^T@xLsS^cE^5(rGw1O95Ch+u znzDOZEJ*t^Fiwci6C$nbFGdc^I&p-HF#4fl zcAJM;5DFjdbWRF;oApUSO~FhV0BCNe{TgWQ16x`q@v=~e*v@z^W0W#_@Hm>6ty%LD z;eV+lnS-7;{?A4q4a`?cDi5;C_PhTgi|T}2Wk^?Sa_}ZRpqNrVFO7t;nA9IA_jhrL zMZ^HqmqSc`uzZaBNl3c>1Icr1Tg2iB+JDz@ZG1I^x`n&N1zhdl?JWvcVJ3g;r64}u|0$V;l52BLO42y+1c zBpY&>8hG-WrMUNLiKQB*gxQlQr4mA&9P1_}?gidWkrxjl^Q4yvj`7NM`siu|m8BH% ze@>LVn7hRkZK$M1+5&+6x-JCPGswlwG*MTPHhi*CCp6O} z6QkI+@a_TxVncBN<|@dWGq|0_#Re?lQu!etv%rk!dJx1S;^xL>ZEbzGegkc7n{h|& zR~QL$9o|yTGTy@ePY*0#{wfQyIN2?y;lL(~YieTG)^rwT)58NPx8i5ia387)ru&HLeB zt>?!(e9yD~^!p=WEwJ18hf8R7iw9d4+V2Yn~?)^zzm zR4Lp}MZxd3@ZUo)4gc7~zR3<@A6;6B7^S^r@bqwZjBfiK{#8t#mT`bt**@t9Fa$(3kqk1&uYG;DoN%xtwzERH@fUf%%N4@1P`;%NU{%(S)F`st-z@ zvH?rzVM?a*Ou*e0(FkNG%wXcM{H2yfs9<0WrSbAz-E34X9ZfzwE(}ax>y}r?#Nr?@ zBZ405=nCNUXE=_~-rOW9sjQjDOVM!r($35zDkG%mo$Fon>I(S2X!x;sy|MhiErg@b zUDy9%vD7MhKrGhy?5sBUR^q&KgR^slTvXX_3gR*rH34z^+sHZ!YIb0sEN01S`?ECv z4*Gd)Y(Wg$U}p3U9_}g~y0Sh>A`vjdS`<_%C}hSl%!y&Gd~B_sPnC+RMRf@jX%fNc z3)Ek&gp;hNeEs*ySw8zyNg9R5PCzTDBn2A&eX z-^jwQ)+~E$oXNz(ETEu6bV7|j-7#<1$TY4D+0glT`rEJ3OzR8UBFiQPky9vW_bVrR zudF|n%d0DG6MgF3uA7*}$AE|XuvH)|_v|I$FawY@He|A8P9{@cq! zsix+Vn3y;|%}61{8`1Wcr{N#l57^c|`oE#GR_?McE@OXWD0w;Iu4(w+6Af6K8bGcR zp<;G25NM4$i!ob4YNTcmap6nH2%uh!eQyEyn^H>CeB@ zEG@E08BVGP0AU*V_po#dw*(b;N2mQf&nd)b8)6l(9*w+*B^kvrHUz{c}q2m$0UTp@#N$kK&q}(YF-A zF@`YF&Op~aJm^|$3GSYEaG8m}vOC|9wGDtK$0JA}`euJMirM4y46*g;%GumLDC9*a zl*+5zn!dE4J8-SV8Sad2tSYjsq1k_Jnr)trY`iL#yqqpO`&FXjHS>FAWWI!mqlPqB z%;w?Ll;W)Lilm+r`7j_BKQt30uox?eTsK0v$H?I*y1YKg<4Xu|Z!jE(ijHu9$;#!7 z=5JdgZ$@UkJT-;MJR@`Ksk3`>AZq0i{GTE*Qo2MZ7bM&3UY^_T=kb3KyyS{n5Q4|X z-AF;jr_yIfC2CAcF+>@kn=SiO6-J2laV7LLJ{wEatdKdPe0MLMJT~C*1Xs^V<&QSl zp(J?8F$R86^o8sUs4GZPriV^|)y5F{U1T2#@|3AYxK7UDNz@lKF1|T_w4kNOL1mZI z`qPqkp#3T-dy=7!TN3`b@bVgLCx-ex-W+UIGNq(M1Ki0Q8>WyY&XTi z!7@5G1*v8)r=pnUG~+ZpeRHy8noHDmu=NKTlxcf+aw{j~_YbpH=nFEA*l&7m!rbDB zN?S)~?{x%G3d*b8fiAyIC~Ys)j_rIeoc@lIZ6>KW(W$`5MD}C6DyBeL#8IpqyM1wv z<4JRVbz3HF_IV{8Yzt|x0!_w7j1IVxpp;|(=7If>4Vt@gNnw6e*h zQ_}=Fy>TOyYJm6Q^VqTei48(Mes_I+!T$^^^NX#!U$5*M!CEETwdynfWm3t=(niHh z6%&)EDgal3@PI_YCs44qW+fd5Y6n;BquYyXck#p0l0po7?GavuB*o#sN<9LUOX4)A zvr9`vYMPj3W>Zc_%p&U>EtzSJ-WucL$Xd{>4u{Zm)1upG$SXmE%88)YRbpb0R&JUI z{UlNUx#dI)#8w{cijNmitRZ?!mgl3~e=QD!L|Kj7M-#Mh zzFSBFe!Pg9rBbS@C&}qba@2=>0s@0*t!1d&H?oG%gy$#3WXcgJi|9f-THq>lC(2K& z3sisCw}#9`sHCQ)wKuy*9kpmyoK<8PW*^@sjdH|kCh6=;>zGsUS~LB%fMikEl9e{c zjadvavw$)_Hev)@7QOElns)ot&h*GHu!y{R`nLFY2svU#apJVRnT5@bguOaj8@wyk zA{P)&IJ?l8v>hru);E?Q`~{y9_W$`E=;*A$to)&(;>nTO_IU5|{vM}TR^9`73An4c7E>|p%J(j1705PfIPQeYFj;0exWMzA$`-el|?V=(8| z!#y_<(QCfm$yD-EvJcIFATiFI75i$NNVC!XsiEV?`_0j~{9flQWhJz3uj#D+m_dc9 z$&Nr-yTm6fx2kOCy`w;;)_Iwk$FCF1p?m@xV#sT6=D^yEM4c@$>ykm)hwZI(Z&)5B zUr%Fe`PI)3i;ydLHW|*UV%@*}%;IK2MCHe*?16T2%DQx}i9LAzNMx-RlCKwh2ODMP z6c%Vg4lC%PyjlY8by!TiX+dqn8u?}^JtxwrX#r=dFMX~Eg-oB$h+G=g^bOW`j$+mc zu7u6LmJC`z>eb~P)Vfw}BMZNhmo)k!;$gBnc9JR_puF_e^SfBn;a*8%{2+iHm#E*&`ht{^aR}wdD^_U#35SK(If67BBqs)AO^kvRe3F5-o({ZJp6fIl$FNchQY= zjEJE~Rc>sIi8TvHlU5Z%UM@;r!m~hN(Ej)|-QcDm4xxcJvW63)!pSW@*T7HSV{@Goh!J!1J^>QIX*t{y`x#%MoL z->d|?lB#Z_TFFVaFej~i0BYGzu+0=C>qKcN)IVe7AtZ<--Iem@QFdtAnFv;q%?`AX zfJynUOR*%oSJm8FfYX`cG_8~S)2O}lsVyf}a0ALndJ!!(HDpdsdq`(<&(jD_)&@R+ zDQqjK9{`LvzgaoMQ=V03f62GE1Ost5Q&{Mh9o4eGKPSI^@ea_pn%_SsDVaO$T$Aeb zwcPJaGzS~Qc00Pf$-<;I4u8iFbQZkzWsYp{t>Aqv-A6g!rV~#x@F)8Kt9GxaDZ*=s`9Ci4wryx4mZ63@Om4R3SZT}lrDKEW~ zQ-^|{^2o#qfk<2Ua_jPvhLYgW8oUnZPU|z9;_9-DfPNvW(UEdH8j4P~fOKz1?<9LC zrIrEe(U|Z=nfHHPuuO3I*2M{11&4Ie)EFVR=Oi z{2vdOrR0o0Wh*T@<`2dSqI=w+A(*_sA;}NYTQf7WUF`ixjd(69@Us=kbF?%JF@0wm zH`dTL>D4_vQ&Hsr#vV^Bo>AR=TZbxbyaRvE(_^@JS|L4a%4c8y zjK3KR(&#GQRMY`H)l4K~U~1^LVu6KmU~&dZ;6@qtq$|R*5fyYO47Crp3D;VKK%uwiBf17AAK%(OBv#G9zu*~iqa9N9Iya^&~lCG8b+RF0=~5T~=}l*u+_BRN#G zkRFo~j|uHJt?ljh=LX9JygoyZmA0Lpc1XEfAKQHPk&uanj;D9Ym&z<~Y|70ldZTJu z_#z`!t!?a4jQ9smRuGbsT;vs$*g5#7-UkF+qW(=yPqFfHDv0Y*vhwCal(p?79r-J@ zK>P9vnQ@yZ(k3tGDgf=d_Fc$92Q-54*ZGqVlB3=z)i;=d2glFz!Yfk7Dl8fr-=pIm z*@RYR{@(DIc7NQvxyNT|`SB3G z_W8-$#ut`f;6P;-*<6DCSeV_N)5}8?TVH@*Is!~jZ@WwTQZTnxK7FG9uc`yotJDxQ zMG{e_LYq4V_*Vb(%QIRYhSHB8q{ctMwL5jfKX`25DrsjJ``EYOu03o6T?k;t8mVYz zQda1k+VNK+(%I(F$Q{Y3BXR=Nx$|EK${wBCXYXk9}s3*sm#&j-1h*bljL{@Z(Z z^=?&LO-jT!DLyPXb^3Py5?4{F0wn?k0aEg5=>)@!QLUQZxO-pX%M=u5du%lQl5R23 zR8eIaOVt#Q3T*#yBZC(tRGS()Ps^Z9&hDQ__m=vlzW6Epxb-$3OW*kqp*f+c^72X} zc&eqCN(6=G+EDPi`)SL|5cCVF5Yy=Qk`Bb85N*g(Xz*H-spd+wuqOK z3@OTb<)*iLbX?3i$0gyTTIX#~Cw#sSlZJbihVKL}3-Bx2n;<3!tHxk!I7bh3qU?6> z>`=k`{u5om^BT7Qicp_#O~R!jSeXVE`r+{T2Eg2y4U?=qqg0fbB{pji2;7(E+YDaL zDFhG3fdy<;|Dg{LmhHOB{DT!FN=)(0IcO}m;F2KSXBa#z+xPYj+yhe35cYb*5lC&I zxN&!i4)cqb@;)UWyQF8!H`+qFp06Rc{+?%k4#A`z2JVo+jmzyvn>%cCJ((00K2L8; zKu(HAaM*(rQWR<)2bu8x(7iJzx*TM%jT=M-l*9rRPPXh=bI@$oB1!~id>sG*5B>n| z+w1G0w;2961+MbwZ?vssbyhaZtT<>4nfDI46_eLdMcpY1c=!iN{n}WeT8cS?)B4_0x&tIVJ(FAXqL()#|J+}_hNe8)!W?R_iz ziroGPToV3--0JlvLdT?@XGK)CrdOqej>IG`rJ7s;<_vE=;t}=!0~fuDyIsih4TuwZ zh0*ikZ}Yll67u*W@A|kh?NU0=Llq!K5n#SxET|WZEVyJP*w`AK81~#~^MiC0?uhDa zWimh)i~-X74a?G0J)Tu)CQGg4-hG|WRgRYyef zf-y3>ir542vmgip*)d1y;#LUz?Q1#XogjfO;ccug28U1$G~vS3)}4Ddv%! zBHwJpRTI=in&5nUiKwOs@$W*#AB3IaL6k_{L*gL$}$(UzB{rN$pRqgJ-gBY+gC zar4W>y8$;227M!!&-D@46_q6wPCVUeN|Y=AlekW9$LmP`{70@qphDOje4Zd2eLn}i zdOsUAftG#}k(NUdm%yL&HL3NgdA)VNSI?Ora^L#xY`JGR`U@NFvP4o{A;#G8=yl=Lkd3t-p{$ab_z7B%^dj95px1YCnn-o{y)Ee2o zDJg&bXMZ4vyzBNEb%~i_cke-Aqo*g#tCeZz>d;evm0|x?^IPlFXgyof@Zlh*eotL& zQIV_u)^_1F77MF^^tFF96rV*$Dx8@rxm_sO$axe;en)6^^JF^SngpqEfLTMpZUJtU z6agy@Z)Hor z@2?nm3NCUXI^J_AG^#z4iI*P+_Owy~uT3C#4F!zdG5WanaN|q6LRHO`v71eZI8{`9 z!*|QC)11Q)>NQvky|_#0DPUg%bKTfgTKxLzoZL;-s4Ya(2Si+wDZIzeYgTa3;fB@} zaprGZAUUi!$R@oB>4J&C$lMI^yE|I7{gmYfENXw5SYc2M$;$6$m+Lx32eI&cebObT zd~=qq`6UIE$qVeMsEx^L1VfEqrU}3db@-$$@D%+xn#=Y1Ujm{^)g(rZP|umi1P<4S zeUqvg_1@hK4U++BU|MAJBDD?T0>3GDQphf1jTyKh!j?jlg=50Bi1ysSo|&Ipw?Ftl zZx#%9Ta|kH{N7%OZ^Dp;hlfjyG0-g}0^uacoGHX)&B$yh$Ymka@YJOe+uB+~q`4h_ ztoJJkzYtt^eKOS$0f!#sw4AOV4XSbsM^5HZMl`AFT6!Ztvevb?@wVyY6z-# zm;R7F-D(a@xUm>gJWcgd=bX}tfO7YDL(KnIk z8@9tfZ*#juz1r}Bb}{82vpC7#hX-9AD44n0yY-5@y&cUn@;ZhI5J6&+#;Z5N1h>q+ ziix>u{^n*&Ae(}^{rTvg>sbQ{`^ty5)xO=O*pc0KxIm3^?<{*lFUl-irqmlLWr344 zj2oEhDX~X-GGKF3=o}o$)HZ>qZA)f0@{tb2@819cdHYmDHc$uB4C#hr#-A*&Z7i}dcSg58Qv|ET&EF+U*s z86qdyiR-Fh7%p+Zuj0}Tb|)vS`=N_ z8y>a(vlbtV5sz>@I~HT)cZ*`XkhPM&MFR6snDr6?>z$EP*w`H>?X&92LVWjlM|5T2 z8}3~-6eU^bW~hVD2cx?h%#qYTY@DUQWxC^_u2(>@lT#%x!Z??o6FUx;r{SiCF5#jl zj{gt*Nt|{`bSTn^W#`L@!@-ewuQl%j z?d!cC{e3|%?#9pW(e`~(I&XLHj%VUK`#eNPMEn_!N0DrC5nM65MRJ%bPn#2wd(Adw z`a7)eL)7*jvf(>8v5*J!8~*uN-vA58?qAt?xMsj40ykC+?1o{(Y3*ma$}At5h-$PzXTxIm|~pp0?XR|Ssv zn=AL1>WtjSHPX5wyL_hLwi=-V*jjsgGQg{JRR0k%| zaW@r*LfQzdI0|m>|JmtapJ^r$HI)9Z?~>!^k)v{?21|D4h`c@Ip&e`~4Y;E|f|@Lp zk0OM4GjcyFyA(D|Tg$OWa4Uy}R0HksO&g+KR#BVJHCD}bM|i>_L`97WcJinM;1F(xRv9RIg(TP~LCuzYVGn$S=!_SKs#C>U%jg8yvrpPn105V{3T80xL=29T~c zeS`UzuZr}oOssvst=qnZhc(RFR0)VpUcg(n#V!;Li{t8dI-#eSVQ%Jpd;eGK-EBGJ z>U2WL9E%#R`Ty|s7Hn;X(UvF@Ac5fSR@^D>8nnf|h2XA5f){w$T%vqhtvuA5eAfptqrpQ&M^os?kEj5AbAnBMM?#6oq?x&s_lc{ z9kE>JCIgb%hhf{EG5F-=Rg(4L6=kP`$tbpN9>&C zmM+Z{J@e(%ZEV7;;)dM{&Oalt*S%xzH(n61*PA2UdC)V))qX}*GJWmt&lkODd&_;| zC-l=5Q;(}7t}Klj>SKpNZbW=BZ{%$5^*gZA65Z>3wL6JP%?0K{NIy=fjq%oHW#;hr zTQhZwFx|a~af*l!x&7JC!%hFM?DIeEQ={O5N>cn`=~p5U<(=w2{z(Qj)3L~0wmVsq zlQ3twhygP)BVPbD1}*^zI)jPY?$jP|z}We)o!0E*NIgy}_-)3Cot=P3Fl}%^gwl&8 zqNWICiI&F}hmGyEy6^fw4}N||`}_3j9Om~ttOhJ`@WUg?c<4U`JD8EJSZS>3>AQlQ z%!L%VecNA-%MM^pYn5?`NQ2U$&!FIC4!}oKtgbQQat$(&)XVF%(4W7s(VHI;4_cgu zm6~Mq4=#|UkV>0Sa3Z}$>1H0i^>r{fq$Nq|QpzqimnSLxC@6hVW^JT&MlobS&T(e0 z4yPq7_4eT{8%ECP4!dhKrV_VG+R-23ng6~wZ<+YVBkzZYuh&Pe+#-`p_8mzeGiAn2Vwh|vI%8U$u z7s-&xOw5WAXM!68 zDJs5jcvPPH0=-^xzM-ypz*i~z*&r*Wa2eM?zQ{je>~T(~+xcn%F&qE>nz%g8%POMs z4{GS{&oEr}U{!Qbcz%}48I{uDEeVF0O8MFgMi>)ySaunX33Bt-Na1)8E~!&dRAQH8@$ zf?oTsrilT1{UO?N@p64J)h4n(y8{)aqG5}Q*-IL1)*4JHR|cwaSmq9SQIG0W^s#&c z_Oz;Cd2iObKU3^P3ft~tg37LxjNg>Xx#Du+yuDU)P=818(+MU!9zxalfopSHWXLV! zdUJiO=o4G>=jQNNwMl;l_PME}J(+SAMHb-p1zCA$529FzDg>6+uG?AMXbDPbL009T zuc>#ZQXsC{o>7zRFH~8m?&yek^^nBBKVR!jDO*VVvXHCU4D^iU3(V;b>qE?91?KY% zF$qe%sAAyVcrdho`stnJF6=s5tVVOVmprK#Y@Gb}rfnk(QYO!+J*en|I6CJT+zamJ zM05^7@If*@sHVuT1F=`dLER-{x6)~pd+oF%_(>>l%}fR23tQ0li`|&hz|8yF%vKB~ zL1wylH~A&$bFjQq}+zE6oPYUP6GyR zcDl45bW}r9EK{)*8?SFoFbTpA_Qwu-dcrsyJ5!~*XALT>H}?}-8FN6KGW<|tgPlS{$~ zHQFeJ1Hig*P`u<2eJ64VdgL4Q;5PH2v(sbxTYLf)o6nd9ye#3-5~~~8-2)a_VWFfN zKhXoKz~2#AO5|xAq}We$I~8d%fIaqe^vC?U`an~g$Vb)#g*uWxo8gGWTH-o$CDnQV z62=tfP(l*c)|%GIF7%lTgxih$z+9jt$77#WKPE?fbatd4_lNWy*1Tp<`uJSd|7bNH`(bp@u-lrCDh41&U zh3|LKjRuqZOif|jgVpU!rz!e92QoPd)vLIX;q;I#b>DIRcb8)Q-Bvodvoh4{T(ByM zlga7N4G7SYiT9{H89nXQc}+QF$y*S@KZ{ofXDQEx|B}rn4=q~6=0L24OPep1Zzk6Pm8*c}G!Qk!0L)Psh?r#HCd#?OPV$wUkW%UF zg;|m%;O58+{f8F641`}@^d7|~juA1?1bK*oE^2B+&=TTvCrJ~vB7>drP!M6l;Te@& z9Zyhy7$!lj&f=KU&6G9r8vC(*-(Iw!%hBd?S{Q2_hFbF}VnIGi0e=6EVwK`}{G8jl z(BlYW0n6d4?Pnxfy-;d3UYdx}!@%*)oDGBUuzB9ZuQV;$A*|P1ylf$crn`yey1H<0 z_w;cY6$C%A^ooc(+7e2291HucrijUvw?h^9A5VpN31y}LenCJmBe{=Hf5N15isI4z zh=IxI&Um$p`gKoKKLrL9XUZqAnskd7bKSK*88R!$@1oAW1RF9V$i&O6kR-KG$ zUIA1Y1m$Q&y9tCQ`cNIg@e9kb_v%spG-H{M^N}$~k_qFpDj|~@yw%)v!smixnvOiZ+utzd7!t+fFTC~-*?}l&W zF#p$zDv6Dj50b3NHOgK8t+!A`5ch&9o~;IVlk5gd$Uy?D$tnpS5<;n4hM|jOSgIdu z=MCuhqolINiCtz6N=Q?1L+%usfOTo6mCiu`9Xx!a`4>FCNL;K_!?d%ecRi+8SGCP# zg-1ejOKHNs29}MV03DPS9X8fFvo>uV9cXzHAk;_8$gt@l1{EMq^$*|&4L#nn>X8BP=dMZiZZNiK?Rb{sHF9?(-R9(^%VXo$5q7V=}742XpfsNr?LV6Kem ztxz4{6+JYaSvEE8G|x{`@M6G25z`eMnG#xWZw|qBdcC)+ikldTgj+>msyS8+fkOp1 zr)bomMnKWT3me>9yTs_W1Ql2UF#S*h=aey~WIq$otz_6X$=(Y5LJ230o7(IP!4Ul< z^pgiMLOxg-67TaX#$7ICuasN&pjOC`dZ1Tj1$KY?^l-@}*{whw5Zc?Tqkp=*1A?t- z9*feCSy5XJ2!KZF0FRoj&i=qK-o<61o`GdVPUF_Fu$FgVL2GUao@mXMD2rOv32FFw zTF7@0`7A4T<}bb*kw?|@zWdJm&l1;S|6S=RF#Od>x5bg42_I0j!YzeS4Ahe>Pa||Y zQP%_7iJFJPqHP zI7*%^EKhrUNIYZ7l9(BpDXux=w3D1<+j**9Z8>coi&*)^SdJUYi_OWUc$q?-)>n?s zJ}RqL4Ajjhw?fiQ(H=a*$BRNY`#MM#n)1#m-&3HCJl!Ga_XGkQu_knhA{o%ehj2k6 zeu1}GjI319Zu)R$%+Almooc_?-7W9;ciq>IE?x46+-$KFdydrV#HL1B%vD| zgClU{+Ze1m4|;(jq{VNs+qXt(m;1eKu-|7*7xNkME&*Oxb{)Yvf1AI4{G9#O7p9P* z5*fkjo_*uK@i?`TFGV}orS47kdQOxt@LSkK7KBbWd=Br;BBo5CJMOB;VZalVFT6Cq zu6pGwPBh2E#=oY2JLv}o2{~14TUk%zCk3NXMiTx=(p*)cfAMbeZhHTn{KlmlVwM}= zmg_Q7-G`1Uo3chitH52-)h9oqwrmu)NK$CkiD;Lu-EVQI5|FytPw!* z5*nzRS4C|AAywW-?dS5y8O9*tBFW}=QRC||th2*2BI#MKklw@K$RLhx`+sSTVU0wo z(s{9IloBh`!}-<9g+U5%{9Ja;Trs~pZt2FD5PtiW<>gNwUgm{h}q9UVcdt7-ppxi=5;=aVrka+p{Y^;*~(Y3_X60Tts4ipeqU2T4dPFQciU- zH%F87KJYK+jG>ddAiHD+#V7?ZnAKC#m%NK07z*DV3M=5NPMkV$djpKrqUGmx#s6YU zJV3^x8f#HXeRSW)52qTRv^MQ)M~6ASD5CZaDfBZlYU@+iLH%cg8OW*~eudREX?8V? z9@I4I_RlXfb5c6(^vsK?GKynTiP&&=JrA0FxA%5{;SSpnk`+>BWoeR;RGX0-9+%;0 zZlO#2ppu2f(kx(AOk+l~$Rv;l>z?dQeQe_o(r!hJX9`)D!0f!OaF+a!wDG3h-URFa z>sV7JORCtp=DQnlFgNesTDlBXG1!LJ(jGEn=qxa5eV@!siHxR1AGa)ez z>~Q_NkZE9$J^abbQFr6>`!_QsAj2~Wcl5B3S$h;c-%1W4ID8%8>?_(BTfIg_W*ijlvZ0btN zQw0)E>e=zT+9Z`n35sP?B(>1g9IsE-6le$5HFXl2o`mt|wW}kl?91dA1<<#T zM-nQw>NF7F43Y{*I`GZR%RDS6+30ZH*5-mfO!^hs<%eaG9^Og_QGi+(l-_7zlF{rP z{Z;wyo%)K`w&JZfa7Fwdy!J}@kn0t%{rp(`86ss1S?>>9fE=eoHj00nK7 z*yVm1+3$I)_+gkyvUft_g+apaf_6VTiF-)3+Ln^S@6$O+s!A^jElp=fYiyfJ1}r|{ z-^7Lw#=nQZMnZ<=v?p3QQq@LpO5S-}0=AUpegf7%z)=}+LFlH-j1TY7`V=2+DK%YH zWRsUekwe_69Z6Vx)ZdZXc5N5>{(w~EC~)LU2}=Yj%Y?c)Bs}WHh)7q>iA5$_;j9?Z z7ig4o>QoDjPp4a|=j_yb-CPVu7OOS6#W$9y$=?qsRhNsR4beSn~~;a&_L?raBE zjli|d*WJx4IQqJ^YSABjX^VGxIi{q-^;ldy{YI9+>eC1ds}002nq^i^90Yy;6f~U2Ap){A*xxyCQX(y2Qw2n3e}2aBd;V1n`*)VT z8R8|`-)rQ&^J~k0^?$;x8;^i&|G#X0fBUO0>;7F$JSwaIwkaX668{ z^w`K@=yPIkxmb{417VUaev~F+FbuWx)xkk8EN(4NDBr<=Tz8mNCMrGHM~NqR5e7y0 zGxW;y1+ls!tw)liCy*E*ZD^}2BUA8yH9ekbMvu+J-(esQzw#v0hk<-3;dZU+dHxtv zh)8SFhSBP|(!ccQRJnf)+$2y(C$VQ&VO;M>v&TkMixKwqsglsyN~&=TGBWVS-`Q7r z%;Z1=&n>xrWu5feANUBpa%R{jWdm2%^1E6Z5$hYV^Xf9*taIT0Ff&4fZ zDInOVhb`>SH)D0|ijxZ|7nT0P?$djH9N7{0qY)+li1hJ>Y~p^v+in{5hR)I^5TIB_w-3_ zp}wC{ebW}WeRG2coWS{YGw^T5G8H^=Q9Vz+E=oZEUJgU zQ}7aecqI5@|CAD1;K?_aOE`H!16KbAkg7t^n#7qwX8j@PZ_I@WFg&pGP1OJm4zZiU z;G|_$b@qLh0Z+lZSLcJSnKX`H}gQiK{_ufkmM#M|@ ziaPs+D%@`jnqzfI_GbY4ohAHUwTjQe5`G88FxVch)u>kFGJSRF*+qum(4(f}(>7c+ z#if%c3d4OuqSceQsmasTqcE=YEA9*-Hsp$kua3QfWVAvxBzY5|lzJ&LGAGS8LCOm! zor~}qALmJ45zs$0IJdg5J^_c>)o#_MK?IMZUNo4 z;@{+v$qJ%=V48c=GoHNHCUUOK zo3}Q41j3$N8ykqNR~{$V8NxO90%uZlB&?B>0IP9e_Ehf9`;Om|*A)L39c2vZh*fYm_-jmL8;g6m z-tLOcreY+P=GZXV_56UOdoW+ESluBLXf!_0qe~?#z7d!a_)Xr=;QPn2si>((p+=jH z*X7X8^cMeWYXCO2s!kDjdMgQQP6(W9}vwpciHtk)7TNfgfqgi%7C( z@3MaT-KQVu|F7xij_qxio$yyqu6@Eed~U_BGTPoaCtiZ_@UE-)=J01bMdKiQ~b&Kj}eC(ZFq_DulMEree zA&{y(=HNp2KCn~ZXDqp(@n9ia)8+Y2{AJnaXUc%P=#9-`h3uV6wCwGd!R+nxil&-2 zZ_t4rR_Tj(c~X(xC%~o_yhJshqKr;qlAQLi;RjHp10;8f82p)Z%npB^>}_*HKtrN^yi+N7F15m2yXzfe`~;8=u#LK14C%F(Dp{hVtkjf!qT;?F#brM~=h+D?Iy0 z{&`A7A5~XAF69Vv){OPhjg|>Eka;ufnINSfMOVj5Fb6L^N-VUN6YwR z>ZPaZWm$*hlTvhVdynF12{^kfz*E<_5a)P;&#$`StFcf2Z4r8$`5l19SqI#zCMAl; zBC4WzjHGC6CfF(glM;1|mLMNOWjLIfFhMqUa4p%alePE$Q$@>~Fd$&?X+!CM6O0ME0?Mk8Y}{z)p1ewnD65 z$XhoY<{CWBDt)oLOBWQMR7{_d^)YA^SH>is1QThSG0M`l+Cc1(iP=nN-lq*US1-f6 zl{=NZY0rV_R2Lh~5UpbA4Ic*O&tfA$(lBD%8pdVLS2g{a6ZY48R5r7NE(iO_s|@Ou zMI+2posd|RuhN7OwpMM>10LKGwOFq09W{x;1IZ_pfZLOeO~Icp;u25W#IUPj>xa!@ zHP?eXBY4J=l!y+44i5N@Mp>M>sSkd`Dfe+YZ4Cayz6?t9jnfdSwhKNVq#UuN&yEbi zy}PK+?6VnOggGeKNH~1j4Xb^Ifv_kVJ!Y?92tShdr=!4XglaSOFgNms^sE_P@R9VJ z5M*GO4=(VAPIYpWuA>G1B}Z4Kt4x|cUzR8L4Gxu5%42(KzBCx|H#cU$Ks4Z|D^L9o zDvNDCVBXGwxtTVwR^dvde8R%kr3OsDw!n>Pp|2aRRV)g0YZE%<&5%`aCKh+LD{G+7+zaX^u^WRp%r zEzFGC)Q`544&O2r9eIaYJ7d^4xHg$l;g`2Oc>zWbqZRsy>+YfAa`yonRgTpLv^!=c z_>Z_*)0BqhHowjs0m~X^d>;TA+)o%?*z$}31t94gE^oGY8zhFO4>M2|u6@`D%UCY6 zK<%s=-<1|hplMd_&S`K9v=WFk4z@^{9x5vtwls8iznR`ZRV*ay+;{YmSL~~sv{40k zu*BfN_wi944j;^rK3Um9ZO8Qg8b?pb2O7(8YW2^RHC=9Qi8lY+@+MaPj1Y`rYD0AB0!uGI{GDL)iU?qrA0k{@^L=OF&~lx1sUlua|oz+Cr7tZ8p~#@ z7?5VQLzgJ!6j9_ABTy5!@$kn+rp8J@=P7_TH@;dv`0x*y?bdKDZk z9PB&#cY`bg1@Oux*J_C`%AKJ^WX;uXqs1m?&zdF>uZhN93K~U|5*i9M+LTh-@9e#H z*fa#gxti3)PnvsO_O%bVu?M)o!Y%9~Q|^|_j^F<_(+~6#at>&>{%eiNyT$%|-xLV| zU%(tEeSwcaMKG;!J1z?yi1aH!`ly700cqpI*Ty7XZ8wn^foJ&lF|#;6ZC+f8XpLb- zTcg;iZ=~aNh%?E^7`}A?9`Ax_LaL>D{r2{o)6yA7KgNGcsZR9`_t&SGhFP&)S{PCK zy(*}_AQzQFk)WM7Y9<4li3VhNfEace)+8HTP$7)Z)zy_!7BHCZPD)f4v4Yut4ix*2 zGcmZbK)+QwP;ZA1eudaCcw2xu;@`Q|ruN+*g@bXszk;TQ0kQDh|OE5CkvjG1#ol$l6; zqX6n5*j=>q=9~(-N}n$@2L=YEqe%LUvEvRsd{+$$F71vAbK zTcRo}PMlKWd*;_mer8=6YSg}-7{a=i@8Xn=)jpRc&{U69E7=>c6b&HhXTF2_dl6u? zeYyaIDB@onyL)B|uMGQVR^b78cs9j-E2Cwd{~=_p^zm{nHtXqD)#Nqlfx|w;S90Q3 zweK?q&K;Gz2nPcyJ+aE?j)8eKV5D4t-(QkhK!dR};I9-?H}tD-=*rPU`2%3|w2Q9I zAw%BIAbC;opnj>n8mGRN&%!V^-TE^Wg^9$b_G`C8wsay=sWzza3I|QM>=s5%Px%%n z2ERZaTJ*ER6Z`qbOKg~~1*LD>K=bDAw(y8R`Rxu`?W# zZXz)M^9c>)-p@R93cjUo|7P0r@_2S`O$skq?1k}AzeIrPX-4EOk+>Z!mUhudD8yPlos#2%a9hd%pD zgl`VLm0$~<6e34%+o@{VQj^z72<^dt7yB3yl^Ey%epc`-9~*H)Bx8n5C(<5M;rpvv zW@m{)sc)N2nHqVSI(dD8Y2Lm|q5McCe9}5`d~#C!eCGqRKB#Yf3E9tMp|0jAiTbH} z>t@v}Q!FB=Yh3+MFR8w(8fBs8_wP7+cF=nj1IIKIcozNlv@wFT(YT(unI-O)?`|T! zNjKttAu8?}BK_jd1N3{oI(w&O(?|q=$PIV%AhC-@5$^~|80M#d@3~P%EUrs{q}@p_ z<-XrtUr%?Bt(0k!&?J_)?5naxm>|Cfq&PRt1hKshmKt3a3q6HWxAetm;F8t-)COs* zmvn#=Y8SZE!;r1D4RvaLesn8+4_CJ=hCAaUMP+_2UwA}Ob$xYILzpAMwq-%D@UA&S zNuf`s$Qn|q4T5Ms6$OXBYrRE(zdS}GQ@y@T3Ab*t>!PCt1E9zZd{9Wjp~#bLsj(p) zyd@p8ZwcpM-Fz_9RguYJLtfVfNr5xCh20_8hT?0VV=3(fXs3>8FFZD@{_Q(|_x60v2FCxn zLwJ6JP?aMI$rApAD*ZEyW*i|)0WDt*J0k;Onj?aVIV@XBFyl@0yAcpfr#;!FB8P5K z=js$}5L~RPEVIc5;i&5AbEmLx+kvkt=PL)MW=CEQ+nS8eS|`o5`ZAD^XuD3H9VO+a zK-Jl&aQql+9c?Roea{PIoJL9!!t%C7+=IY zdHP!~r^;lcA3+#T1;1cESDPI4J+oRk&JpFbSu=RO@y-~jK^hK}q6Czk>N~8Q#7_!T z_~R}Qs?dv$%!B+|M1WE@?E>03&B3ik?FNmvbOx+Yzfg;QG-4)h(?-yDP&4AFK`G~ z<{T*1a-{H7t0{4}CoYHh2$(@m%egk6?}#`*wgyLCqJ$!ig*eLVHGw-`SW9LF$c7GS z5=n&)k8LMS3j)+|pUR{db;1oz z<-FqI|6Y#m&j4E1Jlr%PsduKj!7$!}3f91#<=u zyFyvrsF;rAs_&^PbnI0DQ)jT0oUiX}Fv9VGp<=80ggtjri0O^9YuT&y|r_LkCTUM4{qjHBYAZda~e!k)nP`r4Mt_?h2vFgayzVgRPK zuPmmy>#?_Nij&vL{|UuBV0sl=z3_ZVAx#~&0JOgcJUcbNU?E9Lnnf{-nUY7WE9!qy z)%;Z_pbdfcXL#ReX$DiXxRDYLSWho5ruUDxEx7Is@PpqGOsz2Oq%;`< z6%Bk?(`C@2w0m<0?C#zEIr$zSH1Sshxsf5MUOKEZE>*9Lq+VF z&z@z#md$5f+iaR|e|$(HrMEz{p;y6sIo)kWT3DW%QX8DTRIGuR2So9K%i%&So9bseZJ2UCJjdBu zU3zcmg`b@2!bje_T#~gpAKWWUUdb-(;@Ta2=8D6Gm1T^E-%jDT2$ zD67PvJhm>AkfC}<|9;ZG{&p%btdP>YFf{%)UyI|lhD*~Py$T5t?6puFIMlYU3fXQx z6xz_xZOb!$pt5?3bjx;1KqcWMgZeQDv`m~~cH6jaMo2!lS${Wpjr`*OU*wBBZ(8C# zs!sl+_BlH>2>yuOLo4{f7)?4Ndh<=FdQ9MKafl?dEGwidgYM8Yu``A&ECy8`ReEe$ zYLfij7hER769I>Fj-9Q11=v%?J$I8xSf?~87t4wg!Z2eck1z7|Z!G0m^^(}tGF$qg z%SUrD%~8J=hi!Z=4VAO>i2Jd0f%6c{u2BaxcAcf!Sv)WVO_H(fxRBw3;*FGe_;kQ| zuO+l>3N9R2n{45LM}e#n(K{iX-0=I%l5k}i#@Ad?5z(cO%F>Xg$hWG%p6}@CB=9FT zsBCI?cODhBacr8V(DO8t{dhE|t;r}RAlT-P^d5a?!-0+}Df8DjT_%l8U5iL&M9wcO;>lCrO_nRTsxvaoJ`A-P&WdzKA!Z1-UoazyGZhBYZ{U$)f8<1 z^r_j`8>0y;)wTIUkHyj#*66DwO(opmOT^=*?>j?Jwy3RRbt@wkVD{FPm6cd!&B2#W zbNOpm-S~7RaO7P3k8j$hfm|dJNt^R#*Z4OOZwQ8fbnLt5w~43ksdtrQq1HGzG7RnJ zCRG1tSN=x{!C3lp`QzXFpV-m;F^X_+-7^>8tP9v0faZO(%zIc!>y8|j4Zr?F9UI(|D58q) zC*?;vCwi#H{IB=8Txz46QPKq0HMKSeM>7XP7lyzDwmICGxL= z3=rhRYOrm*m%tP!(-@>qgBVXgrb0rE{9Bl_;=_BWXt1vl%LhZO?PEIx?E5^JA4Bwg zWdSJs36Y+g=pD}GrKq~6voK%Rl zuFS9h8LMOcUzt44-~0dUqy8h4*Bl#dJQAVG(S^!LgoX$-XObbAV6SqLvvcB)Ng#i~ zMKR-Ha08)Sff&$1gtfK|c_>I*?ck#r0$0rzhrW?%Am{1XtGX^@adlOyDIH)*>2aOq0@^3bWxz~23k@$G#aBUV0;4~Bcy zh`UK+O=D~H(h=d<`wBA;Z?pt9wD#OKH+l;yUGAH5h@cM;7@yz9v1+us zu@>>ij;syvePO{2<|6T>2^$~g4(~ZZ6JA|W+P=yoOgk8FZih;QuM5+A7T>->Uig)a zm`22YLuvaf6yq&pc?`Tp!mj&|(pxO+3ZYCU7h~Ygl_8eGt6F3+tLH4*y&_*Dd7Jl* zS;$4w?y*FB4}A*<@{u+31SP4qo6H>B&lOxx0AZ%Qz4vR znp0ayVBntnG_>sqKMOkebGCV=Z;@(g3#D57{#{xksv^HG8~Uvfam(7S_m znMcfCYs4x5@?;Z>zgRz)r=a*S*l^BVL0ZHlos&3(1R`dkSt2>D^Y_<{#h z%N9Y4p9;Lq1y`~cx>&OXHDU9@u4&?%uoPT<>%Lsicsi)TUAgVICVhi)JiV49G3pqD z4c?cz>d>wqBM?%#jwBLanGHsoDwD}th0vGm&Tis|#&O0RmgGVF6@3Aeun(hW80`Nz+0?tgK3lJ!*|eX5U=H8{-YN?K@8jLBXBH3=cDp*&&ah z!29E`l*Ggaee;k>yZ$|S(ftfmBx5VzYTS!yuea=EstKxrqwJXWvVe|WpHut?s<@0A zVT-DU4`$Hj|r)Z4R}ho{;u)bn>B@cosQ=J z@2M6IHbhr^-a3jv?@T ztoobSq^(1O(yfi-$$=^?c)B>^9_#_JP18>EAW6fr$E|_mj1!pfS|0oQInu zbKl;h8S9oby+X0~*aOcUuhOs(exf5wc}Dohpe6FxaT^LZAYOdKSJvOFmC7;)u&I|s zHc0tqY0f>g}kg8#(-v)&ZHRmM0Kp*&7UXk^T5{+ZO*(7??( z_VV+z1MQQMflsATah$*3=~0dKKvG+AKJO!n2PpPeRGH)89eQ<^&s zV=EBI9e2QzDhoOf8u zB9LG!jMx~q`#`X*l>h1US9gQ({S6k)>cz-$QkUoeb;!7HHjWzddt){>HrY?+VYusb z+IncX6>PF9S}2BwW!wU@(ZiQiFQYQ|dP1QFfp~lCiJh}+ zJ#KzNhzeimX^hP2QihX7ib=#Z+l8#IgFy#P#I3E0y@s(<=%6A!o3P6?*|j%|W+nyU z#Gd6XpmJaS$TB&ttjcxTz^QTLy}CK8Ecgo-lmA&A-hgE&%V@HZva_9C<2!@Jx->H- zZ&8~v?u*|a-UR6_~lEjsKh=W3Pb9?aZI0uDj0D8rl_#rRS5a9}ZXS9Tye(cFX+gCKg z%Lry7(39cAOi5qiv6y+(vv$4H9FT`Wte4;HR!$`tGuhc;t6xFIIkg|0gtp<xT<%AM~-D3MJNE6MYYTy^kh1Qr=KL?a7Y!%hU>olf|ir%+f zk?6fOZ|(gqUJ41Aar|Bxdsws&{kN_yia7pWLS-U4<>8pB!Lr98IZZ?HiC=Vv{7&E1 zuUGL6am?nf;E0=FSi@pLqpXlc8qcrBM1%P~O8^{ya`{`E26HD9D;QAONSa0Ya(91zZpug2T~<<3XN$?6CGfT`roUf@on$%Y!F3A!iqC3p=T}#$V1~W*qlBnVl*GHwWxu6IbmrKmO?I-{XG&OUKl-ngYYW5dQmZ z?Fw<FdP2runs04hYTuSpYa+#F)L{QQ{aFs<9(g47!&8ocMElE= zvs1xh*}`!@nk`%~uP|hRI`d1l=82DsJybe#H9Dtcc^v!qsG%dHm-mv-Tl9m4IBH~B zMqWgf<1NKr2$#DF7hfy_Yc;4?A)m~FbEc9bY#}9ORekE8vBM))CKvP~I@f_##lGAk zb8(G9ILB?*Q}a5JaqDI`n0h&#Yw@*))X#+Ji(WLC=|?C6g+WtmX_!@F1cddty?Xa6 zif81I%&XcKhf6*z>h->{)7J$rHfdr-&8;^}haUy!RTm#J#GZ7x@L_)+fFoemuZ^~! zR%^wnMUPeFLb{DGt&hAo#6OzBQ)s&JSNlnDf4BCIv+&h3i@uw*WoYPXiDGNsMo`4) z>Gh8C7sYpPzh$)YNOT5X)(ES<<23Dg784Qc==k7Lw!}%l{}*L!g0g#hnst6*0(x@8 z;8333-`9tf_wHkfV4ecc{>ipxKYRQDuk9FUf14ymuC8y{zRDS+%6puvgJM(z>(LKp z{R!)z%eBz?N0RPwEz0KR`M}XZ=5}2Ac8I6i?9Q)J$g0E=l)haT*7WW2Z;R)u@KUH~ z^5&djrV;a??ff=>Pn+<^uzYhJAu+t#QM8F0lo$lG8g87v`W86p5wnyr)@WN{Iz|Y) zMe*KFS0}iQ3yW$~PQa;6JH{&oYDpKoqvEgs@gs!xQ}){zAfPPfLYKVMu}Ot1!ag6k z(5Fe(d;u&ib>zM>vFC(NpP4bQ?`TFc#r~=g#aP&1oq1(3xhcZrd8L*V->Jwuz5{yj zOKa;8=Jrgk%!NiSQ_g&qpr;-V#T15JdF^Owmx4BuB=~pyXkpUSm@ zWoPw4KvsQ=x}HMtp!QW7<>(*k#7;7w@0n431}1TA`!~DZv@WAfsm}x#g=2y5)S$Mm z<3pzu0|Qpv;tipe*B_i$n`6uLHUw6C3RRr9MpBw;I$ep9_J6@zSDih|giqB%i{bYZTwCW$Jnb!0;iC{(Rkls{ z?YLEYLpK2`eJfKw1eOnR$%pxh2aBp&3$5X`IoBaNSIm=aRa7U<*iw)^-+!?>I9xz*uOri3?mT0J(5VOYPAR@*psx)vwkd52okO%?r; zZ?eV1dTTk;*9Q$p4GUDINEBdEkl!q16Ur5NJd%@GgI6ygnA21TqNMb&Ir-5&c7rp( zI~B^UV9;U&uVf)&H=FG#{VcKR?evAyFGQ@&nbVctN@9=--I_lfyb^7(e}5grGjP zXIl*EXgUv5YErrW`!P;%B6)RuH%O}ng*jLtc55@pJ!8I$aOE4FqfPu>PD2ew#XIps zhm$6@{FF2@CAKp8p&^eq6b<}dXt8}%CgM?AOcSOjH}dVDP9&T@{139;Ixea$Y#3D$ zL{g+f5Jm)~yFrNoN$GBe9=cPIW&lyTloX`9d+6>MI);!&y1sqB!@2jp@BMfG)?UxE z*V<1P@0i!d+o2y#!4>Ak%VQhle3o}$e>>Ih)*KUWx1EM}*48n%5>l(k zUrAp*-w@Cql9_R8)+!3R?cJ;?coi$xhLUjRx##&8f)T&8?VT!~AEa7!72zxO4@P>< zYnOEIMS|xSZQz4d=*6#a$XANsz1uH%u+5S09K6dXgk15W97$LFUvxEmN!&Uj$52v9 z53#AhRZ($-rY+C(SsnFZl_6gG@x%vPmvK#n=F}+x!@rjeWeWFMG{#Lj!_7dAuwAsl zYLjqr2TKyQ6;JUryj8X_f(63i7yp}WQ&VnWYY>rcZx~|~>V69Dnp3XiQp+sLB3sK6 zPE03jy^v$=Lc*}3xIq>4m|ls=t(~CNu?9UCe>D>0_I`o7klj6NuzS%u8BSu0Q~BK8 zEjW2?8$Be^^Q->=%$wj@!N}-Xbll{)=2GM5vLg@GSgGCV-J@~{&sYO?(7DlSUE{8z z(itHEqGXJrX^>f%r@fEs`P6Pv5xeoyd_>0LbF6bkV`uv=um>X9Yd5)d6#i#8;y(4TrC=eNKZVHs@u?6oxVj6IoG>%NukxVYGPBvLmK zfjjK7a@MOpKWEb>NQXt2!sMpNyVe}D;ssDKRdLrwr%Y<{b0cUbf%O_K*i~GU^ycRCotvD@e8H_Dg9ikI;|jj&f!rOt~T^0`Hx}G?X;9cazn^Q7j^yj z7g^ScW2qPZZoV8$O;v~JbFy-TS3_#@-q_@cL7B%%ccA*pi1s3r87EWkf! z{O=4+6iboGUe9w1_Tk8Tx3gVBosgOe^O5*PW7=R{gGUhLeScC1kV<1%N}&cut0>3Z z%NA-r6K9yM*44H-)|PWma&<6md{v`>y}YAM6{W~+;!#e>TXS_ZoATx2LYZn&6cO1# zCtwc@L$$T5THPC@-%mz(-CVlA8e$19TBf9AX^SaSrbt0Ia%tosn%u)R_9;dUF>e@| z()|3%foF_!OiA~Jn6LWC{B#rl zb7Fa!M3Z0}#&?ku#Ag#8{GZxXKtJ}uQVZ1v`wvR$g6s`Ol-9+8@u;@2Ebr}=+%q*n8is5O#aNoW3&ne0Z8LU3J2~-3A)PUi zi1?oKuAiJ;h$~`tmJq0M(elU%RPw#75_Agi=%1W+Cy#!@3HfZ?+iRQ3<<@gEkO~ZR zcn8Wk-P$H^gZBtUm85qCo$%Uk?mu(?gA~@~JAaGj)m5~v9y>LoHrfu>P9Ya$Zh6k1IRmd-v2S{`IpB2`J-d&NgO-E?g1b9U(}L}$sEPr}`@W`}Zu z2sP9AVaJ9!@^;orsE8NWqR-7G(&XX+7G^B9q~;|FHfeljo!@xSxM z!p1hfJbcNcXtN5>#~v7p2F9jioqVs@vf2IM@PSqtXG42-p+Pw72Y&-R{2QJ=27?M| zqFHO0Me0{|b%JU&5_i#rGe}U7eJviXq*}Ey3gl~qa%1!6i?Q(&JbHRwzXG1siQxTo zqraz-8ToaXsCU3fnhzI*-rlFx8v1LFonC`ZGLqV!`b^)fC?o1B>~=RyYq3BUamZ77 z6G!jobiAyZvp$T+p+SHSxsx$6@j*MHn1Z#Iu4B1Pi-`Vmev@!x6(t--dtGHL_)m zl~L$}8kwtVD+N9mbu@wBr?7ETbf%DtUu^Y}h;WZxcOtSbZsuNy%Yr5Y#TC&mtYjE=&&tp`Gnl$Vz=)#AYtLypoZz_$+bDFSBnDr(FFzAweFRq#On3- zo^_q*_QDDSQf&O1Hi0!HHMaU)>+7&tVpy@c;p@3C85UGS=|Umf84R&Wm{=IBS?92w zZ$8gz4IBqMr788zw>g}YRvDQ-MB(Y@LIe9iJ^ifyqMxF!q#4O}bOwFH<~U4!Td0<< z7tbmA_XFLNw^Hj*?4d)#O(>!8_ty$Stj#Cwm_2=RQm>cAWAK)~eG^kvjnAs9BgMzZ z*VNW-zq%3_N*9j!GhJe0;)F78Qn3Zy64zHRi|J0>?aFFW7g}0&Y-T_1jr`ez<0 zi!tQ5daN{U_w*f;W9$KO1?8VN$7LLmKOJ)_r!{?T4yehKAahTsQV#FyQp;FtNJi@w z{yJl2HCV%o6XPLw3C6vWteV;p(QTpZwBPYN^^M*IUJB+!W~ysbfUTWyk(=rc+hagu z%iG7rdQA`&qDAi$p2cR5rTN9S*&^#1&Dr*tI+Mg7BH^bd=4{+eHtW@GJ+{yK>XyaS zgabNnWLlnh5a@vd2^N2P=nt4614vTyz-1f54Eb7RFRe(yZ{>YBy1IjWy{|{nMmJ4&w0+9n=u`e`dTPhPBZp`+-r63L^H?LAdu3II zAYod2;I;^P2eugqVuu8tU&MUyKE*XKHg%uZExZ^d`Q4E}%T4h^t8L*A@2IUQccP9l zt7@XgVBFLq+cg7g0`co0GXtb?^lSpdwnxt(tC$g+DX4y+%q&^FwNXL8F>uf|?>7gc zx^RB?WSWW}8R$Ouzpqu%_wM9J*3Z|&p~<)zpZxLS!~(5l&}m&D#?60%594UtXFrIdt|K1T`z0niI_tjvKppnZ%Kkw4H7c zn@|x4%}^CwwW2cxC6*fd6SCY5r_V4`r7*_LZta~hYoPWI(6^3^FilMzL||;PbjF zm-mGOzruk2z|=xcTlz&V0L%swfT@gRQp#;?6QOla5mWSo=GPp|Tnv@G{; zH(Yd(C7|utGFB&-(A1Rh^)zwisJgn%;pWELj0A3!!kLMSD_M#ZvBT=jOP*-vwViFq zd|l;d++ya{yDF_z{iwOWLGm5j5KyyqQLS;{`Ir^Kw8Gz&RVzjXW^gHwzDn>Jodatf9P$Fb!aU3Yh4pAlwi^3WI#?7!y5v4cU;_X6Q^U6 zSH!F9-ZNkY?!vk6^wqU*4Xf(yYZrC7f@0#*A`iSb1*0kK#Dt*#FTa&o{dr55PJF-D za?87mXcUrZC4ATXC0QxqxsyItUMuQJt8_09T!KKD&#SiE1=uhQ*xu2(PB<8 z3Bk@|fWEJNW1Pdo(p1>@NniO(dFDHvBx>eJ`~_o!Z7MDr>5EC<^pYMV;@GY%9GAh> z0S#=FG}el4=Us+&R))7E47*rQvVa29VS8 zcC*+G1ij-kV&QBU$(5Q==gq3;2)|o&D5O~A3h?S|6v5a>@Oi9KOhu(vp4%1w=eU;Q8la-oe1Itd#gIs z?q3C^{00%6QV9DM&4i3s8Vd5OR~y)=I#jLs9ne~LE3zLx$1KfvS3iz6HVszY4DN9b znmou`Zk9Q{-OoWc$KwX8gPg=lR%c2~!~)f6=ahy`>tCCG8ZPetNj0@N*NGZjSs0Gn z9e`?CVrwVY<3V@d%hv+TrV8)Q_-5B!)N5T6f7LR}X?qC%ZxG<+vpvxxq07bdmgs?0 zxr+!)B^5mz^q-A1xU_M>$zrh*;UkL+!TI?N6e8Xv0BN!*yW>q4>vea{ef;Z;^OJo( zV1D<#oM$B4#s*PFZaE${m>$!cwx^G&GG^Yr*sjr+H7g|6R9$%)&VxiKlc~V4%*}{j z3y+(F$_JW+?diwE8J%4Ck0Qn>WVJ${bI5+Fsy;XNHhx^dNT;N+5MCLpYnr`@_>DJ^ zQp6NJ*)_-!J^0*aZx03V>67|HCB3Yvkh#&T-(nU{HkaDj6%+(L@XUvF*=f8XIf3~B$p!S7#Agju(B#YBx!P^inevzao1_Abj-Rx;C& z|1AT_mQ_btj+U;F4~Ct7{bzCwmgSu!Y+XUWCkYD7YZHBZ3M|ztaASN0O54uuEIq!4 zxi3!LQucp}`T?Pi#qvX|Rn+g4_U^#%o(kw{a_zUabho#3cyPbAbmVu}a{pz?_munY zNTa38oXXFCSoD^{d|Kh>YhDW{x1!x-sP-14_(wJhgs2%p#k1%z*(WBRP^XtgQ#H)O zM=*1g#p!4yu&+-$Ha57_ZAnC46@M5tP1f!0zqU&ZpT&LH=3oSCQ)udqZfsycUf#MR z;F!VQ%*>m5ag_194r_34kYtM-J_?d@SZPO{uRo27DX`WwSc13DbJPo57v(7%l9HOL zp{WZ52`LhUj2yM6;sGcAhYu zccL>}Un+B4`W1d{y~fQoox6t~Y_)|&a*|Lbb&M=CX(wOXeB_>bX|`|cQ2NBzkJO50 zFfXDqqpY|?=$@Lq>D8Wd=a#Z!TtT6dhZ|2Lcabx+ z?n&?32sabU+oZSqnRtmdwi7DW%teL)EsR zCPp9*jsc9@4L{igI{%yC%gXj!SnaSqNihMX`v-i*>+jpUnb-V{a`N8kI2=Z@nRGp7 zBd;-)lQTbufwt|zQxms3Ku^=#i}{*){3bQYJgaGU7%}lzm;7J08*}l10ix%mcHt>t|yPfu{D!*2|Cji=2 zH{VDxHvI6r11|BJMg6TAUOBfr<{*^2J_YRsOMz4ro+sGre0MVl&2Bt$q}n2e@~ z$F644MzFY&=v|4}>lc;$D~l$wq2@tDIfD5A`sbx7D(~S6%LmQp!r7+T?Zk%}*_AIk zX+v~Qv@i2n+Z0=7_u~Qc9?`}L&R$F_a_$Dg!%=zWY01Now!SH7k ziRfVoO289G)^hw#N!}Ot{g5yJ1&Gq1JR7(#omW#+1Cfynj!eu)mLF?heA!U1Bah~ctKWmje z*CM2ERv~v3-}PnK3Lu{uZ=6;G`x<^}ZIHt{4}WeUw+YHnJ>4j<;kS5&PR?}>8( z7Ygr4)a(iilN^>I#Fv0>D!!Bh@nwyXldq~Se9(kb(}1*dC7-NP5_5E6A&OC>cv++6 zim>@=hwE2Cml;vELDKG=+wk5Ti58LejrJ z0}0~{A9~j(qLUt_*MH=rKJIxadyYOK@De8u*I;wV=*ef|DNN>Y-f$;XG!^KV{S zkL&)thi<)duet*X3CV}j+V-g)Y_vYS!-TBR2!(Z`m5~gJlx|si{}5#-lPXV!M(}U% zOIjY@%FOb+5BaR>PkR{Y!L34X?HD?FP}`-MH4GzU+5F6H?SzICj7f_vB|IdH2HAyO zz3~maFButq50>sp3Z$k+rv=Tdd(>4YW_2gx<0((-yVymlKX(S1kdW)Oep-67W37$% zF8>20k1}S*?C-hU&!#%6m2kADFs@D0%d#JkIr?fZ;#V9EncUuq_ovlo?4x4p?30+)*f3FPn`m`iP^x>C{LI(uZgSi3rtQBUzrEiujx&D zTkB3;o7B#$IfD4ytSt)`$=4+BEAwYD4!XfsqPOduH%Q+5K!f|MY4y(s3qHhD-iMF( z7wbZ-%~=htU0&T5-B!=*%4-Q@c;~3wUg|P5G(s54!^6>cK+JhOW90dfGy@;42)U8% zc>^p|Hwy>8=P_#^{~@>xLE;C3W2(gMRQQZnZ_s$mQSMl=jEe+msy{MtU^y1!4`!n1 z8z>Fvx+-hSRGygTHMX*v1A8(w7tVU^OfbNr6-h=5fk3k_x5D<|5Y9|qZjpAY}yso7kX^G`p zK38xJg*?8h3 zE3OoJshug)#j97R1-0(msda~ml4_D8Li&_qU@<{~255b6Ny`)uh=1FM!s6n&pm)Zno{E~=%{+#t@SsHH*!W=OPy*)5S~ew{D{CX@ci$K&59!jHPN2 zxlM1mbT*+6`12;Qx`XM)(|Dq&S%MHC0y?LCJ-Q?sw!IBXOx6X<%9iLUCzeyDq;^xR z36Z;){YK52;n{0@|J=;SP)9qm|8+{lvv@ia87Xy~guOw@Ym2AfPnr_9?7-16i!noB zESJQHhz}Tc7x{cm=1=a-?)(2d~uQ!mVk^`tcg$vJqcpryF?)V;EmKFNR;HiMz2p=#`olRN-k)&F84( z_$>n84x^jCkjyZSjSu>?#k-o4W*x|avaKZo`resWSolHKNwBN?EhUq3S#`CUY~tzZ zIU)$1zVteBtE*qX(`u_LFku_3F*+Ze01UQ=zM1af>h3v0tq!W02YYC_@oMTqvKl36 z)xgI)yT8q`Blj$9cHSo%)M!W*JyH>v{SmEUBEf8xZm#21vJw*+jz?oAJ5~k ze?vGhOw~0%k2j&pJF5ooW84{;6b`>@`v`*#t<01$%PCTV%{SSup1mF6WeZ!pW0xQo z#LI`4wf|wHugdJnbNZ-7avE90^DK#hC{?iJAenoUn`@ro zREQnXJy>g^#HkJ+G2H@NOGS8yEYv!0yc|jujyNG^S)QxnW#<--n5zdfF)^8Vc+4Wz z?vE2%;F~{uqI5KDm#=dE0CSh3OUvs0$LVT-E>9_d>3{*a)q+;4Z6(A`ElLi=B384J zB4uUu&inEbo#2_0vbOO$^Jmxq1qceb!Fr{Pe$F6IrXBB4$Lggus~&ZQo@{8j!1tzu)0~#&88tgOgOeQ#p* zz!yVJ=cSIOD6&r7>;iltLubAXFLh*9aLvr33>_V3(T^~Ac!v-KA^G_bXIJcuoTg`k zU=nK@c^*jS5NzSoQgE_;R%Erh6xl8mezR!2kDI(XF#XBUbP+7aXazHjpE_PV`((u&iol}efgDmYeEe||GD=PkA)EDj(u#@-*A&jQ zm8@uyc8&WB!o`LY%Kb%OV!H)*OecJ&THB|WbCcG!_A4|zI3<}SWtdHaUo4HoS^cGMoLaPy0IFsDi;LpT|ih#O2 zEP78kl-?Aae*}R=4;j0f;hBKOU8|}(>$u4mHXJ+XrdSQ3P)z(aSsu5V>gwmGE=75E z7VIXDVzWdztVKVIs>n~lfk0mC=K`{2R;CIDoYcRYxQDC$V>%}5O<0%6Q`Esfy}iuv z3{_A{p|}m4SNJ<)4dKiLY$sWOiHU`@3@Rqc7f^cHR8=)DT}qmjj~zK`_V@4K)%iN7 zTHjlN{lzA0C$}Z9bCgD>6CNB^imvwuY%B)##*p)YeCEO-ri_YaOz|ca3(GB^PiaOi zc=lkobIO6z?A*=Q+#qtTSr0S6vfX)VoyiWb0rVrG5ul!X?ccnMu#mH?8Oy^zJH!Uw zqcV18u0$NW+1v{CGTe?xaSxB682zboDBG$QB&RT|iM*o&#M9nC*Eq28ik!S-WaKN} z2o5MXGIU}xE4O+G99B`DMD}6!6cMHi{QYj1aiXB6)ENk!JB0Wro2FTI-9)&pmIrsZ z3?o#8H7jRj4jc%(Im3-YsD6nW`tbKG(y&W

    >(QPizv*Bs*f2PPLI3Jv={g({4P# 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 EKULdd_y7O^ literal 0 HcmV?d00001 diff --git a/BXNL/images/fig-unfolding.png b/BXNL/images/fig-unfolding.png new file mode 100644 index 0000000000000000000000000000000000000000..29deb0e5929883cf3ed685a0b60b20e42a22f6b3 GIT binary patch literal 60378 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

    c^X9VccHqkoOlzjK#Sl4c~! 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 ## Important Information +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). +> +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/impVolDemo.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/output.txt). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# Orbital Data Fitting + +Example of a nonlinear least-square orbital data fitting. Given a set of orbital data points the task is to estimate an optimal orbit path that minimizes the error between the path and the fixed data points. + +```java + double[] tx = new double[] { 441.23, 484.31, 265.15, 98.25, 180.66, 439.13, 596.54 }; + double[] ty = new double[] { 333.92, 563.46, 577.40, 379.23, 148.62, 100.28, 285.99 }; + double[] cc = new double[] { 355.00, 347.00 }; + double[] tr = new double[tx.length]; + + for (i = 0; i < tr.length; i++) { + tr[i] = Math.pow(tx[i] - cc[0], 2) + Math.pow(ty[i] - cc[1], 2); + } +``` + +
    + +

    + +Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was taken from [EUMETSAT, Copyright 2020](https://pics.eumetsat.int/viewer/index.html#help). + + +The previous image shows the orbit measurements to which an optimal orbit, `r`, must be estimated. +The simple univariate problem to solve is: + +![LaTeX equation: min f(x) = sum i=1 to nres of (tr[i]^2 - r^2)^2](img/ltx_optprb.png) + +Here `tr[i]` contains the squared norm for the measurement point `i`, given by the coordinate pair `(tx[i], ty[i])`. Note that the coordinates for the center of the planet are provided by the vector `cc`. + +```java + // problem data + // number of oservations + int nres = tx.length; + // observations + // + // number of parameter to fit + int nvar = 1; +``` + +
    + +```java + /** + * Objective function call back passed to the least squares solver. Return the + * difference between the current estimated radius squared, r^2=x^2 and the + * squared norm of the data point stored in tr[i] for i = 1 to nres: + * rx[i] = r^2 - tr[i], i = 1, ..., nres. + */ + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + public void eval() { + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = Math.pow(this.X[0], 2) - this.RUSER[i]; + } + } + } + + /** + * Computes the Jacobian of the least square residuals. Simply return + * rdx[i] = 2r, i = 1, ..., nres. + */ + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + public void eval() { + Arrays.fill(this.RDX, 2.0 * this.X[0]); + } + } +``` + +
    + +```java + // Initialize the model handle + long handle = 0; + int ifail = 0; + + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + + handle = e04ra.getHANDLE(); + + // Define a dense nonlinear least-squares objective function + E04RM e04rm = new E04RM(); + ifail = 0; + e04rm.eval(handle, nres, 0, 0, new int[] {}, new int[] {}, ifail); + + // Restrict parameter space (0 <= x) + E04RH e04rh = new E04RH(); + double[] bl = new double[nvar]; + double[] bu = new double[nvar]; + Arrays.fill(bu, 1000.0); + ifail = 0; + e04rh.eval(handle, nvar, bl, bu, ifail); + + // Set some optional parameters to control the output of the solver + E04ZM e04zm = new E04ZM(); + ifail = 0; + + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Bxnl Iteration Limit = 100", ifail); + + // Define initial guess (starting point) Away from zero which is problematic + double[] x = new double[nvar]; + Arrays.fill(x, 1.0); +``` + +Call the solver + +```java + // Call the solver + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + double[] rx = new double[nres]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[0]; + double[] ruser = tr; + long cpuser = 0; + ifail = 0; + + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); +``` + +
    + +``` + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 1.45373E+09 + Norm of projected gradient 2.23690E-01 + Norm of scaled projected gradient 4.14848E-06 + Norm of step 3.75533E-06 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.38765E+02 1.00000E+03 +``` + +
    + +```java + // Optimal parameter values + double rstar = x[0]; + System.out.printf("Optimal Orbit Height: %3.2f\n", rstar); +``` + +
    + +
    + +
    + +Suppose expert knowledge provides insight on the reliability of each measurement and that for this satellite configuration, operational orbit height should be around 250 +/-6 units. The previous image shows a fit where each measurement (data point) contributes the same amount and provides an optimal orbit height of 238.76 units. The fit is quite poor in the sense that it does not satisfy expert advice. Evidently data point 0 (yellow cross closest to Earth surface) is unreliable. Unreliability should be taken into account while doing the fitting. For this end, weights for each residuals are introduced (weights should be set to be proportional to the inverse of their variability). For this example, suppose we are provided with the accuracy for each of the data measurements. + +With this new information, the problem is solved again using weighted nonlinear least-squares. + +```java + // Add weights for each residual + double[] weights = new double[] { 0.10, 0.98, 1.01, 1.00, 0.92, 0.97, 1.02 }; + double weights_sum = Arrays.stream(weights).sum(); + for (i = 0; i < weights.length; i++) { + weights[i] /= weights_sum; + } + + // Define the reliability of the measurements (weights) + E04RX e04rx = new E04RX(); + ifail = 0; + e04rx.eval(handle, "RW", 0, weights.length, weights, ifail); + + // Indicate to the solver that weights are to be used + ifail = 0; + e04zm.eval(handle, "Bxnl Use weights = Yes", ifail); + + // Define initial guess (starting point) Away from zero which is problematic + Arrays.fill(x, 1.0); + + // Solve again + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); + + // Objective and solution + rstar = x[0]; + System.out.printf("Optimal Orbit Height: %3.2f\n", rstar); +``` + +
    + +``` + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 1.25035E+06 + Norm of projected gradient 6.26959E-03 + Norm of scaled projected gradient 3.96468E-06 + Norm of step 8.72328E-03 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.54896E+02 1.00000E+03 +Optimal Orbit Height: 254.90 +``` + +
    + +
    + +
    + + +``` +Optimal Orbit Height: 254.90 (should be between 244 and 256) +``` + +For this weighted model the orbital solution provided concurs with expert advice. diff --git a/BXNL/orbit_ex/img/dat_orbit.png b/BXNL/orbit_ex/img/dat_orbit.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1b79d634e85a84f41f8980c813a898dc648c26 GIT binary patch literal 93378 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 udN~m~4jct*|t- za=w~6QpC*2;N2p^jVZi#RP_#MA}W&yw~o==!YQQiKU7mT9tllOgRi!x0Sl%x<}sy zEGZftX(By=l$QjqUq$TQ@C+a&zNE<65<(_qL&cB(TvHEb(3WzHQId` zzv{DZQ9O8W3*=57#!5UqTpW&I6e>w7QnDU4S_}lMBi0y?5G@YfS2%&yLLBySaP~V3 zbu~$L=l_SUx8Q0sezt`R1b27W;_gt~rBI4XaCZw(CAxHKb}jtAy8##8^X@P;mW@~~_&EEUQ9wNRK-H+B#GtH_~**hOS2 zn(fi69_^dwrH&g|&-Gs0TG9Ta>#}Pm-!O2Am)eCAf5|kzZIt-E&ExTlh*R47YMjB|cXXCq^M# z3vsXqU>j?qe$J&?#-Pv>z(_bEayZJ!b{22y6OW_LY#T6x+#8e4q7(DicqP=Gz*8MH z0O`wtmJ6U$DV$KNr)aot^b$OI8ajI%l^CkevRJI2BlBe;bd6Z9WrqRp_PdJPLJ^c0 z*YJ!#aV#Q*Cuva)GsI3Cs>vKE79q|hEjlZ`Lt;?FPn#wFQfkL@G2>TQ+)?R`w_O`g z;p*>?DI?+h=-2>&P9=R-{zED`r4)6ruI1{qEA~mr|UnH@HovJdqx8{m|GloBd zI2dZ6KsPhig4Q7S`5<&wvdXC-70RoM#{u{A?@x(sO&!%Xha>nEAn6}V2zP;e4A|cf zIo}l%s6!JufJ9e})iNw0e!(cl`p${(lU$sV9ioEmxm{LnR?GJAXQ=>E8AP+qa5axqWYi*SU8 zXna8(ql+sQbZVu?(0G09$0-#{<*`nE0z*diLJ(fb%Tc-i5KiI-W)=rhc%k&W&YR!Y ze><{v?Egms2{;#Bi!E;et9g+SezPqnM9=0YIGthy^vJ{WNA3krrUZwp>6XdRlsWbhG4-cSFDBLk zLsL^_XRAV>_T=xLVL+W)1p<2{4Z*VuP-X~$pJcW;yJ2yi{PK#XcsqA^Y6zvFsb(p+ zNxi5-m-$DpPJ+niVx1fiz~4q?jJ`E1v^5&ilD9fzAffT%>vvD>ZxbY2Iq!3O>*&&x zJeG_#^;5dmk6VKKZqKhJLJ0i!c<>1Ob>WMr>P$7HS`zC%4k!=+qzAsAzTc9j�!S z4{)VlH}s-RY>|+hIF9@95e0%3Q!#T~%&=a89=diInGBI8)S$nLr-R;D+WKHzeIQK6 zt%tVw?;ge4gk@v!4G?@UCWw6%ZowsIE<`|&^p&2`t5plR6)?4>HYu#QjHxZD%oEg8_*medT zOd|EZtmc945-U3!2VN!0s=ocWHR%RY8I|g-TO?*0df%;$((OJ>M)kHd+s&$$KR$9& zGgoGI_)0Bsr2H$(ht|C)N%gDu1ALXwVaens*NZ03oJ8DvS3T5E!?ylr-DC(PtVVEMjo-AXV%-eUN5_O@k zdB8nPN>vQ9?bR~XwGkclG7*2~43^nQS|=)PCzvbPDvki^UV69edfsXYq+AXw-s?u$ zqYvBErf;^!&tYUNJoby-W-(kc62!7Rcia*aJ$uFAhifNR2ZMy2HpoFj7vIAQ@q1c16}R@LEsAv zG$M>e5IxIfEM#(5=A_k;QzJ-2c~&sJd_L$0kes)4@^&PCdXs1+ntav7ENE?8j&4^u zcETsYm+VyLDG-;!nDEUCGcD2+yd{~ti0B0vH`w&yP6uqhUHp)ds4Z@))TqPq+rz~Ci`NT!x^+oZCy}Y!gg79Zq zu?oeO(=pIwC;w_s)wcEw;2irQ z(}*!JijL$pU20V)byx=3MFro?F@)g2P!Vmi@zdIUoef1ctr?_l+W-5YGwpua+MBWY zqTnbF6XkV_-q6jwHP6OCa$Gm*v2ofDaYZ4wn7{UyEDplQX@O0G*kxN-J#&+TBG<9j zZIVgoi2FeoJ)p+sME|p=zqhj@-{-IUV#|)iy+WAd06om$jaF?fyn4AyOz5n#102bh zl9jlEcQxLE^+H!Ig*pUB95k5NKEF7OD@?{4ZzvFw&~CrOK37CKH)3Xw#n($?(A&2P z>?aUJ3v?ynV^NY{-_D_HYwXt@z2)Sv&s0oJTG|$Xq~U89!47F$7gKU!iLt=&+>+_3*x^EUI+8j@GWPxP2A|%0?ti4m z#lPKo|3!K%!FhVu!iQ_W$W&}$v^a{J(L|5q@ZRu#@#>0J?%Wd-uZa)PO|HT1V$@86ketbx}Md(xtk9OpO^m274m)e zFY&;Sqk;W!5$QoEZ*;8!Or;EB{2;)rA%0B;AC=b3J|Dt0>zdo%-MIVy@JsT|_uoh} z@ADmwq_Ww&`ErXV(ZbDj^XY`~sbuNdmAL2?g=8U=8FZAHbjr{?oJj|8nJl~9ykLov z!1a*Lx5OrJI17n1*qqf)X`5}Se{>x!tUh~{LC^8iQoRwHl2A4^CNLm(<<8gIlRqM3 zl2_keE;~0~hKcgH;>b{!;m)B*YEwH6jNhFVF8VP9&3+!&3-V&x!}fB_i)m zB*cNRDd@-0*z-NrY2aks9_!64?*#L=I7Suy<*JOjY&ZL+{&j_*^o(}hQXSp0 zl+5DvPjp2YR<-32-Rbykb?;7)E7Dz7jRS0aF}G+GK9)J3Rc&P<LWv7+GvMq@Hl)ZZVJw!v-3zVJGM%)J$UmMI$U zeCt?@?R<6gL}-JQn0$l6pBkM%vo^HlEmqVmHMyqu-a!X2_RoZ98h{YMWag zp`8HqoJe2iAljyeXHWoIa`t{bobTffS7Wy7WbhR-|vo2chC~2 zx1uwK1;HzUbeWeN4J?3?keT4{>9dnxD<+GEh-sCO)alj5@N50BgI}Iy*mlmRr(|O} z0>4|OLcIlb&TK+AndMOH=6$j7Z*UGwPw3`+u}gZi5i>T>v!qn#^EEX--H5g{8Z-X* z^YroNYtaAlK>pq&f5faY!EN9`>)1pNj)4kuhiAMRFZjfu&AVB93Y}8Ld(E~`wZSKr z3VDc^$S#^=OiL*>*DH}JHkrYbtQf62t{`*G(J}Ha?zR~`9c6RsaV%H2P0*exHl!I| zAK}EP;8U}ti;{wb91|`1g$aF3?b1c(w7?PKn zW$3S+tDilTtKo~K-gx>mtK1m~BJ_8c8X2ekL!=(>+=yo?kj&R2=aYXOsZm;bfkCfH zXFj#+>3PBq+XG_x?F0r`ZmPzu21<@qB^eyIJ%n zmt9eI_6JdBWpbC{anivO2A%H*Yy26lFo&j$v8ErYP~K(7WHsvLLK2TOIhQ5L=GhkJ zIQViitrIk*zhZz*UWZ+x5$svolyOdR$W5`zt#ivQbIA?y$VsZ~qAHzAtEa@j)={NI z13vU($P3je#TRq3C z?;wl>U*}tR7UIJjdUZN{)>4~BqfR5KukHRO%E&ezhM!+?;+OgAhv^C5DGpZk!dgS9 z?h!N-C7KbTj2@6DHkY>1e^+qbe^2v2OV2Xy$D1q(^mJ2NQ+6oz*+r+k-Y1|p)6Y)^NhiES5WQ5$X3aJ(m#1K!%1ejuf6_mY+Ad4l& zz7;@UR<7h*G?o#5gAqTA8>@g?2RHW`RPe*svJ^t=b({xF{cjwqw_%EP8(@WUC5BA- z9;sxqy5TS)9|{h*+@N6HkX3;3_x7&xTT;zoy9bZIT=8Qp)$}cv@bij9EZf96$HVypj(8a?Z*Ao#GbIrvo<6%Pn5YQdq`k`jItU%4c0B7TuGl z3~FtQJo|(`n@%NQOU&Z$NgByAq3Jgq#Z?=ae^kEBl?sIP>~LGMySP z6*d+<4VjWSgR+=yaTB2bH8zD9b)2dldg@n0zOY6NW;PsJ8xf|#iSfgv_`ZU5?=LQe40-Xrqr zml-QR>rch4N_dh|eHze%{iBKFlQpPc6rUiSY+5KNeWY4+z0Mqqkf@2DG=tITt<^cpb?*n zkw`~H1CLD%nk-NJ{qcbl*q9ojfn>IprlLGf1_TfaJbsYWv_b=oJKhQyG5pX}DSn4b zmshNcM?HX-RjigGrL$n|&8?gk|33S)U&(=CxSBs-d|N(cbKElP8&x36%W3eEOkLI> z@P6nj&RU^1T+KN;`qi!zuKbr~`8wahv!uZT&B3G6c`nOe2X6{P&Zz$pBWue4ofzRb zQ$f}B#JrT|xR++u<0GFb_fUw^0Eg9MbVVRWrV}t{_F4E@`j#X)XZbe?T8tWwD!naN z6mw@0T`kd1xBjpdHdRH^WkgMoMnlFaTv!DcV@6wfVsZNu1^?E~mv|G3pGqN)C>B3D z{1>@imjYb{>GX;`Y>9a2^pwc>3i%Kd8zhMjE~3-dZwI-Wua;Z71x6}6c8EOfm3(*V zO1*X#3BpHbL9hSHd+tJ2oP%wZLT6OR|DD?jqYFn$D*V0!pFbzF;b*oi{-;=~R$~EK zGYUe$=SUm;5b^#9NWKw;A-RD5z?zd6VR2UK{Hn*nn3QD5tuTD=0$~s-&YAQ~iMhMA z?*roJ&zWZ;%lK$4DaF>zOU#@NE(edZtcC@85{xwLhtx)t)dxp=^y z%zoa_va^BK+fjf!fzULmrfK=Dbt3Fe%`9=W8ZogI@Dt86nJQ4oiqRi0Oz&m1JKvj5 z1FFv0S|nmpaAH%?<5Q16;mxq~=C0sv)u8ziI~+Ukr@gyd9a^JfMcnCEgpQ8tq1sx*R?4t+O z7nEhJusERcQ+S$FsSIdSBSdV3KaStE7JMqpT`OC`0{V$ZBY!pgrs2UUE5uReif!zR zsiY3j5YXZ@%V&*wO;_;ccH;BO`9Yn%b^&ZZ=hun&^WuusOpVCty&s}BbvXf-JNYFe zge!{@khIkMfjnH<&QXPcw;An=X|=py{_*0-(UE2XK9#)yu_2eao5)Q-=}q8pFU|Er zXnGdKlH&|7#U(sb987W$f1V29Q!?6_TXl;#2`u}#iXjR%2qg3u z(%(Pg;1^RueV#2_0#ag5Qq@Rx=tQ;g0m^5_@~K4ofD`m?)ICEA9C1`a8tMXR{)a}`)wHyZgGrJsTm z?^27n0#H3;#Vf}kh{+_oz8HF{TU%)7Ab#Drek%<0I*I;YWpurzH(`61j_>dtJ6N_-&br(z(7_EG|Wv3r7IM>&VQimNLPQXTta{mwuIuXJ} zs5N&F-y~=7@bv)Jt+3$5+v8)g?%|G<&{sYDEJXvPp+)L$F>Yy&+rvLjTU3&7wws)~ z)1@OU;+5O5@QmV&4EiNUuHI)PXVF2Kv^Ffeml#F0@+I4J4r?ky*Y<;84WAhxn`{b6 zWaOWAv0k)=-B_adLlS)LL#S6YuqDWnR~$rXE0H*P%+5wcX~<+aFkDNByE~FG?Z3dO z0jc&Uurc9VXWfhSI+^#i{Bk(5Ekycgf8QxsGal(E1)pKFVgPzx<5L)+JCVbYt5^QY zJTc*^+S`%=4s<@doV59X1Wg~}%1%7Apb>Ie2B{Q>cwDJ~#xElN-s$9A2$3xRa?;W57WHM(G_X`V8_nCX>}~C%?S4 zgG~4Kaatz6VwZoL!J3HwHc>N>wjJ*g-^53y)++5-iN7?2X0s1S9 zoHwb7bw|ns3h#&z`b^{Bre+OIn z_+xv4?0h4HoCrBdM4~SYMZ>>0k=JsIM#xe26Usk8Te~R~b_Q6etzG)bikd%xt6;B$4E6%8>_BRqYvkSLngf}DfFPOTZ zcPx8eV-B~_=sB4ui;K`GW~Pl^K)=?ntKHw*|BvVs`yS7bM!Y-3RmNovex8e8DSNfLPlWwT@~LQ!V|vB^cfj@#&hlU!Sod)xlq%1e+cLUbOHJa0o^U{neDP?OG;&WW(cMZ zv+LOSENo-#)mr1d1O>1_XD?t3b!-Vcc0U&lr6xY=(fw?~J8UTyj#}vk;=}}WZ(^h| zeu@OUWh#$6z}!kcS%n~n_GgH~C}Nu&_+4eU=w+dm&e@#wy2icRi01mH=};tm)X*15 z{Vq)%4K)XKGpavC3?+Kyt@EW|>Y_Zmh}VM9Liw=5ysZ4wyNcDlpxu}FtR0hoslV^P zrGCU4jA!=q=r_OU^Km$2vykSBsplH8!>Vw@iji@OsFJDxXAy`M37@jQRG%z65D8Wt z39=of1A4v6({w2qWh-1Dx5jCD<5ODH@p;JQdFEi_v!;wa7u>-_axMRq;w6N{xv9a9 zmY|rRAX_h_4h)+mVuy5=dt8+tyA6d`EZO4GsrX_(t+*`&OuEQ==Y(5Uz>b%nf6M@L z4b2n#HPlo#M$v*S1v^t|2lq-6t*x$tJ)l-PK!nD!TT_&>Pg}251o$P| z%%|?VLuQAT7IR$8LKFEtiI;DJP~~1bvZd}Ouy}WOWih$1P`WnB-osuhe)^6E_C+dN zU~ecLA&*eJHleyvx@7RVlVrM#;@LcWG%7CihoQF+@$rQdMdheZR&r0Dezwe_U~dqUW^M*h;a$?um<}Ev)ATu8PLwOD*aTL!3bU=~v+3#M z^m}EHbGv7=kXi;R%kge*onBFb&IWG*=4E)xsc<9hOt7K zZZPQz69y@pyiXIAY$iSv^*YHXhGxCDsUmId-85!lRA%R5{E}N$|Ikml+UX5=xcW`JD{yeVsF8*6JMhh`v|y9MNmc5246(CYAg*kd zz24=$higw*-x(c31HScZ;;ES(xs*ILY)07y=Vsi+h{z0T>$-^Khl6+2r!aCEzN3+S zLp(|W#mic)gN>Dod-DoM28Ml2mMwEQ#_=q2i(w&i%LPi3s>AMn4DlKj!1?Dtdlmlr z|Ma|X{-ftTolbkz3+}HL4}wt*){~|-qPi8O6%T8A5GaYluMMv;;(cPIW`$}J-Z!dP z=!aYB#}kCp*}2l4CRQ-1q^My_wDZ*OPcBu0E@u6k8l}VOoANu-ub4w^Vx4DpAisL7 zzM!Zj#s&#p0mS-c@|B%(c(RzKzmv2H76yRk^UwCB4N-b${2*!>vop022d`V}=6Z8+ zL~TBVbG~#OZ(437le*O*g!Bw1YgG>{g@U0?-$v`Ov0QR0WR(uq#s0mNC*S~J7_fLL03-f9V8lR^2A+eHk#=Ac zlD)e0v4HXRP!XIjDzm|pl@?dfS%GXpesY*g;vSGMs(}2><4Ip<+u6AD3;oun*TH@* z&Pz+6X|4d!KR2wQu-HJoak_kv0M$a@RW`mZlV(~I+m79-Hks0q7E_oNi)`MxamDZ8 zTt8N(BQ7tCDAf=07>AI9aq98TyR^ zaI+cq;(yF${gUVqj?Ff7>Mk@d z)vi{GvsQx1e5%M=s_zj*ldVLA)*)M+A=tRIQe&vJA7a9XIkpU@fAyS5B$>=fM;qCB zf@pqToe_FcBE&a8KE{E9j8U|)O0$zQ6eYBar02ud)Zh~<&El0@Ry69p#qE}p?yiQ+ zpF#7BhO1s68->BaELpY|`6?o%9iUwOf^1F8%_$Gk%pIVcq3Kh+qAxk1<&-CU^X?>Q zaqZ1eSvS^)3V!Sk+eS7a^}vfVXWLlc%OL&LOR53`g_AZsqB~vNF9i93yF~|-jC0Yk zG5Zvz118b<%e8oF9G#Azz57xw*8u~3m-2KT>vO=@@ zz3mHfu%!qNDVC^}vEUwXXJju+F<4}i^E{}QYh$NK*wTGU<;EFewG`Twn+nO2&V%0( zccL;_RqyQmG@LQ3BiZE}gQ~n~n5SA&xL87##*j+Hm`evTz+PZF{PFE(0!E%$?030s zi*Fulg9aZj5CVD$iBUK1m=!*~_IXSw&Vw}=+aIU~FDl^J)g-e>$O6zoMtWHY4P(HA z#qE07PS(!*|1*^Sk17)0tNkn3)#q>}1BsFXL&R{1f}CHcnK7aTkEEMKt(yR62;-Ix z^S&qXttvByDsh~ukQX_zl_KIEm@20h3thLuYG`8$z-_TLydC7<*w+^cm+(hR0lw&s zhdp&t8NGRWfSddJInSs2t>4b{TRWrlUV3LX`oUa8P|Z=ok-`bOGbNu^oB0i~n#qWY z#HObTeD?$sKR#%%CS$Zrp<#i(J&Gaf!WW2{`eBt#B4kOx|G=YEtK+-()rpc6Go1LG z-4YDCz!*q-O-m8P3`eYnnA29K_5^R1E~`zY(E~#`4HXFxF}}Es1LLBB(GFR0g$E)Trw}C$$2{j>H63 zSvc2Sj65wjz{3HQIHc(LSqz=+spE^rG#yX&9@iLV&Kyx*a!EGu&9bT`ELZQ zcRasJ(!exor55aucOoBOzV@*Hn-f<4XHIy3r25KS*24Dp(wpC8+*wFXDa1MhQNT5@ zN{YAf?1HwwpGP0UB&*0t(+L(hhgItI5T(HB>E=q=MlP% znz}qLZytjo{|s03TG85y{xPO8;zNZiW)&K7`%&!53~zMsVlN zhW^nZ8MRF{Luo27Lz2u%6e>Brw$?e3c6$$8MMn9`>6mCl(#lRqJDzKFDo6s7vfQ}` zEBZ}W=zzD`8yG)${>8w-aoantL+$kP!F+i!XzFeaR|}wuG{r{nC*p5U%AzX&d=XwO}Xz)7A z*3=G~%Fj>dnlbbC%gKCD*==efMUV1lP3#m^EY`RQa$Hr1P*q%)c6Kk0=nW^U$%QE> zAhy|MhjZnbHrkI|T!kR?{51;dz_j~~Hs&R+@%}2?sA`D(vDjTEsu1C|#q?=cti$a= zdC(!Y63`c9+1$Oy0QK!W4Q}c=>ze$&eI4>t@uc^!8f*VoHMV))wS1iZ8h?VvbUL8> z@jK~9ghZwA;`um*x2Q!X>W~XYkN{qU1N5;5KcNbQXu`%KFFxslO;PSm!Q`#x=C9HM zbGiREqergpEp*7D!K)O7PNOIqR8On+1pz@BE7ArD#{^BhAe^U}QZ8)g3|&-0tbf-!3jqP&PW|qN3;H?5r|H_t zT8ct*m?!uyz;Vi6--Oj=-c=_NZW;<9SICWDVb=cPc78jU3-tNgUu#Mcf7m=C96mUP zU|1)3b1>~7`I0153Y>kN&;4d>tddWtFCuX^*tExww8QPq$iszyQ%`Wr&n{oM!r&YA zrSPt&ZJarNvfP{Kou&KD9<;CH@91ljD?O|kBiFbqJlsXXBsS4a^ZhORZ1=l0AVJon zVI0$(R?e&rZF?KdNbzM#h~{=djf6K}{k=IUG*UD|r#Z1HtpR-pD5eZIQu(dGpqYri zcItRS8a+&w^aFMWqVfLogNXpv=#PJ%NEd&eq-CZKA{?Gc<#3Yo={GUH$CUdbuy8m8 z>FZHzL+0n9G#)Ne$d1@OxlAn6y;O9JYp0LU2=Vba?y36Jbk*nABv7Xb8<3lSI* zH*x=hbjA`Tzo*$mBMbHQ#^tIhgt)xIii20`c9DGP;H02{mFk0A;LPqc z!4g?*lM0VB|KKGC9K@B40fuL~A)gjp^m%xUK7Yk4Ui^b)vqGVtI4HMP&AiZdH-=xU zN6w)>>=j+WeP$=^KT;+>INQH&(t(~1=-p1Ebo+9Oq6)Z zlo@iuhhYa9Y}tQ*d_>)O*Wd#wSu0D$wz6lBQVx2(wG{)s1>?SWYnkS^>`i@28;1FQ zZL^hd?eXwl38!?HHZ`)8ws_7T+uB6iTXZXw*0!p29n1)j;BM9IT;Sgyil7Ms^xqL< z+o@A%q-#`F__DFKl2MQy+Kv~pE;R+cPA*r zqaPnFk_~K}ezgYlfSlbk$~5L`W#Gk@?>&tIg~bC{g`@@>;3MD~A$1Q4b)bn{kQ2^y zjftV@hKy*g-2PwdYw7%h-eza`L8os5*7NIW6*@LbT8RsZ%V^le_!MIH3`h!e=%E0} zt79hJQU%>oFEU4$S;In4GmDolSWkoL1FWcR$Eatq6;^p6GS07DSF-x$`8^{Qw7BQX z*Yl;9&2eOz!u2r<3mArX^v}>Mr|Xp)81jz2DRfryQ{rU3-6iM!!QheOmh@6`4JG=P z=n7bZd!fJiz(vUTG}yNiy`jL-&)Dph+n}>V9S91(raTe9*<0c3^|rbJASaFJbIkw_S`dm1XPUUXcSP~>uBUHYDqoY{^uLa~3m zP%>=sqvJJ$w(#zrlt5>wq%=m$Ez`urgo64zYH{P5w+1G5;+s}vl(4}chRK)?u4J^D zK)Y(pzTp)IN=|s6L)O=u;@V1}9$#SiCS*Bh4B|t!r{>4Y=0ndik1W?BMs^$WNzvbPb~8 zOla5ByA|2m@y%$baUOgS&#iC^K{Nj~)|fAD$rYfpiBHvJop9%BpBWs`g*1b?&@F+o zK%`z=S1}HTot|PTDSf_ri}7O86Sc6l9M->s|MCF{M0DkbuB-~17$KQda&gvL+S(#b zYjt3TND2<`%xT|uhOWhdynB%Cqb^B7p62YA(*CdB1hK?EePK3^^^Rx!aq~z4Gou)- ztMl8EoMnv8^Ym_6R3jk^wAkK*xorh+fep-{whO_a{>@;nFoO zHnKVH73+XnlCe|Nj-*-diT%dR44`aT!-!lp(p(IfH}Sm*F21bSy00e3DxUdnKYI zC#ar2^{CrrI;~hlWjzB#ee%R)g>XH#HhFcP99zxoXqddw#4LByClnY=`atrf%S?8Y z?*pv(YPtUu{7y$YnX7R8`+`#~SHlpwp4IjsgP93FzaGSRDk*ibSP|dVnH?d^(`I86Y(t6U1R^o{T(AVI@ z)Ub*hoB{Ik%J}Y=GRiNnK38V(Nwr0EeS1ICnVhUOb4^XUbwrb;`t)E+Wg;H7vV!g6 zY6gM*bY9=-j>*ZfW!iXI+y~Qy^IelBv)cs;wyRoe^5Tv|wFFISrTz|?Lw%oqp4opA zno50()^NqS=YCx{c45Hc`DDsd@7BKm{2FDa6SJ55ve0qxx3_DjfBOntf^-A(gVw1_ zb$)E8ej*2p~pPrf%LG1-je^9x6lG~xK!ilvK7ZAp6De3vbn^0^t*)uW_+ zJjpysh#AjWBU2E*H_6Gx$#-vHvM+S9efTZ-FSp|17^2(XqRyE(Mp-9_-=T66NVr*Noi99nb2&-1e)yu zayw#6Jvuqt1V>8;gd9{93`@DX{j5ewmb;!BCK0(cYYTLZX}9{|u+uF*GuyDge$Fz+ zN^)t_K2yu^(ie?$vJWkx;xGbk^209m^+(>C5bth|O4+pa_R1tiOA!$(xUhaxql+8j zjv?;xplps`Cj)m`yA)94oD^5_f~#)>1;;n|_&tcq!rwV0`dhmAko=aic5uB^2y*5b zQ?hI9Zay2jB>4Q9g!fHHoX}IpPM0^XhpzJe?+tq@h@`r`r*e@U*vWrhe+nYzhnFZ`PK-*eMcQf(Dj=ZEO087SiI54M}Bw0%@=A3Z$Z&y$Fi zWeC-hfP8i~B?MwhNn!Su-Enrb-V8;feU?*9v*Vg zx6cVjn36P|t(_FMCG6=$29|+NENk!{&X2CTNXKf1?$8TPKA=GTz0%s?2 z_7oqZx1FuW{OoFDj}-M?SnW{diK4FjZ@^y;5s2_PtVKVtZB9{utW1J>DWzg%ecB$% zYJ%~Cw;BETjWshc9al7Cx;?0qnQKpA*_ch0B6Is&-_+NoJ`y+dJ>&Vi^(+J(aC2Mq zM#hu6K{p;GL@)ZsU+u04+14P2PT=_u04pPz195^J$N5?7!rQ&e-QG+zG>lbdsWOqgrO-i{U} z%x%o`0yKlXBc5N7Y&G81s29D|@*d`&b-spGoPhVlbu_0 zX|-UE@Yy)}8yr$j`-A4OxapFU5gR05>-O|Eb$gKp24o{jkm{AyeZeTW@;!yQLhcu3 zXXfEQz!L49IyaVh(rC>)2tG6ht`snBb z%F$cZ$i9rZh0R4V2Z>tFG~oQsXC=~0i6~xa!SL8rBPwc>MzbAQl57uKU57K;-dA>o zX|q$`u#SPC<^GRO2UK%z7DE-7YjyM7^4D$7{Km5#w&aNN1m3Ub*ZWwC#2tNS z=S47Oj(l-m({Hm4;+&pDHe?C6N;*EJ+d%8MdB%Q$C3NwUB|i$X?C9k`UM~9*dxXWM-}6#N`}-90FNxw|-r#?W zqH5V^z;C*%>&Di6kW4>fxTuGN37WI{!a~@{jw^0(^ zGsX5_8_vp^)q8E?<{XZqU{Z@i1e~Ax7Sr3Bk1L7kE7_Nqc+KANuB>ZGw0^R=4`p?l zQV!Z!Rv-tG8V(aO>Y}!{8R8$n%&#WlvP7DYv}pZuoQCy*wa1I%mG2~7DVwW1(PN+< z%z=WcddJpRTPH&glLwofpzkbj-EHhc8#U&@B^v(g#L_wB-Qy^~rzg1aI`~z%ly!EI z@!;eNmrJ2&I3djaVBV}3H2i$?h@E6~!R2Sgh83xE71AFiREzBzqu})RdI)G9^2IED z{3V2mad)GFna3Os3^UF0vtffZCrX~)-ei?0;*G+akv%+eeDZbk(O7w7~1 z{y+=6^4rTO0MK-9uKoOeW@l;|YXp&!)`=y2_g++paCFSa%*()^30zm9MP+fR>~Dfz zO8j$TZc<56m1r~o|EY~eu)8tWv-1^s^zGjcdHLq%TQeXJ{D8a85zNF~77#f~tltj5 zRwfsY+1}>My_~gXloh3-C{^yA=Q?K)`S80AG=mjAnNk{bL+4aI zT-8vgAYY5XHOt3je6hH;6qmXu4gZiv&bUYeMOJx*B*1ONq#->@Z%qxuW)c`k^;&Lv z3kowO%jt}!Qa1LaE)lo!sia4S>6%mb5Y1b=C&d|vj+Hr2n~yVln#hf~flU(OFFzJa zs4l%_<4M(5R$48sKH$g4U!0y%x8F?RjonOlY#R~Im=yMpZ7y^3s-uu`1~gIfA`u{iLW}fB zc^rI%?CbY^!@L6}DqyE!v0l{8B?($R?9t8pEosef+!RVZ{vxt{HH+RGvGB%VeV7IAy44Y z!Jb*Ex%U-q>xQC9xhe%2BIzXQtUbb)0juAx%?}TcqEipRLHb%vk!FR(V_zeq#v+2} zAnKRaGyKuVnfj!E-uH0aYM%TzcqI7o_u9wAub&u}*Az@o>ttPBx!|{A_{90a-@o(K zQd^A9m&%I=cF<%=jZ6(07#`QZJIp96Q&4K5N+6k}~`2ZeLqnUBe z65IRN8?Fam{mBE}JWF)?J=o^&NG4ljvMw(1MSSiS9=RYSyLc0q(}WCHIa}IU;hR*> z9c=yNfQ>@PnZ%zLRwQgHur5s@m~B5ErGtKY+2_fMylGe#SHHR5-gB%i6W-exWAjVK?RvG5)D;Ub-=G=q5&3)*hS^6u;6+5cO)#%3T8L8vwOJx0<-J+Ne-ar1^m%4a2|0X)_)=JMH3O^}*!_Cy$xdt=h zVEx;-!N*5oc#?~_>p3y)G#T93;9osnT_E)@X(^skqcp5k$Lih+3*L)Nu=!nYR+VXM zxx}q6k#4;=zr${S)$kJ1k2$bPP+K>TJYV(C&~8561_09t^>*-f?xdEhc1XcR-JoIO+>8 zAsG)L`4$&G2%X6GNuzuc`g@4($mV@P)GaNTur4Sp5J!nHoJzXHf@o7TTs{_ zWO_RYcK$U?{)0Kjc6=&BFJ#pgrl?xgN`TCL)9k`%OsK5m$vibAH*g1SM`~7HqK9aN7wHEM4s{(9gYcvzoSB&! zpsz2niHXVo$KHEJHPvTHv1Md*m-iKvwL#f;dn^)oID)vzzMrO zBwNTJo|^5f5&5j~?n3!LjXN->CGFBGiIe@86=D7b9tC4?iF*3{&?F z=rwu08}Wt*JVc2X9n--UeLy!5-?WU#+XcA-A%#)5xs65|0JP(>GDg67Y&;h>@Lb43 zdCpMOkSIPd(#ag<3l@xfG&ywez#*mjRn@LE7;Xd`BCDTcHqLgs{Uy+8VeoU%++F~R{y4&Q8~vPo2-ksIS(^@Ts<0;7t{0*mC;mfms-C48I}5$ zVVCC1FQxe4p}ACC#InF8w)o6j7bS_&{$+}wX-x}}^w@NTm$1l5O|D-J_IDFl z?;-sUTYR2n*U@jUKkf6EFCBCh=Rg0r0Dkt6#XeudO;f5Gr2tz^Xt;{#r2|H|5UOMMb3L;WFJt=PjY}b(PSV#!TC6xVq(Y zVT)K7P({vnTp^=$Y-F}r5xSSrz@X;4=x*GRIr!8YCo(v=t6(f{Tod8bQQXXd0pWlE z)aq9z`w4Es+GzXec*JxcMz#CXSmR_S#+6*T5AD;BgnMC_ATP?sAeEg7s&_6iqBAY7QxS;p^(kJU9s7Ad}OJOx_Bi zKSqd=)t_Gcx=TVlb1eiFIfTY7P&9cV`fih-G7b{wm<&;nBhlp+)n$P-fuI`DmLhkM zspZ5>0Oy-(1(9f~xrZIYH~gasBK|r8tv%I*XE3QQ4c046ZV}egbAcCJ{5H2#;+B6F z{0Kqn%JKVlTDG@mYI_T4o5k5$MHfD)C{P)#r zHYQ*P2SI71ERf!lnbb@xQTKJ1G5@f`_nF&)fgV`Ms(>15j3GaSdRe>F4L$HYa^8VY z^>YC@vP2h*;4+>lYWTgm739F^VvN)E|Ac|V!lGCFR!|+H9qI<^H#xb4lEv-p!XF#V z-HQ7xX%dwh0PpVUncP_;$+^u&fP(d0mhg@aPN}VC<2ObuQf_oJ3#t`?{!tH}vCX$v z%L9G9mho_UCT`>rJQpuJP#=#CW$ax3(f}gpJK?@3Og1^g{mz!Usa0OVjS$o{TtzXZ zy76E?iCco2Z0}Dd7Bp6ShlnecMMQ3u*}~`V=-%UZEe$WQKehB?$?kov%LZ{}md-&* zDKk4#277`KoLXou(v#LA4Mspr{W!jPx{M6xVVoyJKuv=srI>)6A70Nw>|yDJ>K^Ld zqq2yC8|C3Y*}bchlB*Mw?XssFSNUZjuAM7odB<|hnEp#V!KZN%3t~Bj_IK*Hi!Zg1Lt}WsQT}XR$ z#`VP!Ky%@X2d2mC<7-aG+fG0e*&~|+oc}TSpa|$aI60W+7gE393R#;(@sTo_m77|7 zq;A}d&?grL!>9>yA-PXD-ds!LqYg=J8culhsq31oU&Y?{;<+HIbpPt!Xm}{%*MM|J zsnFZQ(@gVsq*=UL{^03_X(tjF0QBun#q#hq(k^hH8b$^Wnu_W4LhjKU(`$qn3!~&ZVC`1Ola>2ZOroe=Nvrj_A^reUmE;(E z6+%BWOo{*&SE_owR-*2XU^LQ{-oEgH3tTuas` zG`<;d%olYsKfH>pESfl=XzeSqthk&k;m!yQ17Yb9ry!cwJg2xdWiUE>jD*N6MXb|` z^BXHFLu&2|aBfMxco4-zW$c;hSX`U8Lt!szkHTc)wQyZ*ou(;PJy}ILQuvzE_78%I}PN6?5Nip7bdnxDZj@Px|Ec4?yMXtAhnbw%@TUDbbLdjbM=N1NKm zzk)v<-VhSKqyC&DH&6442|3U<|4gjd>OCXP$GQd~>&};aM`^`23rTxhTo|v7>td#L zfn+jIeqmuoZS5f45Dj6CG5#*BIG>Q$rv(Jxnab0%iF70ZYK6$sLRVcmBO2d$8QWoJ z#F1PTexFX=+-jye+AZ7x9lzm~lnAqhHf+~&Q)}~mrddCZ^olck+d9}a@9n*;S!*L; zc7NK-RhGZG4YtGK?DA1}JgkE}bSBQeR8qQvuQIoFzVHUGjD!Z?1jh-svx)ywdC9-? zYXJm=uz&MFD zwc*1+Ff8Wh1#T6Ya4D`lIsd&|GEt(WonL2k+n^;Sw?cGqq#*@~@Pdk$%c;W+t!`rT zV>Jb;O~ zkeu_4)1kz^;?d{6zFZ?C-ap19UM+sQ{!!gd#MVVH9#e)h`-icHEkWwNXgB+7DQ=T5 zZ4*2NFIz?yAJia@&($2YVLf;7SPTYr4)%usBdcC!`7OJdOFd#WTg?BMxx0@vQ98ay zV57rroyh2)jEKwgt^o-Zby8xhV!bJMZ3wS|y%92I&erofGiM zC*vw`jI|C+ab%jq$tzXS54ndr`K7L0yx5$gpUm63X{$0DvR`s*B&hX`pGaSX#o^GC zPw7gY`!hyBc60 z|J?gp% z;p@@jv3*Ioo1ZbDq#^N9ueiC{@8AdD;ScZ;3;;7pf5D8(l7`9=iz|aGi;#8V?Gn1N zsgXN(4L6?PpS|inpt*D@E~8Q=BxBM%S<&mKm=)H2L9!5reF5XXry1E72|xa z$y)lxT*k%V89CQ44U3*{_*d`0FfY}E&=!H7XG}fJJ6BL(@AYdjoaf}*heGEO^&ilT zt-3UmcSN<#G=t6jdPl~dr9gtL^GnW2S7_;4dM|D=DIZOP*$&3McX(wUIhcFec6oQ; zfn=troy}Z27TDJ_)v&E={pLSBu(q955kpSw`2vT#uyVS!5T*#m-t=#lr%Fb2U&Cz0 zI)s~VSH83?9*uuS5|{rT(3&VA0{LgEyZ2`DxM5S)s0Y=8Bv2_cSFDhx>ZHNi6eE6t z%){n6?v}9~L{(`i^4p^B%s~8Kp4{0w?KD9~kGBQw7m@I-!b77&P4@@GDw6E;;kO@T zcQuI~>xRI_N?8pY9l1r<9^Jxx=W=>@xh?#c9oHx*(+;Y<10CP(1s^HB3H#4d|L)zR zGK?Cv%qH!&i8*hVKx^2u_{-0pgnhOR_z-%fN}lcekc!MxlVG6k1HdhWN01;0YC9E* zWa{si60?;77I@>FHuF7w%!IWbtR}f9cSrnP~Gq} zc~g58mXsg+>?+IXWz>njW9J9xY~JzIG}uI;Cm4h2}y}E#j`LWj@abQaj)v z12gI}@0V{Ip-+#sFE77?-H2ZZR5Z#fiD(qlMN!f{;wF46;H+X3gdfdfr`*1Ms;EEk zE1em+-Li<2kWFl`wNav1NFq8CgMZ3&M{HY|e?Bd!$F}yfAPM8Uf4$HIJ8j}A^0`iC z%FmSLv)JqH?Q{B7oe-77Ye3hFxt-N!pz}#PA9jELydYj?6`$lZIhIFto>>-q#5b<0 zUBhLWLb`toLD*=0e-Vg$y@>yo`&^w1XuB%b4A;>~npC%A#Hy?F13BpNlLk_;Eeu&4f8>zWicZp4E^2& z=T9@i6G7uo2m{vjMt+gdjsrjS=iPAfFGy&uOEX*y`POUG5$?BU5>0e1M{Z?Qjs=e$ znb#b2Db?(5qc9%(&lP=0Fk=0&!dIJkab@}FJ^j22k??k`_%h9E$;`QAeU+er86DlJ z#|A8F$iXxB?!Ayu@uzVsv!7q)F1-@Wf&T!WD`~@YAW{tM8etB?C};M-VZI^5yftQn%^Q~zg-UV|kH^uz5|)Uc&m0>?r_I;i%8uOs`42Slum-4k0* zQU{HE2aVt(o;P9d{+dGERP1)B6cbieXPU<9)XWctXU{dB7|sSd`DK9I+#Y1>b2zcI6XY}-Jrv_)QZZj^nzNjMBV7vyW$hw-#d2?d?UrO zuMx+GN2Ml?3eOTztLKp>UbK06P>lO7eH0HgDl6-vt%EIEr^U`L>4%E*r7M}iE-93=cIaTLyID35~qq6G7wBrL{`xro>79*h;U$V@Y*Bs2j$$@k*3^bA0 zy#P0^4+yvEGyjY_v1SYMHr#u{6-g*m(0&H(_z4PGZ7Qzy%y#K>^A(|_uF#{#+%^nS z*8{g)nU3~ZSRSnXQL6*JgC6QJePUwb8CLKWW0u?2&$B>I=F`(`nD23sHGvi%Lxl5F z(eh&txatZ^1)^{Kkp)qsONq1TU-a1M=0 z;aCsvTD}ToOtOL8h;HgTA;;oXBVFspk28#{u@d&t13!jW0!;t#BF>pW zH*F;AG}#rKH>6w_Fj?ux=n;{T=W&8{QUSV{=nrB}8v>%QNUzJA(hB>uX3~Vdx2>t*~HW&`>fLK9B-+36BEzm;llcEIG%*}5s<0I2s z4jDBs$bGAMuR+C+L_vbYjVvT=B~NK|*~3{`1)<%le=w%L#)`wwL=z_E4-Y+y=-#?F?NJ_zdAUw>!m6=h(ffLRX8>-BdVbkdL z9UB;!yHjkGS4=y`zXJ-eSw}udO!HNJX-`Zw0v#|Jy@ElHx zuc*<{(P8J~L!K-jq-&OGNizCA^veO;;wd-^ z`ZBg39Oi3@iWM}J%t+T9?In5c7f{#mNh_0)vSW>8=k3dVH}QIxskqj94Epftm;X3s7{x`iHY)Zu2*S)S0-!(`wI&Q91H%<0JKl` z9Ut_OuT}^v3<~u75`yXfj@-A+(IG3IK)^ILlWQ3mT^?|(U8c+R|qoZ$P zQkgQgu<)|Gx7+XpF9*kM-+UHze#&gM^PIS`^~|MefPn7 z@VY=?bBrp`hayr}R+2tU;muOKDG>hwVTwz_m-L(_n}Wj=Qc{}_x&;&rQKG8r0xBUM z`0I1iW%14#*p-TVqo>cT0nM?E=|P5Dvku-c>GvD;_X|ZTeog~&dOq4^8^XOb{ygG3Nsw# z+|tsL9AY^E1Op|cq*P3xHs_ygQmNS89{gBtdYIGPMqrV}G&pXAa-9%SQWtwN`gX!N zN!@`lin02d*rj^_*>8Sc9S!omVyW??Up8=e*V1!qK(A+a0}Pu`ik^uj**cO-;qfU72ZD#d8$u*bC}Q zuA%YNo`>>xSinNKa%dub<@IXH8ZtF*oMqcSr1MZ`o#;1IRTOWqvb zRV18h_jkewK4edy_O0d>-6C9g^^UGekQf$x)hL$L=*$b4Qz9ss7&}8aj$D&*M{IpA z^8a4VDpHi{d=lAir@vC&fZFYPo-B_I&$4WXiBmNE{1Uf5!i=Ei?aX`%?=34zPcyCU zkgnhnqV>fsVl+lD=$n1&3Td)g7S?bWJi0D^I@RPJV=WLH7@sQZJ37hdw<7@`s}3g@ zY{)4{lPQGq{Umx~_^VS2BhXRHALd}+SZsRlCs>Fvy=lmEde0D~Neh0oKRT+Hmry}o zAS2C_PnLI@oLViJ=yjHRN~XBgqy8Bz;LgmEpHyB!REt=ZDG^hkNRj2zuhgOST-0RA z%MERAl>ja38gZF>k4VDDnSCdheedJ3PzHN=NPw`{D6OhDo<$@B5+b87nDeH?KkhHG zcG<_(A80BbA8g3E?>v^=oShZ8BE=OP%umR1bke3Lj*Xdsfh`Gn3e?mriFTSCEdZy> z+`RFQI0T-Qkl=i>=wc+C*C;I(^Bp&$8z&}yMsj(5$CTHqG2Q5iL6EIh_o}ErWwi}9 zVL6eKnAE=B^@*+qiZrQo-oqO?8Jt_fLB?D03sUnhxC-UetcYVxHU&bEOO|tQXhS_C z;7o7dc0DnC`f}q@+K3DPwup)Emh_V2elK)oB2xDKx7ane5R+}};c7E;!KtQ^*H!gF z{@T83+!Y?3qk0sIuI@l}`_&hr=HlhL&jt)QXjiy`9Njdb3cx(fIftTe_QIL9*xqr3 zeTdeG84xX#Y98UlnspBayDhikBxAB#uPwcA1Pz*aFI*%1m;nXkysXqqYMYoSuAN9o zPIix0FET3Yp_|nehP-@RM%GvA!U@ABBK3!6ZrW+99F~tnzv+noYle1VX3-{~S`DTv z!h!%F)_~2sdGgHS(vs-r1tgrq+hFS5efRXdJOaXkGq?8W zdE`%0H)ixB5TI;(Q){ou0&aR`wV8urwzwYAl1B_46+PJnc6SUOR8(AFBJ(z_k&?tz z$4X8d?kyFOD5KbI3DoHNsj_JQBMDw*A6t(y0@S7$t)dPc!46U20?mo5IOufLcG>^H5DaG*U5AzkfEBRmM%B03?3R^xz~POLP9?H zrAaYfYPrdtxvi~DTuRE)`s!ejX?rjToFDQj0BM^5UOSiRZ`RNRSki3Jpx86n*3t0D z>n#=%sH5DxyaK8u;YU^z<#*^5V4wzsg)#p%Co2p{?=;_S10V14XDM8+E6i#J4yvoW4bDXsFnKi4%{>77gle=Ggf|ioXhJmZ{TQFC zqudeDzG7K*LhUm0z7e7NJVUI}yePx-Atneiwm|1L;*5uM4-lk&yHDjCTC1T_M$6QA zFnPF!{m%BZiBaTOMUiPO;+zqIK&cZQhP!%s6`+iB9~&FO`QxC2HLoJc0~iwSDIIS_ zqhC#aPY+~*dZjYYo-h7x{r@9D)TgyL2V&GsU%#V}kz)tgLGp94u)y)P zzo2LQ8h&$KfB5k9HUSQS*mdFh+-?`N1XsEK8US#{$aIqdv084mA@I{DZ+DMUJaY93 z52RTvh?91x9F&uDzI#GOPHw)*L8Da9(S@$7EBA39o7I*JsAk}YH(_h0(AhN<$(|`T z4FrMAtlSyHH8tfFl!9)99fq6o3MxQa=g!`0hvo~4L(b>r<|6rJE%@W1HCfgJ*@brQ zjkUuCVD+m{?bFIANF?=htYpnT1;yrW@U!9j{^V)Ck-;h)4xsC{of8&jXJ;=h1>uL* zua@6e|0VX(lE*0(RM*)*^APs#oY90kt_kFY9A zzRhAoebrz#Up7yU7gadyG(}cZ1LLMl;cfp>;(}uNJ~$X1;8zJ*QvZhH2S_J#VUVY} zxw%BcYaMP7W2P#wq{`7+^jf?BLA$BvnEKr#slVBkdi&ooDRb;ANZroofh||PcLg~1 zWcJUCi&bStq^6hMKq1R`Zt-`VH{dwpb{*4iU&(B?%P@!lDItE%RB) zZ+Hm{)=N^``Ht?5#dUQ*=+KC~L>^8~mwKl*#I5$WD$ANzu>;TTN2Qf;3V3xOQb3xY z=2jR%!5SilUpiFDx868c)nL&3iKI(7sqA7w+uZyifjv##bmayommxp_CO+g;-kG2k zemU{-MGirB+^4@utOR<>-qzq@qa*`GoKH!?+M1nMV$CCFR9GTvaQn98a%pcobeLH3 z!iJt#q_Ifiqg#7?7E`|I?BpfJLmnO_it;0U1GO~J4kNa?xq16e0Ob0PeyKwMwklKX z)W$y1V~#Wetz^VwLpm>nUI*32oI&0c9&JCz){^hg7%btJJo01az*Z{~)FzED%&!R)?Y+Rx z$?E|mmhXts^4ojw?}ZYnBl#;%mO4al{PyN{m01#FZ9WWUY}mGFSgJKNvUXA5?e=y{ zXTQFIazMb*ldB`%K;$Iz`pE0JI0X1|^vGJrvK=r9FGah)ew!09OI5CL#A0fkBTvTj zZNz!H7z-_z#>ImpBvwn+*|FEfebANHjKc~_&iC~%47Fwq&=EardMK8^x}>Kn`*EW% zLI5HIEo5j@QKy)FMM{{@qasrGQ{z!vdz>!OQqDa38lQ%8s*gw~&B|(6FpQFp^zf+K zAF{Z{m_InPp<`(H_Ta#WTi*55{x-Q8*do_kXPT_jt_{Cu48Pi02n_fWU$Wo7tkceB+|tX z?A)9spkG5zE*my~nqYEwM;I+ZQi=GVpPb!73PdbkAlN|Rnw3~@BHd6=k5;m=X*+(K zt#@U8HP}sGxf0kM(5t(9b*jn>EMQYy?#@_N=9ZA0&^EH@Lag!Xr&+E=QAOt^he|bR z38@kjrKS+1@2>RNx;>=+pcKfOd79ZU#Idg)RhCzd_*(3$A2*n-tDXfTIGlB$m}Q4X z&@Xo9@H^IQJ6=9g$O_GeUKU1muu~nyxXV4#m`q%Hl92rbT%J~3Wpab(VO67OD#`~zp!zZbanNKEw5Y~k(J-;Grm*lw zpyPuF@(*!BqC;_Uu2gJSAl%EVVvDA?hk2O)(%P&pwtmt%7?e98MvPLao{vV?)cZ^} zIO9A#HGO=b3JSci(HI#w_yi*|KTa$y<2DJBb>~`&7O`S zpe80xTFqGT3j&L<@jKJAGnp7n3j)Q_z;4IU@f7;*fD_5T>*3cOXGyG>an#de9=X7S z;MZ5P`~brA=(asJ0t5Yq+nB0s-T14qSi+t0dE4~@UlU9#3BlnltDRChIu<*?D(qsm zK!bc>;N9@9E4;@OwYzS;pD=T#W+%c8fkZm;(uy*Bn4S3gtlp^FV+o&$FguV(Xin@A zU(TpoEW0HMJvW1iX(KHKLuw8zF2&y!A(kf5(fZ0geIv;rxVG`hu+n#__>+yvYP)J* zig5_RN-x5SEXCLNtUwG4DOUVa`o7i!_xRZ}t80Qjx0}G%6_p|d7wFP7Sz_A%uC>eE`5S*V(R0P#CnlRP^6-~u6gyozlCJ}3Zy&J=Yixac$$+#k^%Vj+5ICe}~H%yP0iW6gveLheb zgd>H!t-pOQSWuOYx+(=u9Hv91us0$8aV!18Z+BYNc}|wox>K!o;I@C=A-lvs-w>|5 zp9A>gqxt!?QQUc>)iGhHj3*8}?4IV60ko%=={kS!hsbk-U!Y#+uaR-LfI(;nr1}(t zz$W)izQ-B83vGJ;jw~s;SsL{*AOiZ%2b)rnRddZR62|K}E#7QW0SfSerhyyQZdE=F z#bz*u5+_AP!}agy=SLXsI6CtuYH+*FZ9I|V<}EcT&tYQ8_su$sfDSFe8_st>eZBQz zsZy$YwYshjj#g|5*zu*eqBk3p6n7J&mByX(?3O%+hZrAeSx+*6Z8hJSK6Zd{>IbrT zP;(lBjkf{W?nOpFxY-oLK$S%s_7skyg;Evu;MbT22Bay<*Y>%}7_UArZFtH6zT8gbw^tw?Ye|I4f_F3gJedM-hq~Ov7sd9t8&pCovdI_v#XH z%Mt#vVzm=CHdg1iw1AU5<5!yqc5Y1~n}I^^#XWV_OTd=q^s?kc>wxj+D6mu8D`3L8 z;RWjhuMqpn`(^dP?dx$Lp`zFjECD-O892QC)~!w$_W zYlfS@hdpE2+8%|i^5Jjfgn_D0f4EKE1)CJNr;4^8%|{>2gZiSwI#%BP^$ts~Z-+Y; zVF*b=Zf2n;=*PSBMW$z`4R>ZrDj6GcM#oD_i$U*+bcle#;GU4{+r*g#JI6{R9C~+n z7tkwgZRHY|`8%t`yWJ0YJ@siJOqPkNFAahRx=Q)r8K5o$dAg1sVb@7)L-n;)vxsL) zw?bxxz}2`WmXGS5ElzS?Mr|oZA)~IKLdNMD_Q?9*xMQoT$}3pcDLJ06sg5>L&gUx9 ziEPC|KR8(^t>&Gzzh9+;8(n(lY|}6kC5A*A(7YeneMFvKUz;SgTwtNhzNl)Ci53hJ z<1;e(7&kI-h)36L1p2+b*OKtA>xdB#Nx4NMs$re zhq~m>^|jCCQ&Uf6RTi6^s_4w(%*4f|Rwb8RQxBPtI3Acq0)&B;;CppjX!a2VLbU9p zajMG0fln}E01q>K2X0bGj_~)>kY#oE-|m*eUrhWqLC1$;i79&juhd3`K6gG1@OG5z zNm!?2WsnQ8YMQW_XfS+T7&=Hd>GM0SmyTOaTK0MTl>6Ru>tBd}mKH4$Kfp*o12-I} zG3EU_4Fut7mLjs`pDA5Yxr8%{Q!BnggN*VD;I8j;rJ>}nvs;Zx9!RENHwsqIUw(Bv zp`!IbLCql%)Ow(-qHSWO_fiGt)rqhqCcYS^#ql@k#x-o)izMC<5~|dhWp~vnXnBgQ zu9-Q>yRC0!H6qcVn}!=Trs^9k1cItXSj`J=;lS<|pTc~2{xUTDOpAj#AlZ8hz^hAe&OM zLCR?9w(I~+BsgPj$g+2C4lz&1Txn|seq9S1G=BW3*9Hec+#SMpI24UL76eaCM~V2? z7hpr(?3e5c=&MTKnkQtP&p#{XmZtZ)<~_7NpCGFK#s6?9B+Lp$1F+V)RkSYZe^P^!mmdzi!!VT zu5G{T0|F7Inw0ZW_obZ6hyolnI_9$6XETR_iIQONE3sn5dd0B@5|XfNm1LKzUi@j; zv|-8yBR!0=Sl#~WcKi&VkFno&cONeuY+&JS$6(A~Iij+RznzPMKot&l+Ev>6wN)G& z2N6D0GU}2K$0?o0cxbvqXDj-M{G4RvUI^*Ol24EloHdcg*a4I>aQf( zZM8OhvU?D>mprZ=JoQU4WOzD*Lj-l-FC}ebe!8jF(D;a_Q~EfCyc`!dGH!H9=uWoW z>!!!9V03!+`9ygGHh5K@?>w-cVU2{2MkCzPeDNlX2df$?E$I3UM>-hGuHnYtEOs5K z1P!!*_J4^@0HSywLEhS=VVmKf%U(5xna>^ zt$*$z-MCeiS}8@=!_FXglbIK6wed#-_-sg8Ut0K(uURC($ z1T2PQI8n|Mh`UZ#J3B$E#DJbbLD(uF|EGgxkMxc7cnE+7<<&n=rg&37z6(^szO7F& zn;fKTut`JF_tkda;bWeSgLBQ|S%}v<*g^n>oZQ{umuG#e(|&nlN-AXJ*G(JUuV&aTe&Of$VYYE( zyrzeq8D?g@IlNcdG`FEX5sP8Oi0GMhSj(S=Oq1Y+Vs|gbjO+bX20@PTpW4B{L(TXX zl^aV<0-AiOlT5{+7^0|Fuvy&MFL%V71%t!^(Fc@{rABLVPDB>q3d;3DI?&r@y6+z+ z91y!MxWck~dP~Qff1aY;+Mv1>Jo7g$?7KjBBno6Cl0kEwFk^b-qgutQf&B4cvWskz zC?Sw)aCe#-`B%V`0s%Fq9&V%S9Rp&38rPqp-?VZ`v`hXfe1ROQro?#0CZgj^BbYHq zu_VHpe);XH*Fp6#sPrbA?dZzx_?-fyAdHC}b$bJfX{nEa4v6SYoOK`RWQ`I0pSKXI z*vFkXs9o^|s~k)+J5V=szNJ14=}Ef=d1c8XZouwgzLPjNKdkZ8d<(?u>$Ebr-LyQX z=EyKes%AtVaACN5UI8&f%2e)ky}PMae_kNV1B(+c_Qke$tq#aDR z>oPSmoe>c>lk>e4aU8u<`*C_MC(S&2X5}HB5q_dnL#$a8nO+ejEHHlS@1=I5U2J06 zU%!Dii3nc~vDiL&60ElU+1?WxV{<6!$I!GA}!s|1C z!S>zhwZ{{zyRQG5?sd-_t8abe|F!pCikCdq>$v~5;EKF}e=v>u*X;8$)0xCT+W++x z(V;X&9r1tbHCbZDDI4b7E@un**R^K;kUfAe#n^TELMJ!{#-IIrqg`^K`IgI>|NX#r zHFMqn+lQa-{C0dc+(&wI{L{a8j1f#b5)@e<`0j82Kc6zyXD_X|Lr?9v;LX1y^IBi< zZxS#)cZk0J@7wr4a6y4}k3X*-coLc-fX1Bi$Kg#=33JWMqzlGszZcKOJwPG$GXt|J~-@Vg+*Zmm+J4M z|H)x>vnHPSJ@Xb13;uiQ|Gtp_O2~gz=3g6v|JL(K+U*#K9}%Zo!$$?ve5StslQ=a} zVXvpF*W={BPbk!k7qjjkYzY^u?$An-DR9^uS*KuE5b?&Y4~93jWQJRSE8uv1RvWE1 za^)>r&NwO7zHbgW=Y|~fvKe*{hhY&OK-F=s%8TFBYv{phv*s*vWo)!3O=X;K(8#HF zz)3R!-OL2V{K(Y6GAr*i)NbL8C|{G{u1WCfmooJaK3t~&rAo*&zr7sPS}PcqB;(jM zqS3Nt^dFPhvgb;0L~jM$pPYMr@sV?ig2y`layX>Uxxff5mRB_WKrm%`wl~E{##igW zlzz;l)_b>aL~d2+1VFS1@*AsW^NdzG^5k=eA}Py=VQVlF;FInfyvE8ay*h3iFq#>o^D&$i3}(0Syw+L?CB9*A~G+`XuAH$fUISSQfSIfZXVj-QVSc zV=|a`(c^wtf@QQ4(K;SBOZbVpX2N{e*#D1p&WB(iYu-LjoHI-=I^o9(o5Iek1eR!bct)UGyxl-b{Uh^`8SjeC+Jul2v^ zOxw|($Y=h50p=iT)g z<;z0Zj^#h@Dc_%Y0x`=v|Bd&~mdxUsa8b=vVa@tO>THtJUV1*S`qr&Ssfxp*u|URs-7`|2a4Y!69!e7_U)dd)%G=;FRb_fCJ`bRvf}q1@9)l~Vbz%A zuO@x-&6=@?mJ``T4L{cC*6!OaC5<0^#m;`RCtitGd@5NF$RK4hluyj)f18ndYVFD{ zZjhn2`t>2s^ysH!#enWLX@*At?JY6w+dGeLiFOPiE<>g=dVQ-vq-b%rCn5@_ylp#D?i6g zJ=o}ruVrHyH2vevmvpvvZZ0crbW7ENACr*M$r&!BHorP=_C7gM#QVVrK9w;Ta@6C< zMG@Fm#IxD+>2QgqhDy{9cKi@7qcsUVHC8>MvXo!;aAeRq;(6^so!F_dfzhZGVLRJ$&6NBS9#XI0gQa`9FIczm)UNqzFVPA zca2rb|ARk_jb!Y8b)@+1E%+H1`DO8a6@GT}{34v5lP~u%xAzr2!PStGucaE%yzsrv zg=7UP+{t_mwrG)+b zl)0#FZuZ;F<;8Y*fni10*O$Iiq;I??WGcq@f7LVTM_U+DlyH*Ybd1JcAKy8z@1vZz zT2z(%8FD#~bH>{30;qu834{LO2vr9<0x!Pv_P^p@K6+ck-Y@)yNMt(c46mva* z8g?bh8B3|Q-!@*7_t|ki)^8S{YRD@oj-@FwjwOF*USbo`pPnji{mlg(856z!@;;J>YRi`1Uvu_UDTW~~11X+O zFuD0f=*G>*H(O@rmQFw2Gf(7gM_=nF7i?MCQmglOO zis{J*<_{a6BhSc@%li-9B72^ve-bwj^fv*Fnf^k;X>Ov_$S}O-effVGVXo=+l1l3Ll#93ARgY2eNAZQ<-Ll{1Xc8IBS86t*nD1~t z68BhqrefO6yQ$*45NBZ+N0T2SeFJmz%;IV7>NLlS24Pl4KHtqJe03f-P5C8%s~qzY zP%OQMz6I)Q7VUQrukcK=9K5=^h_^Nr+)A)J+~kv8CYt0TMav`DIv% zh5FI0m>9lUm))6oEWqjAo5+Kl%RuUx+UAxFzew8Uj68=wdJd_l^uFUGg@@hvVnhh@FrLoo26%DkaoK_yRE*wW|!2dj@E;gctTPhH4)&)>hK zfB*l*PqSLH;dNHZP$3#4x~(8sMx7{e;kb031_BJ>(xV;G>PPg9h=guDGu#qQeX&@2yXE^fU(^gmB7z+|Lbpl_m6 z@b%}Wr_yy5CG292s`4tnHQ1MuXK3_t__NLNlfspEp%1_MR$F-u?}->x*L=D6%;?3# z_jF_JeEvjV64$u%m3t8#Uwr|Yg#)(Fx&Dysbhz=`j{;uCiz2A9`vyAwPR*E5={O34 z)J)820ieOLZg&>2q=!!1d%rU?@ZX+j4d{?WnoDtM1Is7*}fF#rnB(+!)-T}!v$?$0$?4Cb%n2MeVX>$E=#lS zE2^6198AAWi?(QGI5ytTwQP@~0R1br3Hgp^?CPgqj@Q*f_vSMXNqs8Eih2F(zp>@< z&QDE<$Kl@A#=dah?bAHdRHp(&`4NDiH}<~(q&YZn6Zhs&W{ANfvxT2oerdlQ?X`Yc zqO+Q;>vR|H#vKCk=L5mrc0&qa+$e-!5{eWIi3p(R*a7;wohi^D+R3!OSHUlo*E<`) z$)C~&%WSl%?J7qS-mQ8oXK^U)mL-3jD0*khZlpYi;NGuQ<|~Dy7}xh90TBJ(7crNT zr9?Y|PI9a?cn}%Y`axTHfm6m|9$gDyf4`*iG?l&iE63G_{-^PdXXg)dXXceqL*}8@ zE9zR~zdebIMy#H5o=i<+F+sE;2lous8(?P7#OJs!(ba2W> zCpi?`q-<2~Gzm9jw_!-BJgjnecq-Ev=ri^-E@O@-IgI#XbtH<0HxC$)*qX#})}LznM@C zlBBGl_Qq zb)RF}%?t7SX}fqGo>u+}bzYLZ<8ouFR*JApo1myx&G$9DXRJUhW6;!d)sT6*JI-*M zV?^9Z&R9}avZSEK5%xz2>%vy44?VlY<;)!G5`OTdMI(hI&;x_NOJ5ooBr%Ed3L zqfA@qnmqrCRmriTBK;0xUv+oTpc{g`0!euyz1V@|| zJ!<^*%2UHaavw+AMu(s?tE%puGX2w0C}bF3|EslUYoQIn!Xh zzL{%_73WF_4MHw;f$@o>HrOt>a{&TpSLacelF$R+Bv*v(l5X%o$=W~xOX*(mKZ|Wj z8Vb*E_}R80MZ=&@zMd?9@&2u=-Oz`8sqJgAkw#hm!D!VfBh#Wimk0J~0;N}~@~3}z za>etf{q5?7G;KmEc8ftID}t>d?;!3@ny%?0Ik1a}d|E)ql#C)Wr{f+YuQ`d~Q7PuX zavf=5nEfOjVWY|3oNcFSMeh>ahK7fWb!@y@4lb4*a3FE#9@pscPtWU%_dG5EH$2<4 zq0p;KFLSd@PmyZ<*m@)o4zw9FAoA*;N+l?zG|ii*nfUu82n6xUwogB@nN{&pZgq67Wuuz6dWCL) zUR}iJ78V1|J=B6Z%Sn(^?I9|U;SJX7;60+uJCCf z$9>&**fR2NTGQdMrXBI#Rojb$yq#TWg6EVJ_Gm$Un+#VF^FqIR{)=E*-t(P&^PPWW z;;}m`2u!4Wi(b9ANF|!ec7>^q$ z(;=AW&bFUKw;vun(?SWz_QgIrP|0sZ*>IJTAPsvx;AE+o<0-)jYgL28Sx)ksvAMvL{oZ+VdO9} zoYTLGtm-D&a)n5O;JIUAtZYj?t=_0kVQGCmo=VfWNC!Hkkvfx0@ZFH{BTP+J+hnAX{XwD1t=1VW9Y9gREg*+Ofj zZH#r-BTaXpv)!k%Sj|lb)~*Uym^68iVM~o1$kF|PQsnfN(FIJ3&;8@{)YMzkYvz5sS9h=VtY@u>{H!d4fl7+{=FJ-nIax`yH*etD-@JK8 zh>Qs9!IRevfL#zx6=Wpey#Dk0+EJDa>p^jn1-ZU?gNFCd`|X>o9Aa1}lAD~86w(e7 z779IKawccQn>SQ%W;$RznP4!bYP`%wqA));5bo~qkGfA^!PtmKO?`%bY8IID5HvP-nt2kpg zc!xY$px0g7zRn3{t2f4(OpMCxCUtN8yimVY1Sf8G-R zUqkuN+5P7X{yWisJMsTxo&4AM{~LAvZyxr)5&gFd@PDkw|CsdutdD=6^uMX<-$noP zM);o}_J5Tx`M=Td|3>tGmH&UR8UO7p{m+~6-|zT;mH+Sh`1c+6|7WvvIW#i&0UPI@ zk^vdcZe_5ZC2NAdY1{a1baeEO6?^@K5*CH1!mlg}F#uw4#CC>5vjX|hn||kBDOcss?xD$Y+~{jY)3v+Aj~I|N6^wK(_z@> z?yJAh<8F6Z*iAefO|G7{Bh>@prcpMXW}%yu$Ha_dR8-D_Mr@N1J&WW*1-36D`15dv z0HCx(GMIZbdd=Yt*x>#0AO14%=;sezRxK^9#pPvFPtWwZInA{6^b24-tsGM{uDZ_k zBc9z?!wSy#D$e%NHbr6EK9GV*2nW@qDg6vd@Kg%z1PQwIxCOvEi!)EzNk4k7#H-ex zO`2%dhCqvu@WMA8$UfWvr=E8G(;!YIPJka+?CLRU%uf{uK0%Bg=9{N{xKjGZRR?sl zKTTL9E2Oj4wY80U@@D8RNA3JP>v&9{$#eTo* zRLLs64)^P&+VO_GThT!em+e;B9+fm{3+xLW?&q3eP+&opjMBXrE$1BcuWid`7jR5|ON+ao}7u%{s`leIAS6Lr~ zzn9Io*GAG1A0ISwISn@<{cfSD&NqCTQzwm@-F2F!Z)?Cxg4D8KF39}Lkzi#dTd+BC znYwfXN>y##3I8!AaQhyIJOZHj-H zN}A1+nB8H7~aolQ7j*n zEi`O!yg(a|6tUiT3$7zkDbt)WNdT`j_0PC>)K{qjBKKSBB9PZ+{qZn;uSe8{CPUM; z%p$ESwHgf)75W?xL71w)&ylJUPiN=3IyrS~8~F`vx5XdixG~l1ulwTM4WIYc zCR!p8OK3zo`C$#YGLGUVlaa3%Od)?;fEz9Ry3l3(t81eJ%RhMkCpm@4P?J8J(XxfB zYw8rFKR7&ov9lgJ|Cf_e_yq}fhJZS)-Sv*95%dqm8r>=_PU8vC|jz0 zC}YgYOGw^Xt zN=)H!<^akJNHH&6gPEuBE9PJ?zOhTNISAie47aS^@R9AP5yYbR^ zs&&`CUT1Vv3G4gnkHJjxmTE6|HcrUfp{0n&+&1*zB1&yaRtVhR-D_F3h_s!^vpHF; z9JH5wT+{m=Wq@rBlSS;5f28#CjvG% zf~xpxRa&wQDGg8o%l)$B4&TTJ{dZlh<0CyxGd&rPSf^as%5s)mPd2hibmP(}M7eLJ zK=qHygl&$F&c4lkGwbg+Q>mk~(Z;n`_^&W0nag~ym(CUgE^`*vAgM=H=^6Oy(j9LR z5HiWs^j-|Xp>huSw^NQ@m^~_$~A(-W0a zr)d*@o1+=6r$UA!A9_orq#hR+2YI;8fZhwt9HKAW=;-Q#?X6=kSwewD^D$23MDpd~ z1U9aEmDOws+33lHuv7d!od$8p@6^{TTn@N<(Zgl8Kt0A4)NSeIoT=O#zU@8E%Cgac z&ml;fSc)=9A-w&P8-D%w5#5K&Zir?%8d*I0Dw=`;gw@8K;xWoW0bmq#vtYQ(lbNxZ zCdsem?vg*4oXPeeF()$flGfitKSA-I+blUVvUr>q49^$cpE_a40Ya+Z8^IP_hO3?C zGFJ1O24wdEqw^Np_S^SH^XZqRppqP(1b&FdA5CRtC<%I4povMR)Pc{e9?#w~kMAVi zq>KLKV3WQ6(15dWEsGuc%wdS-805!T@il12qjT3R}z1wtwJk7d?Bv7{?)db3#s zPrv$jD7qeYYxqTkc6YUnO!xnomnNg+zno$Q+@yDHw6F9v8UW7*?CnlU==b-D;90|u z&Q5WD=vy!_Rm2huKBEjhTGDQl*X-8+XdPxI({8Qz$^?#oX;oIr2xV9O&-TX7=2Ezf(@lBEtSjXq^XWm*sEq8-9^dIi&FT z(Ji@SloLmXmngcrzQY<##^-Rpdgh<5*X*DgX`{$M@*IsKhCgL9p4g8PJdy!*4zH@x z+}q!0REU<}0d#T7a4M0g;Pwvpc%XY}nF>&(ooowIT%CLrGoCqggZN+P$i!2)zP?E0 z0ax}1$V>Ek(F>;}GG)x2hfk|`PbJR+VfliPbDv|Zm%IEw5+ z_irIDJ2Cum7kd~r9ao%uhF%yor|NYdaBT;zmMuH#B8Q^Y$u7AqQdEc)2anlKrya&s z@ex$%3R&b!8n?(V1so)y$;l+au}TL#7vHu8 z2=OXZ63IT6DnGaPXj883LWewwuid`~M?761{mV^}nS;T>lusK-?Kks!8XpPj`?u~v zlnWTvd@$G(zrdCm#BB)G{7 z5Xh)l4W*7H+X9>?Un1?}pU152aepF{f8J9g+HahZB5-3d^4wPgISXEQxxCK#k*u!8 z^@kw(>KeJL)(Mp;A9cZSt-xn`|M)4UWJ0i}{h4#U>&CCtqT5N3{@pQ+C3V&iD-1z8 ziHJ}u;F1rO5scRXyY7tQKA=4X*0aFC=J-|yi;6%S|CZHV#Eadh60I^WU#MJrJf4n@ z&SF96Sz8AAsEaIU8K0X;0ZAgp5xwoi+$Mlfbv)Ea(}@F| z+@8}m+FkWrH}~=ijqZs6)*+t=YLe};xuC9{)5l5vAJQ3_)bR>~$tY6baobmi*v1ljUZR== z9X#dmGL7<09bVTd+@_-`GS6?=*k06gU!%6~Smx5Lxk+29qXCEu?p-hI0?|`uk{jBL ztg=-xU02sl z`fOWf-IIQ?aY^i^unM={$y*)(jzkl!M_11eEeScbl>lZ)gH+*B2oLyFmvE<4f z%xLMyC!FE#X+l3_c{^6xu}B*u4vn7_0IrqMT2@b)d0FR8?F8lKVi@||Ac|o-xjBuy zC8s`3GxRmXWu+pry zaEeBV7o0Q9nWRA2h!nANf%AFs;NUt=t!km!?TFN`K}O5yrQti~=`^`ujkq@wYC5z# z<1!VCs*9SfXt-EUVZ0oynu>yLoxj%wf=_#q)(A_%N^!D#2(#x<;e?Cm8{S z%TsZ47v3X~iM(=}dIC>gKE~WBHas~UzEz6uUBx*dvj@uhF*N=tRL3xSmNj$zo72f| zg`Gp?`Iu4X(BWY#VR^(q)WVAoEK=*d?Kr!-%6}DbPIG$tG3Lf^Uf0+?U-F)?S*x2z z#{;E=dcvjDS@AUGTAIih#GQrFDY4RzplQ%e=Suw$y#wB z4)XUPgnNu%K%j^_49M*CZ9|Z7k+&!sFquy|b>?0!$kqga#3`7_v%K@l;~M3hRuAum zT2;4Jc5F?vu#lJS6!P~m319vmO8pM}5eB3r zAKQ3HdBQ_-evdf0W^?lx2cIlL49RNjYOz^ybO;pl)X~V;;TGy^S+G9due}uvk-HoFX$|%tk;7dq z?-l52UPnzm(;d6+-}CbF9tc>*SgMmIBUD$OIUSB-`m@qBsOe7zah5UmxadPwknjaE z>WzP&aJ3&KT9P!d?7cJ$(aMdUmN2(p3?6aoDk-YE_|Kbg5@Y{-%ka#$WHoBq0qwcK z5i9B$y%bDuYWBLjqoxe_3t+IE%&eLFCPlzD_~BujT8FTKg?j92y{)#Om>Ut?-Nb76 z=oP%0{Wdb2!^3rY`tyjduEm$AU9RTZA=8%dGx%eyE>p{!k2l77$ya_`cB5+Mxg6Fm zIh0B2wW40#7nKqdHzwCPEbnnQjLD-_C(N@{>SFu&->qa$WeIQ(QS+z|DUtsSPO+#8 zI-w<|s@tSd0@NwB5vVo_%i8;*Pgq5c_F|^(y7;g4a02}4Xyxd~lVY&^A4w?JUy`=L zxhu>xuTO3)nGwE4cmCa{sm#CIA6VOeZCO2q-0va;fnpWf+Vq!OLnx&bOTm|%7A6Ie z=8wgoktOSV8LYg7Qj{e(d0_U&0?qvVg41@yA5d&nEW#S(gnq$rWqU?NWIsLNRRNL6 zZ>_~U_sTGxKks62&7FP*MT{6m>v$NRZz7#tt+0z)a8T6hCQr{=;qYl%ma18lC*DO~m3;E^^Bz1{1d-02i=!zqin|7R#@MrQ^?g~|-$~BN z_Nl3B^vS&VI%)Jg7qCOQ<`eHt?Cj;2U6M*b!~PXilU%~|n2U$m_C9STIwvpR<@Unh zlBGZsh5|7y`$V>B>Bn4H$d0|C%TI!FyI<;v{wVEHkwH$ z1jp+|WQzPoi%9xRhtoG}>X>mfo6Z}&1jC7P;*>AuOIaM~@KXUlEX?B3@`Mjf;%Rst z;bZhL>%i*He^RstGXR-P&I(raydKuz%s1?wj2w!ifFUBTFz3Mm#*+1XlT^A`y6nH* z)T|h*c2SxZJ07xC*Uko%WN7Oi2kw*?2Q(JT4WR6rhL&HnmleMu*75TAmlePEp{oqK zzy8BC`mL;_LmnqQb@Y~LGsTLgXq#OwznQq3#2)cEBrz~GECuQc(L~VzCpSGQ1EA|K zTW10yLVZmp*4B9r%|mOaW0fq`m%Emp0*j(sB?{W#=8n+4{a*gmye1VjfZ1y7FaIdi z7=s8IEXyi+mo@q#xY5ghkZNoJ*v|~g}-B~-6?%nCC$bLiDQPOUh?nEEvWB)dI z%Q^C>guFhFLyO)brSuRm=*n-Ji%eaWe@rl@s?^JF(;x}YW7`KNh9EkPZ{j|=O~ zY~=OmVZ8jl7ZfBcdZ19{`RS3ij+J&~5Ndjwi>_$(ROKAxwP>=j_FpIu&S`g4;VC=+ z$%l8ZnW;Xhn#ASx(2vyB-Ql=nd~lR>#4Ki4!nQ=twff81<6Wl=1(CiRJ8^7SOJ3hh zFpBDDOUr%Et7um<+7^>fy8ZnZA&>E=uFJx^LN%*fqb1B{UeJxLpz$4j#W3Q99@}|F zj>@Xa?RyH_F=n8zTYBX%@em$x5?m)DE7H8@Mg#(~M-j&NCG6q_~ z$XL06%o%KLp1jTNL+M!g@bT6+s{*g7+LF83o)k*cx0Qo0drZ!LUCT&4Nj({Pk~AF{ z`j%z%_b*Xs=ZkvJQc=*=JAPr7S_jtp>(P&F(X_z;h19WQMYx|xp5NyF%#xzDR3n%N zIfjq(`TD;EH#^&h--!GWoNXuxdlaLuYDWsxcp+$3vO%3T~n4+k)-J()BiVb~MHx)qW?AQlGWW!iC+J zhHzuCius+!Tw#&*fMJv7;O)hh5*hrqNWtOw!s2@_K#7xIBfZ>|q|kxclI^eMtMuwt0{t zj2or6JU9#q_F-aBxoy3+NhLdTnEs*HqRv0Y)i;Ujy?2tTLGOfSNXCK?yV{cu#;KNWe(1xX&JrR?=+?(x-W|EL* z*bKF(_dcuL*yciW7nL$DtH(d7h~fM^zV&m_o%H{z1@KMIe?Df{iI{iFc|*?c|2M~s z)3lLCrDC4SMhmoN_?1_?z{elz#BbsMG9ZN>aGxF^Rnhp#(2!6>e)Hu#=lo2lyA(^H(^_&W+rd}>HV!nMiyPfFe$qo zGI!%HzOuVO8G!t$LU+j1&v#+>$NJl`jeFk2vn@i*PRdXC94r_P((~Z4h=g+>;OI*36^NXSU%Z(nq>eKsvxv(Qh zOPWj(&(K-tQ;2S3&)<1OEK1%&pkz+ZCz2TRcc-HMC5mv>ti=HAb2&1b%Y*0(v* zC8L7_sE+zRslVmRWi)-qHm{#jl$#~yuw?6FJgP>l1gV)($%ia_$_59;LqoqpeXGPA zaF5Y}UE-|Y)hqZl2Hyz=Gxf=hOgWFtFrW|zAL-gvYGe!ubf|`zlQF(tSjqM|rKs-_ zHrdKv#juP4(t7HtRM0RxNxAr$TOq3-&{+_R@F!hb4=jGa9)!d$d~c}^7yah^YM2ha z%CQ#REYGd)PzM9wRV3Ec@71kUn&<~7r%JXe{JO65AfI+lrpW^fjxQRlS~#8%eD}v# zaEIlw>ffwid7bkA_IpUV*A0!8mbJ1h?o=u=+>~)#?}hWf-yEW~{yxC|Pj$xqp3mVZ zPbVyH;Aowknj#@nP*{u`xL+dK-+xcIzpUT!g4&qMyS)^Mghk=x

    9X+_}29ah}li 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

    >(QPizv*Bs*f2PPLI3Jv={g({4P# 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 EKULdd_y7O^ literal 0 HcmV?d00001 diff --git a/BXNL/orbit_ex/img/ltx_optprb.png b/BXNL/orbit_ex/img/ltx_optprb.png new file mode 100644 index 0000000000000000000000000000000000000000..afc4d24775e9690701459ae4b3d66911aa78b609 GIT binary patch literal 1618 zcmZ`(X;>0=9RBA4ng?EGlAB5%n+)a9P#{W0yz(O5H0EO>c$5K_CZaX8jI_I!S#-|K zqr5W@%+wAlExb*qg61Ogn3*Y=)6t%1ANFA%e!us3yzldVd$WTAy!6(>*8%|ae7q?% z0M>9+v!jNpf%apc4OO5K>*ntUK;>zjm9CFiR)ZLW9teibtRDOm24VbuUl^6~eCj%yie8Ji}5 z`DRRIIN?Ka3yB+9%>@#hicnDZ^~J>80?8TSX-fWc4xwHqsE?~e!GI;A%TUT zk;sjL=!8=e<981CbUltaTimsw_3^1JL@%_K{0wpEZl5rBbA^bBudXImOZLyCPo>A4 zGcco)tQ6N?4y}&Jwk!@2iJ}dZ?vl!@MP;W^RAbU=2j8iMJ|yLG_VKH@2zz;94RtKi z1lIaS5xX^8i#I_pEe)l9Hn}BVOhKsW_Xa4@?KT?ERUGpwK z6RmO^Dh37112)%a804*aJl|;8RY06?-vVk|?ETYVaor>}C0toXJ-72rHS?6)7fwnh z#{jS0RR0X#&0Y>|YBMJ3;jK<>-D6ppxU5}w}oK3I%cR(4z{}1 zKyz%Bm$f3Jg2?P#UmHMr1!2#(##}Ekhce*g&CR`R;mk1@@6B0gGM8Cw6o@R-lctAS z`wC)p*?md7hcwHq2WTAb;ES}2zPK3;iz60xwmz0D3cWZ^+^0^0ap<^1TVK@+&(L)n z3t}6u-rM(R_oZpNBiHrO!fQfc+w{d*Gs&dW{IiF5OV4vZ!A5THI7gOCTOrm4>U*v{ z`XCjYIKCtE@!E*(cXyraz8xbupny;mby!b%eHpF4YqoPV-{jbhZ?cqP-*wIk=*(-8 z7MX9feju@~lG*Qb1*RNrE##)ptgEydFRHuzr^8{VRr2_E(c?8c3LFMQd5Q#UlJvt) zv+7?v8DCCP_9e-bB-A#ld*xyymurlLzdBndHIvIWfyDa$n*cc9aD!RF)JaF_G? zAD=ods?q%+Cd-fWyBS+xs87JWjEdg5zITp)<;$xO^`0(xVF7F z7e`*BqST2kn_`I?<)+V(I%n1UOV>MdolS$epNR$@fsbbZ JrObU-=HEk?(I)@^ literal 0 HcmV?d00001 diff --git a/BXNL/orbit_ex/output.txt b/BXNL/orbit_ex/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..65558ba96d069cd7deb45fb8116ed54b94fa8f9d GIT binary patch literal 3926 zcmeH~PjAye5XI+=#CPx!1VxUMI4SoE4u~QlxI0bS2DKz4am%L%es3psQl};V(;ljo z*Sp@C@w}bcdG_Bwk)2p<4f{ZQYmt4nf&H{A>(lovvk}j(!f0$0#$)?sd3fGq9N9H% z6T3vK%j}%HG&jM(V{iO00SptwZDM{(~G zksiCR9ICbiED0!55X4|PqOUDTRke0EzaPt(I4FZ0#j3~}V5t$AcDNi%`UJ2{z%g9Y zk2+Xd9q z?B0?UckA_Ci}ST=e&rjvG+d%PFTZ>|^HH+J>5s|4xNKhK;xda>H|m_U7FpSx*1)7( zRfVkT*2~r99xY19$I}YCoU(r%_EmN5BRkTk-d!>iOR1){!x>7=@jY{`7~v4j_j^8n zx8vG`42y|pk!OdmgS+9{lzdDA(>7sSuj$*JiuI!Daj9b2jBCYD$6#r2wI7Y27O`x? zwO%JwF_IF?;p4JiEDtU1x%14m`mfq%?|mN&3#)T&GknwP#5of`Ev}V!st0l4+VyyP qrW@HS{tfj%oAd3jeeS^O-cQ2!lKx`E?G0MQH=ajB{E*t~@a}&}ah5y) literal 0 HcmV?d00001 diff --git a/BXNL/orbit_ex/source/OrbitEx.java b/BXNL/orbit_ex/source/OrbitEx.java new file mode 100644 index 0000000..1fc887a --- /dev/null +++ b/BXNL/orbit_ex/source/OrbitEx.java @@ -0,0 +1,263 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04FFU; + +import javax.imageio.ImageIO; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.lang.Math; +import java.awt.Color; +import java.util.Arrays; + +public class OrbitEx { + + public static void main(String[] args) { + + int i; + + // Orbital Data Fitting + + double[] tx = new double[] { 441.23, 484.31, 265.15, 98.25, 180.66, 439.13, 596.54 }; + double[] ty = new double[] { 333.92, 563.46, 577.40, 379.23, 148.62, 100.28, 285.99 }; + double[] cc = new double[] { 355.00, 347.00 }; + double[] tr = new double[tx.length]; + + for (i = 0; i < tr.length; i++) { + tr[i] = Math.pow(tx[i] - cc[0], 2) + Math.pow(ty[i] - cc[1], 2); + } + + try { + // Open a JPEG file, load into a BufferedImage. + BufferedImage img = ImageIO.read(new File("../img/earth.png")); + + // Obtain the Graphics2D context associated with the BufferedImage. + Graphics2D g = img.createGraphics(); + + // Set the Color to Yellow + g.setColor(Color.YELLOW); + + // Draw the Points on the image + for (i = 0; i < tx.length; i++) { + drawPoint(g, (int) tx[i], (int) ty[i]); + } + + // Save the image + ImageIO.write(img, "PNG", new File("../img/dat_orbit.png")); + + // Clean up -- dispose the graphics context that was created. + g.dispose(); + } catch (IOException e) { + e.printStackTrace(); + } + + // problem data + // number of oservations + int nres = tx.length; + // observations + // + // number of parameter to fit + int nvar = 1; + + // Initialize the model handle + long handle = 0; + int ifail = 0; + + E04RA e04ra = new E04RA(); + e04ra.eval(handle, nvar, ifail); + + handle = e04ra.getHANDLE(); + + // Define a dense nonlinear least-squares objective function + E04RM e04rm = new E04RM(); + ifail = 0; + e04rm.eval(handle, nres, 0, 0, new int[] {}, new int[] {}, ifail); + + // Restrict parameter space (0 <= x) + E04RH e04rh = new E04RH(); + double[] bl = new double[nvar]; + double[] bu = new double[nvar]; + Arrays.fill(bu, 1000.0); + ifail = 0; + e04rh.eval(handle, nvar, bl, bu, ifail); + + // Set some optional parameters to control the output of the solver + E04ZM e04zm = new E04ZM(); + ifail = 0; + + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Bxnl Iteration Limit = 100", ifail); + + // Define initial guess (starting point) Away from zero which is problematic + double[] x = new double[nvar]; + Arrays.fill(x, 1.0); + + // Call the solver + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + double[] rx = new double[nres]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[0]; + double[] ruser = tr; + long cpuser = 0; + ifail = 0; + + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); + + // Optimal parameter values + double rstar = x[0]; + System.out.printf("Optimal Orbit Height: %3.2f\n", rstar); + + try { + // Open a JPEG file, load into a BufferedImage. + BufferedImage img = ImageIO.read(new File("../img/dat_orbit.png")); + + // Obtain the Graphics2D context associated with the BufferedImage. + Graphics2D g = img.createGraphics(); + + // Set the Color to White + g.setColor(Color.WHITE); + + // Draw the Circle around the points + g.drawOval((int) (cc[0] - rstar), (int) (cc[1] - rstar), (int) (2 * rstar), (int) (2 * rstar)); + + // Save the image + ImageIO.write(img, "PNG", new File("../img/est_orbit.png")); + + // Clean up -- dispose the graphics context that was created. + g.dispose(); + } catch (IOException e) { + e.printStackTrace(); + } + + // Add weights for each residual + double[] weights = new double[] { 0.10, 0.98, 1.01, 1.00, 0.92, 0.97, 1.02 }; + double weights_sum = Arrays.stream(weights).sum(); + for (i = 0; i < weights.length; i++) { + weights[i] /= weights_sum; + } + + // Define the reliability of the measurements (weights) + E04RX e04rx = new E04RX(); + ifail = 0; + e04rx.eval(handle, "RW", 0, weights.length, weights, ifail); + + // Indicate to the solver that weights are to be used + ifail = 0; + e04zm.eval(handle, "Bxnl Use weights = Yes", ifail); + + // Define initial guess (starting point) Away from zero which is problematic + Arrays.fill(x, 1.0); + + // Solve again + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); + + // Objective and solution + rstar = x[0]; + System.out.printf("Optimal Orbit Height: %3.2f\n", rstar); + + try { + // Open a JPEG file, load into a BufferedImage. + BufferedImage img = ImageIO.read(new File("../img/dat_orbit.png")); + + // Obtain the Graphics2D context associated with the BufferedImage. + Graphics2D g = img.createGraphics(); + + // Set the Color to White + g.setColor(Color.WHITE); + + // Draw the Circle around the points + g.drawOval((int) (cc[0] - rstar), (int) (cc[1] - rstar), (int) (2 * rstar), (int) (2 * rstar)); + + // Save the image + ImageIO.write(img, "PNG", new File("../img/estw_orbit.png")); + + // Clean up -- dispose the graphics context that was created. + g.dispose(); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.printf("Optimal Orbit Height: %3.2f (should be between 244 and 256)\n", rstar); + + // Destroy the handle: + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + } + + /** + * Objective function call back passed to the least squares solver. Return the + * difference between the current estimated radius squared, r^2=x^2 and the + * squared norm of the data point stored in tr[i] for i = 1 to nres: rx[i] = r^2 + * - tr[i], i = 1, ..., nres. + */ + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + public void eval() { + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = Math.pow(this.X[0], 2) - this.RUSER[i]; + } + } + } + + /** + * Computes the Jacobian of the least square residuals. Simply return rdx[i] = + * 2r, i = 1, ..., nres. + */ + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + public void eval() { + Arrays.fill(this.RDX, 2.0 * this.X[0]); + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, this.INFORM, this.IUSER, this.RUSER, + this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, this.IUSER, this.RUSER, + this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + private static void drawPoint(Graphics2D g, int x, int y) { + int width = 3; + int length = 21; + g.fillRect(x - (width / 2), y - (length / 2), width, length); + g.fillRect(x - (length / 2), y - (width / 2), length, width); + } + +} diff --git a/BXNL/simple_BXNL/Readme.md b/BXNL/simple_BXNL/Readme.md new file mode 100644 index 0000000..c085ea4 --- /dev/null +++ b/BXNL/simple_BXNL/Readme.md @@ -0,0 +1,310 @@ +> ## Important Information +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). +> +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +This example demontrates how to fit data to a model using weighted nonlinear least-squares. + +**handle_solve_bxnl** (`e04gg`) is a bound-constrained nonlinear least squares trust region solver (BXNL) from the NAG optimization modelling suite aimed for small to medium-scale problems. It solves the problem: + +$$ +\begin{array}{ll} +{\underset{x \in \mathbb{R}^{n_{\text{var}}}}{minimize}\ } & +\frac{1}{2} \sum_{i=1}^{n_{\text{res}}} w_i r_i(x)^2 + \frac{\sigma}{p}\|x\|^p_2\\ +\text{subject to} & l_{x} \leq x \leq u_{x} +\end{array} +$$ + + +where $$r_i(x),i=1,\dots,n_{\text{res}}$$, are smooth nonlinear functions called residuals, $$w_i ,i=1,\dots,n_{\text{res}}$$ are weights (by default they are all defined to 1, and the rightmost element represents the regularization term with parameter $$\sigma\geq0$$ and power $$p>0$$. The constraint elements $$l_x$$ and $$u_x$$ are $$n_{\text{var}}$$-dimensional vectors defining the bounds on the variables. + +Typically in a calibration or data fitting context, the residuals will be defined as the difference between the observed values $$y_i$$ at $$t_i$$ and the values provided by a nonlinear model $$\phi(t;x)$$, i.e., $$r_i(x)≔y_i-\phi(t_i;x).$$ + +The following example illustrates the usage of `e04gg` to fit PADC target with $$\alpha$$ particle +etched nuclear track data to a convoluted distribution. A target +sheet is scanned and track diameters (red wedges in +the following Figure 1) are recorded into a histogram and a mixed Normal and log-Normal model is to be fitted to the experimental histogram (see Figure 2). +![PADC](../images/tracks.png) + +**Figure 1**: PADC with etched $$\alpha$$ particle tracks. + +`e04gg` is used to fit the six parameter model +$$ +\begin{array}{ll} +\phi\big(t, x = (a, b, A_{\ell}, \mu, \sigma, A_g)\big) = \text{log-Normal}(a, b, A_l) + \text{Normal}(\mu, \sigma^2, A_g)\\ +\text{subject to } 0 \leq x, +\end{array}$$ +using the histogram heights reported in Figure 2. + +```java + // problem data + // number of observations + int nres = 64; + // ovservations + int[] diameter = new int[nres]; + for (i = 0; i < nres; i++) { + diameter[i] = i + 1; + } + double[] density = new double[] { 0.0722713864, 0.0575221239, 0.0604719764, 0.0405604720, 0.0317109145, + 0.0309734513, 0.0258112094, 0.0228613569, 0.0213864307, 0.0213864307, 0.0147492625, 0.0213864307, + 0.0243362832, 0.0169616519, 0.0095870206, 0.0147492625, 0.0140117994, 0.0132743363, 0.0147492625, + 0.0140117994, 0.0140117994, 0.0132743363, 0.0117994100, 0.0132743363, 0.0110619469, 0.0103244838, + 0.0117994100, 0.0117994100, 0.0147492625, 0.0110619469, 0.0132743363, 0.0206489676, 0.0169616519, + 0.0169616519, 0.0280235988, 0.0221238938, 0.0235988201, 0.0221238938, 0.0206489676, 0.0228613569, + 0.0184365782, 0.0176991150, 0.0132743363, 0.0132743363, 0.0088495575, 0.0095870206, 0.0073746313, + 0.0110619469, 0.0036873156, 0.0051622419, 0.0058997050, 0.0014749263, 0.0022123894, 0.0029498525, + 0.0014749263, 0.0007374631, 0.0014749263, 0.0014749263, 0.0007374631, 0.0000000000, 0.0000000000, + 0.0000000000, 0.0000000000, 0.0000000000 }; + + // Define iuser and ruser to be passed to the callback functions + int[] iuser = diameter; + double[] ruser = density; +``` + +
    + +

    + +
    + +**Figure 2**: Histogram of etched track diameter of $\alpha$ particles. Bar heights are the data that will be fitted unsing the aggregated model $\phi(x, t)$. + +```java + // Define Normal and log-Normal distributions + public static double lognormal(int d, double a, double b, double Al) { + return Al / (d * b * Math.sqrt(2 * Math.PI)) * Math.exp(-(Math.pow(Math.log(d) - a, 2)) / (2 * Math.pow(b, 2))); + } + + public static double gaussian(int d, double mu, double sigma, double Ag) { + return Ag * Math.exp(-0.5 * Math.pow((d - mu) / sigma, 2)) / (sigma * Math.sqrt(2 * Math.PI)); + } + + public static double[] lognormal(double[] d, double a, double b, double Al) { + double[] result = new double[d.length]; + for (int i = 0; i < d.length; i++) { + result[i] = Al / (d[i] * b * Math.sqrt(2 * Math.PI)) * Math.exp(-(Math.pow(Math.log(d[i]) - a, 2)) / (2 * Math.pow(b, 2))); + } + return result; + } + + public static double[] gaussian(double[] d, double mu, double sigma, double Ag) { + double[] result = new double[d.length]; + for (int i = 0; i < d.length; i++) { + result[i] = Ag * Math.exp(-0.5 * Math.pow((d[i] - mu) / sigma, 2)) / (sigma * Math.sqrt(2 * Math.PI)); + } + return result; + } +``` + +In terms of solving this problem, the function to minimize is the sum of residuals using the model $\phi(x;t)$ +and the data pair (`diameter`, `density`). The parameter vector is $x = (a, b, A_l, \mu, \sigma, A_g)$. The next step is to define a function to return the residual vector +$\text{lsqfun}(x) := \big[r_1(x), r_2(x), \dots, r_{n_{\text{res}}}(x)\big]$. + +```java + // Define the least-square function as a mixture of Normal and log-Normal + // functions. Also add its first derivatives + + /** + * Objective function callback passed to the least squares solver. x = (a, b, + * Al, mu, sigma, Ag) + */ + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + public void eval() { + int[] d = this.IUSER; + double[] y = this.RUSER; + double a = this.X[0]; + double b = this.X[1]; + double Al = this.X[2]; + double mu = this.X[3]; + double sigma = this.X[4]; + double Ag = this.X[5]; + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = lognormal(d[i], a, b, Al) + gaussian(d[i], mu, sigma, Ag) - y[i]; + } + } + } + + /** + * Computes the Jacobian of the least square residuals. x = (a, b, Al, mu, + * sigma, Ag) + */ + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + public void eval() { + int n = this.X.length; + int[] d = this.IUSER; + double a = this.X[0]; + double b = this.X[1]; + double Al = this.X[2]; + double mu = this.X[3]; + double sigma = this.X[4]; + double Ag = this.X[5]; + for (int i = 0; i < this.NRES; i++) { + // log-Normal derivatives + double l = lognormal(d[i], a, b, Al); + // dl/da + this.RDX[i * n + 0] = (Math.log(d[i]) - a) / Math.pow(b, 2) * l; + // dl/db + this.RDX[i * n + 1] = (Math.pow(Math.log(d[i]) - a, 2) - Math.pow(b, 2)) / Math.pow(b, 3) * l; + // dl/dAl + this.RDX[i * n + 2] = lognormal(d[i], a, b, 1.0); + // Gaussian derivatives + double g = gaussian(d[i], mu, sigma, Ag); + // dg/dmu + this.RDX[i * n + 3] = (d[i] - mu) / Math.pow(sigma, 2) * g; + // dg/dsigma + this.RDX[i * n + 4] = (Math.pow(d[i] - mu, 2) - Math.pow(sigma, 2)) / Math.pow(sigma, 3) * g; + // dg/dAg + this.RDX[i * n + 5] = gaussian(d[i], mu, sigma, 1.0); + } + } + } +``` + +
    + +```java + // parameter vector: x = (a, b, Al, mu, sigma, Ag) + int nvar = 6; + + // Initialize the model handle + E04RA e04ra = new E04RA(); + long handle = 0; + int ifail = 0; + e04ra.eval(handle, nvar, ifail); + + handle = e04ra.getHANDLE(); + + // Define a dense nonlinear least-squares objective function + E04RM e04rm = new E04RM(); + ifail = 0; + e04rm.eval(handle, nres, 0, 0, new int[] {}, new int[] {}, ifail); + + // Add weights for each residual + double[] weights = new double[nres]; + Arrays.fill(weights, 1.0); + for (i = 55; i < 63; i++) { + weights[i] = 5.0; + } + double weights_sum = Arrays.stream(weights).sum(); + for (i = 0; i < weights.length; i++) { + weights[i] /= weights_sum; + } + + // Define the reliability of the measurements (weights) + E04RX e04rx = new E04RX(); + ifail = 0; + e04rx.eval(handle, "RW", 0, weights.length, weights, ifail); + + // Restrict parameter space (0 <= x) + E04RH e04rh = new E04RH(); + double[] bl = new double[nvar]; + double[] bu = new double[nvar]; + Arrays.fill(bu, 100.0); + ifail = 0; + e04rh.eval(handle, nvar, bl, bu, ifail); + + // Set some optional parameters to control the output of the solver + E04ZM e04zm = new E04ZM(); + ifail = 0; + + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Bxnl Iteration Limit = 100", ifail); + // Add cubic regularization term (avoid overfitting) + e04zm.eval(handle, "Bxnl Use weights = YES", ifail); + e04zm.eval(handle, "Bxnl Reg Order = 3", ifail); + e04zm.eval(handle, "Bxnl Glob Method = REG", ifail); + + // Define initial guess (starting point) + double[] x = new double[] { 1.63, 0.88, 1.0, 30, 1.52, 0.24 }; +``` + +Call the solver + +```java + // Call the solver + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + double[] rx = new double[nres]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + long cpuser = 0; + ifail = 0; + + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); +``` + +
    + +``` + E04GG, Nonlinear least squares method for bound-constrained problems + Status: converged, an optimal solution was found + Value of the objective 4.44211E-08 + Norm of projected gradient 1.18757E-09 + Norm of scaled projected gradient 3.98428E-06 + Norm of step 1.66812E-01 + + Primal variables: + idx Lower bound Value Upper bound + 1 0.00000E+00 2.02043E+00 1.00000E+02 + 2 0.00000E+00 1.39726E+00 1.00000E+02 + 3 0.00000E+00 6.93255E-01 1.00000E+02 + 4 0.00000E+00 3.65929E+01 1.00000E+02 + 5 0.00000E+00 7.01808E+00 1.00000E+02 + 6 0.00000E+00 3.36877E-01 1.00000E+02 +``` + +The optimal solution $x$ provides the unfolded parameters for the two distributions, Normal and log-Normal (blue and red curves in Figure 4). Adding these together produces the aggragated curve (shown in color green of Figure 3 and 4) this last one is the one used to perform the fitting with. The optimal solution is + +```java + // Optimal parameter values + // Al * log-Normal(a, b): + double aopt = x[0]; + double bopt = x[1]; + double Alopt = x[2]; + + // Ag * gaussian(mu, sigma): + double muopt = x[3]; + double sigmaopt = x[4]; + double Agopt = x[5]; +``` + +and the objective function value is + +``` +Objective Function Value: 4.4421102582032467E-8 +``` + +The next plot in Figure 3 illustrates the mixed-distribution fit over the histogram: + +
    + +
    + +**Figure 3**: Histogram with aggregated fit. + +The plot below in Figure 4 shows the unfolded fit, in red the log-Normal distribution and blue the Normal one: + +
    + +
    + +**Figure 4**: Aggregated model used for the fitting (green curve) and unfolded models (blue and red curves). +Optimal parameter values are ported in the legend. + +Finally, clean up and destroy the handle + +```java + // Destroy the handle: + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); +``` diff --git a/BXNL/simple_BXNL/data/density.d b/BXNL/simple_BXNL/data/density.d new file mode 100644 index 0000000..7da020e --- /dev/null +++ b/BXNL/simple_BXNL/data/density.d @@ -0,0 +1 @@ +0.0722713864 0.0575221239 0.0604719764 0.040560472 0.0317109145 0.0309734513 0.0258112094 0.0228613569 0.0213864307 0.0213864307 0.0147492625 0.0213864307 0.0243362832 0.0169616519 0.0095870206 0.0147492625 0.0140117994 0.0132743363 0.0147492625 0.0140117994 0.0140117994 0.0132743363 0.01179941 0.0132743363 0.0110619469 0.0103244838 0.01179941 0.01179941 0.0147492625 0.0110619469 0.0132743363 0.0206489676 0.0169616519 0.0169616519 0.0280235988 0.0221238938 0.0235988201 0.0221238938 0.0206489676 0.0228613569 0.0184365782 0.017699115 0.0132743363 0.0132743363 0.0088495575 0.0095870206 0.0073746313 0.0110619469 0.0036873156 0.0051622419 0.005899705 0.0014749263 0.0022123894 0.0029498525 0.0014749263 7.374631E-4 0.0014749263 0.0014749263 7.374631E-4 0.0 0.0 0.0 0.0 0.0 diff --git a/BXNL/simple_BXNL/data/dh.d b/BXNL/simple_BXNL/data/dh.d new file mode 100644 index 0000000..9149a0c --- /dev/null +++ b/BXNL/simple_BXNL/data/dh.d @@ -0,0 +1 @@ +0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.0 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 11.0 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 12.0 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 13.0 13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 14.0 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 15.0 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 16.0 16.1 16.2 16.3 16.4 16.5 16.6 16.7 16.8 16.9 17.0 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 18.0 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 18.9 19.0 19.1 19.2 19.3 19.4 19.5 19.6 19.7 19.8 19.9 20.0 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.9 22.0 22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 23.0 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 24.0 24.1 24.2 24.3 24.4 24.5 24.6 24.7 24.8 24.9 25.0 25.1 25.2 25.3 25.4 25.5 25.6 25.7 25.8 25.9 26.0 26.1 26.2 26.3 26.4 26.5 26.6 26.7 26.8 26.9 27.0 27.1 27.2 27.3 27.4 27.5 27.6 27.7 27.8 27.9 28.0 28.1 28.2 28.3 28.4 28.5 28.6 28.7 28.8 28.9 29.0 29.1 29.2 29.3 29.4 29.5 29.6 29.7 29.8 29.9 30.0 30.1 30.2 30.3 30.4 30.5 30.6 30.7 30.8 30.9 31.0 31.1 31.2 31.3 31.4 31.5 31.6 31.7 31.8 31.9 32.0 32.1 32.2 32.3 32.4 32.5 32.6 32.7 32.8 32.9 33.0 33.1 33.2 33.3 33.4 33.5 33.6 33.7 33.8 33.9 34.0 34.1 34.2 34.3 34.4 34.5 34.6 34.7 34.8 34.9 35.0 35.1 35.2 35.3 35.4 35.5 35.6 35.7 35.8 35.9 36.0 36.1 36.2 36.3 36.4 36.5 36.6 36.7 36.8 36.9 37.0 37.1 37.2 37.3 37.4 37.5 37.6 37.7 37.8 37.9 38.0 38.1 38.2 38.3 38.4 38.5 38.6 38.7 38.8 38.9 39.0 39.1 39.2 39.3 39.4 39.5 39.6 39.7 39.8 39.9 40.0 40.1 40.2 40.3 40.4 40.5 40.6 40.7 40.8 40.9 41.0 41.1 41.2 41.3 41.4 41.5 41.6 41.7 41.8 41.9 42.0 42.1 42.2 42.3 42.4 42.5 42.6 42.7 42.8 42.9 43.0 43.1 43.2 43.3 43.4 43.5 43.6 43.7 43.8 43.9 44.0 44.1 44.2 44.3 44.4 44.5 44.6 44.7 44.8 44.9 45.0 45.1 45.2 45.3 45.4 45.5 45.6 45.7 45.8 45.9 46.0 46.1 46.2 46.3 46.4 46.5 46.6 46.7 46.8 46.9 47.0 47.1 47.2 47.3 47.4 47.5 47.6 47.7 47.8 47.9 48.0 48.1 48.2 48.3 48.4 48.5 48.6 48.7 48.8 48.9 49.0 49.1 49.2 49.3 49.4 49.5 49.6 49.7 49.8 49.9 50.0 50.1 50.2 50.3 50.4 50.5 50.6 50.7 50.8 50.9 51.0 51.1 51.2 51.3 51.4 51.5 51.6 51.7 51.8 51.9 52.0 52.1 52.2 52.3 52.4 52.5 52.6 52.7 52.8 52.9 53.0 53.1 53.2 53.3 53.4 53.5 53.6 53.7 53.8 53.9 54.0 54.1 54.2 54.3 54.4 54.5 54.6 54.7 54.8 54.9 55.0 55.1 55.2 55.3 55.4 55.5 55.6 55.7 55.8 55.9 56.0 56.1 56.2 56.3 56.4 56.5 56.6 56.7 56.8 56.9 57.0 57.1 57.2 57.3 57.4 57.5 57.6 57.7 57.8 57.9 58.0 58.1 58.2 58.3 58.4 58.5 58.6 58.7 58.8 58.9 59.0 59.1 59.2 59.3 59.4 59.5 59.6 59.7 59.8 59.9 60.0 60.1 60.2 60.3 60.4 60.5 60.6 60.7 60.8 60.9 61.0 61.1 61.2 61.3 61.4 61.5 61.6 61.7 61.8 61.9 62.0 62.1 62.2 62.3 62.4 62.5 62.6 62.7 62.8 62.9 63.0 63.1 63.2 63.3 63.4 63.5 63.6 63.7 63.8 63.9 64.0 64.1 64.2 64.3 64.4 64.5 64.6 64.7 64.8 diff --git a/BXNL/simple_BXNL/data/diameter.d b/BXNL/simple_BXNL/data/diameter.d new file mode 100644 index 0000000..ce0d83f --- /dev/null +++ b/BXNL/simple_BXNL/data/diameter.d @@ -0,0 +1 @@ +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 diff --git a/BXNL/simple_BXNL/data/gopt.d b/BXNL/simple_BXNL/data/gopt.d new file mode 100644 index 0000000..0e24968 --- /dev/null +++ b/BXNL/simple_BXNL/data/gopt.d @@ -0,0 +1 @@ +2.5753655165541875E-8 2.773145459193807E-8 2.985508062666399E-8 3.213480516109361E-8 3.4581586868438315E-8 3.720711440847843E-8 4.002385215757E-8 4.3045088598395975E-8 4.628498751023043E-8 4.975864210702609E-8 5.348213227742936E-8 5.747258508786509E-8 6.174823871713718E-8 6.632850999855895E-8 7.123406575345317E-8 7.648689810798785E-8 8.21104039936885E-8 8.812946904065071E-8 9.45705560814465E-8 1.0146179849296142E-7 1.0883309861297935E-7 1.167162314781713E-7 1.251449541403224E-7 1.3415512082810047E-7 1.4378480423245077E-7 1.5407442320481146E-7 1.6506687716874575E-7 1.7680768755731788E-7 1.8934514660060177E-7 2.0273047380004015E-7 2.1701798043909465E-7 2.3226524249258428E-7 2.48533282310429E-7 2.6588675946513634E-7 2.8439417116626596E-7 3.041280626593597E-7 3.251652480413011E-7 3.4758704193890364E-7 3.7147950251258795E-7 3.96933686262358E-7 4.2404591512891804E-7 4.5291805639862016E-7 4.836578159370194E-7 5.163790452921627E-7 5.512020632252209E-7 5.8825399224283E-7 6.276691107223715E-7 6.695892212384454E-7 7.141640357159715E-7 7.615515780526349E-7 8.119186048706638E-7 8.654410450754377E-7 9.223044589157598E-7 9.827045172580034E-7 1.0468475018038981E-6 1.1149508269986923E-6 1.1872435843939264E-6 1.2639671102458615E-6 1.3453755771474092E-6 1.4317366105082272E-6 1.5233319307135053E-6 1.620458021808343E-6 1.7234268275698936E-6 1.8325664758445828E-6 1.94822203204244E-6 2.0707562826944596E-6 2.200550549992401E-6 2.3380055382431703E-6 2.483542213181756E-6 2.6376027150980243E-6 2.800651306742734E-6 2.973175356987449E-6 3.1556863612212845E-6 3.348720999474282E-6 3.5528422332633386E-6 3.7686404421608886E-6 3.9967346010897955E-6 4.2377734993496425E-6 4.492437002379329E-6 4.761437357259783E-6 5.045520542956912E-6 5.345467666299461E-6 5.662096404679869E-6 5.996262496455892E-6 6.34886128002044E-6 6.720829282492197E-6 7.113145858963868E-6 7.526834883226361E-6 7.962966490865058E-6 8.422658875601204E-6 8.907080139723416E-6 9.417450199425253E-6 9.95504274583095E-6 1.0521187262455488E-5 1.111727109980568E-5 1.1744741607785312E-5 1.2405108326521387E-5 1.3099945236177674E-5 1.3830893066267764E-5 1.4599661664922194E-5 1.540803242850114E-5 1.6257860791879284E-5 1.7151078779658055E-5 1.8089697618485683E-5 1.9075810410587354E-5 2.01115948685222E-5 2.119931611109745E-5 2.234132952027551E-5 2.3540083658812054E-5 2.479812324826171E-5 2.6118092206877763E-5 2.7502736746822304E-5 2.895490852998336E-5 3.0477567881572963E-5 3.2073787060553974E-5 3.374675358580579E-5 3.549977361680628E-5 3.73362753874588E-5 3.925981269154483E-5 4.127406841813281E-5 4.33828581351068E-5 4.559013371882075E-5 4.789998702771147E-5 5.031665361752569E-5 5.284451649564377E-5 5.548810991178874E-5 5.825212318222723E-5 6.114140454437063E-5 6.416096503848311E-5 6.731598241300712E-5 7.061180504979964E-5 7.405395590536803E-5 7.764813646397307E-5 8.140023069824902E-5 8.531630903276786E-5 8.94026323057448E-5 9.366565572385738E-5 9.811203280491299E-5 1.0274861930286774E-4 1.0758247710946226E-4 1.1262087812649981E-4 1.1787130810255331E-4 1.233414704276464E-4 1.2903928987921027E-4 1.349729163123799E-4 1.4115072828744371E-4 1.475813366270313E-4 1.542735878953724E-4 1.612365677917277E-4 1.6847960444985773E-4 1.7601227163515764E-4 1.8384439183086017E-4 1.9198603920448216E-4 2.0044754244546417E-4 2.0923948746474615E-4 2.1837271994679794E-4 2.2785834774443234E-4 2.3770774310652386E-4 2.479325447285641E-4 2.5854465961581714E-4 2.695562647486434E-4 2.809798085394283E-4 2.928280120703707E-4 3.0511387010126527E-4 3.1785065183628325E-4 3.3105190143862504E-4 3.4473143828183967E-4 3.5890335692650435E-4 3.735820268108777E-4 3.8878209164411044E-4 4.0451846849052484E-4 4.208063465334779E-4 4.376611855073064E-4 4.550987137858625E-4 4.7313492611619854E-4 4.917860809859957E-4 5.110686976134205E-4 5.309995525481868E-4 5.515956758727061E-4 5.728743469923885E-4 5.948530900042727E-4 6.175496686333996E-4 6.409820807265382E-4 6.651685522931049E-4 6.901275310834189E-4 7.158776796946805E-4 7.424378681954367E-4 7.698271662595977E-4 7.980648348014665E-4 8.271703171036632E-4 8.571632294302157E-4 8.880633511175937E-4 9.198906141369408E-4 9.526650921212412E-4 9.864069888517867E-4 0.0010211366261987916 0.0010568744315116924 0.00109364092445526 0.001131456703288309 0.00117034243058254 0.0012103188183796912 0.0012514066127859976 0.0012936265780037002 0.0013369994798001317 0.0013815460684158045 0.0014272870609136955 0.0014742431229728859 0.001522434850130569 0.001571882748477381 0.0016226072148119853 0.0016746285162617834 0.0017279667693776393 0.001782641918711528 0.0018386737148870082 0.0018960816921735433 0.0019548851455766627 0.0020151031074571385 0.0020767543236933556 0.002139857229402197 0.0022044299242348904 0.0022704901472653193 0.002338055251489508 0.002407142177956042 0.002477767429548347 0.0025499470444408875 0.0026236965692524265 0.0026990310319206594 0.002775964914323618 0.0028545121246743143 0.00293468596971628 0.0030164991267485905 0.0030999636155101718 0.003185090769954121 0.0032718912099438243 0.003360374812903693 0.0034505506854582177 0.0035424271350940773 0.003636011641880895 0.0037313108302870755 0.003828330441128111 0.003927075303685393 0.004027549308034451 0.004129755377622194 0.004233695442133348 0.00433937041068707 0.004446780145405038 0.004555923435393064 0.004666797971178603 0.004779400319646909 0.0048937258995190745 0.005009768957415254 0.005127522544546789 0.005246978494080952 0.0053681273992221374 0.005490958592053414 0.00561546012318212 0.005741618742233235 0.005869419879233913 0.005998847626932257 0.006129884724093222 0.006262512539813822 0.006396711058899532 0.00653245886834304 0.0066697331449457895 0.0068085096441221375 0.006948762689924891 0.007090465166330238 0.007233588509819008 0.007378102703289977 0.00752397627134004 0.007671176276944479 0.007819668319569494 0.007969416534747595 0.008120383595144944 0.008272530713148324 0.00842581764499752 0.00858020269648741 0.00873564273026215 0.008892093174721859 0.009049508034560632 0.009207839902952236 0.009367039975398181 0.009527058065250588 0.009687842620919871 0.009849340744775581 0.010011498213745702 0.010174259501618134 0.010337567803045114 0.010501365059249203 0.010665591985426971 0.010830188099843905 0.010995091754611724 0.011160240168136553 0.011325569459223899 0.011491014682823925 0.011656509867397614 0.011821988053882146 0.011987381336230991 0.012152620903501585 0.012317637083461116 0.012482359387677939 0.012646716558064033 0.012810636614831016 0.012974046905819745 0.013136874157161348 0.01329904452522455 0.013460483649802285 0.013621116708487813 0.013780868472188415 0.013939663361722499 0.014097425505443665 0.014254078797833167 0.014409546959000239 0.014563753595027531 0.01471662225909735 0.014868076513332123 0.015018039991281257 0.015166436460984487 0.015313189888540513 0.015458224502108242 0.015601464856266524 0.015742835896657106 0.015882263024834378 0.016019672163244552 0.01615498982025575 0.016288143155160167 0.016419060043068354 0.01654766913961543 0.016673899945398536 0.016797682870064508 0.016918949295966806 0.017037631641310433 0.017153663422703976 0.01726697931703799 0.017377515222609302 0.01748520831941153 0.017589997128512544 0.01769182157044052 0.01779062302250111 0.01788634437494924 0.017978930085940422 0.018068326235187546 0.01815448057625069 0.01823734258738908 0.018316863520905825 0.018392996450918186 0.01846569631948772 0.01853491998104694 0.018600626245061126 0.018662775916866308 0.018721331836626724 0.018776258916357556 0.0188275241749613 0.018875096771228856 0.01891894803475903 0.018959051494753163 0.018995382906644268 0.01902792027652333 0.019056643883328186 0.01908153629876373 0.01910258240492522 0.019119769409599818 0.019133086859224574 0.019142526649482565 0.019148083033522143 0.019149752627787568 0.01914753441545279 0.01914142974745354 0.019131442341116123 0.01911757827638506 0.019099845989654748 0.01907825626521404 0.019052822224315796 0.019023559311886987 0.018990485280898133 0.01895362017441425 0.018912986305352736 0.01886860823397675 0.018820512743155906 0.018768728811429197 0.01871328758390799 0.01865422234106005 0.018591568465418422 0.01852536340626164 0.018455646642314836 0.018382459642523528 0.0183058458249548 0.018225850513882785 0.018142520895117815 0.01805590596964099 0.01796605650560767 0.01787302498878592 0.017776865571497397 0.017677634020130294 0.01757538766129546 0.01747018532669834 0.017362087296800933 0.01725115524334913 0.017137452170842025 0.01702104235702088 0.016901991292456092 0.01678036561931161 0.016656233069366637 0.01652966240137499 0.016400723337843037 0.016269486501307075 0.01613602335019135 0.016000406114327813 0.015862707730218417 0.015723001776120845 0.015581362407037551 0.015437864289688043 0.0152925825375433 0.015145592646000478 0.014996970427775383 0.014846791948588737 0.014695133463221554 0.014542071352013443 0.014387682057876258 0.014232042023894383 0.014075227631580886 0.013917315139857524 0.013758380624824696 0.01359849992038545 0.013437748559786118 0.013276201718133636 0.013113934155947967 0.012951020163805711 0.012787533508128713 0.012623547378169472 0.01245913433424244 0.012294366257248293 0.0121293142995356 0.011964048837141916 0.011798639423453992 0.011633154744323849 0.011467662574675394 0.011302229736633373 0.01113692205920392 0.010971804339533481 0.01080694030577007 0.01064239258154841 0.010478222652117803 0.010314490832128912 0.01015125623509332 0.009988576744526733 0.00982650898678457 0.009665108305595926 0.009504428738299379 0.009344522993781954 0.009185442432119646 0.009027237045916004 0.008869955443332682 0.008713644832803602 0.00855835100942233 0.00840411834298975 0.008250989767707393 0.008099006773499418 0.007948209398944393 0.007798636225796186 0.007650324375071108 0.007503309504677039 0.00735762580855833 0.007213306017328608 0.007070381400362348 0.00692888176931407 0.006788835483033168 0.006650269453840687 0.00651320915513317 0.0063776786302777826 0.00624370050276141 0.006111295987555771 0.005980484903659589 0.005851285687777825 0.005723715409097619 0.0055977897851194084 0.005473523198501531 0.00535092871487587 0.005230018101591679 0.005110801847344553 0.00499328918264689 0.004877488101096323 0.004763405381398286 0.004651046610098815 0.004540416204983887 0.004431517439101359 0.004324352465362057 0.004218922341676588 0.004115227056584725 0.004013265555334764 0.003913035766370335 0.003814534628182921 0.0037177581164886705 0.003622701271688707 0.0035293582265728744 0.00343772223422728 0.003347785696107 0.003259540190235893 0.0031729764994962973 0.0030880846399723456 0.0030048538893113147 0.0029232728150685224 0.002843329303002136 0.0027650105852852153 0.002688303268603427 0.002613193362107697 0.0025396663051923105 0.002467706995069912 0.002397299814115915 0.0023284286569561163 0.0022610769572720883 0.002195227714300368 0.0021308635190023448 0.0020679665798829894 0.002006518748437703 0.001946501544207576 0.0018878961794246015 0.0018306835832294695 0.0017748444254456033 0.0017203591398943976 0.001667207947237472 0.0016153708773330503 0.0015648277910945549 0.0015155584018405582 0.0014675422961263633 0.0014207589540483948 0.0013751877690137062 0.001330808066967835 0.0012875991250752212 0.0012455401898473965 0.001204610494714991 0.0011647892770406077 0.0011260557945704226 0.001088389341323244 0.0010517692629166287 0.0010161749713303691 9.815859591085275E-4 9.479818130018932E-4 9.153422270534492E-4 8.8364701513018E-4 8.528761229051219E-4 8.230096392942821E-4 7.940278073535989E-4 7.659110346416938E-4 7.386399030547559E-4 7.121951781403358E-4 6.865578178973905E-4 6.617089810703302E-4 6.376300349452585E-4 6.143025626570207E-4 5.917083700159955E-4 5.698294918639697E-4 5.486481979687083E-4 5.281469984671421E-4 5.083086488673653E-4 4.891161546198436E-4 4.7055277526848434E-4 4.5260202819237777E-4 4.3524769194919097E-4 4.1847380923135254E-4 4.0226468944624526E-4 3.866049109317544E-4 3.7147932281857436E-4 3.568730465507253E-4 3.4277147707578146E-4 3.2916028371629357E-4 3.1602541073391275E-4 3.0335307759767814E-4 2.911297789678929E-4 2.7934228440696437E-4 2.679776378284877E-4 2.570231566957884E-4 2.4646643098101654E-4 2.362953218957744E-4 2.2649796040413863E-4 2.1706274552877553E-4 2.0797834246071513E-4 1.9923368048317658E-4 1.9081795071966255E-4 1.8272060371636923E-4 1.7493134686874875E-4 1.6744014170188247E-4 1.6023720101410763E-4 1.5331298589312605E-4 1.466582026136195E-4 1.4026379942515588E-4 1.3412096323895954E-4 1.2822111622188016E-4 1.2255591230566214E-4 1.1711723361938603E-4 1.1189718685270241E-4 1.0688809955725302E-4 1.0208251639342268E-4 9.747319532932627E-5 9.30531037986983E-5 8.881541482409911E-5 8.475350311162367E-5 8.086094112304975E-5 7.71314951311272E-5 7.35591212634751E-5 7.013796154031284E-5 6.686233991102656E-5 6.372675829433788E-5 6.072589262661582E-5 5.785458892265552E-5 5.51078593530177E-5 5.2480878341817836E-5 4.996897868863548E-5 4.756764771800849E-5 4.5272523459776565E-5 4.307939086333468E-5 4.098417804866777E-5 3.8982952596846985E-5 3.707191788248245E-5 3.52474094504514E-5 3.350589143904215E-5 3.184395305148869E-5 3.0258305077704897E-5 2.8745776467868724E-5 2.730331095935495E-5 2.592796375836314E-5 2.4616898277448467E-5 2.3367382930022562E-5 2.2176787982759476E-5 2.104258246671656E-5 1.996233114785315E-5 1.89336915575185E-5 1.795441108336412E-5 1.7022324121030163E-5 1.6135349286854713E-5 1.529148669175431E-5 1.4488815276335041E-5 1.3725490207203956E-5 1.29997403343674E-5 1.2309865709525832E-5 1.1654235164997854E-5 1.1031283952939388E-5 1.0439511444455905E-5 9.877478888145299E-6 9.343807227551943E-6 8.83717497695701E-6 8.356316154882292E-6 7.900018274638281E-6 7.467120391202548E-6 7.056511203679459E-6 6.6671272125513135E-6 6.297950930903164E-6 5.948009148770728E-6 diff --git a/BXNL/simple_BXNL/data/lopt.d b/BXNL/simple_BXNL/data/lopt.d new file mode 100644 index 0000000..332abdc --- /dev/null +++ b/BXNL/simple_BXNL/data/lopt.d @@ -0,0 +1 @@ +0.016516515144937752 0.033885492091396414 0.04602917127104057 0.05435419955305444 0.06005616078557925 0.06393430822834725 0.06651848925630348 0.06816733923972278 0.06912957111630977 0.06958159732857115 0.06965104726548706 0.06943184658116218 0.06899413696983142 0.06839095914759145 0.06766285335157797 0.06684108812657862 0.0659499659630828 0.06500849545627922 0.06403162104125337 0.0630311387742124 0.06201638608080362 0.06099476661730581 0.059972153398849454 0.05895320106393535 0.05794158963158017 0.05694021612750475 0.05595134620209385 0.054976734801687806 0.0540177227279026 0.05307531428339725 0.052150239988899984 0.051243007448302555 0.05035394275371086 0.04948322430173461 0.04863091049373654 0.04779696248557264 0.04698126291408371 0.04618363134167532 0.0454038370144281 0.044641609414082684 0.04389664699298494 0.0431686244083743 0.042457198514214874 0.041762013322007935 0.0410827041042886 0.04041890078394081 0.03977023072761044 0.039136321041218655 0.03851680044897836 0.03791130082368672 0.037319458424841315 0.03674091489185605 0.03617531803197521 0.03562232243610971 0.03508158995051457 0.034552790027801455 0.03403559997708108 0.03352970512993166 0.033034798936288974 0.03255058300216746 0.032076767079279984 0.03161306901507108 0.031159214670365688 0.03071493781072622 0.030279979976669882 0.029854090337101465 0.029437025529640157 0.029028549490943776 0.028628433279645447 0.028236454894101516 0.027852399086795796 0.027476057176943677 0.02710722686258271 0.026745712033217715 0.026391322583902057 0.026043874231477873 0.02570318833356315 0.025369091710758504 0.0250414164724488 0.02471999984649184 0.02440468401301616 0.024095315942490165 0.023791747238175027 0.023493833983031114 0.023201436591112335 0.022914419663453364 0.022632651848429473 0.022356005706548943 0.022084357579620777 0.021817587464227007 0.021555578889417986 0.021298218798540238 0.021045397435099807 0.020797008232558922 0.02055294770796009 0.020313115359269263 0.0200774135663283 0.01984574749530605 0.019618025006537823 0.019394156565643177 0.019174055157813567 0.018957636205162526 0.018744817487033143 0.0185355190631596 0.018329663199581857 0.018127174297215123 0.017927978822978224 0.01773200524338776 0.017539183960527702 0.017349447250306595 0.017162729202917736 0.01697896566542015 0.01679809418636094 0.016620053962362626 0.01644478578660128 0.016272231999104436 0.016102336438799873 0.01593504439724918 0.01577030257400237 0.015608059033512095 0.015448263163548585 0.015290865635058448 0.015135818363412674 0.014983074470991523 0.014832588251055594 0.01468431513285483 0.014538211647928675 0.014394235397552703 0.014252345021288674 0.014112500166596691 0.013974661459469814 0.013838790476052966 0.01370484971520954 0.013572802572000546 0.013442613312042488 0.013314247046711634 0.013187669709163397 0.013062848031137003 0.012939749520516705 0.01281834243962186 0.012698595784199443 0.012580479263093528 0.012463963278567181 0.012349018907253354 0.012235617881712143 0.01212373257257274 0.012013335971239183 0.011904401673139912 0.011796903861501831 0.011690817291630387 0.011586117275677845 0.011482779667882657 0.011380780850263497 0.01128009771875209 0.011180707669749674 0.011082588587092409 0.01098571882941171 0.010890077217875924 0.010795643024300331 0.010702395959612952 0.01061031616266404 0.010519384189367743 0.010429581002164637 0.01034088795979449 0.010253286807368773 0.01016675966673306 0.010081289027109624 0.009996857736010984 0.009913448990415545 0.00983104632819665 0.00974963361979687 0.00966919506013945 0.009589715160769298 0.009511178742216103 0.009433570926572378 0.00935687713027962 0.00928108305711588 0.009206174691378372 0.009132138291254943 0.009058960382378417 0.008986627751558113 0.008915127440682919 0.008844446740790622 0.008774573186298333 0.008705494549388947 0.008637198834548922 0.008569674273252644 0.008502909318788929 0.008436892641225336 0.008371613122506052 0.008307059851679363 0.008243222120250778 0.008180089417658002 0.008117651426864164 0.008055898020065726 0.007994819254511681 0.007934405368430774 0.00787464677706346 0.007815534068795689 0.007757058001391339 0.007699209498320584 0.00764197964518131 0.007585359686210906 0.007529341020885859 0.007473915200606553 0.007419073925464921 0.007364809041092498 0.007311112535586647 0.007257976536512724 0.0072053933079800105 0.007153355247789401 0.007101854884650756 0.007050884875468021 0.007000438002690235 0.006950507171726536 0.006901085408423487 0.0068521658566029235 0.00680374177565868 0.006755806538210638 0.00670835362781445 0.006661376636725494 0.006614869263715545 0.006568825311940773 0.006523238686859659 0.006478103394199519 0.00643341353797031 0.006389163318524493 0.006345347030661674 0.006301959061776923 0.006258993890051541 0.006216446082685201 0.006174310294168379 0.006132581264594002 0.006091253818007324 0.006050322860793015 0.006009783380098516 0.005969630442292715 0.005929859191459044 0.005890464847922127 0.005851442706807108 0.005812788136630825 0.005774496577924054 0.0057365635418840065 0.005698984609056323 0.005661755428045855 0.005624871714255466 0.005588329248652202 0.00555212387656011 0.00551625150647909 0.005480708108929085 0.005445489715319027 0.005410592416839934 0.005376012363381511 0.005341745762471777 0.005307788878239055 0.005274138030395878 0.005240789593244206 0.005207739994701484 0.005174985715347048 0.00514252328748834 0.0051103492942465335 0.00507846036866104 0.005046853192812496 0.005015524496963772 0.004984471058718581 0.004953689702197287 0.004923177297229492 0.004892930758563013 0.004862947045088895 0.00483322315908204 0.004803756145457148 0.004774543091039549 0.004745581123850657 0.004716867412407661 0.00468839916503713 0.0046601736292022486 0.0046321880908433465 0.004604439873731403 0.004576926338834309 0.004549644883695479 0.004522592941824669 0.004495767982100623 0.004469167508185333 0.0044427890579496485 0.004416630202909982 0.004390688547675851 0.0043649617294080414 0.004339447417287141 0.004314143311992225 0.004289047145189457 0.004264156679030417 0.004239469705659914 0.004214984046733089 0.004190697552941636 0.004166608103548871 0.004142713605933558 0.0041190119951422105 0.004095501233449754 0.004072179309928335 0.004049044240024113 0.00402609406514188 0.0040033268522373065 0.003980740693416701 0.003958333705544083 0.003936104029855439 0.003914049831580005 0.00389216929956843 0.0038704606459276673 0.0038489221056624864 0.0038275519363234057 0.0038063484176610045 0.0037853098512863797 0.0037644345603377117 0.003743720889152753 0.0037231672029471473 0.0037027718874984646 0.003682533348835807 0.003662450012934904 0.0036425203254185677 0.0036227427512624116 0.0036031157745057122 0.0035836378979673274 0.0035643076429665577 0.003545123549048859 0.003526084173716304 0.0035071880921627076 0.0034884338970133143 0.003469820198068963 0.003451345622054631 0.0034330088123723 0.0034148084288580156 0.0033967431475431025 0.003378811660419416 0.0033610126752085757 0.003343344915135106 0.0033258071187033914 0.003308398039478379 0.0032911164458699605 0.0032739611209209613 0.003256930862098669 0.003240024481089833 0.0032232408035990524 0.0032065786691505274 0.0031900369308930617 0.003173614455408303 0.003157310122522117 0.003141122825119058 0.0031250514689598863 0.0031090949725020548 0.0030932522667231213 0.0030775222949470248 0.0030619040126731874 0.00304639638740837 0.0030309983985012424 0.0030157090369796156 0.0030005273053902853 0.0029854522176414487 0.0029704827988476226 0.002955618085177044 0.0029408571237015046 0.002926198972248548 0.0029116426992560223 0.002897187383628925 0.0028828321145984944 0.002868575991583535 0.0028544181240538983 0.0028403576313961038 0.0028263936427810736 0.002812525297033898 0.002798751742505652 0.002785072136947181 0.002771485647384849 0.002757991449998198 0.0027445887299994884 0.002731276681515108 0.0027180545074687724 0.002704921419466526 0.0026918766376835047 0.0026789193907524054 0.002666048915653661 0.002653264457607278 0.0026405652699663085 0.0026279506141119323 0.002615419759350109 0.002602971982809802 0.002590606569342705 0.0025783228114244863 0.002566120009057498 0.0025539974696749362 0.002541954508046423 0.0025299904461849945 0.002518104613255459 0.0025062963454841112 0.0024945649860697674 0.002482909885096129 0.002471330399445408 0.002459825892713231 0.0024483957351247843 0.0024370393034521673 0.0024257559809329776 0.0024145451571900424 0.0024034062281523363 0.0023923385959770363 0.0023813416689726897 0.0023704148615235074 0.0023595575940147245 0.002348769292759045 0.0023380493899241316 0.002327397323461124 0.0023168125370341907 0.0023062944799510706 0.0022958426070945996 0.002285456378855209 0.002275135261064376 0.0022648787249290167 0.00225468624696679 0.0022445573089423265 0.002234491397804333 0.002224488005623584 0.002214546629531785 0.0022046667716612766 0.0021948479390855764 0.0021850896437607533 0.002175391402467601 0.00216575273675463 0.002156173172881817 0.002146652241765154 0.002137189478921943 0.0021277844244168417 0.0021184366228086575 0.0021091456230978526 0.002099910978674771 0.0020907322472685764 0.002081608990896862 0.0020725407758159678 0.002063527172471946 0.002054567755452209 0.0020456621034378054 0.0020368097991563566 0.0020280104293356124 0.0020192635846576325 0.002010568859713578 0.002001925852959109 0.0019933341666703657 0.0019847934069005487 0.0019763031834370607 0.0019678631097592198 0.0019594728029965376 0.001951131883887533 0.0019428399767391035 0.0019345967093864107 0.0019264017131533121 0.0019182546228132965 0.0019101550765509257 0.001902102715923797 0.0018940971858249763 0.0018861381344459389 0.001878225213239978 0.0018703580768860853 0.0018625363832533114 0.001854759793365569 0.0018470279713668951 0.0018393405844871625 0.0018316973030082207 0.001824097800230482 0.001816541752439922 0.0018090288388755093 0.001801558741697042 0.0017941311459533974 0.0017867457395511833 0.0017794022132237792 0.001772100260500781 0.0017648395776778143 0.0017576198637867398 0.001750440820566231 0.0017433021524327077 0.0017362035664516562 0.0017291447723092824 0.0017221254822845351 0.001715145411221473 0.0017082042765019687 0.0017013017980187601 0.001694437698148827 0.0016876117017271032 0.0016808235360205068 0.0016740729307022943 0.0016673596178267273 0.0016606833318040487 0.00165404380937577 0.0016474407895902539 0.0016408740137785999 0.0016343432255308194 0.0016278481706723073 0.0016213885972405867 0.001614964255462347 0.0016085748977307558 0.0016022202785830398 0.0015959001546783438 0.0015896142847758486 0.0015833624297131568 0.0015771443523849339 0.0015709598177218096 0.0015648085926695241 0.0015586904461683275 0.0015526051491326267 0.0015465524744308686 0.0015405321968656649 0.0015345440931541518 0.0015285879419085796 0.0015226635236171373 0.0015167706206249967 0.0015109090171155815 0.0015050784990920593 0.0014992788543590424 0.0014935098725045147 0.0014877713448819582 0.0014820630645926956 0.001476384826468435 0.001470736427054015 0.0014651176645903584 0.001459528338997614 0.0014539682518584988 0.0014484372064018313 0.0014429350074862534 0.0014374614615841397 0.0014320163767656952 0.0014265995626832298 0.0014212108305556163 0.0014158499931529276 0.0014105168647812415 0.001405211261267631 0.0013999329999453127 0.0013946818996389714 0.00138945778065025 0.0013842604647434015 0.0013790897751311058 0.0013739455364604437 0.0013688275747990306 0.0013637357176213062 0.0013586697937949764 0.0013536296335676134 0.0013486150685533922 0.001343625931719992 0.0013386620573756314 0.0013337232811562532 0.0013288094400128523 0.001323920372198939 0.0013190559172581483 0.0013142159160119838 0.00130940021054769 0.0013046086442062741 0.0012998410615706409 0.0012950973084538753 0.001290377231887638 0.0012856806801107034 0.0012810075025576097 0.0012763575498474442 0.0012717306737727416 0.0012671267272885073 0.0012625455645013633 0.0012579870406588078 0.0012534510121385894 0.0012489373364382025 0.0012444458721644904 0.0012399764790233653 0.0012355290178096361 0.0012311033503969446 0.0012266993397278163 0.0012223168498038078 0.0012179557456757678 0.0012136158934342022 0.0012092971601997337 0.0012049994141136728 0.0012007225243286857 0.0011964663609995603 0.0011922307952740682 0.0011880156992839295 0.001183820946135869 0.0011796464099027672 0.0011754919656149067 0.0011713574892513055 0.0011672428577311515 0.0011631479489053148 0.0011590726415479564 0.001155016815348226 0.0011509803509020418 0.001146963129703958 0.0011429650341391164 0.0011389859474752843 0.001135025753854972 0.0011310843382876367 0.0011271615866419579 0.0011232573856382062 0.0011193716228406756 0.0011155041866502085 0.0011116549662967877 0.0011078238518322087 0.0011040107341228254 0.001100215504842374 0.001096438056464862 0.0010926782822575432 0.0010889360762739492 0.001085211333347007 0.0010815039490822114 0.0010778138198508792 0.001074140842783467 0.0010704849157629577 0.0010668459374183082 0.0010632238071179747 0.0010596184249634932 0.001056029691783129 0.0010524575091255927 0.0010489017792538102 0.0010453624051387676 0.0010418392904534045 0.0010383323395665859 0.0010348414575371116 0.0010313665501078052 0.0010279075236996533 0.001024464285406001 0.0010210367429868133 0.0010176248048629829 0.0010142283801107027 0.0010108473784558908 0.0010074817102686717 0.0010041312865579097 0.0010007960189657946 9.974758197624923E-4 9.94170601840828E-4 9.90880278711045E-4 9.876047644955905E-4 9.843439739239753E-4 9.81097822327664E-4 9.778662256350326E-4 9.746491003663578E-4 9.714463636288728E-4 9.682579331118562E-4 9.650837270817761E-4 9.619236643774814E-4 9.587776644054366E-4 9.556456471350042E-4 9.525275330937729E-4 9.494232433629306E-4 9.463326995726818E-4 9.432558238977084E-4 9.401925390526734E-4 9.371427682877728E-4 9.341064353843241E-4 diff --git a/BXNL/simple_BXNL/data/w.d b/BXNL/simple_BXNL/data/w.d new file mode 100644 index 0000000..c262f99 --- /dev/null +++ b/BXNL/simple_BXNL/data/w.d @@ -0,0 +1 @@ +0.01651654089859292 0.033885519822851005 0.0460292011261212 0.054354231687859605 0.060056195367166124 0.06393434543546166 0.06651852928015564 0.06816738228481138 0.06912961740129728 0.06958164708721326 0.06965110074761934 0.06943190405374727 0.06899419871807014 0.06839102547610146 0.06766292458564373 0.06684116461347672 0.06595004807348678 0.06500858358574826 0.06403171561180945 0.0630312402360109 0.06201649491390223 0.06099488333353729 0.059972278543803596 0.05895333521905617 0.0579417334163844 0.05694037020192796 0.055951511268971015 0.054976911609375366 0.05401791207304921 0.053075517013871046 0.052150457006880424 0.051243239713545045 0.05035419128699317 0.04948349018849407 0.0486311948879077 0.0477972666136353 0.04698158807933175 0.04618397892871726 0.04540420849393061 0.044642006347768944 0.04389707103890007 0.0431690773264307 0.04245768217203081 0.04176252970105323 0.04108325530635183 0.04041948903793305 0.03977085839672116 0.03913699063043989 0.03851751461301407 0.037912062375264774 0.037320270343446184 0.036741780332901125 0.03617624033643413 0.03562330514062697 0.035082636798016376 0.03455390497862845 0.03403678722066548 0.03353096909704191 0.03303614431186612 0.032552014738777967 0.0320782904112107 0.031614689473092886 0.031160938097193256 0.030716770377202066 0.030281928198701926 0.02985616109338416 0.02943922608019015 0.02903088749648202 0.02863091682185863 0.028239092496816613 0.027855199738102538 0.027479030352300662 0.02711038254894393 0.02674906075421719 0.02639487542613532 0.026047642871920035 0.025707185068164242 0.025373329484257853 0.02504590890945118 0.024724761283849102 0.02440972953355912 0.024100661410156463 0.023797409334579706 0.02349983024552757 0.023207785452392354 0.022921140492735855 0.022639764994288436 0.02236353254143217 0.022092320546111644 0.021826010123102608 0.02156448596955771 0.021307636248739662 0.021055352477845637 0.020807529419821377 0.020564064979059896 0.02032486010087705 0.02008981867465482 0.019858847440542227 0.01963185589960409 0.0194087562273081 0.01918946319024207 0.018973894065954407 0.0187619685658128 0.018553608760778086 0.018348739009992444 0.018147285892083646 0.017949178139089323 0.017754346572908034 0.017562724044186514 0.017374245373554857 0.017188847295124612 0.017006468402166974 0.016827049094890925 0.0166505315302442 0.016476859573661833 0.016305978752690242 0.01613783621241668 0.01597238067263664 0.015809562386693916 0.015649333101930226 0.01549164602168369 0.015336455768777268 0.015183718350440386 0.015033391124609049 0.014885432767551237 0.014739803242766619 0.014596463771110901 0.014455376802097073 0.014316505986327157 0.014179816149009698 0.014045273264519613 0.013912844431958334 0.013782497851673514 0.013654202802698795 0.013527929621075256 0.013403649679017379 0.013281335364887254 0.013160960063941915 0.013042498139819572 0.012925924916731321 0.012811216662325943 0.01269835057119608 0.012587304748994829 0.012478058197132564 0.012370590798024524 0.012264883300860183 0.012160917307866214 0.012058675261035285 0.011958140429293558 0.011859296896080245 0.011762129547313004 0.011666624059713518 0.011572766889467978 0.011480545261197555 0.01138994715721442 0.011300961307039207 0.011213577177156143 0.011127784960982448 0.011043575569028895 0.010960940619228768 0.010879872427412684 0.010800363997907172 0.010722409014235008 0.010646001829895755 0.010571137459205055 0.010497811568171686 0.010426020465391463 0.010355761092937489 0.010287031017226422 0.01021982841984076 0.010154152088287396 0.010090001406672927 0.010027376346276604 0.009966277456001966 0.009906705852688578 0.009848663211265615 0.0097921517547293 0.009737174243926559 0.009683733967127649 0.009631834729370806 0.009581480841562386 0.009532677109316318 0.00948542882151716 0.009439741738591438 0.009395622080472366 0.009353076514243603 0.00931211214144808 0.009272736485048526 0.009234957476026803 0.009198783439609715 0.009164223081109578 0.00913128547136837 0.009099980031794942 0.009070316518985405 0.009042305008917513 0.009015955880710472 0.008991279799942466 0.00896828770151872 0.008946990772083998 0.008927400431973879 0.008909528316700275 0.008893386257967309 0.008878986264214605 0.008866340500685991 0.008855461269022358 0.008846360986378617 0.008839052164065385 0.008833547385717216 0.008829859284990105 0.008828000522791996 0.008827983764051184 0.008829821654028396 0.00883352679417955 0.008839111717577243 0.008846588863900079 0.008855970554000149 0.008867268964060062 0.008880496099352035 0.008895663767612836 0.00891278355204934 0.008931866783990813 0.008952924515205053 0.008975967489896815 0.009001006116408007 0.009028050438640406 0.009057110107222736 0.009088194350445153 0.009121311944985291 0.009156471186451237 0.009193679859767821 0.009232945209433793 0.00927427390967855 0.009317672034548124 0.009363145027951148 0.009410697673696709 0.009460334065556734 0.009512057577386792 0.00956587083333994 0.009621775678209203 0.009679773147935219 0.009739863440316219 0.009802045885958505 0.0098663189195062 0.009932680051189672 0.010001125838732925 0.010071651859660503 0.010144252684045266 0.010218921847738713 0.010295651826126 0.01037443400844816 0.01045525867273428 0.010538114961386723 0.010622990857462463 0.010709873161693913 0.010798747470292469 0.010889598153577998 0.010982408335477442 0.011077159873935396 0.011173833342279305 0.011272408011581563 0.011372861834060355 0.011475171427560573 0.011579312061155537 0.011685257641909561 0.011792980702840718 0.01190245239212218 0.01201364246355973 0.01212651926838202 0.012241049748378871 0.01235719943042208 0.012474932422401627 0.012594211410609044 0.012714997658598251 0.012837251007552605 0.012960929878185454 0.013085991274199769 0.013212390787330757 0.013340082603993553 0.013469019513556169 0.01359915291825611 0.013730432844776905 0.013862807957498804 0.013996225573435921 0.01413063167886952 0.014265970947685563 0.014402186761421553 0.014539221231026175 0.014677015220332254 0.014815508371241428 0.014954639130616428 0.015094344778874322 0.015234561460271637 0.015375224214869643 0.015516267012165536 0.015657622786372796 0.015799223473331174 0.015941000049024358 0.016082882569680747 0.01622480021342992 0.01636668132348523 0.01650845345281982 0.016650043410301338 0.016791377308247715 0.016932380611363828 0.017072978187016787 0.017213094356804556 0.017352652949370717 0.01749157735441548 0.017629790577850902 0.017767215298045903 0.01790377392310467 0.018039388649119546 0.01817398151933795 0.018307474484180283 0.018439789462044498 0.01857084840083059 0.018700573340117065 0.01882888647391939 0.01895571021395908 0.019080967253370655 0.019204580630772235 0.019326473794624432 0.019446570667800936 0.01956479571229341 0.019681073993972054 0.019795331247322877 0.019907493940081667 0.020017489337684394 0.020125245567453168 0.020230691682436807 0.020333757724824823 0.020434374788853536 0.02053247508312339 0.020627991992246568 0.020720860137744407 0.02081101543811492 0.020898395167990923 0.02098293801631048 0.02106458414342207 0.02114327523704791 0.021218954567030254 0.021291567038786596 0.02136105924540122 0.02142737951828214 0.021490477976314128 0.021550306573440304 0.021606819144606777 0.021659971450006824 0.02170972121756318 0.02175602818358943 0.021798854131573748 0.021838162929030742 0.02187392056236967 0.0219060951697301 0.021934657071738646 0.02195957880014345 0.021980835124285718 0.021998403075370952 0.02201226196850523 0.022022393422465234 0.02202878137717377 0.02203141210885584 0.0220302742428535 0.02202535876408106 0.02201665902510568 0.022004170751841468 0.021987892046848895 0.021967823390234616 0.02194396763815002 0.021916330018890713 0.02188491812660193 0.021849741912598888 0.021810813674313992 0.021768148041886475 0.021721761962413242 0.021671674681883024 0.021617907724819262 0.021560484871660256 0.02149943213390831 0.021434777727082858 0.021366552041515267 0.021294787611026357 0.021219519079530354 0.021140783165611746 0.021058618625124637 0.02097306621186623 0.020884168636379288 0.020791970522940285 0.020696518364792752 0.020597860477687413 0.020496046951792666 0.02039112960204138 0.02028316191698151 0.020172199006200063 0.02005829754639159 0.01994151572614375 0.019821913189514165 0.019699550978473913 0.019574491474294194 0.01944679833795386 0.019316536449646135 0.01918377184746395 0.019048571665343673 0.018911004070347678 0.018771138199366544 0.0186290440953218 0.018484792642950394 0.018338455504251946 0.01819010505367954 0.018039814313155034 0.017887656886988623 0.017733706896782643 0.01757803891639851 0.017420727907064854 0.0172618491527044 0.017101478195555526 0.016939690772163882 0.016776562749817776 0.016612170063499843 0.01644658865342617 0.01627989440324216 0.0161121630789431 0.01594347026858545 0.01577389132285305 0.015603501296540747 0.015432374891015453 0.01526058639771312 0.015088209642727654 0.014915317932545556 0.01474198400097813 0.014568279957340292 0.014394277235923065 0.014220046546804177 0.014045657828038778 0.01387118019926996 0.013696681916795794 0.013522230330127602 0.013347891840071178 0.013173731858360276 0.012999814768869094 0.012826203890427702 0.01265296144126199 0.012480148505076913 0.012307824998799278 0.012136049641993869 0.011964879927963794 0.01179437209654379 0.011624581108592463 0.011455560622186911 0.011287362970521056 0.011120039141506057 0.010953638759069316 0.010788210066145979 0.010623799909354527 0.010460453725346127 0.010298215528814726 0.010137127902153332 0.009977231986739396 0.009818567475830478 0.009661172609049497 0.009505084168436677 0.009350337476043934 0.009196966393045493 0.00904500332033683 0.00889447920059283 0.008745423521753993 0.008597864321908677 0.008451828195537728 0.008307340301086567 0.008164424369828966 0.008023102715985189 0.007883396248056552 0.007745324481337404 0.007608905551564564 0.0074741562296638505 0.007341091937552116 0.007209726764953187 0.0070800734871851526 0.006952143583876214 0.006825947258566026 0.006701493459148859 0.006578789899115083 0.006457843079547113 0.006338658311825918 0.006221239741004393 0.006105590369803653 0.005991712083188785 0.005879605673480637 0.005769270865960494 0.005660706344925017 0.005553909780148934 0.005448877853713741 0.005345606287160978 0.0052440898689292935 0.005144322482035221 0.0050462971319580364 0.00495000597469004 0.004855440344914237 0.004762590784272146 0.004671447069685503 0.004581998241696248 0.004494232632790332 0.00440813789567166 0.004323701031453543 0.004240908417736054 0.004159745836538565 0.004080198502057975 0.0040022510882240635 0.003925887756024495 0.003851092180573254 0.003777847577897085 0.0037061367314159496 0.003635942018094404 0.003567245434242032 0.0035000286209422174 0.003434272889089534 0.0033699592440172973 0.0033070684096979048 0.0032455808524996183 0.003185476804484756 0.0031267362862350857 0.003069339129191549 0.003013264997496386 0.0029584934093268116 0.002905003757710503 0.0028527753308140898 0.002801787331696936 0.0027520188975234516 0.0027034491182281488 0.0026560570546286383 0.002609821755982622 0.0025647222769859205 0.0025207376942093943 0.002477847121973494 0.0024360297276600305 0.002395264746461475 0.0023555314955689714 0.0023168093878009237 0.002279077944674755 0.0022423168089251563 0.0022065057564727352 0.002171624707847674 0.0021376537390735907 0.0021045730920173254 0.002072363184211009 0.0020410046181531883 0.0020104781900963293 0.0019807648983284788 0.0019518459509572424 0.0019237027732047108 0.0018963170142222696 0.0018696705534346106 0.0018437455064225835 0.0018185242303547801 0.0017939893289780687 0.0017701236571774533 0.0017469103251159285 0.0017243327019651194 0.0017023744192376984 0.001681019373732716 0.001660251730105053 0.0016400559230703438 0.0016204166592567767 0.0016013189187152157 0.0015827479560991467 0.0015646893015259296 0.0015471287611308574 0.0015300524173254945 0.0015134466287717008 0.001497298030082732 0.0014815935312626899 0.001466320316895522 0.0014514658450946894 0.0014370178462244601 0.0014229643214036989 0.0014092935408028437 0.0013959940417446446 0.0013830546266190456 0.0013704643606224298 0.0013582125693312758 0.0013462888361200542 0.001334682999433034 0.0013233851499194224 0.0013123856274410825 0.0013016750179618455 0.0012912441503271977 0.0012810840929429175 0.0012711861503609965 0.0012615418597809464 0.001252142987474358 0.0012429815251403392 0.0012340496861992108 0.0012253399020316288 0.001216844818170002 0.0012085572904489068 0.0012004703811208867 0.0011925773549438324 0.0011848716752458752 0.001177346999973501 0.0011699971777283371 0.0011628162437978561 0.0011557984161849758 0.001148938091641345 0.0011422298417088272 0.0011356684087735348 0.0011292487021364848 0.0011229657941047755 0.0011168149161069436 0.0011107914548359832 0.00110489094842327 0.0010991090826464637 0.0010934416871742605 0.0010878847318506572 0.0010824343230212501 0.001077086699903856 0.0010718382310056281 0.0010666854105886004 0.00106162485518551 0.001056653300167522 0.0010517675963653559 0.0010469647067451763 0.0010422417031404313 0.0010375957630407253 0.0010330241664386502 0.0010285242927353883 0.0010240936177057629 0.0010197297105233132 0.0010154302308458564 0.0010111929259618581 0.0010070156279978998 0.0010028962511873449 9.988327892003102E-4 9.948233125348681E-4 9.908659659694E-4 9.869589660758836E-4 9.831005987938706E-4 9.792892170647955E-4 9.75523238526232E-4 9.718011432656267E-4 9.681214716329885E-4 9.644828221119612E-4 9.608838492486552E-4 9.573232616375689E-4 9.537998199638844E-4 9.503123351013879E-4 9.468596662652247E-4 9.43440719218676E-4 9.400544445330948E-4 diff --git a/BXNL/simple_BXNL/data/x.d b/BXNL/simple_BXNL/data/x.d new file mode 100644 index 0000000..176b53c --- /dev/null +++ b/BXNL/simple_BXNL/data/x.d @@ -0,0 +1 @@ +2.0204270547382075 1.3972604937797 0.693255185390483 36.59294402449946 7.018075183201494 0.3368769824829059 diff --git a/BXNL/simple_BXNL/generate_img.py b/BXNL/simple_BXNL/generate_img.py new file mode 100644 index 0000000..ac943f4 --- /dev/null +++ b/BXNL/simple_BXNL/generate_img.py @@ -0,0 +1,75 @@ +import numpy as np +import matplotlib.pyplot as plt +from pathlib import Path + +# Set the print precision +np.set_printoptions(precision=4, suppress=True) + +# Set the data folder path +data_folder = Path("data") + +def read_matrix_file(fname): + with open(data_folder / fname) as fdata: + a = np.array([line.split() for line in fdata], dtype = np.float64) + return a + +# Figure 2 +diameter = read_matrix_file("diameter.d")[0] +density = read_matrix_file("density.d")[0] + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('PADC etch track diameter histogram', fontsize=16) +ax.set_xlabel('Diameter (nm)') +ax.set_ylabel('Density') +ax.set_xlim(xmin=1, xmax=65) +ax.bar(diameter, density, color='lightsteelblue') +ax.grid() +plt.savefig("./img/fig2.png") +plt.clf() + +# Figure 3 + +dh = read_matrix_file("dh.d")[0] +lopt = read_matrix_file("lopt.d")[0] +gopt = read_matrix_file("gopt.d")[0] +w = read_matrix_file("w.d")[0] + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('PADC etch track diameter histogram and fit', fontsize=16) +ax.set_xlabel('Diameter (nm)') +ax.set_ylabel('Density') +ax.set_xlim(xmin=1, xmax=65) +ax.bar(diameter, density, color='lightsteelblue') +ax.plot(dh, w, '-', linewidth=3, color='tab:green') +ax.grid() +ax.legend(['Aggregated', 'Measured track diameter density']) +plt.savefig("./img/fig3.png") +plt.clf() + +# Figure 4 +x = read_matrix_file("x.d")[0] +aopt = x[0] +bopt = x[1] +Alopt = x[2] +muopt = x[3] +sigmaopt = x[4] +Agopt = x[5] + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.set_title('PADC etch track diameter histogram unfolding', fontsize=16) +ax.set_xlabel('Diameter (nm)') +ax.set_ylabel('Density') +ax.set_xlim(xmin=1, xmax=65) +ax.bar(diameter, density, color='lightsteelblue') +ax.plot(dh, lopt, '-', linewidth=4, color='tab:red') +ax.plot(dh, gopt, '-', linewidth=4, color='tab:blue') +ax.plot(dh, w, '-', linewidth=3, color='tab:green') +ax.grid() +glab = 'Unfolded Normal($\\mu=%1.2f$, $\\sigma=%1.2f, A=%1.2f$)' % (muopt, sigmaopt, Agopt) +llab = 'Unfolded log-Normal($a=%1.2f$, $b=%1.2f, A=%1.2f$)' % (aopt, bopt, Alopt) +ax.legend([llab, glab, 'Aggregated', 'Measured track diameter density']) +plt.savefig("./img/fig4.png") +plt.clf() diff --git a/BXNL/simple_BXNL/img/fig2.png b/BXNL/simple_BXNL/img/fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..93e189962f60d59dec03fc372240ccc5d8e246eb GIT binary patch literal 22406 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 literal 0 HcmV?d00001 diff --git a/BXNL/simple_BXNL/img/fig3.png b/BXNL/simple_BXNL/img/fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..9947dcc09d9b88e544313ebee95b2e71efe29009 GIT binary patch literal 40289 zcmdSBcQ}{-|2KRRWmHHKDY6P>H_47j6e=V$(xfO`h$5LKl#x_OWfYMuG7BwalPI#v z9^H>u_5J;>-*sH~abN%5pYQQGzMtN`$9cZS^Z8h>Ghn}t#xf>uCW@k#Y3@~Cj6^?Q3CtPjVk@ueE75uitvx!^YQW8sCSU=z%{J~R@dPI z0aiZ2^`WNQnx_{!Yl_qFXl>2Y9O}5x>$9t`wpQl&@olAwh z{QUg)y36T8@j~)-3)($uYH9|rC20ilx~NqYwStX}Eka703Lqa?E$oHAR=K)&D;~ewSu?YD!7?hNh>1C`WaqL`Y|+InPeVjg7tYb8}_ZaS9%{PqkRQ zy7KLGO=&6Z*|TSDo6^_6zRq=7@%J2ibaeFewfU0EOQxoJLK^OCvghRFD5V&bwzsbv z|NilnFC)AC_YW!Vlb1z|@-A*ZCe3wa*&3U{{nu@NFU*Hl9kYG^a9_sh;r0SI{9$Bt zv>~NN;ZVv{{@dBQ$v~#>7lL1GIrZtT^5w3fv}#dS_x)rYq>uSIgS9^Q>RL zo`I23x$kXk!pD=NEp|l-7Y05VKDP~Px7LZ>=@-Z;K}$(XOOO1lQ|vo+BtrDyiWeV~ zba`cM>#2r@2E*L*Laq~o0o4&=0-H8%YP{e+TF#klk}Li7&7G@aho2VL)v?UajH}k% z+B`bgEVIcdlP-vROX*D!eWp)r^aiZ~)dQUp>aGVTc)ccv+GH+n6!t617g4-8*yPP7 zpx%kEwQYPFJLUG~^XHw7y;He0iZWJ9_OH6my+up9`{u1%S6;NcG7mJSRp1-zpB&j{ z@Wl9FX6>VcsT5^uYU=!}pY6~SV?RcA;V-#QR&6#m|M59%XD_F?N%8X&@6+8T&(bYk zY&r1hNq>7mo=)D0_YW;feCYR!MofKAO_My^x;@!IRP#e`^VHZ za!ac>6q*^Bl)idJLmhl%(2$}p8j);Tuu~L&XtjtC)uw{VK7Z!^_~_swDmLLe?nq$$ zdYY_Ljp{AgXV`dnmUfmWn_E;JliqYBd+DlGtNeq4$}tB*|$4PkFFQOiWDb(=AkMZ*LK+7}#**#tkWt8ApSsCS0NsOhZFMSd%4* z8X;o^y3dZ+-HMs<7~fetI62XKiY0!R+m!(J4fpgOXzfoi2-k0Qn;0ya8tv&C9%eay z{5YoUrr6=-B_$;;3pDm$Yq@-VeTy3#IZtMB2L}g_{QUXqOVy2Y*gEb%>TYb%t$%DJ zQ+Z69jQXx!yE;5ZCp#`BVh5yWWO&EMt~Jg+9q^;&Mc+$pous#ErUloGp4lY0{QNpH zHs+I?yCWthhLx4otHX14-|$P*!ee~9cCB^zTC0o!PB@f$pwQh#J9a0>i4!L%uc;|# z_o=R{$%YyHA5Ly@cXyY>b(^GxEn{X@#pdnm>Y{OQaL9T2^4{Sz)9n`rqwXJ_aEop0 zD=aJwx3a|bhEJeEM#-L7aq>el&ECCxo0^*LqNEtUbWCY?&PjxR>*P>u&mJ?K;YKWNDT`9NjH1n(H+TK` z5j63mr6)D5FuZJNV1Sv*x%9j6ZC~%fHQUar%})I2>hEWW(DGyA5H&CJXUmQAz~3vN z7AXZ^Mtdsy zazdzd&v{qb(@m_mZr!qXbW}^yi5<&-do+Hq$E~B#gYv>sy;h+y5iRQx$+q&Bg9b$> z9fccZpnOq0`=6wlW#O`U%zHLpKC(#&5c&@PPdfMqArE)PtsXSXPYaH}cX`#n#S@x+0^`L-8Fvc1~$w|9tksnre0%~-(LgDX)*_}1Vh7Y6l`F(nFggHAq zTP0-OF5k0lFBvahyhuwW9C>lJ^nH@9A1;bfTwGiwUctjRc&!}M$t+`vFMocb#dUJ{ zGK&H$#ekWy{g511pJt|*aIWXIkG3%TN+!Q_*YT4XKN3{0`i6$GqI_#ne80ZE*Ep|@ z`o8b9TW2v1Dva{nQZgnCOP8*!*?DnrA?COfS8tbiL-sLv2 z5>w)LYx5B%6fd9H*x06vz10!qZmA|l@Q3EerA%5i1+TG4frXm0F_m#*d`O_2KY zGuTP*0)|n+eV#pgMk$T_`n7Uqa#+Ig$LE6t4H!SST`zm;lXjn+GAkYF`?OS7tW!JN zm-D$~jxCD4XjCeK*ZM76v(Kj%0^PTiI@jMwAb&TQwpFT$;m$_F`tx&eENRO=D-+H|Xq{ z*dWJNvtStz62dtUx64g1C-oE#{=fd=HW#Jnf+i6;hE*07Ly9iCK=lvYr#!0D^ILVX>Nv=%|McMD!)uqEgSceWj~jUmH^%I6D4R%IXb24pTR+(ROhfPCaO7la z;p~tcs^;L}rWiRVolT7=vn=mf+Sy4=2d|`4PClF#M=7nAH1`Uzx zufC+i$VXWKvbb8gj&ynx=oGu4qocFx#z&`i7mee&gFQ+Q^fYJqWn}dG8`I(`rR1Y| z*`2tH7{yDbneBtV01?E_mGoi#533uPKp8R`a{b5Nza0xZ{=ty3($z^&z_zuiU)@)0J{4>oX9fn3fk6=G7cclUc<6Z zeq&*gZoI-rBXPL{Rhwxx_4g?pIe$KrG%L`m{two?OVZY*p*Y}<-fS72>j_c(wQz23 z=lPj+RXS8ngxH4Zo{cTP7bX?Y`HooA(9qyl!M1J6eXa3J@olnus@sHDDTTlSi0ZF%B5WxO+A!K?`3%>`xq)J z<)z>;Q(UV(8G56p*Y@Kh4g%Z&ckf;N@p;;KI9lfT$d@Yi?Q(K`E^oS1xn*rB78aJ+ zG4x4F$@}S|P5$_ydzR(ba(Ix_&VKp&^`%r@+O|b;lb02GYa$!nmRg%>n-+O`09AZ7yGG}Z-^?yiV=UKb^cfvUOWBjKL9q)0F1py zQ`4J|fuaDl0et8(GBWJ#?dy%iXJuwHBkk-fpDgrRNf$AV?HbDj7Jl{aonDej$GNcR z=zv#OSr%1J|5SAB-;b(LSUh^8ONwUGVw718R8tzIeCK@dAY8)@!S$artd{T#2z2%K z`V|)|RqaGmtADVUb8fmX-mt)R3%cXserNPdN@+~!TX#4Ag5u7d-0kh{ex|=ufv6Oz z;tlccKDr9if{od_aq?A@uFoVUo&dmm-)P2A4Qzgql|@gD+IZi))!2F*grg+i<>%c7 z+w-S?j65p$(n%7LRXK9W1cI2xe2Cir(v)fuLdtc|$w3n9hSG)wSCyXgQJNxy! z2YVZy9+g9RE`?kp9laE5taxtvXF1!|#)GMcHgAm3ic#?327AI*nhQJSUf$b~sKKy& zx%$bIq7SvBeK6LqDk_$sEQZ$fPJvRgtzI2vrTAsMebtwOI)#gEZEY78Ho8STd*)Es zI6L-|0HZki$^hU7o#uhU!@I}1$Oo}rq^w>qB^y;En5QI6Kw|{trYmo_P!)wX1Ff@> z`^hH%))nLV;ZvTHs@q)|*M6)$-(|Io z&2^o5Op{}E=4>YjjDJXoME%CQ1qHhn=6>oDc1QRg^d~~SIj4TbMn-ZDwdP(19{IMf zlX<7WZ?jADejh#<{QCZJZ%pKv^~_Ak{>+f08#ZhxV1HaR^wO^Fr5}*WJxE-;U!Ju} zHhLyZ79pCHDl6S!TOQ}-#mh>`cZ?4-4iqd^=arCIsrJd7rSLnG4q_=Hb;>FWvbE^I>O-yX;D7M<^mh8&!Tbmy#4(klsATD%RY*Ld0&l>2Q1xuD9!X}=b6u+KU-pD^fzS)KzH%-@}kOK zzg}g#wmI=*(cD;I`wWJF)7B$*{4yUy6Vw;)Pm?>jx1MHzZemj4dNBW@XwleC&u5C9 zJKmf!42KT%+^%CChL4u2+G6f9zBl)LZA+fSQl*Hz?bo){BI>j^Y9 z$70O9o9?%kw~0s8u=B#^J#WNH@v1n=m6zY9#qYj@zP zZw1Ty0V~15ZfcL*z5{@L530y^modRBEWA&*4K+0xJ~qry8B5p<-N~!(QpWeZTjhY) z+Qt>oU(uewKi_fT`%ULFq3f+HjOzuvteZKFeviCj>0ZWC{L@SUC?6}fF|YNp(KAY3 zxAXT@4@>M!>fyAnGYk@tVdlmg%|ME`>BMaJ-g@RUpQxy4$GH$*#dS=6v_=?&b#*BS&^hc^ zO&8OOGN@G+c6K4SQ;V)rzwk-<7L4}Kc^-Q!qax2;Z)0{O>c>SzZEWZJbzZu=yPFoB zO-)_>T2*ywX5Gr#SUFC@32Nw-i;u^9Tmck#1x7aJpN{%hg8BeKX0@Vc{(VIOety$| zs@-5vXoyNCCNVlH4!8vEc!h%c0r8W5^Xo(&Lv^F23g;(|#MXV~G;?2Xdfvd~T6bPf z?Z($~!8I}Y!ai@aFa7pB7neMzJr%vH@ng-6LL1#>2U7He&UM$2{sWDQqle;~nwj|? zD=|#OQ}&x$4=5$5ZEUo(w7%HFjJsTau|ggzyU^>{QltP@zanW7A*;8yoDyETT2hH9 z5S_!r5*t?nA&1_+Eovn0Cf!ANJ|=UOdN7Yj^HWgbcF)-}RrxlH7B6Le>G&;tK&^hq zzQ`N#BBH;hF}dX~HG~LX=h>mRddKiFL%`g)wdA1lkEGIV|SN&)(47HK!pm6S@) z>mWaJV<59Dz4~r!?fa0_T$8U2yiRsw(y#u{S*i6!mo6o!_%ZqDrL0WSb=k6z|8QCL zz^=-;#j0k%b>ifWu4iG!R8VUDXcjGIIP>{ATgS8E!dacnS~RP24>Bmu+9pMwM^8I| zn4RmkJbd_Y0*0HYIDWue0s0BDXIl+HX6jr`JH&QW)y>_WX^)JlewH*n3RwVS#J_Z% zyrHy`w4MLdUF*{LO?7gTwcMhWeFC8On zQlS!5xw)m|!yRV*pPt+SBo>0bU}F3Ec?zYp{rngIW4Wyld8#I`UG@f#dM{eS1n9(h zOgdWfSY;?r5^vQhQg!l8DeHRaKgjGBWH$$3t&pVi(qCeH*vyPTF|>rp=r88D?1e z)n}hMaxV7i)2Bpx8yU(QX8Jw%Gvuu_croYVW!!>fec0I8?C|VI85H_8*sM>ayFQ&$ zkd`EmzvZclF~6ck>FewJ5&4T~CeSC#C;4XgDk|dYCzi0R+jLXH%oGd^%Yei8MTh4R z|LfOle=^U2sgc2^N83_PG58|{#mC1JoxSSI>s*hpQ(49qfC!entuHT#b$FzE%w9}D zxghe8`I$4DiNG@j-sbS*eT?U{kgzZl&=)^0;TFqV2rs%t- z*Z)2Q9y(z&1~$6{DJ~Ml=a@3nmMQwrJ?Ip>9D{{ zT3by(Il?6YlGY0e?Vd{Dz$Pwmc+_J2zbn)fur%^BRo8utQ>-1z+C(T z11~>#AcT3l0`6!&H#O?Y>!5D1O6s4%>b#!r|LCAbamjgwYo~sM%}Tp<>sEM#ua{qi z1v>`GPf%F6^!@v1wK~jYbR%2f#}>D=v@}_;!iilk?>wU9?rCrI3V#EufpYew&Y7lg z%5pDTn4dI*{Kp2DtEuZI!{D=0iy{u5*~j)xcJ#-qJ#K}DQg(KBqm#}? z#RcdqrKhLIl$FoNVDIEqfi^L{Bc zDF)#)Y7aQEcJ8SdXPxAD9l{%eTgAMWcDB@1R!UB7^-n%cE=*Wi%yx9s4G=uv*THK8VFy^E4TR4Se;O8mH@rPKgc)bsc0$;LQ4?^6Xs+$_ zZE!g@89!&3n3%Af$5Ms~7XnJehIQT@dmUcG>MbW%!u|mo41~4;1j8Ku?S8;0H;+q@%;^vEqgAD|b5fQvjn)&CNuP-tIQ>*l@U~XAuS4k@SiwZYtZZBiMEP zI~37G2p~~1$CpdX$du1OJ52x<#o!YBucE5@vn@@{Kz{qOrEJl@Ils0)Z~yQ)S&D~2 zfzrsbD*U{Fl0%G9vYobdxU)m2EknCsf1}ENa_A@;A18W1aq@vg`=Qny#J3CY4dL10 zgQ~oSdDSK*ppriZ>{!)?oh`W@vs)K{3Qsp@(gXBS#7QtTG&BeMO@H?66PAxf7vHXb&yv$W)g*)#IvMTZJ2-6oS9R;b`5pibsi zR+sgYbWp50VDTu!yed1x3qb=wxEz9WeWvwZSYb=7USFr72$;k|gV}oJ&Yd*`mBM+{ zj@h0eX}5%piG zG>t^8q$!Yl8VZ)?E7WBvyLS0=({@Gkt3VuAvA@Cqb^{|#%?=j{wNzDB7K37R0fth9 zhyu6-^!MAs3ZaS*n|b(Q^>$%6Dx##U$W2;8k|IhDWezY*SaR6Sn}SbY0JVglkoKJF zS^@{F2c3`LiJV=4WjT3yfj{ux%UCk&1qJD-{TY_K3C7ibs9gelPUZv{Xf0YZi~O!# zG*tYhg&m++b1#qTsO|Po^1`0!M~5Kn0APZFLep2Zx0eL868g05bkqJ!?L_q;$4{dt zn^V(h?xGP}N-w4Wpp~%k!Td-&U1%+E<8&Hot(tt9c<-L1>n~eke8O}}&&ne80p7bq z+axomcqa%>#A!DeMBM`O*ieg62c)JKc|F{B=j%%yeo;>zRBlm1pw>fo4*$a7L&05r zus3qmw`}OQf@wFx!#lgWyy2q^JolKMDal{DX6sTQz*pVnfd>*)=rOG5p0ago_WkP= zzlPe5Bn9gp;S=3~x*4XKez>_uX~dg$bK=L7VNp>GYu4Q1j~?$ZwT?f22RQYyS4q-p@D`rFNd8RK~Dxb@P~D}Zpq*U0>O;?`fE zu;b}0Cf=~neFv~3E#*AYNdrks@XSpuA<#d^>`Txf;pZC-X9ELy1K$wxKQb~xQ9O#C z@^$n7!a~|UCc<@-%T_m|5N* zYHD;OVFK4D0l*vtNFK;A2r%w0APcF1;->lj*Eqzk4W#HjVDg;#wt>W57#SI(-iyqQQZOjh#wwD)Fv8@|k*qK%Ko;S&{r-_s>drf#3h&W6+ z4sc1bnZiOty&wi8Gq}e2Ut5tzmVp;p27G)<8>Sb}M9rIQcVhv}4L`FP^(P@AVPs-L z9XCcpd3$@4T|SCmBMjU2-F?Qwg_%>pi8RGO`_jNMI8stlV5PF5s0-yz`}u2M)@G$E zX;QvvfT1I$@X94|=;x8PvfNl>>?m&DdMUCOw+pEl4L*DRToya)uyoN;Wr+F^1B*Xp zPpMPPr@*wx{jQUD4z;=inXLyEW;;~aFuNkuKhn?v*|oIeqr<};A4fA;O&Xo;kZLX} z>gnmRICbjCU`DjhiVG_x5NJ_QP(XjMZOxHFVTwLA3j&geg-v>fep2w;Ejy&6wTE>l zJ}gsH^UHFdJ|DC50@LsLNnWx5+^2gZyFZ9D7tVYaBQyKLuH!YjK_I%+x91|);r^30 zc=)MF35Z7dH=}EoZE6NPZ${DCW9^aDhRvJXet?UmAl(>A|KQ+HEeqH`Fk|?@Sp(p> z0AdsGKF57Jv*|1LN_afzrK<3a1gM|oSx3|iv@j3E6IO%$DdjX|Lh?URyWFzxzk$}( zkf6E*yJCshp~uDO36e;OG`3IFBn80l3qjt9`O@6z5^!u&x4##rUkpcH{neFa_Mhd5wz&Cdrr` z#?)nAWNI=<|BL5d56Q&QzC9X{!@ONUVA1inF(qiL<CSrBQEQ-PgP! zXpM1b%06?aeFFReNM;F~{75UFZ{NNF5ObPs5EP`S%uHFYt<2m(!bN!okE|yb%?kXk zwv0a^%Z+LYX!T_4@48M8qlu2R=7EI#e~=QFfWJ~^g&(@WDC`e1|+09}iiJdw85UZ zv$=FhF{g>qcMxD1bRq!}5s|v8t3Sh|q72mzM6CS}o}Af)8^=!A?mWT=Xd-k0?^6$` zx_Q%|E`9rB(*kaQvbW;~A22RLiPx|*$PT*}>a$Fw$l^#{N7v~t6P~WyvPkVfSa(FB zt&Mr>e$+an?%lh0pcRWiWjJS6rt>j$tJS-_iPxz6uiGYj2*8816jxoE$O}UJG>#W9 zUQtO+A8ZK;>O-2D*?EU6fXuj{U=}Vr$N+EO@SvW!wxk(n5jGCW({ZXi_h(UTy{*ep z8jzRh>=j`YZ86qH`uSe1$46c)2ZVZsl@S&bbG_@;)kPG^Ipk^{EA?e;DsbDjO5DUB ztJ?~y{dSKTSv2+yMs_MHv|FJ&2J)q&PRSXl`z91oh4exR=<$#|j|h`SLMf!9%KHwrrn1=TlSSb7M(E$D&|q1+Lc{H<1O20DZ#It~fTL4`IGdm4TcKaNec=54&9-Qa$vGo#(* zl71)754YtlF*7qGrg`|?TU(E0pAIvL?Ca^d3{6j3ME33q8CpZV)_|hRQ6E-YT~$_F z{1wqD6bSw;TMljlYs2rZ*^fAzfch=PG`Vq|1CqVDO^{2#t?dRSuiX@xe36(aaQgJ= z>uc4cOX<=Xl8>zlZ{&neE=xl4;FMBC@1ve?}aqHeQhzbOG5k zR*Ah;x1glMinumT@Fswc&_GksB}EvYbYfy+z=Ndyk=z+IpCpF-fufzF0k7o1k|Fo*_jqjtaVm62%92KTKUUJU78ms-Y!bu}&2(3Gi-& z`&r5y`vdZ9_uO^AV$6F^s;HK!nTu=ro-oz}=eVUT={`L+5-0@J%5t{)TtiAL_P!ND zYdPn8nTUr=sK<8uPRgr~(Gvbby30=+co7^j$KRG+=aL~KL_?vD68wgn>%p2pI&w9_ z)B2scAMwf(lpBJAY9b{xOiXyN53XWqb)&qJ8gcL5J)*6ii$;qiT%xJaLyia-gB?Y@ zBm!`54RTylotIhm!`B<#F@Qh)A+il1wk9tf8KL=BI&{!+Z=;6caEzdM;lYznB3=eo-nVTsU! zQARv(u$6^%;tMLieCJ(;|^16@E2x~|2WuIzFPdK&~5q{^NZ?>I-Siqy;z8cZ<9j~X}Z0j&5 z3>W@F&H^T<|2l2qV_>=PzRynq0}$3h7UI#Duca)CbNjWQVv=qQ}2}Qh# z^Jn@At+nq`85J==ktE>>gdg2Vrn$VFo+25gZ*}>%YPMohP2%md{tpB=ce~0`k{%fC3I2G$5(Kv)!J8yRG5uyd6}O1nWuK z7<_oAKyNcL776<|LX!|^?!yQtfHM(^4K;*y?b;y70+t}DJBE0BuQQsnjTjuHHGLWL zwfemnE1mbVa`uSxxN#^}Vko)*Y4usB4sVy+8^73bcH+$a`}gkx(}#~CaZ)8wjKXMv z3u0hl(SWaxLkMMo3v1V|l{(!diQN7@yc0^T67B->=z+V=fC3UO9$lsMBo%^b+j(ZV zHCNzuL(Vy?jMjz*HgpuR`io{b3$Z9Rvvpz@q6YvSmbABTKziUs>>QD!Mi&;-3qL+@ zAqmm&Oi*=8)W03#4g;Sy*G5S#f=jKct$ls_80Wfm;+mA%x(l^&5AH!W3D1PiLDgw+ z;3qGme_5h+SQ3&AC98M!UgcZw8#^T6b8`b{mw#dLdh4D`P9Y%pcR{@wz)mo!1KJ_9q z^IgCb81{zg=H5C-kS#*dl2bgopD*ooXk+0KL&N?fLBS|6osDLf%AqMODLz8ka4Z58-#1$@>(WT-3&Fud^H!24`A7i36Orz^NS3$Q1m zIxRWE6o3VqzRkh=LF;0X&zwe`5lM$hIihK9REGCm&}jJau@O5K2G*Bt+smx>3nWg1 zkH3-|&KI~YbuiI| z=vZIi=0w^9WJVa9l^JJnn8qIEeCgVq2Akx---3T28hj1&X$~F4wxe(tattV&F=_KP zL68F>ij8($`rRA#{PvwYi@feD{(NTQ`7!yxA_V7HbyI0ydK^eI-33y>2nhfUe)F&F z+S*!j!~yJ$v?=JkO?ggf?fM^ftX2I}wUKr~60Z{oFZ_L*fn+}8eFjLx&MB#Ts-4&J z9cV^66^`N-5-%7|hMBZXVQxe<9|3N|7iZU!oCip8H<~<$L{l0nHH@gBOAFIWw%N6p zkq{J`RKP%v+vJ}SwyFs3LY*g4;W_Nc(VfLaQ%0vZgcXjN@Ixv3Cg?jux~%iWAQv<~ ze|!N!TvNzhklY@+QVBX78Xa-gGZ4}>DRk$;wAK8~eTv~GKLzX@5*4-jeo|6j)7CVP zC2<|wGf{%c;U$8oW`_?Vu3xIFIPVKmGSIqtCKCsY%u%TfpV=%!7B&Ev(N!H0Q}k>t z4-dgr;FevGfH86s!uxLDJjMHk#9JjVEx42KB)1CLk8CueAyA#)zcVp2GmkEgotm0* z-yCU%6e3Y`APw82x{)Lsug9;j`)^>Wbqx+)N93U!2QA2zPYid25CI2ix!T5yB$G;h zpsy~z0xDt#;?1^MpLrxU;FMSicHn4#gFw~MZ^#G{WFV{?cO6N>udcg9dxNntM)fp@ z_vFnCJ__Ssf3Mr-)TuiIm6ed0N2@l(o8y22y6fVd7ry(hmAmM#@18&Y=?M82xZ$MW z%6rThNb}pAI6>rxL^M5e1LVM)Q-=qqUBUP&iceCKHQs%Uk;J7yF8HOS4oJU@V29m8 zHW>~}k=BIdC1EHy3TLW4Rya4dmn4vof6!1;q7YtBaM;|HiWvQ6RNw@N%l7Bal_1h~ z+o~mhVl73abkc)CkdhCkt^z2$0+-<1Q8Scu;$$r4l2()6T~~ukE?;@V;m0%B3+%>k4DsItJO1wRxC-hzjSGkD=KHjCpr_S^^yBgf=c+L~!<2}hM0^a&Y& z{(_dJcf~X3h?$h8h5cq9;Q1K5oz=bAzkw@6JrP=l96EfYysmPC!(UN>I37r3s608u zNj$1U=Z_2b26-IXKKQ~%#vmS*k3=m5-0yI`Cr*mJ-{t+iHc zkE!Bbw<}30xeE^R8XK2^Z$g_WJEn5~2DJ~hfQ z&Rki|VC7U>xEy(RW`U!4@y*(m@;aWU@7wxoADM96M#P$6Uw^H{!Qoq((piU;M-SNV zuKf6pBl~Oip2|I}HD@c@uS8}Y7T?Pju@7Y!69z4B@rZk7vyZ}iefX?Uf581>?re_# zk3=#a&BuV?sj{P^EQzIhJUwsp8dM1_#vn7z*P)@WEHiJ^so}F+-*KB25!P_W5h?ek z7h<5*)7OXGRJEuHny;D=Cp=o z@=xS1#4);WTX-6FZ#`z^T{&I4zsMJ+siv7d)qlL)FcAw{TPmLo@pOM}E_S6w$+m|N zjNK*E5GcyZ#$K*Po{VovL3}1Z&}_bRPJWp-zUiSi<6Uoq=Y2tZsf7J|eUpv|y9H$jEM88UyM%Yq*O0N20}h;6pr zX^6+i$A=Z97`!*|3~8h!bqkOAB#kDi!cpeGjnYoYB<0M!hI61Em<&PdVkc@}b16?~6`5)++<+nZk4@!|y96Q_dzMOc>q9kP|V z-bOhwOy_6!ncmGVv5z&??|o%F{U+wu)88L^_dXh&-?({JpXc8e{%6+ToUL7HC3;pk zp5g|ZqNfn^VFw{qpo%*>crhLrPO5_MwGaULjzFnl-d~?6bWzHp^ zZzO4$r#`;#G@mAJ_RjCh6>d4-6<7aOTdR1E<+D#ZwKM7vSGc~`ry<&%wtsMNsh^5> za`Hw^7XyQpt!-`N;ypt{ai`p1lOq9<0AC?|E4orKu!zHTYji_$er{?fxG)msUaA+0 zs}~==ZBTDy^XlocoOQF7_s0T0FO3*H`R!;?Veel4|I(Rh{$KJO!f_>Hue23tWVdb8 zfXczPYSopyclp3|Mj&F4glj_}Tz;)b(dubJiOTL9hTl z=@Zm`pr`ym@7tkD4lk30NhPf%zy;sprSoilUWh%jB|pQbr+H1)gubi09FV|c7RRr z!~cXAf=|3~P9)6u%NXZ2*=?sj!InK;j37AFDx1658AN_P+4yvG_BVtU4m~#XhR)nm zFxjq()6pY%-(7^Wc5}P!cKa4v{HMKDHfgERGEm3~){NdvD?E_rIX^>AVCFt`0B2h* zWvO<+H!|_C2F3m?ZvAF4u9JQd$}je!{M=-}5x*q;eyaHq8m8!9w~ID#2h-v)3t^+E ziINXg812@4bNBjN5nq?#y#G|w^d3{0KY<}DOIpLFrXGT=>~9tc>{h{-;SGjUpEd31 z0;-&k-QPpXU=+0~5I-A#Vx53~rvn2ix7)R9WhI5Guswy+-e=x-$zEkF|6cw|s>^iu z(m;HK0rfl3&)9-~jbGyZ>)U*=g~Kw?E`-Iu_6nv&lczxZ{qsvkzF|7jxqHw!v`ucN z33|D6GhoAWF(TsMZTWOomi5WqEqb!JG=p0>Y9X8!NBfE4+n!4IlYfeI@+K>M@bt>y zbUkCuYG>{!{Q7loMsumKs$(xhe0%=Ze#ChK8&dH{14(?*v8DJU+h2S@kN*tQp-t`* zF~?Pidj5H1BPD#iTtG;yWKRQ0K^dWct#)Z~R;7{AG%`@n`P0?zWnROtNZ+{gO`Bou zn?Db%xW8s$Ho zl)PX|hc0}8%blML90#wkm-@)}*y4tKb}|^(aH9hDGLh(QZ{$b|NM4PmN_#lMkxugH zp55*?*Z8Ug>(U%&;&KkHWK1CIW`w*iD|**sj*0NhH5uEk zvoFQ(M2HB9(wJnQ=0f22?x9q|9AaRxH%{EyW~UB9MGn#9ob;bWf+A!eFv}`kh#^aJ znO6*bEevnm7WX$P_DW2Ou@hxS^29qq!c!sb`XN$>4#T!~?UNVt@QtPHJC%qqPc$5y zJVN*UL(%ilpSy@`S_kG}%#*i>vOkPn(s8}O=yVIY-OSW7K`)XyfLkjC2KfP+08Cad zgz+FD;=7^K;z0`=wBzKVGJGfoMIt16)6tg(?{psMm9(`TojYf5zcILthRR93FW}V} ze^es-44KmAgZwN0FM6iVEZEyCgnx)90y}IJjQ3uLH;;4F;hXuvS^+BVuI?FU;xXmb z!lYU9N=ZpoR#*GnxpU`!E4&Z%O5QDj|FJsV+ir2u>x~4BZH~Qnhel0(>3+E2+ziqBvYa=ZrO&?@5CDWj23xq(2CM#yOE@@f16<@37sMVNJ3P>hzFj>D_&B79haDQuW3N(rO?Hp z{P2MZ(JsS*@8IMIF zCLjg7Ixsz5^7@)>I>XX zHdM@%r}KQ<`wA+qu}H5E;-27@fHb@E4(VJLEenx|YQ1L?<$nJ=g3#W)&T1puHgD?x z!%n^S?R`?h!zEHmlz)qU{|$x z7PxL0iOrFNfqRCQly04X)iiWoot@_7a2-qwwPVKw=jP}C+hwinl^AOVWI=#r8F}0d zIo?F_Q^0?!pwToGC>0{Zf?MvUlqb};%Tu{&+xrRsvj)_ zy~&!twc-X`V;n0zFW;Mo^9Qk+|N5tE3zWxBWWYqKN0`c0ES909mRT1@)z7?sw&ri= zHP@;Y>3lc%af8oDm_2C_d$g&2UT7lCR0L>Ta9Vd5wym@m}mXvTVT6QINz4xQ&L4O~v#IXxscmI~d z=Bj~I-L$a)LX8Z*;JZSNb?~z%KI^MJQ2TeyPw+CU-5R^5jb{X{^OuuHI$h(&_wnDT zay(1d6-&5}!3Vr)bvq;BTUTDw)t7y6^t8s0{ptA!8Z2pTElms91TjQmRbhX-ot6MD z;bF{$9Zk1ew5r9+P5w0uZuBK7gl~?o4E@_ah48-0x{tbJGo?3}|BVLuZ2z*pZGvfO zWhUOjd;e0kXVZ( zwFlDL8P1PZ?f#2^9-z;$kAG+AOuVn*uNfrux0~H2?~C{$_Dbu7kVwyoKVX4r@jmJ| z4r;1CEi}-t8fWYGN=jxgYZ*g=8Y+MO5S zDLyDra?nRMqv^d1y|d}y+|hZVKewk|^QUe0kFS=c`Gu$gdJN{&8$wABdKDhRKo5i& z1R&W3x^|`2J>YOfZt#~2#)r7imbd>KRpXU4`}mO9BeEPK5!dk$m`>E(DI9+x4@N-( zq#NH=&ZZvFbN8YWeG5}~=Ff({pudfoyF8r2W2?A_^M5W!K}yG|NfLu44Flm?axIV@ zS81#k3XczTR49Jda6D)wBVLYJWpl-3`rht9B4-kJkVIHf28pXw*<1Hh2PuTdNAp%e zYQ3^FQSDUcC+brBw7$E?&M{d!WiM@E8A}7QxWc()Y32}bkhCmgAh}0asIDzI$6<*c zNIsZ4e8_BU28*^;H;08+j<<&npHdTwQ)VwlY=)eq;2EtEW}roE%!`~ZZfzw`x+0(a znLT1 zyLpo?%lPQs3-D$cG5Mvi_Uv(1b!vKgJ;YF)>2q!2-Q~Ixhi%G`dn9HeiCiHSh8W?e z6M1+p1d@|HFe~Y=rR4m1u-d(Q$3pds@m;hd?!Qi=kAlsw9Ds#DOaVM+g3~tke?cx( zG5Be^RmF0WLP9L<{fQ#yQA@|~9~ki8pdcPw3LKb90{@WYyyND?N zOLL@kAo`px?E7#BN0W{jNc~S1FMsJ|#oM0Aaq*4^ntnV3V~>UhTeuqE9%VPHNVdWW z^GNsdqpdihfgMWXfH+!cbyc7LUo!7sJ`J$Ud2!lOu`xP4p`_gq^LqNs8HmusCM{>1 zGlk3s{%2&2Jd4XU@|=@XT^7lV5r-GsDR3MDJxNUvfxQ#RVCR5AiUH0py=pu?;|6V<$OJ% za+o&z*)w*H574sD&sRzOO_cFMW3Y_=lPOz`GtQ5kqJj9eJ};`fn((ZJg-e=_AO}oM zIWKSnf#b-5>nc07bUxZ)a5>_gmfpp!*FyYo((#^;*ce-Jr0(phUXf0SZ6r&M%#9Ls zFLFbCJ9Zf5i#a2DhsS)C;@me4h0_2^(D5^11L5I09KGFmy#pBVqkv+VZ6&Sxj znYYEdp*ms85fPu5C?w%i6)tq8)iK4OEn(-N!Mjr%LKGFw{%y_orEO`W!oz7{*iyyB zs>S-j11b_R5jmF>`@Zepqv&Vitv(baX#KZS-~HE8aigygo*Y42^>3Wtt)Wpg@ulAS zAbW^#cw+@GZ{28g4QT>1=$TL6Qy zIrrjUkycw=z<8fLvjD9X$KsbFTAh)PDuIJ1k?Xe|JsI&#WC1Q|AA}GnsL*jTi5Cv6l`jKAlHFA)?C zy%Nt7y1#(im-+H_?-Sv;eIpf56w4Zu5_ME>Jn+^l(P$w8L_2Ohn0pHoIdzXiZwQ{P zSKtpe)wP;@9p0D{oszTKfo;6)`x+5|Kz>n8ynE<#7PH*NK_#56U6vayU7`HLi#vFW z{g37?8H0vpQh&PLO$l_ndZa!O1iR9z7Crv`g4b2vwOf(ZL+gD<#t-VR&D)p&uw#>^OG=+H%ONc> z!BgSonXf{Y3nZTp9reLA-dj;}m(hIx{?PS@%^r$yXvvP-Ufb2>R+g#C!t#g8-;+n@ zkJ)nS7T)kRYg40MIJGWlJ5$i1MGs=$myj`eyHtVA5lJu4xls+0Xa}BJG&1*Lm^?1f zFnsJ?X{z6s3*o|yeTj8z{^}`G7#GugXEyB2ay(3N1R2ov;^NDxbnBW`_=dL7JL2pn zn~xrNm2u_%VErrAe`uBIvalEF)9Dtk>|rq5*xv8lDhKa5!&1So@Z#pD=?pL!w<1?>YhzzU`#p0p7{E@0yqrdZ8{NyS#X z7;{os)Ff?bb1)@>LPB^{7d=Vix4qmVdid#5Y&H0fb+}J`W0$P(e1*{|x^U_6zf&2# z^YYt8w#ScO1#lwX>%a3ZMEr;AuX;AS_Jq+>q1rDtl^<+qDOuxX%XjVceOnkC#KVR4 zAI*PR2#*(81);SZ2@Ct-_FcGA_=%-$ZEJn_@K98)lkcsAgL0Q~yUD%|)6gi(OdpZ_ zGiLWAm33&4pTk|6!vZBw>m-&cqAkSbU%mD8YSxbpy_>(_~`1obtxP=UIELvDW^+vB!SK`~D+v$DG%^;yjPzcYv;-1W{Q-9U8G|9UrY0BDG$w zN9BkX&Jd`IpbMy`7tk{+*|fu?&=1YcG|8NCYjR+eg*zsl*+F+<28uqxNZl5;>mnfh zDQN^S=FooSGlJ}Q4wPngKn zKNe@t?Owf6FR|G|hzxTZ_(dR9VhakEQLn;&f{=>JI`Dp+rL1P*_Mj@k2 zLOjVei&CL-YYln0H+SI|c`|-ng+ak63l10Q%qF@EhQJU_wguI+6}-1Q4V!b_r|r(B z;oh8HAu4auOOsTTyln7k`L4sKMfM?qgX$7UPZDM~2mZZGozm5HuD`bm)~wII?LzwA z=j4`7R4u+xGRoXV-s9y3L)L-zdm`smKy4HzL(Tv9%w%GPzsF(77mDl_IX6Zpw2ys+ z6CK?e=Py0-a#Z6OcX1_q5Myon`v695+l~WPQS{2}xXhM^{egbEY39F|`nnQIF(-^f zM2gFEa}T+3GmU<-q3{=hO6Nh{&c~g?u%|ZM;*-g!&kH+o)`@UUS9`P%x0r*WvR~J;D(6ho2a+vj}cm1GK{g|_QVWX}QGf*X5 z@SktQhBW#t`8m4Nb9GSmVLefvwqDL2;G)(w5a1%3oEL{BhTj2bqHfs+n+x zLfmBlnxX~H1Yac^^pfD-3V`}XEadR{ia3g@oUPV`%I?ecJ}c;Qs6hyGWej^F5q3d9-TGNUTc}|$V#8uR5h&GR&*5--?B3MW zWC)n2rRmz+V5!6a?|D)w9Ax4`*_gqpG(JxCB>S??=zGPeizwfu){WIktvF^9IGyB4 z++H2h=EhOg9>TzxD-ARqHW@C;?q^_`@1Qnzr=fg}4JR(xXktbyG}@$ndHhcY@ZSQb z#ybBdzCMK(1F<9&E`fI;Eh8h}0j@(Z&KI~+xVr9pm4Nh43O*Q8lDi3J9q{Vb!v>To zEAeyAKNZB+?a*!8oJGa4@3f?&*_@EiWU$)(p{BsrmkGlwb`SqXs`7i=!&2cE^{W8m zX!l;aPxFu1p!FY%bAnMy!UM4uRR+6ry#Kog$Q%nUE&qT31jy+TX9@O>bn)L_X}zwvfZlq5p$?&-!9(z~05vH_x^MtXO!hr>XD zCkd$+B8Ol^i4HwEq>xv4abJN&XHAN_EwFy7pB+0)kn2h2{8lq-lRK6RP)!#2XSVQ!qVJQiuz|YG=|<#OO?n)x1C-!F*&b)%9L&7 z3In%%caB63pEks0)k+(+Y~S$1B`i8zFjLCC%^H3^h=qGReBxVi0XTt;Lj40-T&XcQ zj5)eEzJFF%kslp;_%JeAvtmI42=1xxpabWpFMf$S?%FGwvo)T7YGV`esMtF-Pirhz z=)D;_j@Vb}abHBjGz?85XeWkJKCsUIxtnw#Dn#ip@K4>-0s4-zxAtwqf}fIHH(f0( z_-B4azk^p&1Jc%AtILtmG_Qq%9~Q&b9QGG~dr_u3WxLlsmHxnS0@OMSSn55&Zdy?3I*)*~MpHPeX{{%m_tR zqjPdk`1YmYcE9;#P;l}hJ(P(NS!tzTHep4eP-!cnZ>p5L zvR~}Yk1KWz8R&%%bfN$Kn+B{1>9lEbPWKazH3|W}MHV37t62g7U%KR-)rYUzPV%F< zoq2AY$Un2fKQm43dTMWpaEV{Ot@o$>@70W?e{xOoP4=8Rj&1e0(X^kp(J0&l-s~f~ zk(^(lq}s|(Zxh)b=W!Pb7$Kh?9UYH)gB)mj+qFfw zXI@%U{brgE`sX&LHfhwQ4_BUU%uairF(|g3L#3N$JRUtXji0nBb--j~Yj(@Qgj*Db zdZSNb!%hd={B)buwU6Z_o}EI7r%Npok^qD~TF+>7;&lTHOJ0!Tsc_%?=Y6lnqtwG- z-_2V!^hAC%GLTW|c&X^$_pP%=$)|4|F`C;_l|MKRTN( znUVbuyJJ0gMtni7_JQO}%jNLE4&2K>RFgf>E6uc zfvY;P8Gif z`sZhHv(0VmOW-90ehZbhF=IMatY(QltND2DL7ep^Q!kfj?O|W3%m|Lw{&H!wsuGIT zfU-hRnrxbD#N9PZr*v&kU?-;!=d|Fo1uwL%4eL%_dt21VGf&ae>PnntDXU2Pxn~XD z`Lz|-P=;wwq{YWk17(+d)B390%4DQXG2zpe5m0*hViFM0=|*wHdOtnpxA|2XDd?}7 z5S1!lKYe!c+Mw_(c-)~Z#I`a>x917no*;GTWGGwgZg0y6T2vT{SgrndnZSHvUIzQr zrYDX;@~JvUC6Om)t^OGaJlwoSCeqC}WTIXmFH@pD#K0xa)w3sX@gBM;`?*%k2_cmw z9!>^T{?(^N(c^VWW|uiXeg7&i%#?n^aC`G}V1E;x2qQH?zx}M*7-zc0mE8huU*AO5 zEC>Gio84#II8%F`RIsfj-JBv;vuwtS*s}c-Sy@E-w*Fhyxm3ROkooE4Kcw)m%y!9q z+kPRX#9x2UFfymJt)s4R*rz#HF^@3uTB5Nig~{)dY`?c!_to0_2)Y%x;dbuqY&Y*Q zP0l^S;D?c1*U)utYGviOR&DkbEDWM$S5(%+k$uCIpR)OJNugpvQIR)#D;`;UeV@TR z7~6EZEB)2@oZR`;2-feDrX0__ZrgNZt@%kqF&9`O)^=M7NNO&}_UC;0KwB+I53hgE8%?G5?S&DK^20p2c{XDM1H z4=Ty21W4!h!a8{mt(OOhr*XW(*Y1q>cGZ|iUiUdF&-3d2HqWWFsT;!8oo1N!eNrnk zA}FQsBvjvLuK^adOQd*2F*etkF($xs56WnS7=#oMfYN{0(2y=QEp4~-w#N<&qT>cr z#Vphs09GUg-Fx7r;-f%QSr7YgM36iKe}xEVL2&dOj+0jx?P7Fjl3vvhb?K^?vYU|* z^QTa-GNh(PfuJuu?wNGT?LRYZX^bA@U$}-TsVZ%owtVL;76$PhbvM0}-gatQm`!8S z9^^|C#1%hLU+r$CNT3dKZJcV}x!X^ak{m8<5tyyS`v1B~KaT=e2tDjtp{;)pHWA+; z^8+~{fLr>Gn_G95`;u_U1hKeYi$X`=m-Z3TYWx>;T2)ECcQDu&sKqg`41I4?9$&gEH|mbYKC^x9plKaDkrY@!I@j>&lB10Chb0`YF<3Z z*;YYLeT>ra{MJs^&d!(X{V#T^^){$vN$?31=UwymFUq2dxNbs0FU7!j>-sEn#Q)Iw z?M{=BQBdTRd7GG|Pwj!SHeSSq4S{z6KdIWbufIPsIhm_QSx(OFl-8E?{kIpgjMaF1 znqV1kt*BbrF0o^@sm$wtBGy&qZ*Ix0e6sFUL0L0o{DZ>;V=OMV=iBPK>xH;#+6+^l zV8std_j`(?BM$M?PEW2vC2n<~-P933R{+<3&>at|Sth1t^mxKvv7yI@PtoOu<$pNd z-N$b%Ft?5XzQj20cO!#evJ)!Rp@!S*MQm-0Q3n*9Sg?uL2+b*P_a}Z*!vzc`@P-M& zkcRp-TdYa~-+8362NHMZSlC-5Bm*9hsTA9QFdRYKfP0b27IeIb#{CrmEfNDE%tn6mPqi;uWEKO;y zGPvHc@0|KAuq_~EQh4J|qVG4>Lq)qjBXk6`JwXfsm6|!Eh7B_I0-OfeCG&y=XVV3A z=wNlic(vjibE)EH4r=CXv9>=A&PT#S^O`9sE>zaz8-mL(2BLBfPWCp8MjP{Ajc`|n z?uGd^%{y&Z{L$+JlfOSmBS6>(py-y%SxqcTwWhR+2`{iclTThWwvW4vwV68l58&3v zix|IG&)%X5XZ5bJ#lR<{{GmD_@ay#-O~(~M<-kUQc6Oqle3$z%r@DB}Jf5fYzTlsi zxY9Ed^B4^B|4r5C`%iZP@n`?-E+B3^U;|z4gqF&6#=z0`X)qra*-uLd2`^8{@ACot zBSxWz8}mP88YgM`3K@L=G4kv@9n;!JT+djNt@M@BoaojG(8X4$j8BeX<0RGV&*F#` zGCmEgX*jT`*0z(#b%i#AUjMG!*sUZhK}A8Y-W9w7r#$W7l1jg}IbWUom~>=p5hYo* zy@ADKR$Y$1%V=Wgw8JoBpwM(sF(>@WTw;^|!IR7p^Gwok-sr$YNfe@&)PaB=@F*aL zQ3MkAU-gpBaI>2C5Y7=8fsxJzg3dw47IZe6{ngTX5r!{ftbcYmPX^*!1ONj_E1;qB zbV$US#40H6IQ>Cw#a(9Q{4zqmd)=tt@tM^*H3!d#r^UnRoxA^3C|Eij<&g;Wj^n5>xB0U<~ijXG!lO7td(Pc@$JJ$`zx^iljL+EwI7LjlCAPbe=e32uzNoYnag7yW(}|; zN6Qyl*3h_8(O2I6O}F_xl7TUG7LFmo?_MWh9zEQRdqlt@SvTOPL6ng1b4`}vZlFS# zRNFcswP*gH)_eSw$+(;EFxh2B-TiY@?_m+2vi_r%$;oMAm|xJ%{0W&hhLe+s%PH6CLFr^!k@ol;hnrra1nEU<{QaY=w{IuE zs?3RN+JZA;=p;X>eZ@Cfcf3h=EKh;`K~_eF{#GJMJ|WOLaM)CsjRQF?|Gt4uLC#D?AX*|c})YL2^xYCVhp9euHBScwG?i-=k;1PTFw*lF} zd=vE!P4b_-dW%Ps&bAkaWV;&DZa&iwQov;PMcZJbseDg0|0s44^Am6GC6^Ipxf`Wt zXES-e*}}Tbe3H%oEd-xW$@=CcT7hFiM~d2oiycatO{nl35yt1Rhs}Q--(Kk#q=2E1 zDc3B^9QD{^ZaGjPsNwl5oTjbpXqJ2*F{-qxQyj&B`&`y-y2{%zn@8z=t6IM}t3EH% zNSnzo#-dr#I^V5eS+_UH-d%9vh>0=&25%v`Z#fdRcPmVqny6EwL|$jxf?3wX8{1WL zdCWZZlfMt8Mlpzae{>ERH1ss9s9#Ikgb5}&#Mu^{Z)tCSHqBkZ9VL0ucGYrg@x5bR zZk=X;@~NBxt6;03ZS5VT`M8C)Wq^wzr6lW*JW|7O?g&l_NH`x``tYKG=r2l)Tiy!krX}0)7%;Qquq?x>A$4Jzm)CXB zq2i5F*{5gw00UNSByVlgyKetU$&;AqX~oJ=gKIw6m!c#+0_boLe#{cYJGf!W?WGee4RC9RX8=zH(qoZ3*WsQ}V$f5CRmfjYaT?8-N>!#y5^XKw( z}tbBa862_FegavTm#H5u~5c`Q#>&rt7oD#p}>p9u+orC1F zn-}27%QO#SJfmO9#c~~T9Wb=`WZ;3#W)nrXbcC@#rZ0<)o>mYJxfH(0$jSdrE;2Gl zZiopPYzK2gv?4Bkd6#61OnI{0S(&W@NTkHf8)bBr)t~JyYle=ChNWny68m4EqtLt6 zYDKt`N_+wFAG%cLgXlYJyVe31G zB`bZ{f)%0kvaEtqN^Ef{6iYw&tG{Nr867YGkX)pigXqx`%gc4jT&Gt#ejOOMpB@uo zkemy>N@40GurD3BNIep-xVSz6ZIOkPcLa9`;U`4%I9DY3Sm!x&jnjw4bXb2e&8t!D zZ=N)^2X?y|rnhC6A3xi6t-7)o)}3>_Elq1u_g#>X{U6dwLAjqF~H&Ai_-c8}kIep3=IvwU=N zOjr(1*2?|U6`iuCCp}+_)JG`k`8vYQlD`$bpFfvGr6R@sC&A)eU zJnCLm8pLZ@2pgMlp)|$(ZM1FOaqwWT4+}$v`IESUBo6-GM(RAK-{pAsgZN{+HjfjCY?;sTezYx7>^hi zD4le5or_{jq2p8(aW9JLyXdW#`99cG4`z!(W0RyvXhXHWWw&nngl~)8vOyC*_&iUo zKgWzq@rs(mkCY)aL!0SEXP0Y!T-}WHp7TZ3SA1}$#g9?LZ^EeHx&;186lbP=mmhWP zuH$a#y|}A%s!+baS{tq(<0;<(4-)b`tv65e!*^h+$BIzE2hgb5o;cC0Fcqoe@`N$W z&d0=u!l%!+FjMGl8lZ8^^LQF7zv_#6Rzb40`0?1THrgfI%D*j}1+;HnHX>KnI?Ljs z5lbj6lgh-l31VG2RW6ZnY;!*f{Z8p?%e9boA)hoH1)qp<% zipOt*XRPXF_9PtEn`h%5rf}Ppk$az#zqq$t_Scfh`(zyVxOdT9hxMc5qu4DL#MnG118_=JmwD_n5|TgHp25jD{|_K zF^EGhCVykDSpC7{>_v`pmJBBk35D9%7d&s!iL+12MH0o>Dxq?uquNcDv`c8Gxb|bZ zxyfe^^%|;6_Ztc-D-Ue?jGo?Dzl_XFAIr*C1_m8-171%Gq<-+c%P1||{7vC;$YXsc zL-Pd&*4sqx=QIeEW5n+G2SQ$kBpbqU3_c_A3Jf*#f9l(ZW}8C2>TljK;MQ}6K2&OuP zOHN-Ys~@!*zyEVH$$$@q?4l~{*TSHH+CYSZ=?-hY@qTFYnewU1;y^O2g*6tt=OwJR zh`LC;KHby(X|oTqf`)cUFq)_OyaS}4+v)2LzV-Xh+<{BFhzh3$^K8hO|$-0TwZb(c{sZ+{~ zjxPNA2|JH#Spx5EAim!Px)=qmi=y~XQi8c3`dsjgsa8JOH6Pww=oaMNZc}11k>ET< zDMl_uTPRHk646p0pd6MRM0V|m+^#@*NLuDka5F7+0+T_=81B=Qa{)^9tY-_q1P@LY zHe`c?vu%Fd}}oi-5JeQ0kVpk8|A+nQ%;z+L<7`B>S&J|28= znqaN(v*8bY411SlE!yb`vjtP&!} zk?CIRn_r7=mC4*o34^6C+hzurF2>_;rDc9m=Sn#?T#D5JYk%io;U||2rhV{QXHOTR zq_=)3bdlgs-nyD{?GM_1OS?0dq9xAYMTb{9)qLu`jBD|IPlD5x*e!T>zoV&N3t6RS z2X{F9M2Kl9yw1s-C+OHLp6#|S>cS7s zXwlgaEdxW}KWH5`o7aT&F*l*uTOTjjBG&=ilK66a1}=%O7VzQ34v zF~w$>Wg?pt9g^~kgEV<$9+OoQzH+rdJ^Q~i@1{S4A}RtT0IeU`qMpF<6jN3uvju$N zpA)~e#9n)-I++_eC7`07GSk^_Fq`L@MtHQd$mjk!P&V;-n!|YU(&#ZCQS=5%p~u0*Pt6FOojusX-~jz0JA^Z12OIXKM^FEg@q|N zAAG3;y;HEYU>lYu97Y7iC0bYt4_OKeK9t=L7QnzU@@drGmwjyfldL?&qhvtkL1J{I ze`E2(&E1o-B7QTHH=k!+#&q858W~jwjSM+az4csH{(2Wp=$Jsg{h+H~ICi#wE&+>} zLK1rRWS}Mlo0T!b9t8w5NQjY?Qji)yu>S)p+cW@i#DljBxRlR9A(0A1Fi;xjjF>@M z0&?mHIWY1${SS2p8Y~LW9{Vqfp}+j@AD0c`c%&>68WW!Rc+?O0gr<5qo}c8r%`?TC|9HS`S_4{SkQmzaX<D^zG9c*%fg4= zulM(AU-9>vH*JmV=!71dGd;67!(cmDy-HYBG(M*=bh5cCspX};^WfOs1uuZ;jrYyJdGI7ILq7##fOOSS99H7{>( zM4t}b^hL@}sJ-(7s6J^6aQ$_CpLV)v?{Q0;%KVT%y6~=32?PAn zXl<=mF%!A*sT@Lg2!Hde(id11%t*DIXSx{lwY1Pei-=}`X2y0wPl-rfH;&%K(7VrL zqO;-#YuOv!$LYIrB8?eW`o zB*F0+O^^p%Gy1<}xzBb{qoon&oAiCAxcLHl_eHtgIai-n(TJE_|6yZ99(LoGl#N;R z)Luec({9&ld9pjrC$#X?lLE}vE~{({HJqsxE0OS;H^0h~B|24X&b!z0e_4jR{E~{* z{I|gZt8~WFbhr&)n`(dVg$E0r(y}#a|oHf`$2Un zbV5c(1~C_I@PS18yj6+;fQr~+6w0IuP(OpoaLONj7{_+gPr0k7zkB$gEXPLl4}R*e zjAy(H&la!Ku9ilOfB0%_f71n0G6xie;>yVc)x#NY@oR2;I`^fV&JiqpqSVHVNPS~5wI^s^r9auodBh?gSLgXy zcZri;tF^b_&!TrZ*ZDKM|I_;Y?b|ms$eRPb31Wvpy&tqfZ0H~gS=P%00SYK;8zEbw z`4cD@+gVN6M1!{?Entp{;W$x+1|ALN*T*Uc*YYK{sn#>~J9fvuD$!%^_i@eXkA;Z# z)}9Ss+;b!lVy~Xb-|^Rz6|vE{S)^7$$Mp?EYe6_giWCdOQr9xDU+hko-A@8BKxdGO0iLK z#KbPC<>2_YiO97pG{L#KJl6SKnR++FUAa!DLzDY_Zycz?`|N93lt#~?4))F#8#U|j z7aVVOnJj!~zY>EW0u)UY{uY?tz1}5q zB20dIpF?GcX>Lv2elD?e`h9>l9;2)rdJCYpJVHX`5Moyk$}A!ZiVHqIJ_xN5B*Q3Q z_~2j&H2Y%tulxpKi$OSvBoJpDoX3_PCe~&o=h2$Nh>cBFC9c7y*^TY@W^jB3A?NsA)0q^B;E9EHNMk%erc({H;{-ph68#8SiUgQ z=G{76q5bloxYkG0pbO>!$^k=g*wXoo32M!cD{1C_HQCWqcsaWAR`Qs2y>N zDO3hrwOx0eB-Q2MBN0Q_uw>=FREV{I|3ZcnHib*ei=7%(CVX3e$^~FoZSV0cbef^I zY4GQqk$a}Vl_&yb*-y+A)ww%-7WvW{2*)-^fekO*18>?nmF`tUL zV)MRzW-}mu4UWRn-O;}Q~ZqR{AsbVfhp=FN-a!_6Ei{Vn6UFf zVv_C1=#O#OZ?)xg=!CbrFyy+I&z2?D%CE#4=!CUJ%Xv-wG-jEv>W^Z%0n&e^&;+Fm zu6c`s4DLC*WjSld#{=;J3>%hufeMUYmBPXkz3{1=sF2EpdfEICDL5pJAFl?;28Xrn z!~~jSfWx|40SbvmCqeO379u7Q$y?&bOFS>n_^B@>9Hp4wM-L&2^HgG6)z^0pD!vV? zvZi0zHSqQznHE1l!M&qo@k%2;*xj))69vPR2(K|-|NP}XJS zqen~;*#l~AT|CvB&O6TTWWm}6PZioi>wix+7O!`R;7a|t)-Q+d`}^h8^FHX&z4ZJR zP|~2Up3G`8o7ZpfquP6eUP63IsGf-8FARZg5c>N+^fsEI^pmDhc2@svXKV@&906RX zb%CLQh$l0~L%{4Z`T8O2m=M;g66Fcg?ggYP^0jq=K_<#59XBYLEbBQvLn_}LE)BXm zOCC0zfhL0<(mCBRe)$u7L7&Fr)>fXvX0ZX6kBN&%=^EeVc5T-GjBOHA5F@~!Y^59{ zU9!YVds)0fQV|ydVp=*AZCnY_Qwpdizb2$n+eCs(q)o#>RuWrg5T^3h>l_|Go_rDt z0~B0R;kM#Mf7b1$Sd}tBas@Xd3I^N_d5M@Hr=%E!-sIu;C{62)Bo`>S2x^d#5! z6e``D2#(d~bXoZv5tO!kZ*$kr^$C-m=uKTpMrnDp^Itf_NiEWV$UotOT0LO_X@SUY z&KT3LVBLUg;~q0MQskffIpCLfj{g2~wKPE9p+IFrFc!A3cSj`r4W{oac>?5_Bz+YQ zIyLb&V!qdetZI-r3R=9rMnpK6bk9&KU_RS+@R5C@`CB=g*ZME)*Tb804ko`_^oIy5 zq&7fx3w#N9P#wW8_YUM8GM@REn^|_>#_Ve8ZQU^Ljn{RxD#MIy!nyHjObAj7Dq@GK zQ~6>oZr!bf;VP=*Ii*tqtYgyDp(iv+r%V2e)(o>GV zK_pfL&)%`;nE~}PXYyrT;T|&b#A_jlKW5nKD+yb+b=^Zf8vPZvKt(6t>anTcqLLY4 z%LZ*C=4bSSRK;elCG}!FsOSkD{H8mt-sgs%#~mv(tAfr<%P0rN`J15Gz((bd-^9}& z($8K-Ux7|@>Knc5(5S)!a}&$Y;77wU(XWx`U5)pX`hyRj?afW3(f2|w8av#E*xt-{ zE#H2Ac1v}SD0BfQl>a^Xa6*sUXbuflH2AD#WGaJ!=0!Ab(;sOSeBPF8vPzv%<+=zmi@BMTIk(K9uKkL>&wUOjqb`qpp6X?F zgTx9xCX2b=<>aB{Cne4SAsKj&I36{fjkDOsGsXU$2LqM-{rWD6vkTto=@2ibagB^P zyy~jK%_z1;$#*?yBu)JTOU~12smIUbqsb>Ee5jyZ4ox&wRn0_H;9aHFvG@YIr0ltGtMh3@yh(U*BS&RtD5cyZ_4{gU z=TFs+7@oMqyE&>2N_Nbr(~s;18|oBK8u0G7!HA@2!v#hK^708X?H>Dwh5`Z$Zs?kBY9e~S<#7& zch<2%W+;Molkmt6Za>^{i50+uwr{$HdPKfF=~+s;ywoRVT@FR1v)a9NvFseD6U+m_ zPtpQG{-KN53Ff5XS^uk zL}SNTWoW5B$|Z|Q&AvXXz9;VP0TMGd`vb$EiiJ*G|dFKYw2RVKt;F zR3VhA{xHb#zA)QO5|%=)dtWoD=LhGrvkN2>GVw_UNwNoO4w^X!o_xzhO#s{s!GVKn z3XbB&0M$VBalr6{I+fMy+ejz^qB}@t3%*Y6-pa>ofWkZDtzcOB!o7@RwEII>gJRw)psn-Naz0AOWGd_zmR{6+o7?JBqM1E_UOE2guK)34!Jzgd zbZB1rQQudK?zi_b05{^Hlq5m|XQ6YbrlzJD0Aw|l+KvNoAoanVAf#h~7knm4MFInb zV8!JW6dI5uDfq&;^sxWNMvjDVz(5sQ4|9P-0y5Bz0n~iI%n3d{b9a6KMgBvb#<7Nq z-eEQljwVR2ku_+IzZG&0Nfd>$j!up+3!WbzTW?ouZIoD} zH8nqggCFp%`NI@-nP~LRK?51R(tc&=w^WoDBrJis8_{7^LK?2msm33&9t^+^uF@20 zUns2JqqLi@xg-iDhFAR@Jm!}gtEz<-@*l^Sk(qZ1Uy*vBosA3l z?w6OF4d2ROj6g;lJbcQwW8M)W zk&*;(a9)v(l0+GSpT+rX={1eh5Kq^5h;cXNOLtF)mbd&G;@jG3x)XH}c0vph39^ok zp9V4qtsnpdA3SfaVZf-PAV5JvydNpM{CiEhbQ^i>xx<9{?f4#d3`@e9hA82^*(MFL=re$K4FReVC6JRM zyEkd(m*-*WCW;Jtj3IXk(gJD?fgcA@+~-QnQR~Hz?&3a&I$q=GC2NpU^cD0{rjx z=>aBcdshsc@y&n`fUMt){_d*fVW4aOTv$*Dhf=k?cbBd$;xhvi5)ROqA&_dOBZeK; zAZaLyX7Gw#BWJy{^9B`IUM{p;0>QWn8S0RbplsFI(?jO?^%10Y4x@-D3#+QcFeKrl zl#z!=)e6|KuWD;=12*;& zdBP?u3kwPbepYN0Z_Vx=11RET`e{Urjo}|Y-sL4@s zu9i7K;7XV9@VdPUnJVvrCD2D>1wVo$-5)bE@A-!YoLnI;7y<<(0genY704nDT#u7p9{XGEHM4aqKMhu_?k4#E>4RI1M0|g4_H9}DcNfvbT@R$X#cMB*P zHzAzX7?v`Wn;4JTw*{>y(r4C)gB|dwt6r^vJF634q2kY{s;cUXq+&vG6-vl2FLzo@ zLcRuEX<0yB+1nnTLn4O6_qVnn=lAx+#6%GQrNAIc!NWI~F=&N+dnj6=Bn$Pc5qcaf zSWu=NsO#9DsuO0Wxn``M)niI*=g5+BrMMB_ssBdq*ABGZ_V$U=U>}JBo;)c+q?@Lurr2Q2uB>*UjeDj9k)925~Yc+#= z)?bPF3P4#&q<9Q=cYkWuN%7bpLD-PNJ0S-t6La$r1D_L3Sk{AqAs+;fDLs}`W)IL@ zxsYIHFuym$?AQ#-*Z_#HMG}htKJzz7eFx|uCxQ%RB@U8cXkv4p7?j#1KnklAS6m1{ z)k7fkp%L2_YiAzcccjL<@@8g!z7lLn?tZbGd;qCKAwWRahFOM^%K|e|%>5G*6CE2H z+W_g=Nd7k4slQ>(%IfmD2=_crCMIbiQBgc-qxHg~MMO-@fB;o@`OS|YCPf-Had%-+ zMaW9UuxceCQ)-kFEuePQl6tZOg z|NhwTO}h!`{{@}N?=ScfNJxU+Hm&e80)yJ=z4yB2GSMxSsw=oe)s9GjDo_M5P%vaI zAQB5HUO)Y%1Hq$2oDYt-&yvCQh~&0B;u1ucqkJLKfdP_6!FT++v<1ALNW=iZ*&%@~ zvv&x?7ue{?+yhc$Nniz2xo|RAJ#&KyV9I8IU_>M)hQQXJ0c_1cf^9&$Pk?1aYildc zfq%6=q*glz2uR&EkhDq+ObEN3SppOSR0l&gc(nzO9!L)y!>0rH||UfM!E3E#L}_ z09YafnWeTh*tDCXQc}Vp?HgtXBFG0t8jSEwp+o)jR~>kC5xPA1ir{~&E#}`m z`I6!CKzJx7Ag2Zr31E7LY03!JZ;>_V??47hE0Aj;&=3#2#{i+yU8!~7W`-&kLQ;fz zv96=zqW95GJp^d{%anp^i4EfUW>_p-O2xq_+tkt`adw-OD1jPw3j-#w7R~?$41Q%$ zxMgUF6!}R>htm-gnAzpLXR{!4JZH9D$O$Zo(s2U_K0LkQZbaIM>dlwNAvDlplCG|^QknRqt zNvcV-^gy2`I)DB=OfY$a;PrU@8nlLR%n< zw+?BCZ2go+SYt5P4=40P{3aNMkOYZ*{%L8GR4k%icAyfo0q1{rFTmeF5HgVz3Nc{i zE*B{)fgk_`!N0r<8!vx&)LA$^*R;LXj;gM`#9{uaP(l$MtESwm(ugh(ZYC| zv6_R_@^W(MWDkxi!%7Cv#!6^L%{DA=9o8l4iy{{f}~ZzL^1H7zrOxMw+;x6z)|gDmnI9zII0gG1b1{O zK*Y_;jyU^MZ)2xF>D!8mZhp^zP1-*(GWShSWdKV2ibMO%gI zA4m!9)bp@Sf!Oa5xCiv$I{@1_IRwQ(Fw=Y2FxbDtHV7~tA@EGVu^9j|>lwxuAUjJT zqX9Wq0|8Ms+~EYhIspA=L&)n1nI&Bn6nxnOAvw9EdOx^s#OC_n>>(UB_twZ1Xz^axBCo8 z?gnhlYj;iuwBhKJshl)svPz`3T`&5akmy$Ar%!y&>k|}z_SXCqGOPwlU|K|)k&oap zU066SB_LX!rI2JuWj2D8FMv<|fR*ocjh4Lp1<2>_o(&J&L4FMXU1{Y1A4d~7shAl3 hf1h0bPd{Eb!{|7;dOOY9EExs=$;&897f2bt_+NNwi1q*g literal 0 HcmV?d00001 diff --git a/BXNL/simple_BXNL/img/fig4.png b/BXNL/simple_BXNL/img/fig4.png new file mode 100644 index 0000000000000000000000000000000000000000..5b465c95249b13febce67d6a36e0628a6896bd0b GIT binary patch literal 59739 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
    daZ*z< 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 b*qwxu8`>77=5ROy_(xtw`AxZ$N$~#$qsd(5 literal 0 HcmV?d00001 diff --git a/BXNL/simple_BXNL/output.txt b/BXNL/simple_BXNL/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..fac138606a82b0edac266972627278c4c2adb1d5 GIT binary patch literal 2764 zcmd6p+fKqj5QgX4#CPbuhm^LI)_e5EsEN`0%0V$A2vmG}^_$%mXpw_rjoEa&rcz2{Jt^{&MITS}OWFXJ-Bt7bmBr;;`$+X5Yp*@xtNzHhNwj+J!Ch~w(n_ic{ zO5E{J(a@G7X&H?wJwndv)wM(V16Hc`zR~3{S}yyt$JjN}317;(6Z%%?E0QC*r*0eU z2|GII9I~>9&IH|xc)&k3W6I5uDKm;)(OQ({U90I^F1H3(3TnmLrB?gd-km(sY8kA` zZZ(cTj`3O`p42E!?CeUkX8meSKbx^!G+IVjI%i^insZRUIQU2X-o_&xtgkUtE;YE+ zK;Mu$pXCxSttw0XUjJ(@WBi~IWLa#>%!f-17xhe(aS8tcmkB(E-^8JQ2`LfY@iH#8 zZ|c~^OV%&DXsBM+V!R^8=NadfxY2%+WjC9%s>iZwhq)bloWr-wgXf&xDN#|(*F_zR zxoUCdhFBVIkX>BAxjo0IYx5{`i9mN&nsQ*;xi-(tdW;3)6Q9Ldjoz}Xw^Q^MG3L6~ zV^kDA8KJ=m3jZ9VpYdIfF$7}_N{{?oUpnVi+cDS*qvq8RbTKI7%#L}KXuMSG>-tt0 z8wQ2mWO^6>bv)*`%z9s|9etD28?(E%YCGz=xg;0n?}DD#x6P?}ec9KJeVNVkjlS}V VZyeXeXGHCqSPfudUkj1w4xhdp1{weW literal 0 HcmV?d00001 diff --git a/BXNL/simple_BXNL/source/SimpleBXNL.java b/BXNL/simple_BXNL/source/SimpleBXNL.java new file mode 100644 index 0000000..5450d5f --- /dev/null +++ b/BXNL/simple_BXNL/source/SimpleBXNL.java @@ -0,0 +1,301 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RM; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04GG; +import com.nag.routines.E04.E04GGU; +import com.nag.routines.E04.E04GGV; +import com.nag.routines.E04.E04FFU; + +import java.lang.Math; +import java.util.Arrays; +import java.io.File; +import java.io.IOException; +import java.io.FileWriter; + +public class SimpleBXNL { + + public final static String dataFolder = ".." + File.separator + "data"; + + public static void main(String[] args) { + + int i; + + // problem data + // number of observations + int nres = 64; + // ovservations + int[] diameter = new int[nres]; + for (i = 0; i < nres; i++) { + diameter[i] = i + 1; + } + double[] density = new double[] { 0.0722713864, 0.0575221239, 0.0604719764, 0.0405604720, 0.0317109145, + 0.0309734513, 0.0258112094, 0.0228613569, 0.0213864307, 0.0213864307, 0.0147492625, 0.0213864307, + 0.0243362832, 0.0169616519, 0.0095870206, 0.0147492625, 0.0140117994, 0.0132743363, 0.0147492625, + 0.0140117994, 0.0140117994, 0.0132743363, 0.0117994100, 0.0132743363, 0.0110619469, 0.0103244838, + 0.0117994100, 0.0117994100, 0.0147492625, 0.0110619469, 0.0132743363, 0.0206489676, 0.0169616519, + 0.0169616519, 0.0280235988, 0.0221238938, 0.0235988201, 0.0221238938, 0.0206489676, 0.0228613569, + 0.0184365782, 0.0176991150, 0.0132743363, 0.0132743363, 0.0088495575, 0.0095870206, 0.0073746313, + 0.0110619469, 0.0036873156, 0.0051622419, 0.0058997050, 0.0014749263, 0.0022123894, 0.0029498525, + 0.0014749263, 0.0007374631, 0.0014749263, 0.0014749263, 0.0007374631, 0.0000000000, 0.0000000000, + 0.0000000000, 0.0000000000, 0.0000000000 }; + + // Define iuser and ruser to be passed to the callback functions + int[] iuser = diameter; + double[] ruser = density; + + // Print data to files for creating the figures in the doc + printVectorToFile(diameter, "diameter.d"); + printVectorToFile(density, "density.d"); + + // parameter vector: x = (a, b, Al, mu, sigma, Ag) + int nvar = 6; + + // Initialize the model handle + E04RA e04ra = new E04RA(); + long handle = 0; + int ifail = 0; + e04ra.eval(handle, nvar, ifail); + + handle = e04ra.getHANDLE(); + + // Define a dense nonlinear least-squares objective function + E04RM e04rm = new E04RM(); + ifail = 0; + e04rm.eval(handle, nres, 0, 0, new int[] {}, new int[] {}, ifail); + + // Add weights for each residual + double[] weights = new double[nres]; + Arrays.fill(weights, 1.0); + for (i = 55; i < 63; i++) { + weights[i] = 5.0; + } + double weights_sum = Arrays.stream(weights).sum(); + for (i = 0; i < weights.length; i++) { + weights[i] /= weights_sum; + } + + // Define the reliability of the measurements (weights) + E04RX e04rx = new E04RX(); + ifail = 0; + e04rx.eval(handle, "RW", 0, weights.length, weights, ifail); + + // Restrict parameter space (0 <= x) + E04RH e04rh = new E04RH(); + double[] bl = new double[nvar]; + double[] bu = new double[nvar]; + Arrays.fill(bu, 100.0); + ifail = 0; + e04rh.eval(handle, nvar, bl, bu, ifail); + + // Set some optional parameters to control the output of the solver + E04ZM e04zm = new E04ZM(); + ifail = 0; + + e04zm.eval(handle, "Print Options = NO", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Solution = X", ifail); + e04zm.eval(handle, "Bxnl Iteration Limit = 100", ifail); + // Add cubic regularization term (avoid overfitting) + e04zm.eval(handle, "Bxnl Use weights = YES", ifail); + e04zm.eval(handle, "Bxnl Reg Order = 3", ifail); + e04zm.eval(handle, "Bxnl Glob Method = REG", ifail); + + // Define initial guess (starting point) + double[] x = new double[] { 1.63, 0.88, 1.0, 30, 1.52, 0.24 }; + + // Call the solver + E04GG e04gg = new E04GG(); + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + LSQHES lsqhes = new LSQHES(); + LSQHPRD lsqhprd = new LSQHPRD(); + MONIT monit = new MONIT(); + double[] rx = new double[nres]; + double[] rinfo = new double[100]; + double[] stats = new double[100]; + long cpuser = 0; + ifail = 0; + + e04gg.eval(handle, lsqfun, lsqgrd, lsqhes, lsqhprd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser, + cpuser, ifail); + + System.out.println(); + + // Optimal parameter values + // Al * log-Normal(a, b): + double aopt = x[0]; + double bopt = x[1]; + double Alopt = x[2]; + + // Ag * gaussian(mu, sigma): + double muopt = x[3]; + double sigmaopt = x[4]; + double Agopt = x[5]; + + // objective function value + System.out.println("Objective Function Value: " + rinfo[0]); + + // Print data to files for creating the figures in the doc + double[] dh = new double[10 * nres + 8]; + for (i = 0; i < dh.length; i++) { + dh[i] = (i + 1) / 10.0; + } + double[] lopt = lognormal(dh, aopt, bopt, Alopt); + double[] gopt = gaussian(dh, muopt, sigmaopt, Agopt); + double[] w = new double[lopt.length]; + for (i = 0; i < w.length; i++) { + w[i] = lopt[i] + gopt[i]; + } + printVectorToFile(dh, "dh.d"); + printVectorToFile(lopt, "lopt.d"); + printVectorToFile(gopt, "gopt.d"); + printVectorToFile(w, "w.d"); + printVectorToFile(x, "x.d"); + + // Destroy the handle: + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + } + + // Define Normal and log-Normal distributions + public static double lognormal(int d, double a, double b, double Al) { + return Al / (d * b * Math.sqrt(2 * Math.PI)) * Math.exp(-(Math.pow(Math.log(d) - a, 2)) / (2 * Math.pow(b, 2))); + } + + public static double gaussian(int d, double mu, double sigma, double Ag) { + return Ag * Math.exp(-0.5 * Math.pow((d - mu) / sigma, 2)) / (sigma * Math.sqrt(2 * Math.PI)); + } + + public static double[] lognormal(double[] d, double a, double b, double Al) { + double[] result = new double[d.length]; + for (int i = 0; i < d.length; i++) { + result[i] = Al / (d[i] * b * Math.sqrt(2 * Math.PI)) * Math.exp(-(Math.pow(Math.log(d[i]) - a, 2)) / (2 * Math.pow(b, 2))); + } + return result; + } + + public static double[] gaussian(double[] d, double mu, double sigma, double Ag) { + double[] result = new double[d.length]; + for (int i = 0; i < d.length; i++) { + result[i] = Ag * Math.exp(-0.5 * Math.pow((d[i] - mu) / sigma, 2)) / (sigma * Math.sqrt(2 * Math.PI)); + } + return result; + } + + // Define the least-square function as a mixture of Normal and log-Normal + // functions. Also add its first derivatives + + /** + * Objective function callback passed to the least squares solver. x = (a, b, + * Al, mu, sigma, Ag) + */ + public static class LSQFUN extends E04GG.Abstract_E04GG_LSQFUN { + public void eval() { + int[] d = this.IUSER; + double[] y = this.RUSER; + double a = this.X[0]; + double b = this.X[1]; + double Al = this.X[2]; + double mu = this.X[3]; + double sigma = this.X[4]; + double Ag = this.X[5]; + + for (int i = 0; i < this.NRES; i++) { + this.RX[i] = lognormal(d[i], a, b, Al) + gaussian(d[i], mu, sigma, Ag) - y[i]; + } + } + } + + /** + * Computes the Jacobian of the least square residuals. x = (a, b, Al, mu, + * sigma, Ag) + */ + public static class LSQGRD extends E04GG.Abstract_E04GG_LSQGRD { + public void eval() { + int n = this.X.length; + int[] d = this.IUSER; + double a = this.X[0]; + double b = this.X[1]; + double Al = this.X[2]; + double mu = this.X[3]; + double sigma = this.X[4]; + double Ag = this.X[5]; + for (int i = 0; i < this.NRES; i++) { + // log-Normal derivatives + double l = lognormal(d[i], a, b, Al); + // dl/da + this.RDX[i * n + 0] = (Math.log(d[i]) - a) / Math.pow(b, 2) * l; + // dl/db + this.RDX[i * n + 1] = (Math.pow(Math.log(d[i]) - a, 2) - Math.pow(b, 2)) / Math.pow(b, 3) * l; + // dl/dAl + this.RDX[i * n + 2] = lognormal(d[i], a, b, 1.0); + // Gaussian derivatives + double g = gaussian(d[i], mu, sigma, Ag); + // dg/dmu + this.RDX[i * n + 3] = (d[i] - mu) / Math.pow(sigma, 2) * g; + // dg/dsigma + this.RDX[i * n + 4] = (Math.pow(d[i] - mu, 2) - Math.pow(sigma, 2)) / Math.pow(sigma, 3) * g; + // dg/dAg + this.RDX[i * n + 5] = gaussian(d[i], mu, sigma, 1.0); + } + } + } + + public static class LSQHES extends E04GG.Abstract_E04GG_LSQHES { + public void eval() { + E04GGU e04ggu = new E04GGU(); + e04ggu.eval(this.NVAR, this.X, this.NRES, this.LAMBDA, this.HX, this.INFORM, this.IUSER, this.RUSER, + this.CPUSER); + this.INFORM = e04ggu.getINFORM(); + } + } + + public static class LSQHPRD extends E04GG.Abstract_E04GG_LSQHPRD { + public void eval() { + E04GGV e04ggv = new E04GGV(); + e04ggv.eval(this.NVAR, this.X, this.Y, this.NRES, this.HXY, this.INFORM, this.IUSER, this.RUSER, + this.CPUSER); + this.INFORM = e04ggv.getINFORM(); + } + } + + public static class MONIT extends E04GG.Abstract_E04GG_MONIT { + public void eval() { + E04FFU e04ffu = new E04FFU(); + e04ffu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04ffu.getINFORM(); + } + } + + public static void printVectorToFile(double[] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); + for (int i = 0; i < a.length; i++) { + writer.write(a[i] + " "); + } + writer.write("\n"); + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + + public static void printVectorToFile(int[] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); + for (int i = 0; i < a.length; i++) { + writer.write(a[i] + " "); + } + writer.write("\n"); + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } +} From 072689dd35682139461d68c432fc261b0c2c1edd Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 12:54:15 +0200 Subject: [PATCH 156/196] Fixed BXNL doc --- BXNL/Readme.md | 51 ++++++++++++++++++++++---------------- BXNL/simple_BXNL/Readme.md | 10 ++++---- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 4b21542..12efd71 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -8,8 +8,7 @@ # Nonlinear Least-Squares Trust-Region Method (BXNL) -[ [`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | -[`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl) ] +[ [`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | [`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl) ] Data fitting and calibrating parameters of complex numerical models is one of the most common problems found in numerous industries such as physics, space exploration, simulations, engineering, amongs many others. @@ -20,12 +19,14 @@ and is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk Figure 1 shows an illustrative simple problem of data fitting ([more details](./orbit_ex/Readme.md)). The task is to find the optimal orbit path given a variety of measurements for which the orbit has to approximatly pass-by. - - - - -
    Optimal orbit from data orbit measurements. - Weighted optimal orbit from data orbit measurements.
    +
    +
    + Optimal orbit from data orbit measurements. +
    +
    + Weighted optimal orbit from data orbit measurements. +
    +
    **Figure 1.** Example of a NLLS orbital data fitting. Given a set of 7 orbital data points the task is to estimate an optimal orbit path that minimizes the error between the path and the fixed data points. For this example assume that expert knowledge provides insight on the reliability of each measument and that for this satellite configuration operational orbit height should around 250 +/-3 units. Center plot shows a simple fit where each measurement (data point) contributes the same amount and provides an optimal orbit height of 238.76 units. The fit is quite poor in the sense that it does not satisfy expert advice. Evidently data point 0 (yellow cross closest to earch surface) unreliablity should be taken into account while doing the fitting. Weights for the residuals should be proportional to the inverse of their variability. For this example suppose we are provided with the accuracy for each of the data measurements, this can be factored using weighted nonlinear least-squares. The rightmost plot shows the weighted optimal solution with orbit height of 254.90 units wich is withing the suggested tolerance. Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was taken from [EUMETSAT, Copyright 2020](https://pics.eumetsat.int/viewer/index.html#help). @@ -34,7 +35,7 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./ # More Info 1. [BXNL information leaflet](https://www.nag.com/content/faster-data-fitting-solver) 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) - 3. Examples [[Java example](../simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] + 3. Examples [[Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] # Unfolding Nuclear Track Data @@ -53,12 +54,14 @@ using as data the histogram heights. The NLLS solution provides the unfolded parameters for the two distributions (red and blue curves in right plot in Figure 2). Adding these together produces the green curve which is the one used to perform the fitting with. - - - - - -
    PADC etch track diameter histogram unfoldingExperimental histogram of track diameter
    +
    +
    + PADC etch track diameter histogram unfolding +
    +
    + Experimental histogram of track diameter +
    +
    **Figure 2.** Left: example of a PADC target with alpha particle etched tracks, wedges in red show the track diameter. @@ -82,13 +85,17 @@ should present significant improvement for unconstrained or bound-constrained no least-squares solvers in the NAG Library and current users of [`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html) are highly encourage to try out the new solver. - - - -
    Performance Profile (time:seconds) - Performance Profile (number of function calls) - Performance Profile (number of gradient calls) -
    +
    +
    + Performance Profile (time:seconds) +
    +
    + Performance Profile (number of function calls) +
    +
    + Performance Profile (number of gradient calls) +
    +
    **Figure 3.** Performance profiles comparing solvers e04gg and e04gb over 68 CUTEst unconstrained nonlinear least-squares problems. Performance measure are: time in seconds (left), number of function calls (center) and number of gradient calls diff --git a/BXNL/simple_BXNL/Readme.md b/BXNL/simple_BXNL/Readme.md index c085ea4..71adbed 100644 --- a/BXNL/simple_BXNL/Readme.md +++ b/BXNL/simple_BXNL/Readme.md @@ -68,7 +68,7 @@ using the histogram heights reported in Figure 2.

    -**Figure 2**: Histogram of etched track diameter of $\alpha$ particles. Bar heights are the data that will be fitted unsing the aggregated model $\phi(x, t)$. +**Figure 2**: Histogram of etched track diameter of $$\alpha$$ particles. Bar heights are the data that will be fitted unsing the aggregated model $$\phi(x, t)$$. ```java // Define Normal and log-Normal distributions @@ -97,9 +97,9 @@ using the histogram heights reported in Figure 2. } ``` -In terms of solving this problem, the function to minimize is the sum of residuals using the model $\phi(x;t)$ -and the data pair (`diameter`, `density`). The parameter vector is $x = (a, b, A_l, \mu, \sigma, A_g)$. The next step is to define a function to return the residual vector -$\text{lsqfun}(x) := \big[r_1(x), r_2(x), \dots, r_{n_{\text{res}}}(x)\big]$. +In terms of solving this problem, the function to minimize is the sum of residuals using the model $$\phi(x;t)$$ +and the data pair (`diameter`, `density`). The parameter vector is $$x = (a, b, A_l, \mu, \sigma, A_g)$$. The next step is to define a function to return the residual vector +$$\text{lsqfun}(x) := \big[r_1(x), r_2(x), \dots, r_{n_{\text{res}}}(x)\big]$$. ```java // Define the least-square function as a mixture of Normal and log-Normal @@ -262,7 +262,7 @@ Call the solver 6 0.00000E+00 3.36877E-01 1.00000E+02 ``` -The optimal solution $x$ provides the unfolded parameters for the two distributions, Normal and log-Normal (blue and red curves in Figure 4). Adding these together produces the aggragated curve (shown in color green of Figure 3 and 4) this last one is the one used to perform the fitting with. The optimal solution is +The optimal solution $$x$$ provides the unfolded parameters for the two distributions, Normal and log-Normal (blue and red curves in Figure 4). Adding these together produces the aggragated curve (shown in color green of Figure 3 and 4) this last one is the one used to perform the fitting with. The optimal solution is ```java // Optimal parameter values From ef8bb61366dcb351ba53a54eae2e6d4f2b5b38f9 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:01:45 +0200 Subject: [PATCH 157/196] Fixed BXNL doc --- BXNL/Readme.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 12efd71..76f332b 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -8,7 +8,7 @@ # Nonlinear Least-Squares Trust-Region Method (BXNL) -[ [`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | [`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl) ] +[[`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | [`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl)] Data fitting and calibrating parameters of complex numerical models is one of the most common problems found in numerous industries such as physics, space exploration, simulations, engineering, amongs many others. @@ -21,10 +21,10 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./
    - Optimal orbit from data orbit measurements. + Optimal orbit from data orbit measurements.
    - Weighted optimal orbit from data orbit measurements. + Weighted optimal orbit from data orbit measurements.
    @@ -56,10 +56,10 @@ Adding these together produces the green curve which is the one used to perform
    - PADC etch track diameter histogram unfolding + PADC etch track diameter histogram unfolding
    - Experimental histogram of track diameter + Experimental histogram of track diameter
    @@ -87,13 +87,13 @@ are highly encourage to try out the new solver.
    - Performance Profile (time:seconds) + Performance Profile (time:seconds)
    - Performance Profile (number of function calls) + Performance Profile (number of function calls)
    - Performance Profile (number of gradient calls) + Performance Profile (number of gradient calls)
    From 2a581e570496cad8d9a7bb8f1d1f4c0363031291 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:12:10 +0200 Subject: [PATCH 158/196] Fixed BXNL doc --- BXNL/Readme.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 76f332b..bd6ee5d 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -8,7 +8,7 @@ # Nonlinear Least-Squares Trust-Region Method (BXNL) -[[`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html) | [`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html) | [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl)] +[[`e04ggf`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html), [`e04ggc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html), [`handle_solve_bxnl`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bxnl)] Data fitting and calibrating parameters of complex numerical models is one of the most common problems found in numerous industries such as physics, space exploration, simulations, engineering, amongs many others. @@ -19,14 +19,19 @@ and is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk Figure 1 shows an illustrative simple problem of data fitting ([more details](./orbit_ex/Readme.md)). The task is to find the optimal orbit path given a variety of measurements for which the orbit has to approximatly pass-by. -
    + + +
    + Optimal orbit from data orbit measurements. + Weighted optimal orbit from data orbit measurements. +
    **Figure 1.** Example of a NLLS orbital data fitting. Given a set of 7 orbital data points the task is to estimate an optimal orbit path that minimizes the error between the path and the fixed data points. For this example assume that expert knowledge provides insight on the reliability of each measument and that for this satellite configuration operational orbit height should around 250 +/-3 units. Center plot shows a simple fit where each measurement (data point) contributes the same amount and provides an optimal orbit height of 238.76 units. The fit is quite poor in the sense that it does not satisfy expert advice. Evidently data point 0 (yellow cross closest to earch surface) unreliablity should be taken into account while doing the fitting. Weights for the residuals should be proportional to the inverse of their variability. For this example suppose we are provided with the accuracy for each of the data measurements, this can be factored using weighted nonlinear least-squares. The rightmost plot shows the weighted optimal solution with orbit height of 254.90 units wich is withing the suggested tolerance. Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was taken from [EUMETSAT, Copyright 2020](https://pics.eumetsat.int/viewer/index.html#help). From 9b6348e34bfc2a53ac89fba454527a623c59196e Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:18:08 +0200 Subject: [PATCH 159/196] Fixed BXNL doc --- BXNL/Readme.md | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index bd6ee5d..5c5bd27 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -19,18 +19,9 @@ and is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk Figure 1 shows an illustrative simple problem of data fitting ([more details](./orbit_ex/Readme.md)). The task is to find the optimal orbit path given a variety of measurements for which the orbit has to approximatly pass-by. - -
    - Optimal orbit from data orbit measurements. - Weighted optimal orbit from data orbit measurements. + Optimal orbit from data orbit measurements. + Weighted optimal orbit from data orbit measurements.
    **Figure 1.** Example of a NLLS orbital data fitting. @@ -59,14 +50,10 @@ using as data the histogram heights. The NLLS solution provides the unfolded parameters for the two distributions (red and blue curves in right plot in Figure 2). Adding these together produces the green curve which is the one used to perform the fitting with. -
    -
    - PADC etch track diameter histogram unfolding -
    -
    - Experimental histogram of track diameter -
    -
    +
    + PADC etch track diameter histogram unfolding + Experimental histogram of track diameter +
    **Figure 2.** Left: example of a PADC target with alpha particle etched tracks, wedges in red show the track diameter. @@ -90,17 +77,11 @@ should present significant improvement for unconstrained or bound-constrained no least-squares solvers in the NAG Library and current users of [`e04gb`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04gbf.html) are highly encourage to try out the new solver. -
    -
    - Performance Profile (time:seconds) -
    -
    - Performance Profile (number of function calls) -
    -
    - Performance Profile (number of gradient calls) -
    -
    +
    + Performance Profile (time:seconds) + Performance Profile (number of function calls) + Performance Profile (number of gradient calls) +
    **Figure 3.** Performance profiles comparing solvers e04gg and e04gb over 68 CUTEst unconstrained nonlinear least-squares problems. Performance measure are: time in seconds (left), number of function calls (center) and number of gradient calls From 86f00c41c79cafde22275f77b0cdc464d8f0c7de Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:21:40 +0200 Subject: [PATCH 160/196] Fixed BXNL doc --- BXNL/Readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 5c5bd27..a855dcf 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -20,8 +20,8 @@ and is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk Figure 1 shows an illustrative simple problem of data fitting ([more details](./orbit_ex/Readme.md)). The task is to find the optimal orbit path given a variety of measurements for which the orbit has to approximatly pass-by.
    - Optimal orbit from data orbit measurements. - Weighted optimal orbit from data orbit measurements. + Optimal orbit from data orbit measurements. + Weighted optimal orbit from data orbit measurements.
    **Figure 1.** Example of a NLLS orbital data fitting. @@ -51,8 +51,8 @@ parameters for the two distributions (red and blue curves in right plot in Figur Adding these together produces the green curve which is the one used to perform the fitting with.
    - PADC etch track diameter histogram unfolding - Experimental histogram of track diameter + PADC etch track diameter histogram unfolding + Experimental histogram of track diameter
    **Figure 2.** Left: example of a PADC target with alpha @@ -79,8 +79,8 @@ are highly encourage to try out the new solver.
    Performance Profile (time:seconds) - Performance Profile (number of function calls) - Performance Profile (number of gradient calls) + Performance Profile (number of function calls) + Performance Profile (number of gradient calls)
    **Figure 3.** Performance profiles comparing solvers e04gg and e04gb over 68 CUTEst unconstrained nonlinear least-squares problems. From 1b975c5e7aad6a2d1f2a79c29ccb3799f0f5aa6e Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:25:52 +0200 Subject: [PATCH 161/196] Fixed BXNL doc --- BXNL/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index a855dcf..b3196e3 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -51,7 +51,7 @@ parameters for the two distributions (red and blue curves in right plot in Figur Adding these together produces the green curve which is the one used to perform the fitting with.
    - PADC etch track diameter histogram unfolding + PADC etch track diameter histogram unfolding Experimental histogram of track diameter
    From 0ba9230a9fbf0f9db3832aecc1d953e1340558ab Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 13:32:45 +0200 Subject: [PATCH 162/196] Fixed BXNL doc --- BXNL/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index b3196e3..6d25afe 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -51,7 +51,7 @@ parameters for the two distributions (red and blue curves in right plot in Figur Adding these together produces the green curve which is the one used to perform the fitting with.
    - PADC etch track diameter histogram unfolding + PADC etch track diameter histogram unfolding Experimental histogram of track diameter
    From 29f808d498e08cd77b146714ea970789364c4f75 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 15:50:54 +0200 Subject: [PATCH 163/196] Fixed BXNL doc --- BXNL/orbit_ex/Readme.md | 15 +++++++++------ BXNL/orbit_ex/source/OrbitEx.java | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/BXNL/orbit_ex/Readme.md b/BXNL/orbit_ex/Readme.md index 490c12b..9c305de 100644 --- a/BXNL/orbit_ex/Readme.md +++ b/BXNL/orbit_ex/Readme.md @@ -1,7 +1,7 @@ > ## Important Information -> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/BXNL/orbit_ex) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/BXNL/orbit_ex). > -> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/impVolDemo.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/opt_imp_vol/output.txt). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/BXNL/orbit_ex/source/OrbitEx.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/BXNL/orbit_ex/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). @@ -23,7 +23,7 @@ Example of a nonlinear least-square orbital data fitting. Given a set of orbital
    - +
    Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was taken from [EUMETSAT, Copyright 2020](https://pics.eumetsat.int/viewer/index.html#help). @@ -32,7 +32,9 @@ Image credit: [Image of Earth](https://pics.eumetsat.int/viewer/index.html) was The previous image shows the orbit measurements to which an optimal orbit, `r`, must be estimated. The simple univariate problem to solve is: -![LaTeX equation: min f(x) = sum i=1 to nres of (tr[i]^2 - r^2)^2](img/ltx_optprb.png) +
    + LaTeX equation: min f(x) = sum i=1 to nres of (tr[i]^2 - r^2)^2 +
    Here `tr[i]` contains the squared norm for the measurement point `i`, given by the coordinate pair `(tx[i], ty[i])`. Note that the coordinates for the center of the planet are provided by the vector `cc`. @@ -49,6 +51,7 @@ Here `tr[i]` contains the squared norm for the measurement point `i`, given by t
    ```java + // Define the least-square function and add first derivatives. /** * Objective function call back passed to the least squares solver. Return the * difference between the current estimated radius squared, r^2=x^2 and the @@ -161,7 +164,7 @@ Call the solver
    - +
    Suppose expert knowledge provides insight on the reliability of each measurement and that for this satellite configuration, operational orbit height should be around 250 +/-6 units. The previous image shows a fit where each measurement (data point) contributes the same amount and provides an optimal orbit height of 238.76 units. The fit is quite poor in the sense that it does not satisfy expert advice. Evidently data point 0 (yellow cross closest to Earth surface) is unreliable. Unreliability should be taken into account while doing the fitting. For this end, weights for each residuals are introduced (weights should be set to be proportional to the inverse of their variability). For this example, suppose we are provided with the accuracy for each of the data measurements. @@ -216,7 +219,7 @@ Optimal Orbit Height: 254.90
    - +
    diff --git a/BXNL/orbit_ex/source/OrbitEx.java b/BXNL/orbit_ex/source/OrbitEx.java index 1fc887a..b138f2d 100644 --- a/BXNL/orbit_ex/source/OrbitEx.java +++ b/BXNL/orbit_ex/source/OrbitEx.java @@ -203,6 +203,7 @@ public static void main(String[] args) { e04rz.eval(handle, ifail); } + // Define the least-square function and add first derivatives. /** * Objective function call back passed to the least squares solver. Return the * difference between the current estimated radius squared, r^2=x^2 and the From 282a4716c7dee9e7123346f7a5f4b4e2b8e3ce20 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 15:57:53 +0200 Subject: [PATCH 164/196] Fixed BXNL doc --- BXNL/simple_BXNL/Readme.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/BXNL/simple_BXNL/Readme.md b/BXNL/simple_BXNL/Readme.md index 71adbed..ce4e9cf 100644 --- a/BXNL/simple_BXNL/Readme.md +++ b/BXNL/simple_BXNL/Readme.md @@ -1,6 +1,7 @@ > ## Important Information -> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/opt_imp_vol) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/opt_imp_vol). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/BXNL/simple_BXNL) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/BXNL/simple_BXNL). > +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). @@ -25,7 +26,10 @@ The following example illustrates the usage of `e04gg` to fit PADC target with $ etched nuclear track data to a convoluted distribution. A target sheet is scanned and track diameters (red wedges in the following Figure 1) are recorded into a histogram and a mixed Normal and log-Normal model is to be fitted to the experimental histogram (see Figure 2). -![PADC](../images/tracks.png) + +
    + PADC +
    **Figure 1**: PADC with etched $$\alpha$$ particle tracks. From cb8ebd452d382ebc729c2008781e597e8585155d Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 15:59:13 +0200 Subject: [PATCH 165/196] Fixed BXNL doc --- BXNL/simple_BXNL/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BXNL/simple_BXNL/Readme.md b/BXNL/simple_BXNL/Readme.md index ce4e9cf..0b3fa0d 100644 --- a/BXNL/simple_BXNL/Readme.md +++ b/BXNL/simple_BXNL/Readme.md @@ -1,7 +1,7 @@ > ## Important Information > This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/BXNL/simple_BXNL) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/BXNL/simple_BXNL). > -> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/NcmNag.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/nearest_correlation_matrices/output.txt). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/BXNL/simple_BXNL/source/SimpleBXNL.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/BXNL/simple_BXNL/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). From 89882f3c9eff4bd7d070c46eeeb2ce907e4290c6 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 16:02:00 +0200 Subject: [PATCH 166/196] Fixed BXNL doc --- BXNL/simple_BXNL/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BXNL/simple_BXNL/Readme.md b/BXNL/simple_BXNL/Readme.md index 0b3fa0d..4fd5f53 100644 --- a/BXNL/simple_BXNL/Readme.md +++ b/BXNL/simple_BXNL/Readme.md @@ -28,7 +28,7 @@ sheet is scanned and track diameters (red wedges in the following Figure 1) are recorded into a histogram and a mixed Normal and log-Normal model is to be fitted to the experimental histogram (see Figure 2).
    - PADC + PADC
    **Figure 1**: PADC with etched $$\alpha$$ particle tracks. From aca4773eaa4e9b983aa798aa137be33e2e20aca9 Mon Sep 17 00:00:00 2001 From: Christos Date: Mon, 22 Feb 2021 16:09:02 +0200 Subject: [PATCH 167/196] Added link to BXNL example page --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1d7bda9..e46ac6f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This repository contains examples and demonstrations using the [NAG Library for * [Nearest Correlation Matrices](./nearest_correlation_matrices) * [Quadratically constrained quadratic programming and its applications in portfolio optimization](./QCQP) * [Fast Implied Volatilities](./opt_imp_vol) +* [Nonlinear Least-Squares Trust-Region Method (BXNL)](./BXNL) ## Examples that ship with the product From 5bd6401b30ee941570c3fea9de2f5b90ce647296 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 23 Feb 2021 11:21:10 +0200 Subject: [PATCH 168/196] Fixed BXNL doc --- BXNL/Readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 6d25afe..13fd675 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -33,6 +33,7 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./ 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) 3. Examples [[Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] + # Unfolding Nuclear Track Data [[More details for this example](./simple_BXNL/Readme.md)] From e83f3d9f8d88011b268f7470c543a5b57a3fb659 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 23 Feb 2021 11:22:54 +0200 Subject: [PATCH 169/196] Fixed BXNL doc --- BXNL/Readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 13fd675..fa9d723 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -33,7 +33,8 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./ 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) 3. Examples [[Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] - +
    + # Unfolding Nuclear Track Data [[More details for this example](./simple_BXNL/Readme.md)] From 3b430a5a0c056d17c0dc22e5b2a7ffc89a9cd74b Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 23 Feb 2021 11:24:08 +0200 Subject: [PATCH 170/196] Fixed BXNL doc --- BXNL/Readme.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index fa9d723..1f8c91c 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -32,10 +32,8 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./ 1. [BXNL information leaflet](https://www.nag.com/content/faster-data-fitting-solver) 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) 3. Examples [[Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] - -
    - # Unfolding Nuclear Track Data +

    Unfolding Nuclear Track Data

    [[More details for this example](./simple_BXNL/Readme.md)] From 0979f080b8829cc710f3f84948ca4510959aef35 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 23 Feb 2021 11:25:35 +0200 Subject: [PATCH 171/196] Fixed BXNL doc --- BXNL/Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BXNL/Readme.md b/BXNL/Readme.md index 1f8c91c..4532989 100644 --- a/BXNL/Readme.md +++ b/BXNL/Readme.md @@ -33,6 +33,8 @@ Figure 1 shows an illustrative simple problem of data fitting ([more details](./ 2. [BXNL in the NAG Library for Java](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04ggf.html) 3. Examples [[Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04GGJE.java), [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04ggc.html#example), [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04ggf.html#example), [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_disable_ex.main)] +
    +

    Unfolding Nuclear Track Data

    [[More details for this example](./simple_BXNL/Readme.md)] From 9be94fbda6a5dc4a68b68d9a6d8645698deb3f92 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Thu, 29 Apr 2021 11:41:22 +0100 Subject: [PATCH 172/196] Simple Examples Synced --- simple_examples/baseresults/a00aaje.r | 2 +- simple_examples/baseresults/e04kfje.r | 55 ++++++++ simple_examples/baseresults/outputexample.r | 2 +- simple_examples/data/testdir/testtmp2.d | 7 -- simple_examples/data/tmptest.d | 23 ---- simple_examples/source/int32/E04KFJE.java | 133 ++++++++++++++++++++ 6 files changed, 190 insertions(+), 32 deletions(-) create mode 100644 simple_examples/baseresults/e04kfje.r delete mode 100644 simple_examples/data/testdir/testtmp2.d delete mode 100644 simple_examples/data/tmptest.d create mode 100644 simple_examples/source/int32/E04KFJE.java diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r index adcba2f..f55ff48 100644 --- a/simple_examples/baseresults/a00aaje.r +++ b/simple_examples/baseresults/a00aaje.r @@ -5,6 +5,6 @@ Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) Precision: double precision Product Code: CLL6I262CL - Mark: 27.2.0 (self-contained) + Mark: 27.3.0 (self-contained) *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/e04kfje.r b/simple_examples/baseresults/e04kfje.r new file mode 100644 index 0000000..421d894 --- /dev/null +++ b/simple_examples/baseresults/e04kfje.r @@ -0,0 +1,55 @@ + E04KFJ Example Program Results + + E04KF, First order method for bound-constrained problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * d + Print Solution = All * U + Monitoring File = 9 * U + Monitoring Level = 3 * U + Foas Monitor Frequency = 0 * d + Foas Print Frequency = 5 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + Verify Derivatives = No * d + + Foas Estimate Derivatives = No * d + Foas Finite Diff Interval = 1.05367E-08 * d + Foas Iteration Limit = 10000000 * d + Foas Memory = 11 * d + Foas Progress Tolerance = 1.08158E-12 * d + Foas Rel Stop Tolerance = 1.08158E-12 * d + Foas Restart Factor = 6.00000E+00 * d + Foas Slow Tolerance = 1.01316E-02 * d + Foas Stop Tolerance = 1.00000E-06 * d + Foas Tolerance Norm = Infinity * d + End of Options + + + Status: converged, an optimal solution was found + Value of the objective 4.00000E-02 + Norm of inactive gradient 0.00000E+00 + Norm of projected direction 0.00000E+00 + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E+00 8.00000E-01 8.00000E-01 + 2 -2.00000E+00 6.40000E-01 2.00000E+00 + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E+00 0.00000E+00 8.00000E-01 4.00000E-01 + 2 -2.00000E+00 0.00000E+00 2.00000E+00 0.00000E+00 + + + Solution found: + Objective function value at solution: 4.0E-02 + Gradient at solution: -4.0E-01 0.0E+00 + + Estimated Lagrange multipliers: blx 0.0E+00 0.0E+00 + Estimated Lagrange multipliers: bux 4.0E-01 0.0E+00 + diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r index 76fc07e..9794ff3 100644 --- a/simple_examples/baseresults/outputexample.r +++ b/simple_examples/baseresults/outputexample.r @@ -3,7 +3,7 @@ Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran Precision: double precision Product Code: NLL6I27DBL - Mark: 27.2.0 (self-contained) + Mark: 27.3.0 (self-contained) This is a 64-bit library using 32-bit integers. diff --git a/simple_examples/data/testdir/testtmp2.d b/simple_examples/data/testdir/testtmp2.d deleted file mode 100644 index 1cc90f5..0000000 --- a/simple_examples/data/testdir/testtmp2.d +++ /dev/null @@ -1,7 +0,0 @@ -Dummy test file 2 -S17DGF Example Program Data - 'F' ( 0.3, 0.4) 'U' - 'F' ( 0.2, 0.0) 'U' - 'F' ( 1.1, -6.6) 'U' - 'F' ( 1.1, -6.6) 'S' - 'D' (-1.0, 0.0) 'U' diff --git a/simple_examples/data/tmptest.d b/simple_examples/data/tmptest.d deleted file mode 100644 index 6328091..0000000 --- a/simple_examples/data/tmptest.d +++ /dev/null @@ -1,23 +0,0 @@ -Dummy test file -E04TCJ Example Program Data -30 : nres --1.0000000000000000E+00 -9.3103448275862066E-01 -8.6206896551724133E-01 --7.9310344827586210E-01 -7.2413793103448276E-01 -6.5517241379310343E-01 --5.8620689655172420E-01 -5.1724137931034486E-01 -4.4827586206896552E-01 --3.7931034482758619E-01 -3.1034482758620685E-01 -2.4137931034482762E-01 --1.7241379310344829E-01 -1.0344827586206895E-01 -3.4482758620689724E-02 - 3.4482758620689724E-02 1.0344827586206895E-01 1.7241379310344818E-01 - 2.4137931034482762E-01 3.1034482758620685E-01 3.7931034482758630E-01 - 4.4827586206896552E-01 5.1724137931034475E-01 5.8620689655172420E-01 - 6.5517241379310343E-01 7.2413793103448265E-01 7.9310344827586210E-01 - 8.6206896551724133E-01 9.3103448275862055E-01 1.0000000000000000E+00 : x --4.7355262950125371E-01 -5.4938194860076961E-01 -3.9825239170869919E-01 --3.8856020837234490E-01 -5.5342876546898057E-01 -4.9096203345353551E-01 --5.3572741683518588E-01 -4.7612745760879621E-01 -5.3500371923553647E-01 - 6.0158102095753345E-01 -5.8735647599146978E-01 -4.4672492128166008E-01 --2.8302528479868733E-01 -3.0311152621895832E-01 -4.1648482978955480E-02 - 3.7631282343379285E-02 1.6504195889737350E-01 5.1964885199180544E-01 - 5.4702301251386876E-01 -4.4537928919142311E-01 5.9042453784268267E-01 - 6.9016702395652996E-01 6.9143394337665087E-01 7.8263998594593021E-01 - 8.1261679746103432E-01 7.5887968830904762E-01 9.5316846217349571E-01 - 1.1014159319048389E+00 1.0675894279571976E+00 1.1538027971634699E+00 : obs diff --git a/simple_examples/source/int32/E04KFJE.java b/simple_examples/source/int32/E04KFJE.java new file mode 100644 index 0000000..6aa9f92 --- /dev/null +++ b/simple_examples/source/int32/E04KFJE.java @@ -0,0 +1,133 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04RG; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04KF; +import com.nag.routines.E04.E04KFU; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.X04.X04AC; + +import java.lang.Math; + +/** + * E04KF example program text. + */ +public class E04KFJE { + + private static final int NMONIT = 9; + private static final int NVAR = 2; + + public static void main(String[] args) { + + long cpuser = 0; + int nu = 2 * NVAR; + + /* Header */ + System.out.println(" E04KFJ Example Program Results\n"); + + // Define filename for monitoring output + X04AC x04ac = new X04AC(); + int ifail = 0; + x04ac.eval(NMONIT, "e04kffe.mon", 1, ifail); + + // Initialize handle + E04RA e04ra = new E04RA(); + long handle = 0; + ifail = 0; + e04ra.eval(handle, NVAR, ifail); + handle = e04ra.getHANDLE(); + + // Define initial guess point + double[] x = new double[] { -1.5, 1.9 }; + + // Define Simple box bounds on X + E04RH e04rh = new E04RH(); + double[] blx = new double[] { -1.0, -2.0 }; + double[] bux = new double[] { 0.8, 2.0 }; + ifail = 0; + e04rh.eval(handle, NVAR, blx, bux, ifail); + + // Add nonlinear objective information + E04RG e04rg = new E04RG(); + int iidx[] = new int[NVAR]; + for (int i = 0; i < NVAR; i++) + iidx[i] = i + 1; + ifail = 0; + e04rg.eval(handle, NVAR, iidx, ifail); + + // Add options + E04ZM e04zm = new E04ZM(); + ifail = 0; + e04zm.eval(handle, "FOAS Print Frequency = 5", ifail); + + ifail = 0; + e04zm.eval(handle, "Print Solution = yes", ifail); + + ifail = 0; + e04zm.eval(handle, "Print Level = 1", ifail); + + ifail = 0; + e04zm.eval(handle, "Monitoring File = " + NMONIT, ifail); + + ifail = 0; + e04zm.eval(handle, "Monitoring Level = 3", ifail); + + // Solve the problem + E04KF e04kf = new E04KF(); + OBJFUN objfun = new OBJFUN(); + OBJGRD objgrd = new OBJGRD(); + MONIT monit = new MONIT(); + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[0]; + double[] ruser = new double[0]; + ifail = -1; + e04kf.eval(handle, objfun, objgrd, monit, NVAR, x, rinfo, stats, iuser, ruser, cpuser, ifail); + + ifail = e04kf.getIFAIL(); + + // Print objective value at solution + if ((ifail == 0) || (ifail == 50)) { + System.out.printf("\n\n Solution found:\n Objective function value at solution: %9.1E\n", rinfo[0]); + // Retrieve Lagrange multipliers (FDX) + E04RX e04rx = new E04RX(); + double[] u = new double[nu]; + e04rx.eval(handle, "U", 1, nu, u, ifail); + if (ifail == 0) { + System.out.printf(" Gradient at solution: %9.1E %9.1E\n\n", u[0] - u[1], u[2] - u[3]); + System.out.printf(" Estimated Lagrange multipliers: blx %9.1E %9.1E\n", u[0], u[2]); + System.out.printf(" Estimated Lagrange multipliers: bux %9.1E %9.1E\n", u[1], u[3]); + } + } + + System.out.println(); + + // Clean up + E04RZ e04rz = new E04RZ(); + ifail = 0; + e04rz.eval(handle, ifail); + } + + public static class OBJFUN extends E04KF.Abstract_E04KF_OBJFUN { + public void eval() { + // Rosenbrock function + this.FX = Math.pow(1.0 - this.X[0], 2) + 100.0 * Math.pow(this.X[1] - Math.pow(this.X[0], 2), 2); + } + } + + public static class OBJGRD extends E04KF.Abstract_E04KF_OBJGRD { + public void eval() { + this.FDX[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.FDX[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + } + + public static class MONIT extends E04KF.Abstract_E04KF_MONIT { + public void eval() { + E04KFU e04kfu = new E04KFU(); + e04kfu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04kfu.getINFORM(); + } + } +} From be7c9a057db35c3eef03cf1175029bb97388d864 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 4 May 2021 15:20:05 +0300 Subject: [PATCH 173/196] Added new FOAS example --- FOAS/Readme.md | 79 +++++ FOAS/example/Readme.md | 301 ++++++++++++++++++ FOAS/example/Rosenbrock2d.java | 247 ++++++++++++++ FOAS/example/data/X.d | 101 ++++++ FOAS/example/data/Y.d | 101 ++++++ FOAS/example/data/bl.d | 1 + FOAS/example/data/box.d | 2 + FOAS/example/data/bu.d | 1 + FOAS/example/data/steps[0].d | 1 + FOAS/example/data/steps[1].d | 1 + FOAS/example/data/steps[2].d | 1 + FOAS/example/data/z_box.d | 1 + FOAS/example/data/z_m.d | 101 ++++++ FOAS/example/generate_img.py | 47 +++ FOAS/example/img/plot.png | Bin 0 -> 113953 bytes FOAS/example/output.txt | Bin 0 -> 20866 bytes FOAS/images/KF_DG_unconst_tokyo_notriv-NF.png | Bin 0 -> 45317 bytes FOAS/images/KF_DG_unconst_tokyo_notriv-NG.png | Bin 0 -> 46913 bytes FOAS/images/KF_DG_unconst_tokyo_notriv-NT.png | Bin 0 -> 45750 bytes FOAS/images/Rosenbrock2dw.png | Bin 0 -> 638792 bytes FOAS/images/animated.gif | Bin 0 -> 841650 bytes FOAS/images/handle_solve_bounds_foas_ex.png | Bin 0 -> 87305 bytes FOAS/migration/Migration_E04DG_E04KF.java | 139 ++++++++ FOAS/migration/Readme.md | 202 ++++++++++++ FOAS/migration/output.txt | Bin 0 -> 6180 bytes README.md | 1 + 26 files changed, 1327 insertions(+) create mode 100644 FOAS/Readme.md create mode 100644 FOAS/example/Readme.md create mode 100644 FOAS/example/Rosenbrock2d.java create mode 100644 FOAS/example/data/X.d create mode 100644 FOAS/example/data/Y.d create mode 100644 FOAS/example/data/bl.d create mode 100644 FOAS/example/data/box.d create mode 100644 FOAS/example/data/bu.d create mode 100644 FOAS/example/data/steps[0].d create mode 100644 FOAS/example/data/steps[1].d create mode 100644 FOAS/example/data/steps[2].d create mode 100644 FOAS/example/data/z_box.d create mode 100644 FOAS/example/data/z_m.d create mode 100644 FOAS/example/generate_img.py create mode 100644 FOAS/example/img/plot.png create mode 100644 FOAS/example/output.txt create mode 100644 FOAS/images/KF_DG_unconst_tokyo_notriv-NF.png create mode 100644 FOAS/images/KF_DG_unconst_tokyo_notriv-NG.png create mode 100644 FOAS/images/KF_DG_unconst_tokyo_notriv-NT.png create mode 100644 FOAS/images/Rosenbrock2dw.png create mode 100644 FOAS/images/animated.gif create mode 100644 FOAS/images/handle_solve_bounds_foas_ex.png create mode 100644 FOAS/migration/Migration_E04DG_E04KF.java create mode 100644 FOAS/migration/Readme.md create mode 100644 FOAS/migration/output.txt diff --git a/FOAS/Readme.md b/FOAS/Readme.md new file mode 100644 index 0000000..0e83ef4 --- /dev/null +++ b/FOAS/Readme.md @@ -0,0 +1,79 @@ +[![NAG Logo](../nag_logo-removebg.png)](https://www.nag.com) + +> ## Important Information +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# First-order active-set method (FOAS) +[ [`e04kff`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04kff.html) | +[`e04kfc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html) | +[`handle_solve_bounds_foas`](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.opt.handle_solve_bounds_foas) ] + +Implementations of first-order methods not only are ubiquitous and have a widespread use, they have also demonstrated to endure the challenges of ever-growing problems sizes imposed by the industry. Most notable are applications in statistics, e.g. parameter calibration for log-linear models, conditional random fields (L2-regularisation) or logistic multi-class regression, amongs many other. First-order methods and the Conjugate Gradient method inparticular have been a research subject for well over 50 years and continue to be improved. + +FOAS is a [first-order nonlinear conjugate method](https://en.wikipedia.org/wiki/Nonlinear_conjugate_gradient_method) for large-scale bound-constrained nonlinear optimization. The solver is ideal for very large problems (tens of thousands or more variables) where the first-order derivatives are available or are relatively _cheap_ to estimate. + +e04kf is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04intro.html#optsuite) common handle interface. It offers clarity and consistency of the interface of the solvers within the suite, making it trivial to switch among compatible solvers. + +The following example illustrates the simple usage of FOAS to solve the bound-constrained 2D version of the [Rosenbrock function](https://en.wikipedia.org/wiki/Rosenbrock_function) which is a classical test function to measure and profile performance of solvers. Source of this example is avaible in [Rosenbrock2d.java](example/Rosenbrock2d.java). + +
    + 2D Rosenbrock example + 2D Rosenbrock with bounds +
    + +**Figure 1.** 2D Rosenbrock function, (left) the minimum is shown as a yellow dot at x=(1,1). On the right a bound constrained version showing with a purple dotted line a path towards the constrained solution point on the border. + +# More information + 1. [FOAS information page](https://www.nag.com/content/limited-memory-nonlinear-conjugate-gradient-solver) + 2. [FOAS in the NAG Library](https://www.nag.com/numeric/nl/nagdoc_27.1/flhtml/e04/e04kff.html) + 3. [FOAS documentation page [C]](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html) + 4. Examples [ [Java example](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/blob/main/simple_examples/source/int32/E04KFJE.java) | + [C example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html#example) | + [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04kff.html#example) | + [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_solve_bounds_foas_ex.main) ] + +## A modern replacement for NAG solver [`uncon_conjgrd_comp` (`e04dg`)](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04dgf.html) +One of the main design objectives for `handle_solve_bounds_foas` (`e04kf`) was to provide a modern and attractive replacement for the CG solver `e04dg` introduced in Mark 12. While this solver was targeted for unconstrained NLPs, `e04kf` has been extended with an active-set method in order to solve bound-constrained NLPs. + +More recent and modern methods have been incorporated into `e04kf` making it much faster than `e04dg`. The following Figure 2 reports performance profiles over 114 unconstrained NLP CUTEst problems for both solvers `e04kf` and `e04dg`. Contrasting the three plots, it is evident that the new solver is more efficient in time (40% faster) and in general terms is less expensive: requires less function and gradient evaluations. + +
    + Perf profile e04kf/e04dg time (s) + Perf profile e04kf/e04dg function evaluations + Perf profile e04kf/e04dg gradient evaluations +
    + +**Figure 2.** Performance profiles comparing solvers `e04kf` and `e04dg`. In the time plot on the left, higher line indicates faster solver. For the center and right plots higher line represent less functions (NF) or gradients (NG) calls. For all three plots it can be seen that `e04kf` is 40% faster in time and requires less function and gradient calls. + +## Migrating from Marks 25 and 26 to Mark 27 + +Notes and comments on migrating your code from [`uncon_conjgrd_comp (e04dg)`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04dgf.html) to the new FOAS solver [`handle_solve_bounds_foas`, (`e04kff`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04kff.html), +[`e04kfc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html)): + + + * [Java](./migration/Migration_E04DG_E04KF.java) + * [Fortran 90](https://www.nag.com/numeric/nl/nagdoc_latest/flhtml/genint/replace.html#e04dgf) + * [C](https://www.nag.com/numeric/nl/nagdoc_latest/clhtml/genint/replace.html#e04dgc) + * [Python](https://github.com/numericalalgorithmsgroup/NAGPythonExamples/blob/master/local_optimization/FOAS/migration/migration_e04dg_e04kf.ipynb) + +## Beale's function +This example compares the steps taken by FOAS and L-BFGS-B 3.0 to find the solution point to [Beale's function](https://en.wikipedia.org/wiki/Test_functions_for_optimization). It is a classic nonconvex test function used to benchmark nonlinear optimization solvers. + +Both solvers are used to find a minimum to the function and are started at the same initial point (2, 2). The following figure shows an animation of the steps taken by each solver to find a minimum to the function. +It illustrates the agressive steps taken by the [Conjugate Gradient method](https://en.wikipedia.org/wiki/Conjugate_gradient_method) compared to the more conservative steps of BFGS. + +
    + Beale function solved using e04kf and L-BFGS-B +
    + +**Figure 3.** Contour plots for Beale's function (thin blue lines), and the steps taken by FOAS (red) and L-BFGS-B 3.0 (blue) to find the minimum of Beale's funtion at (3, 0.5) marked with a magenta star. It can be seen that FOAS by the 8th step provides a reasonable approximation to the solution point while L-BFGS-B is still relatively far from it. + +## References + + * Hager W W and Zhang H (2005) _A New Conjugate Gradient Method with Guaranteed Descent and an Efficient Line Search_. SIAM J. Optim. 16(1) 170–192 + * Hager W W and Zhang H (2006a) _Algorithm 851: CG DESCENT, a Conjugate Gradient Method with Guaranteed Descent_. ACM Trans. Math. Software 32(1) 113–137 + * Hager W W and Zhang H (2006b) _A New Active Set Algorithm for Box Constrained Optimization_. SIAM J. Optim. 17(2) 525–557 + * Hager W W and Zhang H (2013) _The Limited Memory Conjugate Gradient Method_. SIAM J. Optim. 23(4) 2150–2168 + * Nocedal J and Wright S J (2006) _Numerical Optimization_. (2nd Edition) Springer Series in Operations Research, Springer, New York diff --git a/FOAS/example/Readme.md b/FOAS/example/Readme.md new file mode 100644 index 0000000..f14ca33 --- /dev/null +++ b/FOAS/example/Readme.md @@ -0,0 +1,301 @@ +> ## Important Information +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/example) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example). +> +> The source of this example can be found [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/example/Rosenbrock2d.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/output.txt). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# Rosenbrock function: Bound constrained optimization +First order active set bound-constrained nonlinear programming + +2d Rosenbrock example: This page illustrates the usage of FOAS to solve the bound-constrained 2d Rosenbrock function. There is a plot at the end showing the steps taken by the solver to find the solution point. + +Add objective function, gradient and monitoring callback + +```java +/** + * The objective's function. + */ +public static class OBJFUN extends E04KF.Abstract_E04KF_OBJFUN { + public void eval() { + this.FX = objfunEval(this.X[0], this.X[1]); + } +} + +/** + * The objective's gradient. + */ +public static class OBJGRD extends E04KF.Abstract_E04KF_OBJGRD { + public void eval() { + this.FDX[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.FDX[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } +} + +/** + * The monitor function. + */ +public static class MONIT extends E04KF.Abstract_E04KF_MONIT { + public void eval() { + steps[0].add(this.X[0]); + steps[1].add(this.X[1]); + steps[2].add(this.RINFO[0]); + } +} +``` + +Specify initial guess + +```java +double[] x = new double[] { -1.0, -1.5 }; +``` + +Define the nonlinear objective (add to handle) + +```java +E04RA e04ra = new E04RA(); +E04RG e04rg = new E04RG(); +E04RH e04rh = new E04RH(); +E04ZM e04zm = new E04ZM(); +E04KF e04kf = new E04KF(); + +ifail = 0; +e04ra.eval(handle, nvar, ifail); +handle = e04ra.getHANDLE(); + +ifail = 0; +e04rg.eval(handle, nvar, idxfd, ifail); +``` + +Add the box bounds on the variable x to the handle + +```java +double[] bl = new double[] { -1.0, -2.0 }; +double[] bu = new double[] { 0.8, 2.0 }; +ifail = 0; +e04rh.eval(handle, nvar, bl, bu, ifail); +``` + +Set some algorithmic options + +```java +ifail = 0; +e04zm.eval(handle, "FOAS Print Frequency = 1", ifail); +e04zm.eval(handle, "Print Solution = yes", ifail); +e04zm.eval(handle, "FOAS Monitor Frequency = 1", ifail); +e04zm.eval(handle, "Print Level = 2", ifail); +e04zm.eval(handle, "Monitoring Level = 1", ifail); +``` + +Solve the problem + +```java +OBJFUN objfun = new OBJFUN(); +OBJGRD objgrd = new OBJGRD(); +MONIT monit = new MONIT(); +double[] rinfo = new double[100]; +double[] stats = new double[100]; +int[] iuser = new int[0]; +double[] ruser = new double[0]; +long cpuser = 0; +ifail = 0; +e04kf.eval(handle, objfun, objgrd, monit, nvar, x, rinfo, stats, iuser, ruser, cpuser, ifail); + +// Add last step +steps[0].add(x[0]); +steps[1].add(x[1]); +steps[2].add(rinfo[0]); +``` + +
    + +``` + ---------------------------------------------------------- + E04KF, First order method for bound-constrained problems + ---------------------------------------------------------- + + Begin of Options + Print File = 6 * d + Print Level = 2 * U + Print Options = Yes * d + Print Solution = All * U + Monitoring File = -1 * d + Monitoring Level = 1 * U + Foas Monitor Frequency = 1 * U + Foas Print Frequency = 1 * U + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + Verify Derivatives = No * d + + Foas Estimate Derivatives = No * d + Foas Finite Diff Interval = 1.05367E-08 * d + Foas Iteration Limit = 10000000 * d + Foas Memory = 11 * d + Foas Progress Tolerance = 1.08158E-12 * d + Foas Rel Stop Tolerance = 1.08158E-12 * d + Foas Restart Factor = 6.00000E+00 * d + Foas Slow Tolerance = 1.01316E-02 * d + Foas Stop Tolerance = 1.00000E-06 * d + Foas Tolerance Norm = Infinity * d + End of Options + + Problem Statistics + No of variables 2 + free (unconstrained) 0 + bounded 2 + Objective function Nonlinear + + + ------------------------------------------------------------------------------- + iters | objective | optim | dir + ------------------------------------------------------------------------------- + 0 6.29000E+02 5.00E+02 3.50E+00 + 1 6.29000E+02 5.00E+02 3.50E+00 + 2 4.00000E+00 0.00E+00 1.80E+00 + 3 4.00000E+00 0.00E+00 1.80E+00 + 4 3.99156E+00 2.80E+00 2.80E+00 + 5 3.99156E+00 2.80E+00 2.80E+00 + 6 3.98433E+00 1.44E+00 1.44E+00 + 7 3.97076E+00 5.76E+00 1.79E+00 + 8 3.41157E+00 1.66E+01 1.60E+00 + 9 3.15876E+00 2.07E+01 1.65E+00 + 10 2.34744E+00 2.55E+00 2.29E+00 + 11 2.06122E+00 5.09E+00 1.83E+00 + 12 1.97065E+00 6.49E+00 1.88E+00 + 13 1.77751E+00 9.58E+00 1.99E+00 + 14 1.19453E+00 2.20E+00 8.93E-01 + 15 1.12429E+00 2.33E+00 2.01E+00 + 16 1.01998E+00 5.04E+00 2.02E+00 + 17 8.94996E-01 8.97E+00 2.02E+00 + 18 7.06184E-01 1.32E+00 1.10E+00 + 19 5.06340E-01 5.11E+00 1.91E+00 + ------------------------------------------------------------------------------- + iters | objective | optim | dir + ------------------------------------------------------------------------------- + 20 3.21115E-01 1.03E+00 3.67E-01 + 21 2.99551E-01 9.31E-01 9.31E-01 + 22 2.51003E-01 2.68E+00 1.75E+00 + 23 2.14196E-01 4.82E+00 1.66E+00 + 24 1.15236E-01 1.17E+00 3.70E-01 + 25 8.06733E-02 1.98E+00 1.73E+00 + 26 6.60815E-02 4.33E+00 1.79E+00 + 27 5.37636E-02 3.33E+00 1.80E+00 + 28 4.02960E-02 3.44E-01 3.44E-01 + 29 4.02960E-02 3.44E-01 3.44E-01 + 30 4.00937E-02 1.94E-01 1.94E-01 + 31 4.00937E-02 1.94E-01 1.94E-01 + 32 4.00000E-02 0.00E+00 0.00E+00 + ------------------------------------------------------------------------------- + Status: converged, an optimal solution was found + ------------------------------------------------------------------------------- + Value of the objective 4.00000E-02 + Norm of inactive gradient 0.00000E+00 + Norm of projected direction 0.00000E+00 + Iterations 32 + Function evaluations 75 + FD func. evaluations 0 + Gradient evaluations 36 + NPG function calls 18 + NPG gradient calls 3 + CG function calls 9 + CG gradient calls 5 + LCG function calls 48 + LCG gradient calls 28 + ------------------------------------------------------------------------------- + + Primal variables: + idx Lower bound Value Upper bound + 1 -1.00000E+00 8.00000E-01 8.00000E-01 + 2 -2.00000E+00 6.40000E-01 2.00000E+00 + + Box bounds dual variables: + idx Lower bound Value Upper bound Value + 1 -1.00000E+00 0.00000E+00 8.00000E-01 4.00000E-01 + 2 -2.00000E+00 0.00000E+00 2.00000E+00 0.00000E+00 + +``` + +Retrieve Lagrange multipliers + +```java +double[] mult = new double[2 * nvar]; +Arrays.fill(mult, 0.0); + +E04RX e04rx = new E04RX(); +ifail = 0; +e04rx.eval(handle, "Dual Variables", 1, 2 * nvar, mult, ifail); + +double[] mult_t = new double[mult.length / 2]; +for (int i = 0; i < mult.length; i += 2) { + mult_t[i / 2] = mult[i] - mult[i + 1]; +} +``` + +
    + +``` +Lagrange multipliers: [ -0.4 0.0 ] +``` + +Destroy the handle + +```java +E04RZ e04rz = new E04RZ(); +e04rz.eval(handle, ifail); +``` + +Evaluate the funtion over the domain + +```java +double[] x_m = linspace(bl[0] - 0.5, bu[0] + 0.5, 101); +double[] y_m = linspace(bl[1] - 0.5, bu[1] + 0.5, 101); +double[][] z_m = new double[101][101]; + +for (int i = 0; i < 101; i++) { + for (int j = 0; j < 101; j++) { + z_m[i][j] = objfunEval(x_m[i], y_m[i]); + } +} +int inform = 1; + +int nb = 25; +double[] x_box = linspace(bl[0], bu[0], nb); +double[] y_box = linspace(bl[1], bu[1], nb); + +double[][] box = new double[2][100]; + +for (int i = 0; i < nb; i++) { + box[0][i] = x_box[i]; + box[0][nb + i] = bu[0]; + box[0][nb * 2 + i] = x_box[nb - 1 - i]; + box[0][nb * 3 + i] = bl[0]; + + box[1][i] = bl[1]; + box[1][nb + i] = y_box[i]; + box[1][nb * 2 + i] = bu[1]; + box[1][nb * 3 + i] = y_box[nb - 1 - i]; +} + +double[] z_box = new double[box[0].length]; + +for (int i = 0; i < z_box.length; i++) { + z_box[i] = objfunEval(box[0][i], box[1][i]); +} + +double[][] X = new double[x_m.length][x_m.length]; +double[][] Y = new double[y_m.length][y_m.length]; + +for (int i = 0; i < X.length; i++) { + Arrays.fill(X[i], x_m[i]); + Arrays.fill(Y[i], y_m[i]); +} +``` + +Plot function and steps taken + +
    + +
    diff --git a/FOAS/example/Rosenbrock2d.java b/FOAS/example/Rosenbrock2d.java new file mode 100644 index 0000000..0364235 --- /dev/null +++ b/FOAS/example/Rosenbrock2d.java @@ -0,0 +1,247 @@ +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RG; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04KF; +import com.nag.routines.E04.E04RX; +import com.nag.routines.E04.E04RZ; + +import java.lang.Math; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.io.FileWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class Rosenbrock2d { + + public final static String dataFolder = "data"; + + private static List[] steps = new ArrayList[3]; + + public static void main(String[] args) { + + for (int i = 0; i < steps.length; i++) { + steps[i] = new ArrayList(); + } + + // Specify initial guess + double[] x = new double[] { -1.0, -1.5 }; + + int nvar = x.length; + long handle = 0; + int ifail; + int[] idxfd = new int[nvar]; + for (int i = 0; i < nvar; i++) { + idxfd[i] = i + 1; + } + + E04RA e04ra = new E04RA(); + E04RG e04rg = new E04RG(); + E04RH e04rh = new E04RH(); + E04ZM e04zm = new E04ZM(); + E04KF e04kf = new E04KF(); + + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + ifail = 0; + e04rg.eval(handle, nvar, idxfd, ifail); + + double[] bl = new double[] { -1.0, -2.0 }; + double[] bu = new double[] { 0.8, 2.0 }; + ifail = 0; + e04rh.eval(handle, nvar, bl, bu, ifail); + + ifail = 0; + e04zm.eval(handle, "FOAS Print Frequency = 1", ifail); + e04zm.eval(handle, "Print Solution = yes", ifail); + e04zm.eval(handle, "FOAS Monitor Frequency = 1", ifail); + e04zm.eval(handle, "Print Level = 2", ifail); + e04zm.eval(handle, "Monitoring Level = 1", ifail); + + // Solve the problem + OBJFUN objfun = new OBJFUN(); + OBJGRD objgrd = new OBJGRD(); + MONIT monit = new MONIT(); + double[] rinfo = new double[100]; + double[] stats = new double[100]; + int[] iuser = new int[0]; + double[] ruser = new double[0]; + long cpuser = 0; + ifail = 0; + e04kf.eval(handle, objfun, objgrd, monit, nvar, x, rinfo, stats, iuser, ruser, cpuser, ifail); + + // Add last step + steps[0].add(x[0]); + steps[1].add(x[1]); + steps[2].add(rinfo[0]); + + System.out.println(); + + double[] mult = new double[2 * nvar]; + Arrays.fill(mult, 0.0); + + E04RX e04rx = new E04RX(); + ifail = 0; + e04rx.eval(handle, "Dual Variables", 1, 2 * nvar, mult, ifail); + + double[] mult_t = new double[mult.length / 2]; + for (int i = 0; i < mult.length; i += 2) { + mult_t[i / 2] = mult[i] - mult[i + 1]; + } + System.out.print("Lagrange multipliers: [ "); + for (double num : mult_t) { + System.out.print((double) Math.round(num * 10d) / 10d + " "); + } + System.out.println("]"); + + // Destroy the handle + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + + // Evaluate the funtion over the domain + double[] x_m = linspace(bl[0] - 0.5, bu[0] + 0.5, 101); + double[] y_m = linspace(bl[1] - 0.5, bu[1] + 0.5, 101); + double[][] z_m = new double[101][101]; + + for (int i = 0; i < 101; i++) { + for (int j = 0; j < 101; j++) { + z_m[i][j] = objfunEval(x_m[i], y_m[j]); + } + } + int inform = 1; + + int nb = 25; + double[] x_box = linspace(bl[0], bu[0], nb); + double[] y_box = linspace(bl[1], bu[1], nb); + + double[][] box = new double[2][100]; + + for (int i = 0; i < nb; i++) { + box[0][i] = x_box[i]; + box[0][nb + i] = bu[0]; + box[0][nb * 2 + i] = x_box[nb - 1 - i]; + box[0][nb * 3 + i] = bl[0]; + + box[1][i] = bl[1]; + box[1][nb + i] = y_box[i]; + box[1][nb * 2 + i] = bu[1]; + box[1][nb * 3 + i] = y_box[nb - 1 - i]; + } + + double[] z_box = new double[box[0].length]; + + for (int i = 0; i < z_box.length; i++) { + z_box[i] = objfunEval(box[0][i], box[1][i]); + } + + double[][] X = new double[x_m.length][x_m.length]; + double[][] Y = new double[y_m.length][y_m.length]; + + for (int i = 0; i < X.length; i++) { + Arrays.fill(X[i], x_m[i]); + for (int j = 0; j < Y[0].length; j++) + Y[i][j] = y_m[j]; + } + + // Plot + printMatrixToFile(box, "box.d"); + printVectorToFile(z_box, "z_box.d"); + printVectorToFile(bl, "bl.d"); + printVectorToFile(bu, "bu.d"); + printMatrixToFile(X, "X.d"); + printMatrixToFile(Y, "Y.d"); + printMatrixToFile(z_m, "z_m.d"); + printVectorToFile(toArray(steps[0]), "steps[0].d"); + printVectorToFile(toArray(steps[1]), "steps[1].d"); + printVectorToFile(toArray(steps[2]), "steps[2].d"); + } + + /** + * The objective's function. + */ + public static class OBJFUN extends E04KF.Abstract_E04KF_OBJFUN { + public void eval() { + this.FX = objfunEval(this.X[0], this.X[1]); + } + } + + /** + * The objective's gradient. + */ + public static class OBJGRD extends E04KF.Abstract_E04KF_OBJGRD { + public void eval() { + this.FDX[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.FDX[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + } + + /** + * The monitor function. + */ + public static class MONIT extends E04KF.Abstract_E04KF_MONIT { + public void eval() { + steps[0].add(this.X[0]); + steps[1].add(this.X[1]); + steps[2].add(this.RINFO[0]); + } + } + + private static double objfunEval(double x0, double x1) { + return Math.pow(1 - x0, 2) + 100.0 * Math.pow(x1 - Math.pow(x0, 2), 2); + } + + private static double[] linspace(double startPoint, double endPoint, int length) { + double[] a = new double[length]; + double step = (endPoint - startPoint) / (length - 1); + a[0] = startPoint; + a[length - 1] = endPoint; + for (int i = 1; i < length - 1; i++) { + a[i] = startPoint + i * step; + } + return a; + } + + public static void printMatrixToFile(double[][] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); + for (int i = 0; i < a.length; i++) { + for (int j = 0; j < a[0].length; j++) { + writer.write(a[i][j] + " "); + } + writer.write("\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + + public static void printVectorToFile(double[] a, String fileName) { + try { + FileWriter writer = new FileWriter(new File(dataFolder + File.separator + fileName)); + for (int i = 0; i < a.length; i++) { + writer.write(a[i] + " "); + } + writer.write("\n"); + writer.close(); + } catch (IOException e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } + } + + public static double[] toArray(List list) { + double[] t = new double[list.size()]; + for (int i = 0; i < t.length; i++) { + t[i] = (double) list.get(i); + } + return t; + } +} diff --git a/FOAS/example/data/X.d b/FOAS/example/data/X.d new file mode 100644 index 0000000..9e4e6b7 --- /dev/null +++ b/FOAS/example/data/X.d @@ -0,0 +1,101 @@ +-1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 +-1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 -1.472 +-1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 -1.444 +-1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 -1.416 +-1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 -1.388 +-1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 -1.36 +-1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 -1.332 +-1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 -1.304 +-1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 -1.276 +-1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 -1.248 +-1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 -1.22 +-1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 -1.1920000000000002 +-1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 -1.1640000000000001 +-1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 -1.1360000000000001 +-1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 -1.108 +-1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 -1.08 +-1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 -1.052 +-1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 -1.024 +-0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 -0.996 +-0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 -0.9680000000000001 +-0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 -0.9400000000000001 +-0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 -0.912 +-0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 -0.8840000000000001 +-0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 -0.8560000000000001 +-0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 -0.8280000000000001 +-0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 -0.8 +-0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 -0.772 +-0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 -0.7440000000000001 +-0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 -0.7160000000000001 +-0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 -0.6880000000000001 +-0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 -0.6600000000000001 +-0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 -0.6320000000000001 +-0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 -0.6040000000000001 +-0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 -0.5760000000000001 +-0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 -0.548 +-0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 -0.5200000000000001 +-0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 -0.492 +-0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 -0.4640000000000002 +-0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 -0.43600000000000017 +-0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 -0.40800000000000014 +-0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 -0.3800000000000001 +-0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 -0.3520000000000001 +-0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 -0.32400000000000007 +-0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 -0.29600000000000004 +-0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 -0.26800000000000024 +-0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 -0.2400000000000002 +-0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 -0.2120000000000002 +-0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 -0.18400000000000016 +-0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 -0.15600000000000014 +-0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 -0.1280000000000001 +-0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 -0.10000000000000009 +-0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 -0.07200000000000006 +-0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 -0.04400000000000004 +-0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 -0.016000000000000236 +0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 0.011999999999999789 +0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 0.039999999999999813 +0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 0.06799999999999984 +0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 0.09599999999999986 +0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 0.12399999999999989 +0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 0.1519999999999999 +0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 0.17999999999999972 +0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 0.20799999999999974 +0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 0.23599999999999977 +0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 0.2639999999999998 +0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 0.2919999999999998 +0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 0.31999999999999984 +0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 0.34799999999999986 +0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 0.3759999999999999 +0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 0.4039999999999999 +0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 0.4319999999999997 +0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 0.45999999999999974 +0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 0.48799999999999977 +0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 0.516 +0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 0.5439999999999996 +0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 0.5719999999999996 +0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 0.5999999999999996 +0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 0.6279999999999997 +0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 0.6559999999999997 +0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 0.6839999999999997 +0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 0.7119999999999997 +0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 0.7399999999999998 +0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 0.7679999999999998 +0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 0.7959999999999998 +0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 0.8239999999999998 +0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 0.8519999999999999 +0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 0.8799999999999999 +0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 0.9079999999999999 +0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 0.9359999999999999 +0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 0.9639999999999995 +0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 0.9919999999999995 +1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 1.0199999999999996 +1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 1.0479999999999996 +1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 1.0759999999999996 +1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 1.1039999999999996 +1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 1.1319999999999997 +1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 1.1599999999999997 +1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 1.1879999999999997 +1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 1.2159999999999997 +1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 1.2439999999999998 +1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 1.2719999999999998 +1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 diff --git a/FOAS/example/data/Y.d b/FOAS/example/data/Y.d new file mode 100644 index 0000000..b500a4f --- /dev/null +++ b/FOAS/example/data/Y.d @@ -0,0 +1,101 @@ +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 +-2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2.0 -1.95 -1.9 -1.85 -1.7999999999999998 -1.75 -1.7 -1.65 -1.6 -1.5499999999999998 -1.5 -1.45 -1.4 -1.3499999999999999 -1.2999999999999998 -1.25 -1.2 -1.15 -1.0999999999999999 -1.0499999999999998 -1.0 -0.95 -0.8999999999999999 -0.8499999999999999 -0.7999999999999998 -0.75 -0.7 -0.6499999999999999 -0.5999999999999999 -0.5499999999999998 -0.5 -0.44999999999999973 -0.3999999999999999 -0.3500000000000001 -0.2999999999999998 -0.25 -0.19999999999999973 -0.1499999999999999 -0.09999999999999964 -0.04999999999999982 0.0 0.050000000000000266 0.10000000000000009 0.15000000000000036 0.20000000000000018 0.25 0.30000000000000027 0.3500000000000001 0.40000000000000036 0.4500000000000002 0.5 0.5500000000000003 0.6000000000000001 0.6500000000000004 0.7000000000000002 0.75 0.8000000000000003 0.8500000000000001 0.9000000000000004 0.9500000000000002 1.0 1.0500000000000003 1.1 1.1500000000000004 1.2000000000000002 1.25 1.3000000000000003 1.35 1.4000000000000004 1.4500000000000002 1.5 1.5499999999999998 1.6000000000000005 1.6500000000000004 1.7000000000000002 1.75 1.7999999999999998 1.8500000000000005 1.9000000000000004 1.9500000000000002 2.0 2.05 2.1000000000000005 2.1500000000000004 2.2 2.25 2.3000000000000007 2.3500000000000005 2.4000000000000004 2.45 2.5 diff --git a/FOAS/example/data/bl.d b/FOAS/example/data/bl.d new file mode 100644 index 0000000..f3cc08f --- /dev/null +++ b/FOAS/example/data/bl.d @@ -0,0 +1 @@ +-1.0 -2.0 diff --git a/FOAS/example/data/box.d b/FOAS/example/data/box.d new file mode 100644 index 0000000..de0bc32 --- /dev/null +++ b/FOAS/example/data/box.d @@ -0,0 +1,2 @@ +-1.0 -0.925 -0.85 -0.775 -0.7 -0.625 -0.55 -0.475 -0.4 -0.32500000000000007 -0.25 -0.17500000000000004 -0.10000000000000009 -0.025000000000000022 0.050000000000000044 0.125 0.19999999999999996 0.2749999999999999 0.34999999999999987 0.42500000000000004 0.5 0.575 0.6499999999999999 0.7249999999999999 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.7249999999999999 0.6499999999999999 0.575 0.5 0.42500000000000004 0.34999999999999987 0.2749999999999999 0.19999999999999996 0.125 0.050000000000000044 -0.025000000000000022 -0.10000000000000009 -0.17500000000000004 -0.25 -0.32500000000000007 -0.4 -0.475 -0.55 -0.625 -0.7 -0.775 -0.85 -0.925 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 +-2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -2.0 -1.8333333333333333 -1.6666666666666667 -1.5 -1.3333333333333335 -1.1666666666666667 -1.0 -0.8333333333333335 -0.6666666666666667 -0.5 -0.3333333333333335 -0.16666666666666674 0.0 0.16666666666666652 0.33333333333333304 0.5 0.6666666666666665 0.833333333333333 1.0 1.1666666666666665 1.333333333333333 1.5 1.6666666666666665 1.833333333333333 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1.833333333333333 1.6666666666666665 1.5 1.333333333333333 1.1666666666666665 1.0 0.833333333333333 0.6666666666666665 0.5 0.33333333333333304 0.16666666666666652 0.0 -0.16666666666666674 -0.3333333333333335 -0.5 -0.6666666666666667 -0.8333333333333335 -1.0 -1.1666666666666667 -1.3333333333333335 -1.5 -1.6666666666666667 -1.8333333333333333 -2.0 diff --git a/FOAS/example/data/bu.d b/FOAS/example/data/bu.d new file mode 100644 index 0000000..f39c9ad --- /dev/null +++ b/FOAS/example/data/bu.d @@ -0,0 +1 @@ +0.8 2.0 diff --git a/FOAS/example/data/steps[0].d b/FOAS/example/data/steps[0].d new file mode 100644 index 0000000..74306a9 --- /dev/null +++ b/FOAS/example/data/steps[0].d @@ -0,0 +1 @@ +-1.0 -1.0 -1.0 -0.99296875 -0.99296875 -0.9947825556289756 -0.9921746233349885 -0.8021660267814262 -0.6426359233317612 -0.5268324439162966 -0.429824541854885 -0.38257262245766227 -0.2441292048404598 -0.09294132329290505 -0.055555574121325814 0.02200279065745358 0.16701694077699777 0.1614523121618464 0.3358200093560964 0.43335832687964876 0.4546697642576748 0.5172242703185462 0.6006967765953171 0.6610396101972403 0.7294424612099392 0.7912632067871832 0.7995710330012783 0.8 0.8 0.8 0.8 0.8 0.8 diff --git a/FOAS/example/data/steps[1].d b/FOAS/example/data/steps[1].d new file mode 100644 index 0000000..f72eca9 --- /dev/null +++ b/FOAS/example/data/steps[1].d @@ -0,0 +1 @@ +-1.5 1.0 1.0 1.0 1.0 0.9967824082467203 0.9799415277235192 0.6030021051407258 0.3451198880895362 0.29029001846761554 0.17178000514383232 0.12204207818696558 0.011676755534838296 0.008305303559625915 -0.006958557229223871 -0.024716004461906464 -0.01695347945466523 0.02056936968995976 0.08723972365338444 0.18723151761370005 0.20207111211407683 0.254130569373384 0.3374371910258528 0.4388216944451618 0.5234422931032321 0.6110939693998171 0.6276554248873316 0.6417205464807693 0.6417205464807693 0.6417205464807693 0.6390321926045675 0.6390321926045675 0.6400000000000001 diff --git a/FOAS/example/data/steps[2].d b/FOAS/example/data/steps[2].d new file mode 100644 index 0000000..d1b3343 --- /dev/null +++ b/FOAS/example/data/steps[2].d @@ -0,0 +1 @@ +629.0 4.0 4.0 3.991561027802527 3.991561027802527 3.9843271624704335 3.9707568861559763 3.411570147013121 3.1587648769464978 2.347441943172276 2.061218058032132 1.9706519989880744 1.7775122878255587 1.1945318108144782 1.1242877304604002 1.019983182866884 0.894996324810947 0.7061844527677409 0.5063404956253301 0.3211150392407906 0.2995505558744312 0.2510026232716557 0.2141963797414622 0.11523577756704549 0.08067327460792421 0.06608152910684452 0.05376362767906821 0.040296028019248684 0.040296028019248684 0.040296028019248684 0.040093665115465395 0.040093665115465395 0.03999999999999998 diff --git a/FOAS/example/data/z_box.d b/FOAS/example/data/z_box.d new file mode 100644 index 0000000..43fec5e --- /dev/null +++ b/FOAS/example/data/z_box.d @@ -0,0 +1 @@ +904.0 819.1650390625 744.6231250000001 679.4756640625 622.8999999999999 574.1494140625 532.5531250000001 497.5162890625 468.52000000000004 445.12128906249995 426.953125 413.72441406250005 405.22 401.30066406249995 401.903125 407.0400390625 416.79999999999995 431.3475390625 450.923125 475.8431640625 506.5 543.3619140624999 586.9731249999999 637.9537890624998 697.0 697.0 611.7777777777779 532.1111111111111 458.00000000000006 389.44444444444457 326.4444444444445 269.00000000000006 217.11111111111117 170.77777777777783 130.00000000000003 94.77777777777784 65.11111111111116 41.00000000000002 22.44444444444447 9.44444444444447 2.0000000000000036 0.11111111111110965 3.7777777777777612 12.99999999999999 27.77777777777775 48.11111111111105 73.99999999999999 105.4444444444444 142.44444444444431 184.99999999999997 184.99999999999997 217.45378906250005 248.97312500000004 278.86191406250003 306.5 331.34316406249997 352.9231250000001 370.8475390625 384.79999999999995 394.5400390625 399.903125 400.80066406249995 397.21999999999997 389.22441406249993 376.953125 360.62128906249995 340.5199999999999 317.01628906250005 290.55312499999997 261.6494140625 230.89999999999998 198.97566406250002 166.62312500000002 134.66503906249997 104.0 104.0 73.4444444444444 48.44444444444443 29.0 15.111111111111091 6.777777777777773 4.0 6.7777777777777874 15.111111111111121 29.0 48.444444444444485 73.44444444444446 104.0 140.11111111111114 181.7777777777778 229.0 281.7777777777778 340.11111111111114 404.0 473.44444444444457 548.4444444444446 629.0 715.1111111111112 806.7777777777777 904.0 diff --git a/FOAS/example/data/z_m.d b/FOAS/example/data/z_m.d new file mode 100644 index 0000000..59ce0a2 --- /dev/null +++ b/FOAS/example/data/z_m.d @@ -0,0 +1,101 @@ +2262.5 2215.2500000000005 2168.5 2122.2499999999995 2076.4999999999995 2031.25 1986.5000000000002 1942.2500000000002 1898.4999999999995 1855.2499999999998 1812.5 1770.25 1728.5000000000005 1687.2499999999998 1646.5 1606.25 1566.5 1527.25 1488.5000000000002 1450.25 1412.5 1375.2500000000002 1338.5 1302.2499999999998 1266.5 1231.25 1196.5000000000002 1162.2499999999998 1128.4999999999998 1095.2499999999998 1062.5 1030.2500000000002 998.5 967.2499999999998 936.4999999999999 906.25 876.5 847.25 818.4999999999999 790.2499999999999 762.5 735.2499999999998 708.5 682.2500000000001 656.5 631.25 606.4999999999999 582.25 558.4999999999998 535.2499999999999 512.5 490.2499999999999 468.49999999999994 447.24999999999983 426.49999999999994 406.25 386.4999999999999 367.25 348.49999999999983 330.24999999999994 312.5 295.24999999999994 278.49999999999994 262.2499999999999 246.49999999999994 231.25 216.49999999999991 202.24999999999997 188.49999999999991 175.24999999999994 162.5 150.24999999999991 138.49999999999997 127.24999999999993 116.49999999999996 106.25 96.49999999999996 87.24999999999999 78.49999999999994 70.24999999999997 62.5 55.25000000000003 48.49999999999993 42.24999999999996 36.499999999999986 31.25 26.500000000000014 22.249999999999957 18.499999999999975 15.24999999999999 12.5 10.250000000000007 8.499999999999984 7.249999999999993 6.499999999999998 6.25 6.500000000000007 7.250000000000011 8.50000000000001 10.250000000000007 12.5 +2183.9980742656 2137.5802342655998 2091.6623942656 2046.2445542655994 2001.3267142655995 1956.9088742655997 1912.9910342655999 1869.5731942656 1826.6553542655997 1784.2375142655997 1742.3196742655998 1700.9018342656 1659.9839942656001 1619.5661542655996 1579.6483142655998 1540.2304742655997 1501.3126342655999 1462.8947942655998 1424.9769542656 1387.5591142655996 1350.6412742655998 1314.2234342656 1278.3055942656 1242.8877542655996 1207.9699142655998 1173.5520742655997 1139.6342342656 1106.2163942655998 1073.2985542655995 1040.8807142655999 1008.9628742655998 977.5450342656001 946.6271942655998 916.2093542655997 886.2915142655997 856.8736742655998 827.9558342656 799.5379942655998 771.6201542655997 744.2023142655997 717.2844742655999 690.8666342655997 664.9487942655998 639.5309542655999 614.6131142655998 590.1952742655999 566.2774342655997 542.8595942655999 519.9417542655998 497.52391426559984 475.6060742656 454.1882342655998 433.2703942655999 412.85255426559985 392.9347142655999 373.51687426559994 354.59903426559987 336.1811942655999 318.26335426559984 300.8455142655999 283.92767426559993 267.50983426559986 251.5919942655999 236.1741542655998 221.25631426559988 206.83847426559993 192.9206342655999 179.50279426559993 166.58495426559986 154.1671142655999 142.24927426559995 130.8314342655999 119.91359426559995 109.49575426559989 99.57791426559993 90.16007426559996 81.24223426559992 72.82439426559995 64.90655426559992 57.48871426559995 50.57087426559998 44.1530342656 38.23519426559992 32.817354265599946 27.899514265599965 23.481674265599985 19.5638342656 16.145994265599953 13.228154265599972 10.810314265599985 8.892474265599994 7.4746342656 6.55679426559999 6.138954265599998 6.2211142656000025 6.8032742656000025 7.885434265600024 9.467594265600026 11.549754265600026 14.13191426560002 17.21407426560001 +2108.3203498496005 2062.7189898496 2017.6176298496 1973.0162698496 1928.9149098495993 1885.3135498496001 1842.2121898495998 1799.6108298495997 1757.5094698495998 1715.9081098495997 1674.8067498496002 1634.2053898495997 1594.1040298495998 1554.5026698496001 1515.4013098495998 1476.7999498496 1438.6985898495998 1401.0972298496 1363.9958698496 1327.3945098496 1291.2931498496 1255.6917898496 1220.5904298496 1185.9890698496001 1151.8877098495998 1118.2863498496 1085.1849898495998 1052.5836298496 1020.4822698495999 988.8809098495998 957.7795498495999 927.1781898495997 897.0768298495998 867.4754698495999 838.3741098495998 809.7727498496 781.6713898495998 754.0700298495999 726.9686698495999 700.3673098495998 674.2659498495999 648.6645898495998 623.5632298495998 598.9618698495999 574.8605098495998 551.2591498495999 528.1577898495998 505.5564298495999 483.45506984959985 461.8537098495999 440.75234984959997 420.15098984959985 400.04962984959997 380.44826984959985 361.3469098495999 342.74554984959997 324.64418984959985 307.04282984959997 289.94146984959986 273.3401098495999 257.23874984959997 241.63738984959988 226.53602984959997 211.93466984959989 197.83330984959994 184.23194984959997 171.13058984959991 158.52922984959994 146.4278698495999 134.82650984959994 123.72514984959996 113.12378984959992 103.02242984959996 93.4210698495999 84.31970984959995 75.71834984959999 67.61698984959993 60.01562984959997 52.91426984959993 46.31290984959996 40.21154984959998 34.610189849600005 29.508829849599937 24.90746984959996 20.806109849599974 17.20474984959999 14.103389849600003 11.502029849599968 9.400669849599982 7.799309849599991 6.697949849599997 6.0965898496 5.995229849600001 6.393869849600006 7.292509849600006 8.691149849600002 10.589789849600034 12.988429849600035 15.887069849600028 19.28570984960002 23.18434984960001 +2035.3900123135998 1990.5894523135998 1946.2888923136 1902.4883323135996 1859.1877723136 1816.3872123136 1774.0866523135999 1732.2860923136002 1690.9855323135996 1650.1849723135997 1609.8844123135998 1570.0838523136001 1530.7832923135998 1491.9827323136 1453.6821723135997 1415.8816123136 1378.5810523136001 1341.7804923135998 1305.4799323135999 1269.6793723135997 1234.3788123136 1199.5782523136 1165.2776923135998 1131.4771323135997 1098.1765723135998 1065.3760123136 1033.0754523136 1001.2748923135997 969.9743323135996 939.1737723135998 908.8732123135999 879.0726523135999 849.7720923135998 820.9715323135997 792.6709723135997 764.8704123135998 737.5698523135999 710.7692923135997 684.4687323135996 658.6681723135997 633.3676123135998 608.5670523135997 584.2664923135998 560.4659323135999 537.1653723135997 514.3648123135998 492.06425231359975 470.2636923135999 448.9631323135997 428.1625723135998 407.8620123135999 388.06145231359983 368.76089231359987 349.9603323135998 331.65977231359983 313.8592123135999 296.5586523135998 279.7580923135999 263.4575323135998 247.65697231359982 232.35641231359992 217.55585231359984 203.25529231359988 189.4547323135998 176.15417231359987 163.3536123135999 151.05305231359986 139.2524923135999 127.95193231359985 117.15137231359992 106.85081231359995 97.0502523135999 87.74969231359994 78.9491323135999 70.64857231359993 62.84801231359996 55.54745231359992 48.74689231359995 42.446332313599925 36.64577231359995 31.345212313599973 26.54465231359999 22.244092313599936 18.443532313599952 15.142972313599973 12.342412313599986 10.041852313599996 8.241292313599974 6.9407323135999865 6.140172313599995 5.839612313599999 6.0390523136 6.738492313600015 7.937932313600018 9.637372313600018 11.836812313600014 14.536252313600059 17.735692313600055 21.435132313600047 25.63457231360004 30.334012313600027 +1965.1317223935996 1921.1162823936 1877.6008423936003 1834.5854023935995 1792.0699623935998 1750.0545223935997 1708.5390823935998 1667.5236423936003 1627.0082023935995 1586.9927623935996 1547.4773223936 1508.4618823936 1469.9464423935997 1431.9310023936 1394.4155623935999 1357.4001223936 1320.8846823935999 1284.8692423936 1249.3538023935998 1214.3383623935997 1179.8229223935998 1145.8074823936 1112.2920423935998 1079.2766023935997 1046.7611623935998 1014.7457223936 983.2302823936 952.2148423935998 921.6994023935997 891.6839623935997 862.1685223935999 833.1530823936 804.6376423935998 776.6222023935997 749.1067623935998 722.0913223935999 695.5758823936001 669.5604423935998 644.0450023935997 619.0295623935998 594.5141223935999 570.4986823935998 546.9832423935999 523.9678023935999 501.4523623935998 479.4369223935999 457.9214823935998 436.9060423935999 416.39060239359975 396.37516239359985 376.85972239359995 357.8442823935998 339.32884239359987 321.3134023935998 303.79796239359985 286.78252239359995 270.2670823935998 254.25164239359992 238.7362023935998 223.72076239359987 209.20532239359994 195.18988239359987 181.67444239359992 168.65900239359985 156.1435623935999 144.12812239359994 132.6126823935999 121.59724239359994 111.0818023935999 101.06636239359993 91.55092239359998 82.53548239359993 74.02004239359995 66.00460239359991 58.489162393599955 51.47372239359997 44.958282393599944 38.942842393599975 33.42740239359995 28.411962393599964 23.896522393599984 19.881082393599996 16.365642393599952 13.350202393599968 10.834762393599984 8.819322393599993 7.3038823935999995 6.288442393599989 5.773002393599997 5.7575623936000015 6.2421223936000025 7.2266823936 8.711242393600024 10.695802393600024 13.18036239360002 16.164922393600012 19.649482393600067 23.634042393600062 28.118602393600053 33.103162393600044 38.58772239360002 +1897.4716160000007 1854.2256160000006 1811.479616 1769.2336160000002 1727.4876160000003 1686.2416160000005 1645.4956160000008 1605.249616 1565.5036160000002 1526.2576160000003 1487.5116160000005 1449.2656160000001 1411.519616 1374.2736160000002 1337.5276160000003 1301.2816160000004 1265.5356160000003 1230.289616 1195.5436160000002 1161.2976160000003 1127.5516160000004 1094.3056160000003 1061.559616 1029.3136160000001 997.5676160000004 966.3216160000004 935.5756160000001 905.3296160000001 875.5836160000002 846.3376160000003 817.5916160000005 789.3456160000003 761.5996160000001 734.3536160000001 707.6076160000002 681.3616160000004 655.6156160000002 630.3696160000001 605.6236160000001 581.3776160000002 557.6316160000003 534.385616 511.63961600000005 489.39361600000007 467.64761600000014 446.4016160000002 425.65561599999995 405.4096160000001 385.663616 366.417616 347.6716160000001 329.42561600000005 311.67961600000007 294.433616 277.68761600000005 261.4416160000001 245.69561600000003 230.4496160000001 215.703616 201.45761600000006 187.7116160000001 174.465616 161.7196160000001 149.47361600000002 137.72761600000004 126.48161600000009 115.73561600000002 105.48961600000007 95.743616 86.49761600000005 77.75161600000007 69.50561600000002 61.759616000000044 54.513616000000006 47.767616000000025 41.521616000000044 35.775616000000014 30.52961600000003 25.783616000000002 21.537616000000014 17.791616000000026 14.545616000000035 11.799615999999993 9.553616000000002 7.8076160000000066 6.561616000000008 5.815616000000007 5.569616000000001 5.823616000000001 6.577615999999997 7.831615999999991 9.58561599999998 11.83961600000001 14.593616 17.847615999999988 21.60161599999997 25.855616000000033 30.60961600000002 35.86361600000001 41.61761599999998 47.87161599999995 +1832.3373042176001 1789.8450642176003 1747.8528242176005 1706.3605842176 1665.3683442176 1624.8761042176 1584.8838642176004 1545.3916242176 1506.3993842176003 1467.9071442176 1429.9149042176002 1392.4226642176004 1355.4304242176001 1318.9381842176 1282.9459442176 1247.4537042176003 1212.4614642176002 1177.9692242176002 1143.9769842176004 1110.4847442176 1077.4925042176003 1045.0002642176003 1013.0080242176001 981.5157842175998 950.5235442176 920.0313042176002 890.0390642176002 860.5468242176001 831.5545842176 803.0623442176001 775.0701042176 747.5778642176002 720.5856242176001 694.0933842175999 668.1011442176001 642.6089042176001 617.6166642176001 593.1244242176001 569.1321842176 545.6399442176 522.6477042176001 500.1554642176 478.16322421760003 456.67098421760016 435.67874421760007 415.18650421760003 395.1942642176 375.70202421760007 356.7097842176 338.2175442176 320.22530421760007 302.7330642176 285.74082421760005 269.24858421759996 253.2563442176 237.76410421760008 222.77186421759998 208.27962421760003 194.28738421759996 180.7951442176 167.80290421760006 155.3106642176 143.31842421760004 131.82618421759997 120.8339442176 110.34170421760005 100.3494642176 90.85722421760003 81.86498421759998 73.37274421760002 65.38050421760005 57.8882642176 50.896024217600015 44.403784217599984 38.4115442176 32.91930421760002 27.927064217599995 23.434824217600013 19.442584217599993 15.950344217600005 12.958104217600013 10.465864217600018 8.473624217599989 6.981384217599996 5.9891442176 5.4969042176 5.504664217599997 6.012424217600003 7.020184217600002 8.527944217599996 10.535704217599989 13.043464217599976 16.05122421760002 19.55898421760001 23.566744217599993 28.074504217599976 33.08226421760005 38.59002421760003 44.597784217600015 51.105544217599984 58.11330421759997 +1769.6578733056008 1727.9037133056001 1686.6495533056 1645.8953933056002 1605.6412333055998 1565.8870733056 1526.6329133056004 1487.8787533056002 1449.6245933056002 1411.8704333056 1374.6162733056 1337.8621133056001 1301.6079533056 1265.8537933056002 1230.5996333056 1195.8454733056 1161.5913133056001 1127.8371533056002 1094.5829933056002 1061.8288333056 1029.5746733056 997.8205133056 966.5663533056 935.8121933056002 905.5580333056 875.8038733056002 846.5497133056 817.7955533056 789.5413933056002 761.7872333055999 734.5330733056 707.7789133055999 681.5247533056 655.7705933056001 630.5164333056 605.7622733056 581.5081133055999 557.7539533056 534.4997933056001 511.74563330560005 489.4914733056001 467.73731330559997 446.48315330560007 425.72899330560017 405.4748333056 385.7206733056001 366.46651330559996 347.71235330560006 329.45819330559993 311.70403330560003 294.4498733056001 277.69571330559995 261.44155330560005 245.68739330559993 230.4332333056 215.6790733056 201.42491330559997 187.67075330560002 174.41659330559995 161.6624333056 149.40827330560003 137.65411330559996 126.39995330560001 115.64579330559997 105.39163330559998 95.63747330560003 86.38331330559998 77.62915330560003 69.37499330559996 61.620833305599994 54.366673305600024 47.61251330559999 41.358353305600005 35.60419330559998 30.350033305599997 25.595873305600012 21.341713305599992 17.587553305600004 14.333393305599989 11.579233305599999 9.325073305600007 7.570913305600011 6.316753305599994 5.562593305599999 5.308433305600001 5.5542733056 6.300113305599995 7.545953305600013 9.29179330560001 11.537633305600004 14.283473305599992 17.529313305599977 21.275153305600032 25.52099330560002 30.266833305600006 35.51267330559999 41.25851330560007 47.504353305600056 54.25019330560003 61.4960333056 69.24187330559997 +1709.3638846976 1668.3321246976 1627.8003646976001 1587.7686046976003 1548.2368446975997 1509.2050846976 1470.6733246976 1432.6415646976002 1395.1098046976003 1358.0780446975998 1321.5462846976 1285.5145246976 1249.9827646976003 1214.9510046976004 1180.4192446975999 1146.3874846976 1112.8557246976 1079.8239646976 1047.2922046976003 1015.2604446975997 983.7286846975999 952.6969246975999 922.1651646976001 892.1334046976 862.6016446975997 833.5698846976 805.0381246976 777.0063646976 749.4746046976 722.4428446975998 695.9110846975999 669.8793246975999 644.3475646976001 619.3158046975999 594.7840446975998 570.7522846975999 547.2205246976 524.1887646976 501.6570046976 479.62524469759984 458.0934846976 437.0617246976 416.5299646976001 396.49820469760004 376.96644469759997 357.9346846976 339.40292469759993 321.3711646976 303.8394046975999 286.8076446976 270.2758846976 254.24412469759991 238.71236469759995 223.6806046975999 209.14884469759997 195.1170846976 181.58532469759996 168.55356469759997 156.02180469759992 143.99004469759996 132.45828469760002 121.42652469759996 110.8947646976 100.86300469759995 91.33124469759998 82.29948469760001 73.76772469759997 65.7359646976 58.20420469759996 51.172444697599985 44.64068469760001 38.608924697599974 33.0771646976 28.045404697599974 23.51364469759999 19.4818846976 15.950124697599987 12.918364697599998 10.386604697599985 8.354844697599995 6.823084697600001 5.791324697600003 5.259564697599997 5.227804697600001 5.696044697600001 6.664284697599998 8.13252469759999 10.10076469760002 12.569004697600015 15.537244697600006 19.005484697599996 22.973724697599977 27.441964697600042 32.41020469760002 37.87844469760002 43.8466846976 50.31492469760009 57.28316469760007 64.75140469760004 72.71964469760002 81.18788469759998 +1651.3873750015996 1611.0623350015999 1571.2372950016 1531.9122550016002 1493.0872150015996 1454.7621750015996 1416.9371350016 1379.6120950016 1342.7870550016 1306.4620150015999 1270.6369750016 1235.3119350016 1200.4868950016 1166.1618550016 1132.3368150015997 1099.0117750015997 1066.1867350016 1033.8616950016 1002.0366550016001 970.7116150015997 939.8865750015998 909.5615350015999 879.7364950016 850.4114550015998 821.5864150015998 793.2613750015998 765.4363350015999 738.1112950016001 711.2862550015999 684.9612150015997 659.1361750015999 633.8111350016 608.9860950016001 584.6610550016 560.8360150015998 537.5109750015998 514.6859350016 492.36089500160006 470.53585500159994 449.21081500159977 428.3857750015999 408.0607350016 388.23569500159994 368.9106550016 350.0856150015999 331.7605750016 313.9355350015999 296.61049500159993 279.78545500159987 263.4604150015999 247.63537500159998 232.31033500159992 217.4852950016 203.1602550015999 189.33521500159995 176.0101750016 163.18513500159992 150.8600950016 139.03505500159991 127.71001500159996 116.88497500160001 106.55993500159995 96.7348950016 87.40985500159994 78.58481500159998 70.2597750016 62.43473500159997 55.109695001599995 48.28465500159996 41.959615001599985 36.134575001600005 30.809535001599972 25.984495001599992 21.659455001599973 17.83441500159999 14.509375001600002 11.684335001599987 9.359295001599998 7.534255001599989 6.209215001599997 5.384175001600001 5.059135001600001 5.234095001600005 5.909055001600008 7.084015001600006 8.758975001600001 10.933935001599993 13.608895001600033 16.783855001600024 20.458815001600016 24.6337750016 29.308735001599985 34.48369500160006 40.158655001600046 46.33361500160002 53.00857500160001 60.18353500160011 67.85849500160009 76.03345500160006 84.70841500160005 93.8833750016 +1595.661856 1556.027856 1516.893856 1478.2598560000001 1440.1258559999999 1402.4918559999999 1365.357856 1328.7238559999998 1292.589856 1256.9558559999998 1221.821856 1187.1878559999998 1153.0538559999998 1119.419856 1086.285856 1053.651856 1021.5178559999998 989.8838559999999 958.749856 928.1158559999998 897.981856 868.3478559999998 839.213856 810.5798560000001 782.4458559999999 754.811856 727.6778559999999 701.0438559999999 674.909856 649.2758559999999 624.141856 599.5078559999998 575.3738559999999 551.739856 528.6058559999999 505.97185599999995 483.8378559999999 462.2038559999999 441.069856 420.43585599999994 400.301856 380.6678559999999 361.53385599999996 342.899856 324.7658559999999 307.13185599999997 289.9978559999999 273.363856 257.22985599999987 241.59585599999994 226.46185599999998 211.82785599999994 197.69385599999998 184.0598559999999 170.92585599999995 158.291856 146.15785599999992 134.523856 123.38985599999991 112.75585599999994 102.62185599999998 92.98785599999994 83.85385599999996 75.21985599999992 67.08585599999996 59.45185599999999 52.317855999999956 45.68385599999998 39.54985599999995 33.91585599999997 28.781855999999994 24.147855999999972 20.013855999999986 16.37985599999997 13.245855999999986 10.611855999999996 8.477855999999987 6.843855999999995 5.709855999999991 5.075855999999997 4.941855999999999 5.3078559999999975 6.173856000000012 7.539856000000013 9.405856000000009 11.771856000000003 14.637855999999992 18.00385600000004 21.86985600000003 26.235856000000023 31.101856000000005 36.46785599999998 42.33385600000007 48.69985600000005 55.56585600000003 62.931856 70.79785600000012 79.1638560000001 88.02985600000007 97.39585600000004 107.26185600000001 +1542.1223146496002 1503.1636746496004 1464.7050346496003 1426.7463946496002 1389.2877546496002 1352.3291146496001 1315.8704746496003 1279.9118346496002 1244.4531946496004 1209.4945546495999 1175.0359146496003 1141.0772746496 1107.6186346496002 1074.6599946496 1042.2013546496 1010.2427146496002 978.7840746496 947.8254346496002 917.3667946496001 887.4081546496001 857.9495146496001 828.9908746496 800.5322346496 772.5735946496002 745.1149546496001 718.1563146496001 691.6976746496 665.7390346496001 640.2803946496001 615.3217546496 590.8631146496001 566.9044746495999 543.4458346496 520.4871946496002 498.02855464960004 476.06991464960015 454.6112746496001 433.6526346496001 413.19399464960014 393.2353546496001 373.77671464960014 354.8180746496 336.35943464960013 318.4007946496002 300.94215464960007 283.9835146496001 267.5248746496 251.5662346496001 236.1075946496 221.14895464960006 206.69031464960008 192.73167464960002 179.27303464960008 166.31439464960002 153.85575464960004 141.8971146496001 130.4384746496 119.47983464960005 109.0211946496 99.06255464960003 89.60391464960006 80.64527464960001 72.18663464960004 64.22799464959999 56.769354649600025 49.81071464960005 43.35207464960001 37.39343464960003 31.9347946496 26.97615464960002 22.51751464960003 18.558874649600007 15.100234649600019 12.141594649600002 9.682954649600008 7.724314649600013 6.265674649600003 5.307034649600005 4.848394649600001 4.8897546496 5.431114649599996 6.472474649599987 8.013834649600007 10.0551946496 12.596554649599991 15.637914649599978 19.17927464959996 23.22063464960002 27.761994649600002 32.80335464959998 38.344714649599965 44.386074649599934 50.92743464960003 57.9687946496 65.51015464959997 73.55151464959994 82.09287464960005 91.13423464960003 100.6755946496 110.71695464959996 121.25831464959992 +1490.7052130816 1452.4062530816002 1414.6072930816003 1377.3083330816005 1340.5093730816 1304.2104130816 1268.4114530816003 1233.1124930816004 1198.3135330816003 1164.0145730816 1130.2156130816002 1096.9166530816 1064.1176930816002 1031.8187330816006 1000.0197730815999 968.7208130816001 937.9218530816001 907.6228930816004 877.8239330816004 848.5249730816 819.7260130816001 791.4270530816002 763.6280930816002 736.3291330816 709.5301730816 683.2312130816001 657.4322530816002 632.1332930816002 607.3343330816001 583.0353730815999 559.2364130816001 535.9374530816002 513.1384930816001 490.8395330816001 469.04057308160003 447.74161308160006 426.94265308160016 406.6436930816002 386.84473308160005 367.5457730816001 348.7468130816002 330.44785308160004 312.64889308160014 295.34993308160017 278.5509730816001 262.2520130816001 246.45305308160005 231.15409308160005 216.3551330816 202.05617308160004 188.25721308160007 174.95825308160002 162.15929308160005 149.8603330816 138.06137308160004 126.76241308160007 115.96345308160001 105.66449308160004 95.86553308159999 86.56657308160003 77.76761308160006 69.46865308160001 61.66969308160004 54.370733081599994 47.57177308160002 41.272813081600034 35.473853081600005 30.174893081600025 25.375933081599996 21.07697308160001 17.278013081600026 13.979053081600004 11.180093081600013 8.881133081599998 7.082173081600005 5.783213081600007 4.984253081600001 4.6852930816 4.886333081600001 5.587373081599997 6.788413081599991 8.489453081599981 10.69049308160001 13.391533081600002 16.59257308159999 20.293613081599975 24.494653081599957 29.19569308160002 34.396733081600004 40.09777308159998 46.29881308159996 52.99985308159993 60.200893081600036 67.9019330816 76.10297308159997 84.80401308159995 94.00505308160007 103.70609308160005 113.90713308160001 124.60817308159997 135.80921308159992 +1441.3484886016001 1403.6935286016003 1366.5385686016004 1329.8836086016006 1293.7286486016 1258.0736886016 1222.9187286016002 1188.2637686016003 1154.1088086016005 1120.4538486016 1087.2988886016 1054.6439286016002 1022.4889686016003 990.8340086016004 959.6790486016 929.0240886016002 898.8691286016002 869.2141686016002 840.0592086016003 811.4042486015999 783.2492886016 755.5943286016002 728.4393686016002 701.7844086016001 675.6294486016 649.9744886016 624.8195286016002 600.1645686016003 576.0096086016001 552.3546486016 529.1996886016001 506.5447286016001 484.38976860160017 462.73480860160004 441.5798486016 420.9248886016 400.7699286016001 381.1149686016001 361.96000860160007 343.30504860160005 325.1500886016001 307.4951286016 290.3401686016001 273.68520860160015 257.5302486016 241.87528860160012 226.72032860160002 212.06536860160008 197.91040860159998 184.25544860160005 171.1004886016001 158.44552860160002 146.29056860160006 134.6356086016 123.48064860160004 112.82568860160006 102.6707286016 93.01576860160004 83.8608086016 75.20584860160001 67.05088860160005 59.39592860160001 52.24096860160003 45.58600860159999 39.43104860160002 33.77608860160004 28.621128601600006 23.966168601600017 19.811208601599997 16.15624860160001 13.001288601600017 10.346328601600003 8.191368601600008 6.536408601599999 5.3814486016000025 4.7264886016000025 4.5715286016 4.916568601599998 5.761608601600001 7.106648601599996 8.951688601599987 11.296728601599975 14.141768601600013 17.486808601600003 21.33184860159999 25.67688860159997 30.521928601599953 35.86696860160003 41.712008601600004 48.05704860159999 54.902088601599964 62.24712860159993 70.09216860160002 78.4372086016 87.28224860159997 96.62728860159994 106.47232860160007 116.81736860160005 127.6624086016 139.00744860159998 150.85248860159993 +1393.9915536896 1356.9649136896003 1320.4382736896 1284.4116336896002 1248.8849936896 1213.8583536896 1179.3317136896003 1145.3050736896002 1111.7784336896002 1078.7517936896 1046.2251536896001 1014.1985136896 982.6718736896001 951.6452336896003 921.1185936896001 891.0919536896002 861.5653136896 832.5386736896002 804.0120336896002 775.9853936896001 748.4587536896003 721.4321136896001 694.9054736896002 668.8788336896001 643.3521936896001 618.3255536896002 593.7989136896001 569.7722736896001 546.2456336896001 523.2189936896001 500.6923536896001 478.66571368960007 457.13907368960014 436.11243368960015 415.58579368960005 395.5591536896001 376.0325136896001 357.0058736896001 338.47923368960005 320.45259368960006 302.9259536896001 285.89931368960004 269.3726736896001 253.34603368960015 237.81939368960008 222.79275368960012 208.26611368960002 194.23947368960006 180.7128336896 167.68619368960003 155.1595536896001 143.13291368960003 131.60627368960004 120.57963368959999 110.05299368960002 100.02635368960006 90.49971368960001 81.47307368960004 72.9464336896 64.91979368960003 57.39315368960005 50.366513689600005 43.839873689600026 37.81323368959999 32.28659368960002 27.25995368960003 22.733313689600003 18.706673689600017 15.180033689599998 12.153393689600009 9.626753689600015 7.600113689600001 6.073473689600005 5.0468336896 4.520193689600001 4.493553689599999 4.966913689599999 5.940273689599994 7.413633689600001 9.386993689599993 11.860353689599982 14.83371368959997 18.307073689600017 22.280433689600002 26.753793689599988 31.727153689599966 37.200513689599944 43.17387368960002 49.6472336896 56.62059368959998 64.09395368959996 72.06731368959991 80.54067368960004 89.51403368960001 98.98739368959997 108.96075368959994 119.43411368960008 130.40747368960007 141.88083368960002 153.85419368959998 166.32755368959994 +1348.5752960000002 1312.1612960000002 1276.2472959999998 1240.833296 1205.919296 1171.5052960000003 1137.5912960000003 1104.1772959999998 1071.2632959999999 1038.849296 1006.9352960000003 975.5212960000001 944.6072959999998 914.193296 884.2792960000002 854.8652960000002 825.951296 797.537296 769.623296 742.2092960000001 715.2952960000002 688.881296 662.9672959999999 637.5532959999999 612.6392960000001 588.2252960000002 564.3112960000001 540.897296 517.983296 495.56929600000007 473.6552960000001 452.241296 431.32729599999993 410.91329599999995 390.99929599999996 371.585296 352.671296 334.25729599999994 316.34329599999995 298.92929599999997 282.01529600000003 265.60129599999993 249.687296 234.27329600000004 219.359296 204.94529600000004 191.03129599999997 177.617296 164.70329599999994 152.289296 140.37529600000005 128.96129599999998 118.047296 107.63329599999997 97.71929599999999 88.30529600000003 79.39129599999998 70.97729600000001 63.06329599999996 55.649295999999985 48.73529600000001 42.321295999999975 36.407296 30.993295999999972 26.079295999999992 21.66529600000001 17.75129599999999 14.337296000000002 11.423295999999988 9.009295999999997 7.095296000000004 5.681295999999997 4.767296000000001 4.353295999999999 4.439296000000001 5.025295999999999 6.111296000000005 7.697296 9.783296000000012 12.369296000000006 15.455295999999993 19.041295999999978 23.127296000000037 27.713296000000025 32.79929600000001 38.38529599999999 44.47129599999996 51.05729600000006 58.143296000000035 65.729296 73.81529599999999 82.40129599999996 91.48729600000009 101.07329600000006 111.15929600000001 121.74529599999998 132.83129600000015 144.4172960000001 156.50329600000006 169.08929600000002 182.17529599999997 +1305.0420783616 1269.2250383616001 1233.9079983616 1199.0909583616 1164.7739183616 1130.9568783616003 1097.6398383616001 1064.8227983616 1032.5057583616003 1000.6887183616 969.3716783616001 938.5546383615999 908.2375983616 878.4205583616 849.1035183615999 820.2864783616001 791.9694383615998 764.1523983616 736.8353583616001 710.0183183616 683.7012783616001 657.8842383615998 632.5671983616 607.7501583616001 583.4331183616 559.6160783616 536.2990383615999 513.4819983616 491.16495836160016 469.34791836159997 448.03087836160006 427.2138383615999 406.8967983616001 387.07975836160006 367.7627183616 348.9456783616001 330.62863836160005 312.81159836160003 295.4945583616 278.6775183616 262.3604783616001 246.54343836159995 231.2263983616 216.40935836160008 202.09231836159998 188.27527836160004 174.95823836159997 162.1411983616 149.82415836159993 138.0071183616 126.69007836160003 115.87303836159998 105.55599836159999 95.73895836159997 86.4219183616 77.60487836160002 69.28783836159997 61.47079836160001 54.15375836159997 47.3367183616 41.019678361600015 35.20263836159999 29.885598361600003 25.06855836159998 20.751518361599995 16.934478361600007 13.61743836159999 10.800398361600003 8.48335836159999 6.666318361599998 5.349278361600002 4.532238361599998 4.2151983616 4.398158361600002 5.081118361600001 6.264078361599996 7.947038361600004 10.129998361599998 12.812958361600012 15.995918361600003 19.678878361599992 23.861838361599972 28.54479836160004 33.727758361600024 39.410718361600004 45.593678361599984 52.27663836159996 59.459598361600065 67.14255836160004 75.32551836160002 84.00847836159997 93.19143836159995 102.87439836160007 113.05735836160002 123.7403183616 134.92327836159996 146.60623836160013 158.78919836160009 171.47215836160004 184.65511836160002 198.33807836159997 +1263.3357387775998 1228.0999787776 1193.3642187776 1159.1284587776001 1125.3926987775997 1092.1569387775999 1059.4211787775998 1027.1854187776 995.4496587776002 964.2138987775996 933.4781387775998 903.2423787776 873.5066187776 844.2708587776001 815.5350987775997 787.2993387775998 759.5635787775999 732.3278187776001 705.5920587776001 679.3562987775998 653.6205387775999 628.3847787776 603.6490187776001 579.4132587775999 555.6774987775998 532.4417387775999 509.70597877759997 487.47021877760005 465.7344587775999 444.4986987775998 423.76293877759997 403.5271787776 383.7914187776 364.55565877759994 345.8198987776 327.5841387776 309.8483787776 292.61261877759995 275.8768587776 259.64109877759995 243.90533877759998 228.6695787775999 213.93381877759995 199.6980587776 185.96229877759993 172.72653877759998 159.9907787775999 147.75501877759996 136.0192587775999 124.78349877759996 114.0477387776 103.81197877759993 94.07621877759998 84.84045877759993 76.10469877759996 67.8689387776 60.13317877759995 52.89741877759998 46.161658777599946 39.925898777599976 34.1901387776 28.954378777599967 24.218618777599985 19.982858777599965 16.247098777599984 13.011338777599995 10.275578777599986 8.039818777599994 6.3040587775999875 5.0682987775999955 4.332538777599999 4.0967787776 4.361018777600001 5.125258777600008 6.389498777600007 8.153738777600001 10.417978777600016 13.18221877760001 16.44645877760003 20.210698777600015 24.474938777600002 29.239178777599985 34.50341877760006 40.26765877760005 46.531898777600034 53.29613877760001 60.56037877759998 68.3246187776001 76.58885877760007 85.35309877760004 94.61733877760001 104.38157877759997 114.64581877760011 125.41005877760009 136.67429877760006 148.4385387776 160.7027787776002 173.46701877760015 186.73125877760012 200.49549877760006 214.7597387776 +1223.4015904256 1188.7314304256001 1154.5612704256 1120.8911104256001 1087.7209504256 1055.0507904256 1022.8806304256002 991.2104704256 960.0403104256001 929.3701504255998 899.1999904256 869.5298304255998 840.3596704255999 811.6895104256 783.5193504255999 755.8491904256 728.6790304255999 702.0088704256 675.8387104256001 650.1685504256 624.9983904256001 600.3282304255998 576.1580704255999 552.4879104256 529.3177504255999 506.64759042559996 484.47743042559983 462.8072704256 441.63711042560004 420.9669504256 400.79679042559997 381.1266304256 361.95647042559995 343.28631042559994 325.1161504255999 307.44599042560003 290.27583042559996 273.60567042559995 257.4355104256 241.76535042559993 226.59519042559998 211.92503042559994 197.7548704256 184.0847104256 170.91455042559994 158.24439042560002 146.07423042559995 134.40407042559997 123.23391042559992 112.56375042559996 102.3935904256 92.72343042559994 83.55327042559999 74.88311042559994 66.71295042559997 59.042790425599996 51.87263042559996 45.202470425599984 39.03231042559995 33.362150425599985 28.1919904256 23.52183042559998 19.351670425599995 15.681510425599976 12.511350425599991 9.8411904256 7.671030425599991 6.000870425599998 4.830710425599994 4.1605504255999985 3.9903904256 4.320230425600003 5.150070425600002 6.479910425600011 8.309750425600008 10.6395904256 13.469430425600017 16.799270425600007 20.62911042560003 24.958950425600015 29.7887904256 35.118630425599974 40.94847042560006 47.27831042560004 54.108150425600016 61.43799042559999 69.26783042559997 77.59767042560009 86.42751042560006 95.75735042560002 105.5871904256 115.91703042559995 126.74687042560011 138.07671042560008 149.90655042560005 162.2363904256 175.0662304256002 188.39607042560013 202.2259104256001 216.55575042560005 231.3855904256 +1185.1864216576 1151.0661816576003 1117.4459416575999 1084.3257016576001 1051.7054616576 1019.5852216576001 987.9649816576002 956.8447416576 926.2245016576002 896.1042616575999 866.4840216576 837.3637816576003 808.7435416576 780.6233016576001 753.0030616575999 725.8828216576001 699.2625816576001 673.1423416576 647.5221016576 622.4018616576 597.7816216576 573.6613816576001 550.0411416576 526.9209016576001 504.30066165759996 482.18042165760005 460.5601816576001 439.43994165759995 418.81970165760004 398.69946165759995 379.07922165760004 359.9589816576001 341.3387416576 323.21850165760003 305.59826165759995 288.47802165760004 271.85778165760007 255.73754165759996 240.11730165760005 224.99706165759997 210.3768216576 196.25658165759995 182.63634165759998 169.51610165760005 156.89586165759997 144.77562165760003 133.15538165759995 122.03514165760001 111.41490165759996 101.2946616576 91.67442165760004 82.55418165759998 73.93394165760002 65.81370165759998 58.19346165760001 51.07322165760002 44.45298165759999 38.33274165760002 32.71250165759998 27.5922616576 22.972021657600017 18.851781657599997 15.231541657600005 12.111301657599991 9.491061657600001 7.370821657600007 5.750581657599998 4.630341657600002 4.010101657599999 3.8898616576 4.2696216575999975 5.149381657600002 6.529141657599997 8.408901657600008 10.788661657599999 13.668421657599989 17.048181657600008 20.92794165759999 25.307701657600017 30.1874616576 35.56722165759997 41.446981657599956 47.826741657600046 54.70650165760002 62.086261657600005 69.96602165759997 78.34578165759994 87.22554165760006 96.60530165760002 106.48506165760003 116.86482165759999 127.74458165759994 139.1243416576001 151.00410165760007 163.38386165760002 176.26362165759997 189.64338165760014 203.52314165760012 217.90290165760007 232.78266165760002 248.16242165759996 +1148.6384960000003 1115.0524960000002 1081.966496 1049.380496 1017.2944960000001 985.7084960000002 954.6224960000003 924.0364959999999 893.9504959999999 864.364496 835.2784960000001 806.692496 778.6064959999999 751.020496 723.9344960000001 697.3484960000002 671.262496 645.6764959999999 620.590496 596.0044960000001 571.9184960000001 548.3324960000001 525.246496 502.660496 480.5744960000001 458.98849600000017 437.90249600000004 417.3164959999999 397.230496 377.644496 358.55849600000005 339.97249600000004 321.886496 304.300496 287.214496 270.62849600000004 254.54249600000006 238.95649600000004 223.870496 209.284496 195.19849600000006 181.61249599999996 168.526496 155.94049600000005 143.85449599999998 132.26849600000003 121.18249599999997 110.596496 100.51049599999996 90.92449599999999 81.83849600000002 73.25249599999998 65.16649600000001 57.58049599999997 50.494496 43.908496000000014 37.82249599999999 32.23649600000001 27.150495999999983 22.564496 18.478496000000014 14.892495999999994 11.806496000000005 9.22049599999999 7.1344959999999995 5.548496000000004 4.462495999999998 3.8764960000000004 3.7904960000000005 4.204496 5.118495999999996 6.532496000000004 8.446495999999996 10.86049600000001 13.774496000000001 17.18849599999999 21.10249600000001 25.516495999999993 30.43049600000002 35.844496 41.75849599999997 48.17249599999995 55.08649600000005 62.50049600000003 70.414496 78.82849599999997 87.74249599999993 97.15649600000006 107.07049600000005 117.484496 128.39849599999997 139.81249599999992 151.72649600000008 164.14049600000004 177.054496 190.46849599999996 204.38249600000015 218.79649600000013 233.71049600000003 249.124496 265.03849599999995 +1113.7075521535999 1080.6401121536 1048.0726721536 1016.0052321536001 984.4377921536001 953.3703521536 922.8029121536001 892.7354721536 863.1680321536002 834.1005921535999 805.5331521536 777.4657121535998 749.8982721536 722.8308321536001 696.2633921536 670.1959521536 644.6285121535999 619.5610721536 594.9936321536001 570.9261921535999 547.3587521536 524.2913121535998 501.7238721536 479.65643215360006 458.0889921536 437.0215521536 416.4541121535999 396.38667215360005 376.81923215359996 357.7517921536 339.18435215360006 321.1169121536 303.54947215360005 286.4820321536 269.9145921536 253.84715215359998 238.27971215359997 223.2122721536 208.64483215359996 194.57739215359996 181.0099521536 167.94251215359995 155.37507215359997 143.30763215360003 131.74019215359996 120.67275215360002 110.10531215359995 100.03787215359999 90.47043215359994 81.40299215359998 72.8355521536 64.76811215359996 57.20067215359999 50.133232153599955 43.56579215359998 37.4983521536 31.930912153599976 26.863472153599997 22.296032153599974 18.22859215359999 14.661152153600002 11.593712153599988 9.026272153599997 6.958832153599989 5.3913921535999965 4.3239521536000005 3.7565121535999983 3.6890721536 4.121632153600004 5.054192153600003 6.486752153599999 8.419312153600009 10.851872153600002 13.78443215360002 17.21699215360001 21.149552153599995 25.58211215360002 30.514672153600003 35.947232153600034 41.879792153600015 48.312352153599996 55.24491215359997 62.67747215360007 70.61003215360005 79.04259215360003 87.97515215359999 97.40771215359996 107.3402721536001 117.77283215360006 128.70539215360003 140.1379521536 152.07051215359996 164.50307215360013 177.43563215360007 190.86819215360003 204.80075215359997 219.2333121536002 234.16587215360016 249.59843215360013 265.5309921536001 281.9635521536 +1080.3448039936002 1047.7802439936002 1015.7156839936001 984.1511239936002 953.0865639936001 922.5220039936003 892.4574439936004 862.8928839936001 833.8283239936002 805.2637639936002 777.1992039936001 749.6346439936 722.5700839936001 696.0055239936001 669.9409639936001 644.3764039936001 619.3118439936001 594.7472839936 570.6827239936002 547.1181639936 524.0536039936002 501.4890439936001 479.4244839936002 457.85992399360003 436.7953639936001 416.23080399360015 396.16624399360006 376.60168399360015 357.5371239936 338.9725639936001 320.9080039936002 303.34344399360003 286.2788839936001 269.71432399360003 253.64976399360006 238.0852039936001 223.02064399360003 208.4560839936001 194.39152399359998 180.82696399360003 167.7624039936001 155.19784399360003 143.13328399360006 131.5687239936001 120.50416399360005 109.93960399360007 99.87504399360002 90.31048399360004 81.24592399359999 72.68136399360003 64.61680399360004 57.052243993599994 49.98768399360002 43.42312399359999 37.35856399360001 31.794003993600025 26.729443993599997 22.164883993600014 18.100323993599993 14.535763993600007 11.471203993600016 8.9066439936 6.842083993600007 5.277523993599998 4.212963993600002 3.6484039936000023 3.583843993600001 4.019283993599998 4.954723993600003 6.390163993599998 8.325603993599989 10.761043993600001 13.696483993599989 17.131923993600005 21.067363993599994 25.502803993599976 30.4382439936 35.87368399359998 41.80912399360001 48.24456399359998 55.18000399359996 62.61544399359993 70.55088399360005 78.98632399360002 87.92176399359998 97.35720399359997 107.2926439935999 117.72808399360004 128.6635239936 140.09896399359994 152.0344039935999 164.46984399359985 177.40528399360002 190.84072399359997 204.77616399359997 219.21160399359988 234.1470439936001 249.58248399360005 265.5179239936 281.95336399359996 298.8888039935999 +1048.5029405696 1016.4255805696002 984.8482205696 953.7708605696001 923.1935005695999 893.1161405696001 863.5387805696001 834.4614205695999 805.8840605696 777.8067005696 750.2293405696001 723.1519805696001 696.5746205696 670.4972605696001 644.9199005696 619.8425405696 595.2651805696001 571.1878205696 547.6104605696001 524.5331005696 501.95574056960004 479.8783805696001 458.3010205696 437.2236605696 416.64630056959993 396.5689405696 376.9915805696001 357.91422056959993 339.33686056960005 321.25950056959994 303.6821405696 286.60478056960005 270.0274205696 253.95006056960008 238.37270056959994 223.2953405696 208.7179805696001 194.6406205696 181.06326056960003 167.98590056959998 155.4085405696 143.33118056959995 131.7538205696 120.67646056960004 110.09910056959998 100.02174056960004 90.44438056959999 81.36702056960002 72.78966056959997 64.7123005696 57.13494056960002 50.057580569599985 43.48022056960001 37.40286056959998 31.825500569599996 26.748140569600015 22.17078056959999 18.093420569600006 14.516060569599988 11.4387005696 8.861340569600008 6.783980569599997 5.206620569600002 4.129260569599997 3.5519005696000003 3.4745405696 3.8971805696000015 4.819820569599998 6.242460569600007 8.1651005696 10.58774056959999 13.510380569600006 16.933020569599996 20.855660569600015 25.2783005696 30.200940569599982 35.62358056960001 41.54622056959999 47.968860569600025 54.8915005696 62.31414056959997 70.23678056959994 78.65942056960007 87.58206056960005 97.00470056960002 106.92734056959999 117.34998056959996 128.2726205696001 139.69526056960007 151.61790056960004 164.04054056959998 176.96318056959996 190.38582056960013 204.30846056960007 218.73110056960002 233.65374056959996 249.07638056960022 264.99902056960013 281.4216605696001 298.3443005696 315.7669405695999 +1018.1361261055999 986.5302861056001 955.4244461055999 924.8186061056 894.7127661055999 865.1069261056 836.0010861056 807.3952461055999 779.2894061056 751.6835661055999 724.5777261055999 697.9718861056001 671.8660461055999 646.2602061056001 621.1543661055999 596.5485261056 572.4426861056002 548.8368461055999 525.7310061056 503.12516610559993 481.0193261056 459.41348610560004 438.3076461056 417.7018061056001 397.5959661055999 377.9901261056 358.88428610560004 340.2784461056 322.17260610560004 304.5667661055999 287.4609261056 270.8550861056001 254.74924610559998 239.14340610560004 224.03756610559998 209.43172610559998 195.32588610560006 181.72004610559998 168.61420610560003 156.00836610559995 143.9025261056 132.29668610559995 121.19084610559999 110.5850061056 100.47916610559999 90.87332610560001 81.76748610559996 73.1616461056 65.05580610559996 57.449966105599984 50.344126105600004 43.73828610559997 37.632446105599996 32.026606105599974 26.92076610559999 22.31492610560001 18.209086105599987 14.6032461056 11.497406105599985 8.891566105599995 6.785726105600004 5.179886105599995 4.0740461056 3.468206105599998 3.3623661056000005 3.756526105599999 4.650686105600005 6.0448461056000005 7.939006105600011 10.333166105600005 13.227326105599996 16.621486105600013 20.515646105600002 24.909806105600026 29.803966105600008 35.19812610559999 41.09228610560002 47.4864461056 54.38060610560004 61.77476610560001 69.66892610559998 78.06308610559995 86.95724610560008 96.35140610560005 106.24556610560003 116.6397261056 127.53388610559998 138.92804610560015 150.8222061056001 163.21636610560006 176.11052610560003 189.50468610559997 203.3988461056002 217.7930061056001 232.68716610560008 248.0813261056 263.9754861056003 280.36964610560017 297.26380610560017 314.65796610560005 332.5521261056 +989.2 958.0500000000002 927.4 897.2500000000001 867.5999999999999 838.45 809.8000000000002 781.6500000000001 754.0000000000001 726.8499999999999 700.2 674.05 648.4 623.2500000000001 598.6 574.45 550.8 527.6500000000001 505.00000000000006 482.85 461.20000000000005 440.04999999999995 419.4 399.25 379.59999999999997 360.45000000000005 341.8 323.65 306.0 288.84999999999997 272.20000000000005 256.05 240.4 225.25 210.6 196.45000000000005 182.80000000000004 169.65000000000003 157.00000000000003 144.85 133.20000000000005 122.04999999999997 111.4 101.25000000000004 91.6 82.45000000000002 73.79999999999997 65.65 57.999999999999964 50.849999999999994 44.200000000000024 38.04999999999999 32.400000000000006 27.24999999999998 22.599999999999994 18.45000000000001 14.79999999999999 11.650000000000002 8.99999999999999 6.849999999999998 5.200000000000004 4.049999999999998 3.4000000000000004 3.250000000000001 3.600000000000001 4.4499999999999975 5.800000000000004 7.649999999999999 10.000000000000012 12.850000000000003 16.19999999999999 20.05000000000001 24.4 29.25000000000002 34.6 40.44999999999999 46.800000000000026 53.65 61.000000000000036 68.85000000000001 77.19999999999997 86.04999999999994 95.40000000000008 105.25000000000004 115.60000000000001 126.44999999999997 137.79999999999993 149.65000000000012 162.00000000000006 174.85000000000002 188.2 202.04999999999993 216.40000000000012 231.2500000000001 246.60000000000002 262.44999999999993 278.80000000000024 295.65000000000015 313.0000000000001 330.85 349.2 +961.6516768256001 930.9418368256003 900.7319968256 871.0221568256001 841.8123168256001 813.1024768256001 784.8926368256002 757.1827968256 729.9729568256001 703.2631168255999 677.0532768256 651.3434368255998 626.1335968256 601.4237568256001 577.2139168256 553.5040768256 530.2942368255999 507.58439682560004 485.3745568256001 463.6647168256 442.4548768256 421.7450368255999 401.5351968256 381.8253568256 362.61551682559997 343.90567682560004 325.69583682560005 307.9859968256 290.77615682559997 274.0663168256 257.8564768256 242.14663682559998 226.9367968256 212.22695682559996 198.01711682559997 184.3072768256 171.0974368256 158.3875968256 146.17775682559997 134.46791682559999 123.25807682560001 112.54823682559996 102.33839682559999 92.62855682560003 83.41871682559999 74.70887682560002 66.49903682559997 58.78919682559999 51.57935682559996 44.86951682559998 38.65967682560001 32.94983682559998 27.739996825599995 23.030156825599974 18.82031682559999 15.110476825600005 11.900636825599987 9.1907968256 6.980956825599989 5.2711168255999965 4.061276825600001 3.3514368255999982 3.1415968256 3.431756825600003 4.221916825600003 5.512076825599998 7.3022368256000085 9.592396825600002 12.382556825600018 15.672716825600007 19.46287682559999 23.75303682560002 28.5431968256 33.83335682560003 39.623516825600014 45.913676825599985 52.70383682560003 59.99399682559999 67.78415682560004 76.07431682560002 84.8644768256 94.15463682559995 103.9447968256001 114.23495682560005 125.02511682560002 136.3152768256 148.10543682559992 160.3955968256001 173.18575682560007 186.47591682560002 200.26607682559998 214.55623682559994 229.34639682560015 244.63655682560008 260.42671682560007 276.7168768256 293.5070368256002 310.79719682560017 328.5873568256001 346.8775168256001 365.6676768256 +935.4497463296001 905.1643863296002 875.3790263296 846.0936663296002 817.3083063296 789.0229463296 761.2375863296002 733.9522263296 707.1668663296001 680.8815063296 655.0961463296001 629.8107863296 605.0254263296 580.7400663296 556.9547063296 533.6693463296 510.88398632959996 488.5986263296001 466.81326632960014 445.52790632960006 424.74254632960015 404.4571863296 384.67182632960004 365.3864663296 346.60110632960004 328.31574632960013 310.5303863296 293.2450263296001 276.4596663296 260.17430632960003 244.38894632960012 229.10358632959998 214.31822632960004 200.03286632959998 186.24750632960001 172.96214632960007 160.17678632960002 147.89142632960002 136.10606632959997 124.82070632960003 114.03534632960006 103.7499863296 93.96462632960001 84.67926632960004 75.89390632959999 67.60854632960002 59.82318632959998 52.53782632960001 45.752466329599976 39.46710632959999 33.68174632960002 28.396386329599988 23.611026329600005 19.325666329599983 15.540306329599998 12.254946329600008 9.469586329599995 7.184226329600002 5.3988663295999935 4.1135063296 3.3281463296000022 3.0427863296000006 3.2574263296000003 3.972066329600005 5.1867063296000016 6.9013463295999955 9.115986329600007 11.830626329599998 15.045266329600016 18.759906329600007 22.97454632959999 27.689186329600012 32.903826329599994 38.618466329600025 44.83310632960001 51.54774632959998 58.76238632960001 66.4770263296 74.69166632960003 83.4063063296 92.62094632959997 102.33558632959995 112.55022632960006 123.26486632960001 134.47950632959999 146.19414632959996 158.4087863295999 171.12342632960008 184.33806632960003 198.0527063296 212.26734632959995 226.98198632959986 242.1966263296001 257.91126632960004 274.1259063296 290.84054632959993 308.05518632960013 325.7698263296001 343.9844663296001 362.6991063296 381.9137463295999 +910.5542734336001 880.6777134336002 851.3011534336001 822.4245934336002 794.0480334336 766.1714734336001 738.7949134336003 711.9183534336 685.5417934336001 659.6652334336001 634.2886734336 609.4121134336 585.0355534336001 561.1589934336001 537.7824334336 514.9058734336 492.5293134336 470.6527534336001 449.2761934336001 428.39963343360006 408.0230734336001 388.1465134336 368.76995343360005 349.89339343359995 331.5168334336 313.64027343360004 296.2637134336 279.3871534336 263.0105934335999 247.13403343360002 231.75747343360007 216.8809134336 202.50435343360004 188.62779343359998 175.25123343360002 162.37467343360007 149.9981134336 138.12155343360004 126.74499343359997 115.8684334336 105.49187343360005 95.61531343359997 86.2387534336 77.36219343360003 68.98563343359999 61.10907343360002 53.73251343359998 46.85595343360001 40.479393433599974 34.60283343359999 29.226273433600014 24.349713433599987 19.973153433600004 16.096593433599985 12.720033433599996 9.843473433600007 7.466913433599993 5.590353433600001 4.213793433599995 3.3372334336 2.9606734336000007 3.0841134336000016 3.7075534336000002 4.830993433600007 6.454433433600003 8.577873433599995 11.20131343360001 14.3247534336 17.94819343360002 22.07163343360001 26.69507343359999 31.818513433600017 37.4419534336 43.56539343360003 50.18883343360001 57.312273433599984 64.93571343360003 73.05915343359999 81.68259343360005 90.8060334336 100.42947343359998 110.55291343359991 121.17635343360007 132.29979343360003 143.9232334336 156.04667343359995 168.6701134335999 181.7935534336001 195.41699343360006 209.5404334336 224.16387343359995 239.28731343359988 254.9107534336001 271.0341934336001 287.6576334336 304.7810734335999 322.4045134336002 340.52795343360015 359.15139343360005 378.2748334336 397.8982734335999 +886.9267982335999 857.4433582336001 828.4599182335999 799.9764782336 771.9930382335999 744.5095982336 717.5261582336 691.0427182336 665.0592782336 639.5758382335998 614.5923982336 590.1089582336 566.1255182335999 542.6420782336 519.6586382335998 497.1751982336 475.1917582336 453.7083182335999 432.7248782336 412.2414382335999 392.25799823359995 372.77455823360003 353.79111823359995 335.3076782336 317.3242382335999 299.84079823359997 282.85735823360005 266.3739182335999 250.39047823360002 234.90703823359993 219.9235982336 205.44015823360007 191.45671823359996 177.9732782336 164.98983823359995 152.5063982336 140.52295823360004 129.03951823359998 118.05607823360002 107.57263823359996 97.58919823360002 88.10575823359997 79.1223182336 70.63887823360004 62.65543823359999 55.17199823360002 48.18855823359998 41.705118233600004 35.721678233599974 30.238238233599994 25.25479823360001 20.77135823359999 16.787918233600003 13.304478233599983 10.321038233599996 7.837598233600005 5.854158233599994 4.370718233600001 3.387278233599997 2.9038382336000006 2.9203982336000003 3.436958233600003 4.4535182336000005 5.9700782336000096 7.986638233600004 10.503198233599996 13.51975823360001 17.0363182336 21.052878233600023 25.56943823360001 30.58599823359999 36.10255823360002 42.1191182336 48.63567823360004 55.65223823360001 63.16879823359999 71.18535823360003 79.7019182336 88.71847823360005 98.23503823360002 108.25159823360002 118.76815823359996 129.78471823360013 141.3012782336001 153.31783823360004 165.8343982336 178.85095823359995 192.36751823360015 206.38407823360012 220.90063823360006 235.9171982336 251.43375823359997 267.45031823360017 283.9668782336001 300.98343823360005 318.49999823359997 336.5165582336002 355.0331182336002 374.0496782336001 393.5662382336001 413.5827982336 +864.5303359999999 835.424336 806.8183360000002 778.7123360000003 751.1063359999998 724.000336 697.3943360000001 671.2883360000001 645.6823360000002 620.5763359999999 595.970336 571.8643360000001 548.2583360000001 525.1523360000002 502.54633599999994 480.440336 458.8343360000001 437.7283360000001 417.1223360000002 397.016336 377.4103360000001 358.3043360000001 339.69833600000004 321.59233600000005 303.98633600000005 286.88033600000006 270.27433600000006 254.168336 238.56233600000002 223.456336 208.85033600000006 194.74433600000003 181.138336 168.032336 155.426336 143.32033600000005 131.714336 120.60833600000004 110.00233600000001 99.896336 90.29033600000004 81.18433599999999 72.57833600000002 64.47233600000004 56.866336000000004 49.76033600000003 43.154335999999994 37.04833600000001 31.442335999999987 26.336336000000003 21.73033600000002 17.624335999999996 14.018336000000009 10.912335999999993 8.306336000000002 6.200336000000008 4.594335999999998 3.488336000000002 2.882335999999999 2.776336 3.1703359999999976 4.064336000000002 5.4583359999999965 7.352336000000006 9.746336 12.640335999999987 16.034336000000007 19.92833599999999 24.322336000000014 29.216336 34.610335999999975 40.50433600000001 46.898335999999986 53.79233600000002 61.186336 69.08033599999996 77.47433600000001 86.36833599999997 95.76233600000002 105.65633600000001 116.05033599999996 126.94433599999991 138.33833600000006 150.23233600000003 162.62633599999998 175.52033599999993 188.91433599999988 202.80833600000008 217.20233600000006 232.09633599999998 247.49033599999993 263.3843359999999 279.77833600000014 296.67233600000003 314.066336 331.9603359999999 350.3543360000002 369.24833600000017 388.64233600000006 408.5363360000001 428.930336 +843.3293771776 814.5851371776002 786.3408971776 758.5966571776002 731.3524171775999 704.6081771776 678.3639371776002 652.6196971776001 627.3754571776001 602.6312171776 578.3869771776 554.6427371776 531.3984971776 508.6542571776002 486.4100171776 464.6657771776001 443.4215371776 422.6772971776001 402.4330571776001 382.6888171776 363.44457717760014 344.7003371776001 326.4560971776001 308.71185717760005 291.46761717760006 274.72337717760007 258.4791371776001 242.73489717760003 227.49065717759999 212.7464171776 198.50217717760006 184.75793717760004 171.51369717760002 158.7694571776 146.5252171776 134.78097717760005 123.53673717760005 112.79249717760004 102.54825717760002 92.80401717760002 83.55977717760005 74.8155371776 66.57129717760002 58.82705717760005 51.582817177600006 44.83857717760003 38.59433717759999 32.85009717760001 27.60585717759998 22.8616171776 18.617377177600012 14.873137177599993 11.628897177600006 8.88465717759999 6.6404171776 4.896177177600006 3.6519371775999985 2.907697177600001 2.6634571776000007 2.9192171776000007 3.674977177599997 4.930737177600004 6.686497177599998 8.94225717760001 11.6980171776 14.95377717759999 18.709537177600005 22.965297177599993 27.721057177600013 32.9768171776 38.73257717759997 44.9883371776 51.74409717759998 58.99985717760002 66.75561717759999 75.01137717759997 83.76713717760002 93.02289717759997 102.77865717760004 113.0344171776 123.79017717759996 135.04593717759988 146.8016971776001 159.0574571776 171.8132171776 185.06897717759995 198.82473717759987 213.08049717760008 227.83625717760003 243.09201717759996 258.84777717759994 275.1035371775999 291.8592971776001 309.1150571776 326.87081717760003 345.1265771775999 363.8823371776002 383.1380971776002 402.8938571776 423.14961717759996 443.9053771775999 +823.2898873856001 794.8917273856002 766.9935673856 739.5954073856002 712.6972473856 686.2990873856 660.4009273856002 635.0027673856001 610.1046073856002 585.7064473856 561.8082873856001 538.4101273855999 515.5119673856001 493.1138073856001 471.2156473856 449.81748738560003 428.9193273856 408.52116738560005 388.62300738560003 369.22484738559996 350.3266873856 331.9285273856 314.03036738559996 296.63220738559994 279.7340473855999 263.33588738559996 247.43772738559997 232.03956738559998 217.14140738559996 202.74324738559994 188.8450873856 175.4469273856 162.54876738559997 150.15060738559995 138.25244738559996 126.85428738560002 115.95612738560001 105.55796738559998 95.65980738559999 86.26164738559997 77.36348738560001 68.96532738559996 61.0671673856 53.669007385600025 46.77084738559998 40.37268738560001 34.47452738559998 29.076367385599994 24.178207385599976 19.780047385599993 15.881887385600006 12.483727385599988 9.585567385600001 7.187407385599989 5.289247385599998 3.8910873856000023 2.992927385599998 2.5947673856000004 2.6966073856000023 3.298447385600002 4.400287385599999 6.002127385600007 8.1039673856 10.705807385600014 13.807647385600006 17.40948738559999 21.511327385600016 26.1131673856 31.215007385600035 36.81684738560002 42.9186873856 49.52052738560003 56.622367385600015 64.22420738560005 72.32604738560002 80.9278873856 90.02972738560005 99.63156738560002 109.73340738560006 120.33524738560003 131.4370873856 143.03892738559995 155.14076738560013 167.74260738560008 180.84444738560003 194.4462873856 208.54812738559994 223.14996738560015 238.2518073856001 253.85364738560003 269.9554873856 286.55732738559993 303.6591673856002 321.2610073856001 339.36284738560005 357.9646873856 377.06652738560024 396.66836738560016 416.7702073856001 437.37204738559996 458.4738873855999 +804.3793074176001 776.3115474176002 748.7437874176001 721.6760274176002 695.1082674176 669.0405074176 643.4727474176002 618.4049874176001 593.8372274176002 569.7694674175999 546.2017074176001 523.1339474176 500.5661874176 478.4984274176001 456.9306674176 435.8629074176 415.2951474175999 395.22738741759997 375.6596274176 356.5918674176 338.0241074176 319.9563474176 302.3885874176 285.32082741759996 268.75306741759994 252.68530741760006 237.11754741760004 222.0497874176 207.4820274176 193.41426741759997 179.8465074176 166.77874741760002 154.2109874176 142.1432274176 130.57546741759998 119.50770741760002 108.93994741760001 98.8721874176 89.3044274176 80.23666741759999 71.66890741760001 63.601147417599975 56.0333874176 48.965627417600025 42.39786741759998 36.330107417600004 30.76234741759998 25.694587417599998 21.126827417599976 17.05906741759999 13.491307417600005 10.42354741759999 7.8557874176 5.78802741759999 4.220267417599997 3.152507417600001 2.584747417599999 2.5169874176 2.949227417600004 3.881467417600003 5.313707417599998 7.245947417600009 9.678187417600002 12.610427417600018 16.042667417600008 19.974907417599994 24.40714741760002 29.3393874176 34.77162741760003 40.70386741760001 47.13610741759999 54.06834741760003 61.5005874176 69.43282741760005 77.86506741760002 86.7973074176 96.22954741760005 106.16178741760001 116.59402741760006 127.52626741760002 138.95850741759998 150.89074741759993 163.32298741760013 176.25522741760008 189.68746741760003 203.6197074176 218.05194741759993 232.98418741760014 248.4164274176001 264.34866741760004 280.78090741759996 297.7131474175999 315.14538741760015 333.07762741760007 351.5098674176 370.44210741759997 389.87434741760023 409.8065874176002 430.2388274176001 451.17106741760006 472.6033074176 +786.5665532416001 758.8135132416002 731.5604732416 704.8074332416 678.5543932416 652.8013532416 627.5483132416001 602.7952732416 578.5422332416001 554.7891932416 531.5361532416 508.78311324159995 486.5300732416 464.77703324160007 443.52399324159995 422.7709532416 402.51791324159996 382.7648732416 363.5118332416001 344.75879324159996 326.5057532416 308.7527132416 291.4996732416 274.74663324159997 258.49359324159997 242.74055324160003 227.4875132416 212.7344732416 198.48143324159997 184.72839324159997 171.47535324160003 158.7223132416 146.46927324159998 134.7162332416 123.46319324159998 112.71015324160004 102.45711324160001 92.70407324160001 83.4510332416 74.69799324159999 66.44495324160002 58.69191324159998 51.43887324160001 44.68583324160003 38.432793241599995 32.67975324160001 27.426713241599987 22.6736732416 18.42063324159998 14.667593241599992 11.414553241600006 8.661513241599991 6.408473241599999 4.655433241599992 3.4023932415999982 2.649353241600001 2.3963132416 2.6432732416 3.390233241600006 4.637193241600004 6.384153241599997 8.63111324160001 11.378073241600003 14.62503324160002 18.37199324160001 22.618953241599993 27.36591324160002 32.61287324159999 38.35983324160003 44.60679324160001 51.35375324159998 58.60071324160002 66.34767324159999 74.59463324160004 83.34159324160001 92.58855324159998 102.33551324160003 112.58247324159998 123.32943324160004 134.5763932416 146.32335324159996 158.5703132415999 171.3172732416001 184.56423324160005 198.3111932416 212.55815324159997 227.3051132415999 242.5520732416001 258.29903324160006 274.5459932416 291.29295324159995 308.5399132415999 326.2868732416001 344.53383324160006 363.2807932416 382.52775324159995 402.27471324160024 422.5216732416001 443.26863324160007 464.5155932416 486.26255324159996 +769.822016 742.368016 715.4140159999998 688.960016 663.0060159999999 637.552016 612.598016 588.1440159999999 564.190016 540.7360159999998 517.7820159999999 495.32801600000005 473.3740159999999 451.9200160000001 430.9660159999999 410.512016 390.55801600000007 371.10401600000006 352.1500160000001 333.69601600000004 315.7420160000001 298.2880160000001 281.3340160000001 264.88001600000007 248.926016 233.47201600000005 218.51801600000002 204.064016 190.110016 176.656016 163.70201600000004 151.24801600000004 139.294016 127.840016 116.88601600000001 106.43201600000005 96.47801600000004 87.02401600000003 78.07001600000001 69.616016 61.66201600000003 54.20801599999999 47.254016000000014 40.80001600000004 34.846016 29.39201600000002 24.43801599999999 19.984016000000004 16.030015999999986 12.576015999999997 9.622016000000007 7.168015999999994 5.214016000000002 3.760015999999995 2.8060159999999996 2.3520160000000008 2.3980160000000006 2.944015999999999 3.9900160000000056 5.536016000000002 7.582015999999994 10.128016000000006 13.174015999999996 16.72001600000002 20.766016000000004 25.312015999999986 30.35801600000001 35.90401599999999 41.950016000000026 48.496016 55.542015999999975 63.08801600000001 71.13401599999999 79.68001600000004 88.726016 98.27201599999997 108.31801600000001 118.86401599999998 129.910016 141.45601599999998 153.50201599999994 166.04801599999988 179.0940160000001 192.64001600000003 206.686016 221.23201599999993 236.27801599999987 251.8240160000001 267.8700160000001 284.416016 301.46201599999995 319.0080159999999 337.05401600000016 355.60001600000004 374.646016 394.1920159999999 414.2380160000003 434.78401600000024 455.83001600000017 477.3760160000001 499.42201600000004 +754.1175620096 726.9469220096 700.2762820096 674.1056420095999 648.4350020095999 623.2643620096 598.5937220096 574.4230820096 550.7524420096 527.5818020096 504.91116200960005 482.74052200959994 461.06988200959995 439.8992420096001 419.2286020096 399.05796200960003 379.3873220096 360.2166820096 341.54604200960006 323.37540200959995 305.7047620096 288.5341220096 271.8634820096 255.69284200959996 240.02220200959997 224.85156200960003 210.1809220096 196.0102820096 182.33964200959997 169.16900200959998 156.49836200960002 144.3277220096 132.6570820096 121.48644200959998 110.81580200959996 100.64516200960001 90.9745220096 81.80388200959999 73.13324200959998 64.96260200959998 57.29196200960001 50.12132200959997 43.450682009599994 37.28004200960002 31.609402009599986 26.4387620096 21.768122009599978 17.597482009599993 13.926842009599977 10.756202009599988 8.0855620096 5.91492200959999 4.244282009599997 3.0736420095999932 2.4030020095999984 2.2323620096 2.561722009600003 3.3910820096000016 4.720442009600012 6.549802009600008 8.879162009600002 11.708522009600017 15.037882009600008 18.86724200960003 23.196602009600017 28.025962009599994 33.35532200960002 39.1846820096 45.51404200960004 52.34340200960002 59.67276200959999 67.50212200960003 75.83148200960001 84.66084200960005 93.99020200960003 103.81956200959998 114.14892200960004 124.97828200960001 136.30764200960007 148.13700200960002 160.46636200959998 173.29572200959996 186.62508200960013 200.4544420096001 214.78380200960004 229.61316200960002 244.9425220095999 260.7718820096002 277.1012420096001 293.9306020096 311.2599620096 329.0893220095999 347.4186820096002 366.2480420096001 385.57740200960006 405.40676200959996 425.73612200960025 446.5654820096002 467.8948420096001 489.7242020096001 512.0535620096 +739.4265327616002 712.5235727616002 686.1206127616001 660.2176527616002 634.8146927616001 609.9117327616002 585.5087727616002 561.6058127616002 538.2028527616002 515.2998927616001 492.8969327616002 470.99397276160005 449.59101276160015 428.68805276160026 408.28509276160014 388.3821327616001 368.97917276160007 350.0762127616 331.6732527616001 313.7702927616 296.3673327616001 279.46437276160003 263.0614127616 247.1584527616 231.7554927616 216.85253276160003 202.44957276160002 188.54661276160002 175.1436527616 162.2406927616 149.83773276160002 137.93477276160002 126.53181276160002 115.62885276160002 105.2258927616 95.32293276160003 85.91997276160002 77.01701276160001 68.6140527616 60.7110927616 53.30813276160002 46.405172761599985 40.002212761600006 34.09925276160003 28.696292761599995 23.793332761600013 19.39037276159999 15.487412761600007 12.084452761599987 9.1814927616 6.778532761600008 4.875572761599997 3.472612761600003 2.5696527615999987 2.1666927616000007 2.2637327615999996 2.860772761600002 3.957812761599998 5.5548527616000065 7.651892761600001 10.248932761599992 13.345972761600008 16.943012761599995 21.040052761600016 25.6370927616 30.734132761599984 36.33117276160001 42.428212761599994 49.02525276160003 56.12229276160001 63.71933276159997 71.81637276160002 80.41341276159999 89.51045276160005 99.10749276160001 109.20453276159998 119.80157276160004 130.8986127616 142.49565276160004 154.5926927616 167.18973276159994 180.2867727615999 193.8838127616001 207.98085276160006 222.57789276160003 237.67493276159996 253.27197276159987 269.3690127616001 285.9660527616001 303.06309276160005 320.6601327616 338.75717276159986 357.35421276160014 376.4512527616001 396.0482927616 416.1453327615999 436.74237276160017 457.83941276160004 479.43645276160004 501.5334927615999 524.1305327615999 +725.7237449216 699.0727849216 672.9218249216 647.2708649216 622.1199049215999 597.4689449216 573.3179849216001 549.6670249216 526.5160649216 503.86510492159994 481.7141449216 460.0631849216001 438.9122249216 418.2612649216 398.11030492159995 378.4593449216 359.30838492160007 340.65742492159995 322.50646492160007 304.85550492159996 287.7045449216 271.0535849216001 254.90262492159997 239.25166492160005 224.10070492159994 209.4497449216 195.29878492160006 181.64782492159998 168.49686492160004 155.84590492159998 143.6949449216 132.04398492160004 120.89302492159999 110.24206492160002 100.09110492159999 90.44014492160002 81.28918492160001 72.63822492160001 64.4872649216 56.836304921600004 49.68534492160002 43.03438492159998 36.88342492160001 31.232464921600027 26.081504921599997 21.430544921600013 17.27958492159999 13.628624921600004 10.477664921599988 7.826704921599999 5.675744921600007 4.024784921599998 2.8738249216000016 2.222864921599999 2.0719049216000003 2.4209449215999985 3.2699849216000025 4.619024921599999 6.468064921600009 8.817104921600002 11.66614492159999 15.01518492160001 18.864224921599995 23.213264921600018 28.062304921600006 33.41134492159998 39.26038492160002 45.609424921599995 52.458464921600026 59.8075049216 67.65654492159997 76.00558492160002 84.85462492159998 94.20366492160004 104.05270492160003 114.4017449216 125.25078492160004 136.5998249216 148.44886492160006 160.79790492160004 173.64694492159998 186.99598492159993 200.84502492160013 215.1940649216001 230.04310492160002 245.39214492159996 261.2411849215999 277.59022492160017 294.4392649216001 311.78830492160006 329.6373449216 347.9863849215999 366.8354249216002 386.1844649216001 406.03350492160007 426.38254492159996 447.2315849216003 468.58062492160025 490.4296649216002 512.7787049216 535.6277449216 +712.9854903296 686.5708503296001 660.6562103296 635.2415703296001 610.3269303295999 585.9122903296 561.9976503296001 538.5830103296 515.6683703296001 493.2537303295998 471.33909032959997 449.92445032960006 429.00981032959993 408.5951703296 388.68053032959995 369.26589032960004 350.3512503296001 331.9366103296 314.02197032960004 296.6073303296 279.69269032960005 263.27805032960003 247.36341032960001 231.94877032960002 217.0341303296 202.61949032960004 188.70485032960002 175.2902103296 162.37557032959998 149.9609303296 138.04629032960003 126.63165032960003 115.71701032960001 105.30237032960001 95.3877303296 85.97309032960004 77.05845032960002 68.64381032960002 60.72917032960001 53.314530329600004 46.39989032960003 39.985250329599985 34.07061032960001 28.655970329600027 23.741330329599993 19.32669032960001 15.412050329599989 11.997410329600001 9.082770329599988 6.668130329599998 4.753490329600004 3.338850329599997 2.4242103296000006 2.0095703296 2.094930329600001 2.6802903295999987 3.7656503296000046 5.3510103296 7.436370329600011 10.021730329600004 13.107090329599993 16.69245032960001 20.777810329599998 25.363170329600024 30.448530329600004 36.033890329599984 42.119250329600014 48.70461032959999 55.78997032960003 63.375330329600004 71.46069032959997 80.04605032960002 89.13141032959999 98.71677032960005 108.80213032960002 119.38749032959998 130.47285032960002 142.05821032959997 154.14357032960004 166.7289303296 179.81429032959994 193.3996503295999 207.48501032960013 222.07037032960005 237.1557303296 252.74109032959996 268.8264503295999 285.41181032960014 302.4971703296 320.0825303296 338.1678903295999 356.75325032959984 375.83861032960016 395.4239703296001 415.5093303296001 436.09469032960004 457.1800503296003 478.76541032960023 500.8507703296002 523.4361303296001 546.5214903296 +701.1895360000001 674.9955360000001 649.301536 624.1075360000001 599.4135359999999 575.2195360000001 551.5255360000001 528.331536 505.63753600000007 483.443536 461.74953600000003 440.55553600000013 419.861536 399.6675360000001 379.97353599999997 360.77953600000006 342.085536 323.89153600000003 306.19753600000007 289.003536 272.30953600000004 256.115536 240.42153600000003 225.22753600000001 210.53353599999997 196.33953600000004 182.64553600000002 169.451536 156.757536 144.563536 132.86953600000004 121.675536 110.98153599999999 100.78753599999999 91.09353599999997 81.89953600000001 73.20553600000001 65.01153599999999 57.317536 50.12353599999999 43.42953600000001 37.23553599999998 31.541535999999997 26.347536000000016 21.653535999999992 17.459536000000007 13.765535999999988 10.571536000000002 7.877535999999987 5.683535999999997 3.989536000000003 2.7955359999999967 2.1015360000000003 1.9075360000000006 2.2135360000000013 3.0195359999999987 4.325536000000006 6.1315360000000005 8.437536000000014 11.243536000000008 14.549535999999994 18.355536000000015 22.661536 27.467536000000024 32.77353600000001 38.579536 44.88553600000003 51.691536 58.997536000000046 66.80353600000001 75.10953599999998 83.91553600000002 93.221536 103.02753600000004 113.33353600000001 124.13953599999998 135.44553600000006 147.25153600000002 159.55753600000008 172.36353600000004 185.669536 199.47553599999995 213.78153600000013 228.58753600000009 243.89353600000004 259.69953599999997 276.0055359999999 292.81153600000016 310.1175360000001 327.923536 346.229536 365.0355359999999 384.3415360000002 404.1475360000002 424.45353600000004 445.259536 466.56553600000024 488.37153600000016 510.67753600000015 533.4835360000001 556.789536 +690.3151241216 664.3260841216 638.8370441215999 613.8480041216001 589.3589641215999 565.3699241216 541.8808841216 518.8918441215999 496.40280412160007 474.4137641215999 452.92472412160004 431.93568412160005 411.44664412159995 391.4576041216 371.9685641215999 352.9795241216 334.49048412159993 316.50144412159995 299.0124041216 282.0233641215999 265.5343241216 249.54528412159996 234.05624412159995 219.06720412159996 204.5781641215999 190.58912412159998 177.1000841216 164.11104412159997 151.62200412159996 139.63296412159997 128.14392412159998 117.15488412159999 106.6658441216 96.67680412159999 87.18776412159998 78.19872412160001 69.7096841216 61.72064412159999 54.231604121599986 47.24256412159997 40.75352412160001 34.76448412159998 29.275444121599996 24.286404121600015 19.797364121599994 15.808324121600004 12.319284121599987 9.3302441216 6.841204121599987 4.852164121599996 3.363124121600002 2.3740841215999975 1.8850441216 1.8960041216000016 2.406964121600002 3.4179241215999983 4.9288841216000066 6.939844121600001 9.450804121600015 12.461764121600007 15.972724121599994 19.983684121600017 24.4946441216 29.505604121600037 35.01656412160001 41.027524121599996 47.538484121600035 54.549444121600004 62.06040412160006 70.07136412160004 78.5823241216 87.59328412160005 97.10424412160002 107.11520412160009 117.62616412160004 128.63712412159998 140.14808412160005 152.1590441216 164.67000412160007 177.68096412160003 191.19192412159998 205.20288412159994 219.71384412160012 234.72480412160007 250.23576412160003 266.2467241216 282.75768412159994 299.7686441216002 317.27960412160013 335.2905641216 353.8015241216 372.81248412159994 392.3234441216002 412.33440412160013 432.8453641216 453.8563241215999 475.3672841216003 497.3782441216002 519.8892041216002 542.9001641216 566.4111241216 +680.3429720576 654.5432120576002 629.2434520576 604.4436920576001 580.1439320576001 556.3441720576001 533.0444120576002 510.2446520576 487.9448920576001 466.14513205759994 444.84537205760006 424.04561205759995 403.7458520576 383.9460920576 364.6463320575999 345.8465720576 327.54681205759994 309.74705205759994 292.4472920576 275.6475320575999 259.34777205759997 243.54801205759995 228.24825205759996 213.44849205759994 199.14873205759991 185.34897205759998 172.04921205759996 159.24945205759997 146.94969205759995 135.14993205759995 123.85017205759999 113.05041205759998 102.75065205759998 92.9508920576 83.65113205759998 74.85137205760002 66.55161205760001 58.7518520576 51.452092057599984 44.652332057599985 38.35257205760001 32.55281205759998 27.253052057599998 22.453292057600017 18.153532057599993 14.353772057600006 11.054012057599987 8.254252057599999 5.954492057599987 4.154732057599996 2.8549720576000013 2.0552120575999977 1.7554520576000001 1.955692057600003 2.655932057600003 3.8561720575999994 5.556412057600009 7.756652057600002 10.456892057600017 13.657132057600007 17.357372057599996 21.557612057600018 26.257852057600005 31.458092057600034 37.158332057600006 43.358572057599986 50.05881205760002 57.2590520576 64.95929205760004 73.15953205760003 81.85977205759998 91.06001205760005 100.7602520576 110.96049205760009 121.66073205760004 132.8609720576 144.56121205760005 156.76145205760002 169.4616920576001 182.66193205760007 196.3621720576 210.56241205759994 225.26265205760015 240.4628920576001 256.1631320576001 272.36337205760003 289.0636120576 306.2638520576002 323.9640920576001 342.16433205760006 360.8645720576 380.0648120575999 399.76505205760026 419.96529205760004 440.6655320576 461.8657720575999 483.5660120576002 505.7662520576002 528.4664920576001 551.6667320576 575.3669720575999 +671.2552723456 645.6291123456002 620.5029523456 595.8767923456002 571.7506323456 548.1244723456001 524.9983123456001 502.37215234560006 480.24599234560014 458.6198323456 437.4936723456001 416.86751234559995 396.74135234560003 377.1151923456001 357.9890323456 339.36287234560007 321.2367123455999 303.6105523456 286.4843923456001 269.8582323456 253.73207234560007 238.10591234559996 222.97975234560002 208.35359234559996 194.2274323456 180.60127234560005 167.47511234559997 154.84895234560003 142.72279234559997 131.0966323456 119.97047234560003 109.34431234559996 99.21815234559999 89.59199234559998 80.46583234559996 71.83967234560001 63.713512345599995 56.08735234559999 48.96119234559999 42.335032345599984 36.20887234560001 30.582712345599976 25.456552345599995 20.83039234560001 16.70423234559999 13.0780723456 9.951912345599986 7.325752345599997 5.199592345599988 3.5734323455999957 2.4472723456000005 1.8211123455999982 1.6949523456000002 2.068792345600004 2.9426323456000034 4.316472345599999 6.19031234560001 8.564152345600004 11.43799234560002 14.811832345600012 18.685672345599997 23.05951234560002 27.933352345600003 33.30719234560004 39.18103234560002 45.554872345599996 52.42871234560003 59.80255234560001 67.67639234560005 76.05023234560002 84.9240723456 94.29791234560004 104.17175234559998 114.54559234560004 125.4194323456 136.79327234559997 148.66711234560003 161.0409523456 173.91479234560006 187.2886323456 201.16247234559998 215.5363123455999 230.41015234560012 245.78399234560007 261.6578323456 278.03167234559993 294.9055123455999 312.2793523456001 330.1531923456001 348.52703234560005 367.40087234559996 386.7747123455999 406.64855234560014 427.0223923456001 447.8962323456001 469.27007234559994 491.14391234560026 513.5177523456001 536.3915923456001 559.7654323456001 583.6392723455999 +663.0356926976002 637.5674526976003 612.5992126976001 588.1309726976003 564.1627326976002 540.6944926976001 517.7262526976003 495.25801269760007 473.2897726976002 451.8215326976001 430.8532926976002 410.38505269760003 390.4168126976 370.94857269760007 351.9803326976 333.51209269760005 315.5438526976 298.07561269760004 281.10737269760006 264.63913269759996 248.67089269760004 233.20265269760003 218.2344126976 203.7661726976 189.79793269759998 176.32969269760002 163.36145269760001 150.89321269759998 138.92497269759997 127.45673269759999 116.48849269760002 106.0202526976 96.0520126976 86.5837726976 77.61553269759997 69.14729269760001 61.17905269760001 53.710812697600005 46.742572697599996 40.274332697599995 34.306092697600015 28.837852697599985 23.8696126976 19.401372697600017 15.433132697599996 11.964892697600007 8.996652697599993 6.528412697600001 4.560172697599992 3.091932697599999 2.1236926976000023 1.6554526976 1.6872126976000004 2.2189726976000044 3.250732697600002 4.782492697599996 6.814252697600008 9.346012697599999 12.377772697600017 15.909532697600005 19.94129269759999 24.473052697600018 29.504812697600002 35.03657269760003 41.06833269760001 47.60009269759999 54.631852697600024 62.1636126976 70.19537269760004 78.7271326976 87.75889269759998 97.29065269760002 107.32241269759999 117.85417269760003 128.88593269760003 140.41769269759996 152.4494526976 164.98121269759997 178.01297269760005 191.5447326976 205.57649269759997 220.1082526975999 235.1400126976001 250.67177269760006 266.7035326976 283.23529269759996 300.26705269759987 317.79881269760017 335.8305726976001 354.3623326976 373.39409269759994 392.9258526975999 412.9576126976001 433.4893726976 454.52113269759997 476.0528926975998 498.0846526976001 520.6164126976001 543.6481726976001 567.1799326976 591.2116926975999 +655.6693760000002 630.3433760000003 605.5173760000001 581.1913760000002 557.3653760000001 534.0393760000002 511.21337600000015 488.88737600000013 467.0613760000002 445.73537600000003 424.9093760000001 404.583376 384.757376 365.43137600000006 346.605376 328.279376 310.453376 293.127376 276.30137600000006 259.975376 244.14937600000002 228.823376 213.99737599999997 199.67137599999998 185.84537599999996 172.51937600000002 159.693376 147.367376 135.54137599999999 124.21537599999998 113.38937600000003 103.063376 93.237376 83.91137599999999 75.08537599999998 66.75937600000002 58.93337600000001 51.607375999999995 44.781375999999995 38.45537599999999 32.62937600000001 27.303375999999986 22.477376000000003 18.151376000000017 14.325375999999997 10.999376000000007 8.173375999999992 5.847376000000001 4.021375999999992 2.6953759999999987 1.8693760000000017 1.5433760000000003 1.7173760000000005 2.3913760000000055 3.565376000000003 5.2393759999999965 7.413376000000008 10.087376 13.261376000000018 16.93537600000001 21.10937599999999 25.78337600000002 30.957376 36.63137600000003 42.80537600000001 49.47937599999998 56.65337600000002 64.327376 72.50137600000004 81.17537600000001 90.34937599999998 100.02337600000003 110.197376 120.87137600000005 132.045376 143.71937599999995 155.89337600000002 168.567376 181.74137600000006 195.415376 209.589376 224.2633759999999 239.4373760000001 255.1113760000001 271.28537600000004 287.95937599999996 305.13337599999994 322.80737600000015 340.9813760000001 359.655376 378.82937599999997 398.5033759999999 418.67737600000004 439.351376 460.52537599999994 482.1993759999998 504.3733760000001 527.0473760000001 550.2213760000001 573.8953759999999 598.0693759999999 +649.1429403136 623.9435003136001 599.2440603136 575.0446203136 551.3451803135999 528.1457403136 505.44630031360015 483.2468603136 461.54742031360007 440.3479803136 419.64854031360005 399.4491003136 379.74966031360003 360.5502203136001 341.8507803136 323.6513403136001 305.95190031360005 288.7524603136 272.0530203136001 255.85358031359996 240.15414031360004 224.95470031360003 210.2552603136 196.05582031359998 182.35638031359997 169.15694031360002 156.4575003136 144.2580603136 132.5586203136 121.35918031359998 110.65974031360003 100.46030031360002 90.7608603136 81.5614203136 72.86198031359999 64.66254031360002 56.96310031360001 49.7636603136 43.064220313599996 36.86478031359999 31.16534031360001 25.96590031359998 21.2664603136 17.067020313600015 13.367580313599994 10.168140313600006 7.468700313599992 5.2692603136 3.5698203135999926 2.3703803135999983 1.6709403136000012 1.4715003136000007 1.7720603136000006 2.572620313600006 3.873180313600003 5.673740313599997 7.974300313600009 10.7748603136 14.075420313600018 17.875980313600007 22.17654031359999 26.97710031360002 32.277660313599995 38.078220313600035 44.37878031360001 51.17934031359999 58.47990031360003 66.2804603136 74.58102031360005 83.38158031360001 92.68214031359997 102.48270031360002 112.78326031360001 123.58382031360006 134.88438031360002 146.68494031359998 158.98550031360003 171.7860603136 185.08662031360006 198.88718031360003 213.18774031359996 227.98830031359992 243.28886031360014 259.0894203136001 275.38998031360006 292.19054031359997 309.49110031359993 327.2916603136002 345.59222031360014 364.39278031360004 383.6933403136 403.4939003135999 423.79446031360015 444.5950203136002 465.8955803136001 487.6961403135999 509.99670031360034 532.7972603136002 556.0978203136001 579.8983803136 604.1989403135999 +643.4444788736 618.3559188736001 593.7673588736 569.6787988736 546.0902388735999 523.0016788736 500.4131188736001 478.32455887360004 456.7359988736001 435.64743887360004 415.05887887360007 394.97031887360004 375.3817588736 356.2931988736001 337.70463887359995 319.61607887360003 302.0275188736 284.93895887360003 268.3503988736001 252.26183887359997 236.67327887360003 221.58471887360002 206.9961588736 192.9075988736 179.3190388736 166.23047887360005 153.64191887360002 141.55335887360002 129.96479887360002 118.87623887359999 108.28767887360002 98.1991188736 88.6105588736 79.5219988736 70.93343887359998 62.84487887360002 55.25631887360001 48.1677588736 41.5791988736 35.4906388736 29.90207887360001 24.813518873599982 20.224958873599995 16.136398873600015 12.547838873599991 9.459278873600004 6.870718873599991 4.782158873599999 3.1935988735999925 2.105038873599998 1.5164788736000008 1.427918873600001 1.8393588736000008 2.7507988736000075 4.162238873600005 6.073678873599998 8.485118873600012 11.396558873600002 14.807998873600022 18.719438873600012 23.130878873599997 28.042318873600017 33.4537588736 39.365198873600036 45.776638873600014 52.688078873599984 60.099518873600026 68.01095887359999 76.42239887360003 85.3338388736 94.74527887359997 104.65671887360004 115.0681588736 125.97959887360005 137.39103887360002 149.3024788736 161.71391887360005 174.62535887360002 188.03679887360008 201.94823887360002 216.35967887359996 231.27111887359993 246.68255887360016 262.59399887360007 279.00543887360004 295.91687887359996 313.3283188735999 331.2397588736002 349.6511988736001 368.5626388736 387.9740788735999 407.8855188735999 428.29695887360015 449.2083988736001 470.61983887360003 492.5312788736 514.9427188736003 537.8541588736002 561.2655988736001 585.1770388736 609.5884788735999 +638.5635600896 613.5702000896 589.0768400895998 565.0834800896 541.5901200895998 518.5967600895999 496.1034000896001 474.1100400895999 452.6166800896 431.62332008959993 411.1299600896 391.13660008960005 371.6432400896 352.6498800896001 334.1565200896 316.16316008960007 298.6698000896 281.6764400896 265.1830800896001 249.1897200896 233.69636008960003 218.7030000896 204.20964008960001 190.2162800896 176.7229200896 163.72956008960003 151.23620008960003 139.2428400896 127.74948008960001 116.75612008959999 106.26276008960002 96.2694000896 86.77604008959999 77.78268008959999 69.28932008959998 61.29596008960001 53.802600089600006 46.809240089599996 40.31588008959999 34.32252008959999 28.829160089600002 23.835800089599978 19.342440089599993 15.349080089600008 11.855720089599991 8.862360089600003 6.36900008959999 4.375640089599999 2.8822800895999925 1.8889200895999982 1.3955600896000007 1.4022000896000015 1.9088400896000013 2.915480089600008 4.422120089600004 6.428760089599998 8.935400089600014 11.942040089600006 15.448680089600025 19.45532008960001 23.961960089599994 28.968600089600027 34.47524008960001 40.48188008960005 46.98852008960002 53.9951600896 61.501800089600046 69.50844008960001 78.01508008960006 87.02172008960002 96.5283600896 106.53500008960003 117.04164008959998 128.04828008960004 139.55492008960002 151.56156008959996 164.06820008960003 177.07484008959997 190.58148008960006 204.5881200896 219.09476008959993 234.1014000895999 249.6080400896001 265.6146800896001 282.12132008960003 299.1279600896 316.63460008959987 334.64124008960016 353.1478800896001 372.15452008960006 391.6611600896 411.66780008959995 432.1744400896003 453.1810800896002 474.68772008960013 496.6943600896001 519.2010000896003 542.2076400896002 565.7142800896002 589.7209200896001 614.2275600896 +634.4912275455999 609.5773875456001 585.1635475456 561.2497075456 537.8358675455999 514.9220275455999 492.5081875456001 470.5943475456 449.1805075456 428.2666675455999 407.8528275456 387.93898754559996 368.5251475455999 349.6113075456 331.1974675455999 313.2836275456 295.86978754559993 278.95594754559994 262.5421075456 246.6282675455999 231.21442754559996 216.30058754559997 201.88674754559995 187.97290754559995 174.55906754559993 161.6452275456 149.23138754559997 137.31754754559995 125.90370754559996 114.98986754559996 104.5760275456 94.6621875456 85.2483475456 76.33450754559999 67.92066754559998 60.00682754560002 52.59298754560001 45.6791475456 39.265307545599995 33.35146754559999 27.93762754560001 23.023787545599976 18.609947545599994 14.69610754560001 11.28226754559999 8.368427545600001 5.95458754559999 4.040747545599999 2.626907545599993 1.7130675455999982 1.2992275456000002 1.3853875456000018 1.9715475456000011 3.0577075456000085 4.6438675456000045 6.730027545599999 9.316187545600014 12.402347545600005 15.988507545600028 20.074667545600015 24.660827545599997 29.746987545600017 35.333147545600006 41.41930754560004 48.00546754560001 55.0916275456 62.67778754560004 70.7639475456 79.35010754560005 88.43626754560002 98.02242754559998 108.10858754560006 118.69474754560004 129.7809075456001 141.36706754560004 153.45322754560001 166.03938754560008 179.12554754560003 192.7117075456001 206.79786754560004 221.3840275456 236.47018754559997 252.05634754560018 268.1425075456001 284.72866754560005 301.8148275456 319.40098754559995 337.48714754560024 356.07330754560013 375.1594675456001 394.7456275456 414.8317875455999 435.4179475456002 456.50410754560016 478.0902675456001 500.1764275456 522.7625875456004 545.8487475456003 569.4349075456001 593.5210675456001 618.1072275456 +631.2200000000001 606.3700000000002 582.0200000000001 558.1700000000002 534.82 511.97000000000014 489.6200000000002 467.77000000000004 446.42000000000013 425.56999999999994 405.22 385.36999999999995 366.02 347.17 328.81999999999994 310.96999999999997 293.61999999999995 276.77 260.42 244.56999999999994 229.22 214.36999999999998 200.01999999999998 186.17 172.81999999999996 159.97000000000003 147.62 135.77 124.41999999999997 113.56999999999996 103.22 93.36999999999999 84.01999999999998 75.16999999999997 66.81999999999996 58.97 51.62 44.76999999999999 38.41999999999999 32.56999999999998 27.22 22.369999999999976 18.019999999999996 14.170000000000009 10.81999999999999 7.970000000000001 5.619999999999989 3.769999999999998 2.419999999999993 1.5699999999999983 1.2200000000000002 1.370000000000002 2.0200000000000014 3.1700000000000097 4.8200000000000065 6.97 9.620000000000015 12.770000000000007 16.420000000000027 20.570000000000018 25.22 30.370000000000033 36.02000000000001 42.170000000000044 48.82000000000003 55.97 63.62000000000005 71.77000000000001 80.42000000000006 89.57000000000002 99.21999999999998 109.37000000000005 120.02000000000001 131.17000000000007 142.82000000000005 154.97000000000003 167.62000000000006 180.77000000000004 194.4200000000001 208.57000000000005 223.22 238.36999999999995 254.02000000000015 270.17000000000013 286.82000000000005 303.96999999999997 321.61999999999995 339.77000000000015 358.4200000000001 377.57000000000005 397.21999999999997 417.3699999999998 438.0200000000001 459.17 480.82 502.96999999999986 525.6200000000002 548.7700000000002 572.4200000000001 596.57 621.2199999999999 +628.7438713856 603.9420313856 579.6401913855999 555.8383513855999 532.5365113855999 509.73467138559994 487.4328313856 465.63099138559994 444.3291513856 423.5273113855999 403.2254713855999 383.4236313856 364.1217913856 345.3199513856 327.0181113855999 309.21627138560007 291.9144313856 275.1125913856 258.81075138560004 243.00891138559996 227.7070713856 212.9052313856 198.6033913856 184.80155138559996 171.49971138559997 158.6978713856 146.3960313856 134.59419138559997 123.29235138559999 112.49051138559999 102.18867138560003 92.38683138559999 83.08499138559999 74.28315138559998 65.98131138559998 58.179471385599996 50.87763138559999 44.075791385599985 37.77395138559998 31.972111385599977 26.670271385599996 21.86843138559998 17.566591385599995 13.764751385600007 10.46291138559999 7.6610713856000014 5.3592313855999905 3.557391385599998 2.255551385599993 1.4537113855999984 1.1518713856000002 1.3500313856000026 2.048191385600002 3.2463513856000095 4.944511385600006 7.142671385599999 9.840831385600014 13.038991385600005 16.73715138560003 20.935311385600016 25.6334713856 30.831631385600033 36.529791385600014 42.72795138560005 49.426111385600024 56.624271385600004 64.32243138560005 72.52059138560003 81.21875138560007 90.41691138560005 100.1150713856 110.31323138560005 121.0113913856 132.20955138560007 143.9077113856 156.10587138559998 168.80403138560004 182.00219138559999 195.70035138560007 209.89851138560002 224.59667138559996 239.7948313855999 255.49299138560013 271.69115138560005 288.3893113856 305.58747138559994 323.2856313855999 341.48379138560017 360.1819513856001 379.3801113856 399.0782713856 419.27643138559995 439.97459138560026 461.1727513856002 482.8709113856001 505.06907138560007 527.7672313856003 550.9653913856002 574.6635513856002 598.8617113856002 623.5598713856001 +627.0583108096 602.2889508096001 578.0195908096 554.2502308096001 530.9808708096 508.2115108096001 485.94215080960015 464.17279080960003 442.90343080960014 422.1340708096001 401.86471080960007 382.09535080959995 362.82599080959994 344.05663080960005 325.78727080959993 308.0179108096 290.7485508096 273.97919080959997 257.7098308096 241.94047080959993 226.67111080959998 211.90175080959995 197.63239080959994 183.86303080959996 170.59367080959996 157.82431080959998 145.55495080959997 133.78559080959997 122.51623080959996 111.74687080959994 101.47751080959998 91.7081508096 82.43879080959998 73.66943080959999 65.40007080959998 57.630710809600004 50.361350809600005 43.59199080959999 37.32263080959999 31.553270809599987 26.28391080960001 21.514550809599978 17.245190809599993 13.475830809600005 10.206470809599988 7.437110809599999 5.167750809599989 3.398390809599997 2.129030809599993 1.359670809599998 1.0903108096 1.3209508096000027 2.0515908096000017 3.2822308096000112 5.012870809600007 7.2435108096 9.974150809600015 13.204790809600006 16.935430809600028 21.16607080960002 25.896710809600002 31.127350809600024 36.857990809600004 43.08863080960004 49.81927080960002 57.04991080959999 64.78055080960003 73.01119080960001 81.74183080960005 90.97247080960001 100.70311080959999 110.93375080960006 121.66439080960002 132.8950308096001 144.62567080960005 156.8563108096 169.58695080960007 182.81759080960003 196.5482308096001 210.77887080960008 225.50951080960002 240.74015080959998 256.4707908096002 272.70143080960014 289.4320708096001 306.66271080960007 324.39335080959995 342.6239908096003 361.3546308096002 380.5852708096001 400.31591080960004 420.54655080959986 441.2771908096002 462.5078308096001 484.2384708096 506.4691108095999 529.1997508096002 552.4303908096001 576.1610308096 600.3916708096 625.1223108095999 +626.1602625535999 601.4077025536 577.1551425535998 553.4025825535999 530.1500225535998 507.39746255359995 485.14490255360005 463.3923425535999 442.1397825536 421.3872225535999 401.1346625535999 381.3821025536 362.1295425536 343.3769825536001 325.12442255359997 307.3718625536 290.1193025536 273.3667425536 257.1141825536 241.36162255359997 226.10906255359998 211.35650255359997 197.10394255359998 183.35138255359996 170.09882255359997 157.3462625536 145.0937025536 133.34114255359998 122.08858255359998 111.33602255359997 101.0834625536 91.3309025536 82.0783425536 73.32578255359999 65.07322255359998 57.3206625536 50.0681025536 43.3155425536 37.062982553599994 31.310422553599984 26.057862553600007 21.30530255359998 17.052742553599998 13.30018255360001 10.047622553599993 7.295062553600002 5.04250255359999 3.2899425535999978 2.0373825535999934 1.2848225535999989 1.0322625536000005 1.279702553600003 2.0271425536000023 3.274582553600011 5.022022553600007 7.2694625536 10.016902553600014 13.264342553600004 17.011782553600028 21.25922255360001 26.006662553599995 31.254102553600024 37.00154255360001 43.248982553600044 49.99642255360002 57.243862553599996 64.99130255360004 73.23874255360002 81.98618255360006 91.23362255360003 100.9810625536 111.22850255360005 121.97594255360002 133.22338255360006 144.97082255360004 157.2182625536 169.96570255360004 183.2131425536 196.96058255360006 211.20802255360005 225.95546255359997 241.20290255359993 256.95034255360014 273.1977825536001 289.9452225536001 307.1926625536 324.94010255359996 343.18754255360017 361.93498255360015 381.1824225536001 400.9298625536 421.17730255360004 441.9247425536003 463.17218255360024 484.9196225536002 507.16706255360015 529.9145025536004 553.1619425536003 576.9093825536002 601.1568225536001 625.9042625536001 +626.0481460736 601.2967060736001 577.0452660736 553.2938260736001 530.0423860736 507.2909460736 485.03950607360014 463.28806607359996 442.0366260736001 421.2851860736 401.0337460736 381.28230607359995 362.0308660735999 343.2794260736 325.0279860735999 307.27654607359995 290.02510607359994 273.27366607359994 257.0222260736 241.27078607359994 226.01934607359996 211.26790607359996 197.01646607359996 183.26502607359996 170.01358607359995 157.26214607359998 145.01070607359998 133.25926607359997 122.00782607359996 111.25638607359994 101.0049460736 91.25350607360001 82.00206607359999 73.25062607359999 64.99918607359999 57.2477460736 49.996306073599996 43.24486607359999 36.993426073599984 31.241986073599985 25.9905460736 21.239106073599977 16.987666073599993 13.236226073600005 9.984786073599988 7.233346073599999 4.9819060735999905 3.230466073599998 1.979026073599993 1.2275860735999986 0.9761460736000005 1.224706073600003 1.9732660736000023 3.221826073600011 4.9703860736000065 7.218946073600001 9.967506073600017 13.216066073600008 16.96462607360003 21.213186073600017 25.961746073600004 31.210306073600027 36.9588660736 43.20742607360004 49.95598607360002 57.20454607359999 64.95310607360004 73.20166607360002 81.95022607360006 91.19878607360003 100.9473460736 111.19590607360007 121.94446607360005 133.1930260736001 144.94158607360006 157.1901460736 169.93870607360012 183.18726607360006 196.93582607360014 211.1843860736001 225.93294607360002 241.18150607359996 256.9300660736002 273.1786260736001 289.92718607360007 307.1757460736 324.92430607359995 343.17286607360023 361.9214260736001 381.16998607360006 400.9185460736 421.1671060735998 441.91566607360016 463.16422607360005 484.9127860736 507.16134607359993 529.9099060736003 553.1584660736002 576.9070260736 601.1555860736 625.9041460735999 +626.721856 601.955856 577.689856 553.923856 530.6578559999998 507.89185599999996 485.62585600000006 463.8598559999999 442.59385599999996 421.8278559999999 401.561856 381.795856 362.529856 343.76385600000003 325.497856 307.73185600000005 290.46585600000003 273.699856 257.43385600000005 241.66785599999997 226.40185600000004 211.63585600000005 197.369856 183.603856 170.337856 157.57185600000003 145.305856 133.53985600000001 122.273856 111.50785599999998 101.241856 91.47585599999998 82.20985599999997 73.44385599999995 65.17785599999995 57.41185599999999 50.14585599999998 43.379855999999975 37.11385599999998 31.347855999999975 26.081855999999995 21.315855999999975 17.04985599999999 13.283856000000005 10.017855999999988 7.251856 4.985855999999989 3.2198559999999974 1.953855999999993 1.1878559999999982 0.9218560000000003 1.155856000000003 1.8898560000000022 3.123856000000011 4.857856000000008 7.091856000000001 9.825856000000016 13.059856000000007 16.79385600000003 21.027856000000018 25.761856000000005 30.99585600000004 36.72985600000001 42.96385600000006 49.69785600000003 56.93185600000001 64.66585600000006 72.89985600000003 81.63385600000007 90.86785600000005 100.60185600000001 110.83585600000004 121.56985600000002 132.80385600000008 144.53785600000003 156.771856 169.50585600000008 182.73985600000003 196.4738560000001 210.70785600000005 225.44185600000003 240.67585599999995 256.40985600000016 272.64385600000014 289.37785600000007 306.611856 324.34585599999997 342.5798560000002 361.31385600000016 380.5478560000001 400.281856 420.515856 441.2498560000003 462.48385600000023 484.21785600000015 506.45185600000013 529.1858560000004 552.4198560000003 576.1538560000002 600.3878560000002 625.1218560000001 +628.1827621376001 603.3865221376002 579.0902821376001 555.2940421376001 531.9978021375999 509.2015621376001 486.9053221376002 465.10908213760007 443.8128421376001 423.0166021376 402.72036213760015 382.92412213759997 363.6278821376 344.83164213760006 326.53540213759993 308.7391621376 291.44292213759996 274.64668213759995 258.3504421376 242.55420213759996 227.2579621376 212.46172213759996 198.16548213759998 184.36924213759997 171.07300213759996 158.2767621376 145.9805221376 134.18428213759998 122.88804213759995 112.09180213759996 101.79556213759999 91.99932213759999 82.70308213759998 73.90684213759997 65.61060213759997 57.8143621376 50.51812213759999 43.72188213759998 37.42564213759997 31.629402137599975 26.333162137599995 21.536922137599973 17.24068213759999 13.444442137600003 10.148202137599988 7.351962137599998 5.0557221375999895 3.2594821375999974 1.9632421375999922 1.1670021375999982 0.8707621376000003 1.074522137600003 1.7782821376000024 2.9820421376000112 4.685802137600008 6.889562137600001 9.593322137600019 12.79708213760001 16.50084213760003 20.70460213760002 25.408362137600005 30.612122137600032 36.31588213760001 42.519642137600044 49.223402137600026 56.42716213760001 64.13092213760005 72.33468213760001 81.03844213760007 90.24220213760003 99.9459621376 110.14972213760007 120.85348213760003 132.0572421376001 143.76100213760006 155.96476213760002 168.6685221376001 181.87228213760005 195.57604213760013 209.7798021376001 224.48356213760005 239.68732213759998 255.3910821376002 271.59484213760015 288.2986021376001 305.5023621376 323.20612213759995 341.4098821376002 360.11364213760015 379.3174021376001 399.0211621376 419.22492213759983 439.92868213760016 461.1324421376001 482.83620213759997 505.0399621375999 527.7437221376002 550.9474821376001 574.6512421376 598.8550021376 623.5587621375998 +630.4337094656 605.5915494656001 581.2493894656 557.4072294656 534.0650694655999 511.2229094655999 488.88074946560005 467.03858946559996 445.6964294656 424.8542694655999 404.5121094655999 384.6699494655999 365.3277894655999 346.48562946559997 328.1434694655999 310.30130946559996 292.9591494655999 276.1169894655999 259.77482946559996 243.93266946559993 228.59050946559995 213.74834946559997 199.40618946559994 185.56402946559993 172.22186946559992 159.37970946559997 147.03754946559997 135.19538946559996 123.85322946559994 113.01106946559993 102.66890946559997 92.82674946559999 83.48458946559998 74.64242946559999 66.30026946559997 58.458109465599996 51.1159494656 44.27378946559999 37.93162946559998 32.08946946559998 26.747309465600004 21.905149465599976 17.562989465599994 13.720829465600007 10.37866946559999 7.5365094656 5.194349465599988 3.352189465599997 2.010029465599992 1.167869465599998 0.8257094656000002 0.9835494656000027 1.6413894656000023 2.799229465600011 4.457069465600008 6.614909465600001 9.272749465600015 12.430589465600006 16.08842946560003 20.24626946560002 24.9041094656 30.061949465600033 35.719789465600016 41.877629465600045 48.53546946560002 55.693309465599995 63.351149465600045 71.50898946560002 80.16682946560007 89.32466946560002 98.9825094656 109.14034946560008 119.79818946560005 130.9560294656001 142.61386946560006 154.77170946560003 167.4295494656001 180.58738946560004 194.24522946560012 208.4030694656001 223.06090946560002 238.21874946559998 253.8765894656002 270.03442946560017 286.6922694656001 303.85010946560004 321.50794946559995 339.6657894656002 358.32362946560016 377.4814694656001 397.1393094656 417.2971494656 437.95498946560025 459.1128294656002 480.7706694656001 502.9285094656 525.5863494656004 548.7441894656004 572.4020294656002 596.5598694656002 621.2177094656001 +633.4790181376 608.5752581376 584.1714981375999 560.2677381376 536.8639781375998 513.9602181375999 491.55645813760003 469.65269813759994 448.2489381376 427.3451781375999 406.94141813759995 387.03765813760003 367.6338981376 348.7301381376001 330.32637813759993 312.42261813760007 295.01885813760003 278.1150981376 261.7113381376001 245.80757813759996 230.40381813760004 215.50005813760004 201.0962981376 187.1925381376 173.7887781376 160.88501813760004 148.4812581376 136.5774981376 125.17373813759998 114.26997813759998 103.86621813760001 93.96245813759998 84.55869813759998 75.65493813759997 67.25117813759995 59.347418137599995 51.94365813759998 45.03989813759998 38.63613813759997 32.73237813759997 27.328618137599992 22.42485813759997 18.02109813759999 14.117338137600003 10.713578137599987 7.809818137599997 5.406058137599988 3.502298137599996 2.0985381375999914 1.1947781375999975 0.7910181376000001 0.8872581376000022 1.483498137600002 2.5797381376000104 4.175978137600008 6.272218137600002 8.868458137600019 11.96469813760001 15.560938137600031 19.65717813760002 24.253418137600004 29.349658137600034 34.94589813760001 41.04213813760005 47.63837813760003 54.73461813760001 62.330858137600046 70.42709813760003 79.02333813760008 88.11957813760004 97.71581813760001 107.81205813760003 118.4082981376 129.5045381376001 141.10077813760006 153.1970181376 165.79325813760008 178.88949813760001 192.4857381376001 206.58197813760006 221.17821813760003 236.27445813759994 251.87069813760016 267.9669381376001 284.56317813760006 301.65941813759997 319.25565813759994 337.3518981376002 355.9481381376001 375.04437813760006 394.6406181376 414.7368581376 435.3330981376003 456.42933813760027 478.0255781376001 500.1218181376001 522.7180581376003 545.8142981376003 569.4105381376003 593.5067781376002 618.1030181376001 +637.3244834815999 612.3434434816002 587.8624034816 563.8813634816 540.4003234815999 517.4192834816 494.93824348160007 472.9572034816 451.47616348160005 430.49512348159993 410.0140834816 390.03304348160003 370.5520034816 351.5709634816001 333.08992348159995 315.1088834816 297.6278434816 280.6468034816 264.16576348160004 248.18472348159992 232.7036834816 217.72264348159996 203.24160348159998 189.26056348159995 175.77952348159994 162.7984834816 150.31744348159998 138.33640348159997 126.85536348159997 115.87432348159997 105.39328348160001 95.4122434816 85.9312034816 76.95016348159999 68.46912348159998 60.48808348160001 53.0070434816 46.02600348159999 39.544963481599986 33.56392348159998 28.082883481600007 23.10184348159997 18.620803481599992 14.639763481600003 11.158723481599987 8.177683481599997 5.696643481599988 3.7156034815999965 2.2345634815999906 1.2535234815999972 0.7724834816000001 0.7914434816000018 1.310403481600002 2.3293634816000095 3.848323481600007 5.867283481600001 8.386243481600017 11.405203481600008 14.92416348160003 18.94312348160002 23.462083481600004 28.48104348160003 34.00000348160001 40.01896348160004 46.537923481600025 53.5568834816 61.075843481600046 69.09480348160002 77.61376348160006 86.63272348160004 96.1516834816 106.17064348160004 116.68960348160002 127.70856348160008 139.22752348160003 151.2464834816 163.76544348160004 176.7844034816 190.3033634816001 204.32232348160002 218.8412834816 233.86024348159995 249.37920348160017 265.39816348160014 281.9171234816001 298.9360834816 316.45504348159994 334.4740034816002 352.99296348160016 372.01192348160004 391.53088348160003 411.54984348159996 432.0688034816002 453.0877634816002 474.6067234816001 496.6256834816 519.1446434816004 542.1636034816003 565.6825634816001 589.7015234816001 614.2204834816 +641.977376 616.9033760000002 592.329376 568.2553760000001 544.681376 521.607376 499.0333760000001 476.9593759999999 455.38537600000006 434.31137599999994 413.737376 393.66337599999997 374.0893759999999 355.015376 336.4413759999999 318.367376 300.79337599999997 283.71937599999995 267.145376 251.07137599999993 235.497376 220.42337600000002 205.84937599999998 191.77537599999997 178.20137599999995 165.127376 152.553376 140.479376 128.90537599999996 117.83137599999995 107.25737599999998 97.18337599999997 87.60937599999995 78.53537599999994 69.96137599999994 61.88737599999998 54.31337599999998 47.23937599999997 40.66537599999997 34.59137599999997 29.017375999999988 23.94337599999996 19.36937599999998 15.295375999999996 11.72137599999998 8.647375999999994 6.073375999999984 3.999375999999994 2.4253759999999884 1.351375999999996 0.7773759999999998 0.7033760000000018 1.1293760000000028 2.0553760000000114 3.48137600000001 5.4073760000000055 7.8333760000000225 10.759376000000014 14.185376000000035 18.111376000000025 22.53737600000001 27.46337600000004 32.88937600000003 38.815376000000064 45.24137600000004 52.16737600000002 59.59337600000006 67.51937600000004 75.94537600000008 84.87137600000005 94.29737600000003 104.22337600000004 114.64937600000003 125.57537600000008 137.00137600000005 148.927376 161.35337600000008 174.27937600000004 187.70537600000011 201.63137600000005 216.057376 230.98337599999996 246.40937600000015 262.3353760000001 278.76137600000004 295.687376 313.1133759999999 331.0393760000002 349.4653760000001 368.39137600000004 387.81737599999997 407.74337599999996 428.16937600000017 449.09537600000016 470.5213760000001 492.447376 514.8733760000003 537.7993760000003 561.2253760000002 585.1513760000001 609.5773760000001 +647.4464413695998 622.2638013696 597.5811613695998 573.3985213696 549.7158813695997 526.5332413695999 503.85060136960004 481.66796136959994 459.98532136959994 438.80268136959984 418.12004136959996 397.93740136959997 378.2547613696 359.07212136960004 340.38948136959993 322.2068413696 304.5242013696 287.3415613696 270.6589213696 254.47628136959992 238.79364136959998 223.61100136959996 208.92836136959997 194.74572136959995 181.06308136959996 167.8804413696 155.19780136959997 143.01516136959998 131.33252136959996 120.14988136959994 109.46724136959998 99.28460136959995 89.60196136959995 80.41932136959996 71.73668136959995 63.55404136959998 55.87140136959998 48.68876136959997 42.00612136959997 35.82348136959997 30.140841369599986 24.958201369599966 20.275561369599984 16.092921369600003 12.410281369599982 9.227641369599995 6.545001369599982 4.362361369599992 2.679721369599987 1.497081369599995 0.8144413695999995 0.6318013696000009 0.9491613696000026 1.7665213696000106 3.0838813696000096 4.901241369600005 7.218601369600019 10.035961369600011 13.353321369600033 17.170681369600022 21.48804136960001 26.30540136960004 31.622761369600028 37.440121369600064 43.75748136960005 50.57484136960002 57.89220136960007 65.70956136960004 74.02692136960007 82.84428136960005 92.16164136960002 101.97900136960006 112.29636136960002 123.11372136960009 134.43108136960004 146.24844136960002 158.56580136960008 171.38316136960003 184.7005213696001 198.51788136960005 212.8352413696 227.65260136959998 242.96996136960016 258.78732136960014 275.1046813696001 291.92204136960004 309.2394013696 327.0567613696002 345.3741213696002 364.1914813696001 383.5088413696 403.3262013696001 423.6435613696003 444.46092136960027 465.77828136960017 487.5956413696001 509.91300136960047 532.7303613696002 556.0477213696003 579.8650813696001 604.1824413696002 +653.7419004415999 628.4349404415999 603.6279804415999 579.3210204415999 555.5140604415998 532.2071004415999 509.40014044159994 487.0931804415998 465.28622044159994 443.97926044159976 423.1723004415999 402.8653404415999 383.0583804415999 363.7514204416 344.9444604415999 326.63750044159997 308.8305404415999 291.52358044159996 274.7166204416 258.4096604415999 242.6027004416 227.29574044159997 212.48878044159994 198.18182044159994 184.37486044159996 171.0679004416 158.26094044159998 145.95398044159995 134.14702044159995 122.84006044159996 112.03310044159998 101.7261404416 91.91918044159996 82.61222044159994 73.80526044159994 65.49830044159998 57.691340441599976 50.38438044159997 43.57742044159996 37.270460441599965 31.463500441599983 26.156540441599958 21.349580441599983 17.0426204416 13.23566044159998 9.928700441599995 7.121740441599982 4.814780441599992 3.0078204415999856 1.700860441599994 0.8939004415999992 0.5869404415999999 0.779980441600002 1.473020441600009 2.6660604416000084 4.359100441600005 6.552140441600019 9.245180441600011 12.43822044160003 16.13126044160002 20.324300441600005 25.017340441600037 30.210380441600027 35.90342044160006 42.096460441600044 48.789500441600026 55.982540441600065 63.67558044160003 71.86862044160009 80.56166044160005 89.75470044160004 99.44774044160009 109.64078044160003 120.3338204416001 131.52686044160006 143.2199004416 155.41294044160006 168.10598044160002 181.2990204416001 194.99206044160005 209.18510044160004 223.87814044159995 239.0711804416002 254.76422044160014 270.95726044160006 287.6503004416 304.84334044159993 322.5363804416002 340.7294204416001 359.4224604416001 378.6155004416 398.3085404415999 418.5015804416003 439.1946204416002 460.38766044160013 482.08070044160013 504.2737404416004 526.9667804416003 550.1598204416003 573.8528604416002 598.0459004416002 +660.8754492416 635.4284892416001 610.4815292415999 586.0345692416 562.0876092415999 538.6406492415999 515.6936892416 493.2467292415999 471.2997692416 449.8528092415999 428.9058492416 408.45888924159993 388.51192924159994 369.0649692416 350.1180092415999 331.6710492416 313.7240892416 296.2771292416 279.33016924160006 262.88320924159996 246.9362492416 231.4892892416 216.5423292416 202.09536924159994 188.14840924159995 174.70144924160002 161.7544892416 149.30752924159998 137.36056924159996 125.91360924159996 114.96664924160001 104.5196892416 94.57272924159996 85.12576924159995 76.17880924159995 67.73184924159999 59.78488924159998 52.337929241599966 45.39096924159996 38.944009241599964 32.99704924159998 27.550089241599963 22.60312924159998 18.156169241599997 14.209209241599977 10.762249241599992 7.815289241599978 5.36832924159999 3.421369241599984 1.9744092415999934 1.0274492415999987 0.5804892415999988 0.6335292416000016 1.186569241600008 2.239609241600008 3.7926492416000053 5.845689241600018 8.398729241600014 11.451769241600033 15.004809241600023 19.057849241600014 23.61088924160004 28.663929241600027 34.21696924160006 40.27000924160004 46.82304924160002 53.876089241600056 61.42912924160003 69.48216924160008 78.03520924160006 87.08824924160002 96.64128924160008 106.69432924160003 117.24736924160008 128.30040924160005 139.8534492416 151.90648924160007 164.45952924160002 177.5125692416001 191.06560924160004 205.11864924160002 219.67168924159995 234.72472924160016 250.2777692416001 266.33080924160004 282.8838492416 299.93688924159994 317.4899292416002 335.54296924160013 354.0960092416001 373.14904924160004 392.70208924159994 412.75512924160023 433.3081692416001 454.3612092416001 475.91424924160003 497.9672892416003 520.5203292416003 543.5733692416002 567.1264092416001 591.1794492416 +668.8602589696 643.2576189696001 618.1549789695999 593.5523389696 569.4496989695999 545.8470589696 522.7444189696001 500.14177896959995 478.0391389696 456.4364989695999 435.3338589696 414.7312189695999 394.62857896959997 375.0259389696 355.9232989695999 337.3206589696 319.2180189695999 301.6153789696 284.51273896960004 267.91009896959997 251.8074589696 236.2048189695999 221.10217896959998 206.49953896959988 192.39689896959996 178.7942589696 165.69161896959992 153.08897896959996 140.9863389695999 129.38369896959995 118.28105896960001 107.67841896959995 97.57577896959997 87.97313896959997 78.87049896959996 70.26785896959998 62.16521896959998 54.56257896959997 47.45993896959997 40.85729896959996 34.75465896959999 29.15201896959996 24.04937896959998 19.4467389696 15.344098969599978 11.741458969599993 8.63881896959998 6.036178969599991 3.933538969599983 2.3308989695999927 1.2282589695999984 0.6256189695999976 0.5229789696000008 0.9203389696000062 1.817698969600007 3.215058969600004 5.112418969600016 7.509778969600011 10.40713896960003 13.80449896960002 17.701858969600007 22.09921896960003 26.99657896960002 32.39393896960006 38.291298969600035 44.68865896960001 51.586018969600055 58.98337896960003 66.88073896960007 75.27809896960005 84.17545896960003 93.57281896960008 103.47017896960001 113.86753896960009 124.76489896960005 136.1622589696 148.05961896960005 160.45697896960002 173.3543389696001 186.75169896960006 200.6490589696 215.04641896959993 229.94377896960017 245.34113896960008 261.2384989696 277.63585896959995 294.53321896959994 311.93057896960016 329.8279389696001 348.2252989696001 367.12265896959997 386.5200189695999 406.4173789696002 426.8147389696001 447.71209896960005 469.1094589696 491.0068189696003 513.4041789696003 536.3015389696001 559.6988989696001 583.5962589696 +677.710976 651.9369760000001 626.6629759999998 601.888976 577.6149759999998 553.8409759999998 530.566976 507.79297599999984 485.51897599999995 463.74497599999984 442.47097599999995 421.696976 401.42297599999984 381.648976 362.3749759999999 343.60097599999995 325.32697599999995 307.55297599999994 290.278976 273.5049759999999 257.23097599999994 241.45697599999994 226.18297599999994 211.4089759999999 197.1349759999999 183.36097599999994 170.08697599999994 157.31297599999994 145.03897599999993 133.26497599999993 121.99097599999996 111.21697599999996 100.94297599999996 91.16897599999996 81.89497599999996 73.12097599999998 64.84697599999998 57.07297599999998 49.798975999999975 43.024975999999974 36.750975999999994 30.976975999999965 25.702975999999985 20.928975999999995 16.654975999999973 12.880975999999992 9.606975999999976 6.83297599999999 4.558975999999982 2.784975999999991 1.5109759999999979 0.7369759999999963 0.4629760000000001 0.6889760000000046 1.4149760000000058 2.6409760000000038 4.366976000000015 6.592976000000011 9.31897600000003 12.544976000000021 16.27097600000001 20.496976000000032 25.22297600000002 30.448976000000048 36.17497600000003 42.400976000000014 49.12697600000005 56.35297600000003 64.07897600000007 72.30497600000004 81.03097600000001 90.25697600000007 99.98297600000004 110.2089760000001 120.93497600000008 132.16097600000003 143.88697600000012 156.1129760000001 168.83897600000014 182.0649760000001 195.79097600000006 210.01697599999997 224.74297600000023 239.9689760000002 255.69497600000014 271.92097600000005 288.646976 305.8729760000002 323.59897600000016 341.8249760000001 360.55097600000005 379.776976 399.5029760000003 419.7289760000002 440.4549760000001 461.6809760000001 483.4069760000004 505.6329760000003 528.3589760000003 551.5849760000002 575.3109760000001 +687.4437218816 661.4826818816 636.0216418816 611.0606018816 586.5995618815999 562.6385218816 539.1774818816 516.2164418816 493.7554018816 471.79436188159985 450.33332188159994 429.3722818816 408.9112418815999 388.9502018816 369.48916188159984 350.52812188159993 332.0670818815999 314.10604188159994 296.64500188159997 279.6839618815999 263.2229218815999 247.26188188159995 231.80084188159992 216.8398018815999 202.37876188159993 188.4177218816 174.95668188159996 161.99564188159994 149.53460188159994 137.57356188159994 126.11252188159999 115.15148188159996 104.69044188159995 94.72940188159996 85.26836188159994 76.30732188159999 67.84628188159998 59.88524188159997 52.42420188159996 45.46316188159995 39.00212188159998 33.04108188159995 27.58004188159998 22.6190018816 18.157961881599977 14.196921881599991 10.735881881599976 7.774841881599988 5.31380188159998 3.352761881599991 1.8917218815999979 0.930681881599995 0.46964188159999937 0.5086018816000027 1.0475618816000045 2.0865218816000026 3.625481881600013 5.664441881600008 8.203401881600026 11.242361881600022 14.781321881600007 18.820281881600035 23.35924188160002 28.398201881600052 33.93716188160003 39.976121881600015 46.51508188160005 53.554041881600035 61.093001881600074 69.13196188160005 77.67092188160002 86.70988188160008 96.24884188160006 106.2878018816001 116.82676188160006 127.86572188160004 139.40468188160008 151.44364188160006 163.98260188160012 177.0215618816001 190.56052188160004 204.5994818816 219.1384418816002 234.17740188160016 249.7163618816001 265.7553218816 282.2942818816 299.3332418816002 316.8722018816001 334.9111618816001 353.4501218816 372.4890818816 392.02804188160025 412.06700188160016 432.6059618816001 453.6449218816 475.18388188160037 497.2228418816003 519.7618018816003 542.8007618816001 566.3397218816001 +698.0760933375998 671.9123333376 646.2485733375997 621.0848133375998 596.4210533375997 572.2572933375999 548.5935333376 525.4297733375997 502.7660133375999 480.6022533375998 458.93849333759994 437.77473333759997 417.11097333759983 396.94721333760003 377.28345333759995 358.11969333760004 339.4559333376 321.2921733376 303.6284133376001 286.46465333759994 269.80089333760003 253.63713333759998 237.97337333759995 222.80961333759996 208.14585333759993 193.9820933376 180.31833333759997 167.15457333759994 154.49081333759995 142.32705333759995 130.66329333759998 119.49953333759997 108.83577333759997 98.67201333759996 89.00825333759995 79.84449333759999 71.18073333759997 63.01697333759998 55.353213337599975 48.189453337599964 41.52569333759999 35.361933337599964 29.698173337599982 24.5344133376 19.87065333759998 15.706893337599995 12.043133337599977 8.879373337599992 6.215613337599979 4.051853337599991 2.3880933375999978 1.2243333375999939 0.5605733375999987 0.39681333760000087 0.7330533376000031 1.5692933376000018 2.9055333376000108 4.741773337600008 7.078013337600022 9.914253337600014 13.250493337600004 17.086733337600027 21.422973337600013 26.25921333760004 31.595453337600024 37.4316933376 43.76793333760004 50.604173337600024 57.94041333760006 65.77665333760004 74.11289333760001 82.94913333760006 92.28537333760003 102.12161333760008 112.45785333760006 123.29409333760002 134.63033333760006 146.46657333760004 158.8028133376001 171.63905333760005 184.97529333760002 198.81153333759997 213.14777333760017 227.9840133376001 243.3202533376001 259.1564933376 275.4927333376 292.32897333760025 309.66521333760016 327.5014533376001 345.83769333760006 364.6739333376 384.0101733376003 403.84641333760027 424.18265333760024 445.0188933376001 466.3551333376005 488.1913733376004 510.5276133376003 533.3638533376002 556.7000933376 +709.6271622655998 683.2450022656 657.3628422655999 631.9806822656 607.0985222655999 582.7163622656 558.8342022656 535.4520422656 512.5698822656 490.1877222655998 468.3055622655999 446.9234022656 426.04124226559986 405.6590822655999 385.7769222655999 366.3947622656 347.5126022656 329.1304422656 311.24828226560004 293.8661222655999 276.9839622656 260.6018022656 244.71964226560002 229.3374822656 214.4553222656 200.07316226560002 186.19100226560002 172.8088422656 159.9266822656 147.54452226559997 135.66236226560002 124.2802022656 113.39804226559998 103.01588226559997 93.13372226559994 83.75156226559999 74.86940226559997 66.48724226559997 58.60508226559997 51.22292226559996 44.34076226559999 37.95860226559996 32.07644226559999 26.694282265600002 21.812122265599974 17.429962265599993 13.547802265599977 10.16564226559999 7.283482265599977 4.90132226559999 3.019162265599998 1.637002265599993 0.7548422655999982 0.372682265599999 0.4905222656000018 1.1083622656000012 2.226202265600009 3.8440422656000055 5.96188226560002 8.579722265600015 11.697562265600007 15.31540226560003 19.433242265600015 24.05108226560004 29.168922265600024 34.78676226560001 40.90460226560005 47.52244226560003 54.640282265600064 62.25812226560004 70.37596226560001 78.99380226560007 88.11164226560003 97.72948226560008 107.84732226560004 118.46516226559999 129.58300226560007 141.20084226560004 153.3186822656001 165.93652226560005 179.05436226560002 192.67220226559996 206.79004226560014 221.4078822656001 236.52572226560008 252.14356226560002 268.26140226559994 284.87924226560017 301.9970822656001 319.61492226560006 337.7327622656 356.3506022655999 375.4684422656002 395.0862822656001 415.2041222656002 435.82196226560006 456.93980226560035 478.55764226560035 500.6754822656003 523.2933222656002 546.4111622656001 +722.1174757375998 695.5012357375999 669.3849957375999 643.7687557375999 618.6525157375997 594.0362757375999 569.9200357376 546.3037957375998 523.1875557376 500.5713157375998 478.4550757375999 456.8388357376 435.7225957375999 415.1063557375999 394.9901157375998 375.37387573759986 356.25763573759986 337.64139573759985 319.52515573759996 301.90891573759984 284.7926757375999 268.1764357375999 252.06019573759986 236.44395573759985 221.32771573759985 206.71147573759987 192.5952357375999 178.9789957375999 165.86275573759988 153.24651573759988 141.13027573759993 129.5140357375999 118.39779573759992 107.78155573759992 97.66531573759994 88.04907573759996 78.93283573759996 70.31659573759995 62.20035573759995 54.58411573759994 47.46787573759997 40.851635737599935 34.735395737599966 29.11915573759999 24.002915737599963 19.386675737599983 15.270435737599966 11.65419573759998 8.537955737599969 5.92171573759998 3.8054757375999912 2.1892357375999865 1.0729957375999946 0.45675573759999594 0.3405157376000014 0.7242757376000033 1.6080357376000116 2.991795737600011 4.875555737600026 7.25931573760002 10.143075737600014 13.526835737600036 17.410595737600026 21.794355737600053 26.67811573760004 32.06187573760002 37.94563573760006 44.32939573760004 51.213155737600076 58.59691573760006 66.48067573760004 74.86443573760009 83.74819573760006 93.13195573760011 103.0157157376001 113.39947573760007 124.28323573760014 135.6669957376001 147.55075573760016 159.93451573760012 172.8182757376001 186.20203573760003 200.08579573760022 214.46955573760016 229.35331573760016 244.73707573760007 260.62083573760003 277.0045957376003 293.88835573760025 311.2721157376002 329.1558757376001 347.53963573760007 366.42339573760034 385.8071557376003 405.6909157376002 426.07467573760016 446.9584357376005 468.3421957376004 490.2259557376003 512.6097157376003 535.4934757376001 +735.5690559999998 708.703056 682.3370559999998 656.471056 631.1050559999999 606.2390559999999 581.873056 558.0070559999999 534.6410559999999 511.77505599999984 489.4090559999999 467.5430559999998 446.1770559999999 425.311056 404.9450559999999 385.0790559999999 365.7130559999999 346.8470559999999 328.48105599999997 310.61505599999987 293.24905599999994 276.38305599999995 260.0170559999999 244.1510559999999 228.78505599999986 213.91905599999993 199.5530559999999 185.6870559999999 172.32105599999988 159.4550559999999 147.08905599999994 135.22305599999993 123.85705599999993 112.99105599999993 102.62505599999993 92.75905599999996 83.39305599999996 74.52705599999994 66.16105599999995 58.295055999999946 50.929055999999974 44.06305599999994 37.69705599999997 31.831055999999986 26.46505599999996 21.59905599999998 17.23305599999996 13.367055999999979 10.001055999999966 7.135055999999979 4.76905599999999 2.903055999999984 1.537055999999993 0.671055999999993 0.3050559999999993 0.4390560000000021 1.0730560000000093 2.2070560000000095 3.8410560000000227 5.97505600000002 8.609056000000013 11.743056000000033 15.377056000000023 19.511056000000046 24.145056000000036 29.279056000000022 34.91305600000006 41.04705600000004 47.68105600000008 54.81505600000006 62.449056000000034 70.58305600000008 79.21705600000006 88.3510560000001 97.98505600000009 108.11905600000006 118.75305600000011 129.88705600000006 141.52105600000013 153.6550560000001 166.28905600000004 179.423056 193.0570560000002 207.19105600000015 221.82505600000007 236.95905600000006 252.593056 268.72705600000023 285.3610560000002 302.49505600000015 320.1290560000001 338.263056 356.8970560000003 376.0310560000002 395.66505600000016 415.7990560000001 436.43305600000036 457.5670560000004 479.2010560000002 501.33505600000024 523.9690560000001 +750.0054004735998 722.8739604735999 696.2425204735998 670.1110804735999 644.4796404735998 619.3482004735998 594.7167604736 570.5853204735998 546.9538804736 523.8224404735998 501.1910004735999 479.0595604735999 457.42812047359985 436.2966804735999 415.6652404735998 395.53380047359985 375.90236047359986 356.77092047359986 338.13948047359986 320.0080404735998 302.37660047359986 285.24516047359987 268.61372047359987 252.48228047359987 236.85084047359985 221.71940047359993 207.08796047359988 192.95652047359988 179.32508047359988 166.19364047359988 153.56220047359992 141.43076047359992 129.79932047359992 118.66788047359992 108.03644047359991 97.90500047359997 88.27356047359996 79.14212047359995 70.51068047359995 62.37924047359994 54.74780047359997 47.61636047359993 40.98492047359996 34.85348047359999 29.22204047359996 24.090600473599977 19.459160473599958 15.32772047359998 11.696280473599963 8.564840473599979 5.933400473599989 3.8019604735999812 2.1705204735999915 1.0390804735999901 0.40764047359999717 0.27620047360000083 0.6447604736000063 1.5133204736000074 2.881880473600019 4.750440473600018 7.1190004736000105 9.98756047360003 13.356120473600024 17.224680473600046 21.593240473600034 26.461800473600018 31.830360473600052 37.69892047360003 44.06748047360008 50.93604047360005 58.30460047360003 66.17316047360008 74.54172047360005 83.41028047360011 92.77884047360007 102.64740047360007 113.01596047360013 123.88452047360009 135.25308047360016 147.12164047360014 159.49020047360008 172.35876047360006 185.72732047360023 199.5958804736002 213.96444047360015 228.83300047360012 244.20156047360004 260.07012047360024 276.4386804736002 293.30724047360013 310.6758004736001 328.5443604736 346.91292047360025 365.7814804736002 385.15004047360014 405.01860047360015 425.3871604736004 446.2557204736003 467.62428047360027 489.49284047360015 511.8614004736001 +765.4514817535999 738.0389217536 711.1263617535998 684.7138017535999 658.8012417535998 633.3886817535998 608.4761217536 584.0635617535997 560.1510017536 536.7384417535998 513.8258817535999 491.4133217536 469.50076175359993 448.0882017536 427.1756417535999 406.7630817536 386.8505217536 367.4379617536 348.5254017536001 330.1128417536 312.20028175360005 294.7877217536 277.87516175359997 261.4626017536 245.55004175359994 230.13748175359999 215.22492175359997 200.81236175359996 186.89980175359995 173.48724175359996 160.5746817536 148.1621217536 136.24956175359998 124.83700175359998 113.92444175359998 103.51188175360001 93.5993217536 84.1867617536 75.2742017536 66.86164175359998 58.94908175360001 51.53652175359998 44.6239617536 38.21140175360002 32.29884175359999 26.886281753600006 21.97372175359997 17.56116175359999 13.648601753599975 10.236041753599988 7.323481753599999 4.910921753599988 2.9983617535999967 1.5858017535999915 0.6732417535999976 0.26068175359999995 0.34812175360000186 0.9355617536000016 2.0230017536000098 3.6104417536000066 5.697881753600001 8.285321753600016 11.372761753600006 14.960201753600028 19.047641753600015 23.6350817536 28.72252175360002 34.30996175360001 40.39740175360004 46.984841753600016 54.072281753599995 61.65972175360004 69.74716175360001 78.33460175360005 87.42204175360003 97.0094817536 107.09692175360004 117.6843617536 128.77180175360007 140.35924175360003 152.4466817536 165.03412175359995 178.1215617536001 191.70900175360006 205.79644175360002 220.38388175359995 235.47132175359994 251.05876175360012 267.1462017536001 283.73364175360007 300.82108175359997 318.4085217535999 336.4959617536002 355.0834017536001 374.1708417536001 393.7582817536 413.84572175360034 434.43316175360025 455.52060175360026 477.1080417536001 499.19548175360006 +781.9337476095995 754.2243876095997 727.0150276095998 700.3056676095999 674.0963076095995 648.3869476095996 623.1775876095998 598.4682276095998 574.2588676096 550.5495076095997 527.3401476095996 504.63078760959974 482.42142760959985 460.7120676095999 439.5027076095996 418.7933476095997 398.58398760959983 378.8746276095998 359.6652676095999 340.95590760959976 322.7465476095999 305.03718760959987 287.82782760959986 271.1184676095998 254.90910760959977 239.19974760959983 223.99038760959985 209.28102760959982 195.0716676095998 181.3623076095998 168.15294760959986 155.44358760959986 143.23422760959986 131.52486760959985 120.31550760959986 109.60614760959992 99.3967876095999 89.6874276095999 80.47806760959989 71.7687076095999 63.55934760959993 55.849987609599886 48.640627609599925 41.931267609599956 35.72190760959993 30.012547609599952 24.803187609599927 20.093827609599952 15.884467609599934 12.175107609599955 8.965747609599973 6.256387609599964 4.047027609599978 2.3376676095999764 1.1283076095999882 0.4189476095999961 0.20958760960000097 0.5002276096000063 1.2908676096000176 2.5815076096000205 4.372147609600019 6.662787609600038 9.453427609600034 12.744067609600057 16.53470760960005 20.82534760960004 25.615987609600076 30.90662760960006 36.697267609600104 42.98790760960009 49.778547609600075 57.06918760960011 64.85982760960009 73.15046760960014 81.94110760960012 91.23174760960009 101.02238760960014 111.31302760960011 122.1036676096002 133.39430760960013 145.1849476096001 157.47558760960007 170.26622760960026 183.5568676096002 197.34750760960017 211.6381476096001 226.42878760960008 241.7194276096003 257.51006760960024 273.80070760960024 290.5913476096002 307.8819876096001 325.6726276096004 343.96326760960034 362.7539076096002 382.0445476096002 401.8351876096006 422.1258276096005 442.91646760960043 464.2071076096004 485.9977476096003 +799.4801209855997 771.4582809855998 743.9364409855997 716.9146009855998 690.3927609855996 664.3709209855997 638.8490809855998 613.8272409855997 589.3054009855997 565.2835609855997 541.7617209855998 518.7398809855998 496.21804098559977 474.19620098559983 452.6743609855997 431.6525209855997 411.13068098559984 391.1088409855997 371.5870009855998 352.56516098559973 334.0433209855998 316.02148098559985 298.4996409855998 281.4778009855998 264.95596098559975 248.93412098559986 233.41228098559992 218.39044098559984 203.86860098559987 189.84676098559981 176.32492098559987 163.30308098559993 150.78124098559985 138.7594009855999 127.23756098559984 116.21572098559987 105.69388098559993 95.67204098559989 86.1502009855999 77.1283609855999 68.60652098559993 60.58468098559989 53.06284098559993 46.04100098559996 39.519160985599925 33.49732098559995 27.97548098559993 22.953640985599954 18.431800985599935 14.409960985599957 10.888120985599974 7.866280985599962 5.344440985599978 3.322600985599973 1.8007609855999853 0.778920985599994 0.2570809855999966 0.23524098560000262 0.7134009856000115 1.6915609856000149 3.1697209856000144 5.147880985600031 7.626040985600028 10.60420098560005 14.082360985600046 18.060520985600036 22.538680985600067 27.51684098560005 32.995000985600086 38.97316098560007 45.45132098560005 52.429480985600094 59.90764098560008 67.88580098560013 76.3639609856001 85.34212098560008 94.82028098560014 104.79844098560012 115.27660098560018 126.25476098560016 137.73292098560012 149.71108098560012 162.18924098560026 175.16740098560024 188.6455609856002 202.62372098560016 217.10188098560013 232.08004098560033 247.5582009856003 263.5363609856002 280.01452098560014 296.9926809856001 314.4708409856004 332.4490009856003 350.92716098560027 369.9053209856002 389.3834809856005 409.36164098560045 429.83980098560033 450.8179609856003 472.2961209856002 +818.1199999999997 789.7699999999998 761.9199999999995 734.5699999999997 707.7199999999996 681.3699999999997 655.5199999999998 630.1699999999996 605.3199999999997 580.9699999999996 557.1199999999998 533.7699999999998 510.91999999999973 488.56999999999977 466.7199999999997 445.36999999999983 424.5199999999998 404.16999999999973 384.3199999999999 364.96999999999986 346.1199999999999 327.76999999999987 309.9199999999999 292.5699999999999 275.71999999999986 259.36999999999995 243.5199999999999 228.16999999999987 213.31999999999982 198.96999999999983 185.1199999999999 171.7699999999999 158.9199999999999 146.56999999999988 134.71999999999989 123.36999999999993 112.51999999999992 102.1699999999999 92.31999999999991 82.9699999999999 74.11999999999993 65.7699999999999 57.91999999999994 50.56999999999997 43.719999999999935 37.36999999999996 31.519999999999932 26.169999999999956 21.319999999999933 16.969999999999953 13.119999999999973 9.769999999999959 6.919999999999974 4.569999999999968 2.7199999999999815 1.3699999999999914 0.5199999999999922 0.1699999999999993 0.32000000000000633 0.9700000000000106 2.1200000000000117 3.7700000000000258 5.920000000000024 8.570000000000045 11.72000000000004 15.370000000000031 19.520000000000056 24.170000000000048 29.320000000000075 34.97000000000007 41.12000000000005 47.77000000000009 54.920000000000066 62.570000000000114 70.72000000000008 79.37000000000006 88.52000000000011 98.17000000000009 108.32000000000014 118.9700000000001 130.12000000000006 141.77000000000004 153.92000000000021 166.5700000000002 179.72000000000014 193.3700000000001 207.52000000000004 222.17000000000027 237.32000000000022 252.97000000000014 269.1200000000002 285.7700000000001 302.92000000000036 320.5700000000003 338.7200000000002 357.3700000000001 376.52000000000044 396.17000000000036 416.3200000000004 436.9700000000003 458.1200000000003 +837.8842579455998 809.1904179455998 780.9965779455997 753.3027379455999 726.1088979455997 699.4150579455998 673.2212179455998 647.5273779455997 622.3335379455998 597.6396979455998 573.4458579455998 549.7520179455996 526.5581779455997 503.86433794559986 481.6704979455998 459.9766579455998 438.78281794559973 418.08897794559977 397.89513794559986 378.2012979455997 359.0074579455998 340.31361794559984 322.11977794559976 304.4259379455998 287.2320979455998 270.5382579455998 254.34441794559987 238.65057794559985 223.45673794559985 208.76289794559983 194.5690579455999 180.8752179455999 167.68137794559988 154.98753794559988 142.79369794559986 131.09985794559992 119.90601794559991 109.2121779455999 99.0183379455999 89.3244979455999 80.13065794559994 71.4368179455999 63.24297794559993 55.54913794559996 48.35529794559992 41.661457945599956 35.467617945599926 29.773777945599946 24.57993794559992 19.886097945599943 15.692257945599966 11.998417945599952 8.80457794559997 6.110737945599961 3.9168979455999766 2.223057945599988 1.029217945599987 0.3353779455999957 0.14153794560000113 0.4476979456000071 1.2538579456000094 2.560017945600022 4.366177945600022 6.672337945600041 9.478497945600038 12.784657945600031 16.590817945600055 20.896977945600046 25.70313794560007 31.009297945600057 36.81545794560005 43.121617945600086 49.92777794560006 57.23393794560011 65.0400979456001 73.34625794560007 82.15241794560012 91.4585779456001 101.26473794560015 111.57089794560012 122.37705794560009 133.68321794560003 145.48937794560024 157.7955379456002 170.60169794560014 183.9078579456001 197.71401794560006 212.02017794560027 226.82633794560024 242.13249794560016 257.9386579456001 274.24481794560006 291.05097794560027 308.35713794560024 326.16329794560016 344.4694579456001 363.2756179456004 382.5817779456003 402.38793794560024 422.6940979456002 443.5002579456001 +858.8052432895997 829.7518832895998 801.1985232895998 773.1451632895999 745.5918032895997 718.5384432895997 691.9850832895999 665.9317232895997 640.3783632895999 615.3250032895997 590.7716432895999 566.7182832895999 543.1649232895998 520.1115632895999 497.55820328959976 475.50484328959976 453.95148328959993 432.89812328959977 412.3447632895999 392.29140328959977 372.73804328959983 353.68468328959983 335.1313232895998 317.07796328959984 299.5246032895998 282.4712432895999 265.91788328959984 249.86452328959984 234.31116328959985 219.25780328959982 204.7044432895999 190.65108328959988 177.09772328959988 164.04436328959986 151.49100328959986 139.43764328959992 127.88428328959989 116.8309232895999 106.2775632895999 96.22420328959988 86.67084328959992 77.61748328959987 69.06412328959992 61.01076328959995 53.45740328959992 46.40404328959995 39.850683289599914 33.797323289599944 28.243963289599918 23.190603289599945 18.637243289599965 14.58388328959995 11.030523289599968 7.977163289599958 5.423803289599974 3.3704432895999856 1.817083289599983 0.7637232895999925 0.21036328959999567 0.15700328960000245 0.6036432896000057 1.550283289600016 2.9969232896000166 4.943563289600033 7.390203289600032 10.336843289600024 13.78348328960005 17.730123289600037 22.17676328960007 27.12340328960006 32.570043289600044 38.51668328960008 44.96332328960006 51.90996328960011 59.35660328960009 67.30324328960006 75.7498832896001 84.6965232896001 94.14316328960014 104.08980328960011 114.53644328960009 125.48308328960005 136.92972328960022 148.8763632896002 161.32300328960014 174.2696432896001 187.71628328960006 201.6629232896003 216.1095632896002 231.05620328960018 246.50284328960012 262.4494832896001 278.8961232896003 295.84276328960027 313.2894032896002 331.23604328960016 349.6826832896004 368.6293232896004 388.0759632896003 408.0226032896002 428.4692432896002 +880.9167796735996 851.4882196735998 822.5596596735998 794.1310996736 766.2025396735996 738.7739796735997 711.8454196735998 685.4168596735999 659.4882996736 634.0597396735997 609.1311796735997 584.7026196735998 560.7740596735999 537.3454996736 514.4169396735997 491.98837967359975 470.0598196735998 448.63125967359986 427.70269967359997 407.2741396735996 387.34557967359984 367.91701967359984 348.98845967359983 330.55989967359983 312.6313396735998 295.2027796735998 278.2742196735999 261.8456596735998 245.9170996735998 230.4885396735998 215.55997967359986 201.13141967359988 187.20285967359985 173.77429967359984 160.84573967359984 148.4171796735999 136.48861967359989 125.06005967359991 114.13149967359989 103.7029396735999 93.77437967359992 84.34581967359988 75.41725967359992 66.98869967359995 59.06013967359991 51.631579673599944 44.70301967359991 38.27445967359994 32.34589967359992 26.91733967359994 21.988779673599964 17.560219673599942 13.631659673599966 10.203099673599954 7.27453967359997 4.845979673599983 2.9174196735999782 1.4888596735999888 0.56029967359999 0.13173967359999814 0.20317967360000272 0.774619673600011 1.846059673600013 3.4174996736000276 5.488939673600027 8.060379673600023 11.131819673600045 14.703259673600039 18.774699673600065 23.346139673600053 28.41757967360004 33.989019673600076 40.060459673600064 46.63189967360011 53.703339673600084 61.27477967360006 69.34621967360012 77.91765967360008 86.98909967360014 96.56053967360012 106.63197967360009 117.20341967360004 128.27485967360022 139.84629967360019 151.91773967360012 164.4891796736001 177.56061967360006 191.13205967360025 205.20349967360022 219.77493967360016 234.8463796736001 250.41781967360006 266.4892596736003 283.06069967360025 300.1321396736002 317.70357967360013 335.7750196736004 354.34645967360035 373.4178996736003 392.9893396736002 413.0607796736003 +904.2541659135999 874.4347259136 845.1152859135996 816.2958459135998 787.9764059135998 760.1569659136 732.8375259136 706.0180859135996 679.6986459135998 653.8792059135998 628.5597659135999 603.7403259135998 579.4208859135997 555.6014459135997 532.2820059135998 509.4625659135999 487.14312591359976 465.3236859135997 444.0042459135998 423.1848059135998 402.8653659135999 383.04592591359983 363.7264859135998 344.9070459135998 326.5876059135998 308.7681659135999 291.4487259135999 274.62928591359986 258.3098459135998 242.4904059135998 227.17096591359987 212.35152591359986 198.03208591359987 184.21264591359986 170.89320591359984 158.07376591359989 145.7543259135999 133.93488591359989 122.61544591359987 111.79600591359988 101.47656591359993 91.65712591359987 82.33768591359991 73.51824591359994 65.19880591359991 57.37936591359993 50.059925913599905 43.24048591359994 36.921045913599905 31.10160591359994 25.782165913599965 20.962725913599943 16.643285913599964 12.823845913599946 9.504405913599966 6.684965913599981 4.365525913599973 2.5460859135999856 1.2266459135999843 0.40720591359999375 0.0877659135999996 0.26832591360000574 0.948885913600009 2.1294459136000214 3.8100059136000217 5.990565913600019 8.671125913600036 11.851685913600031 15.532245913600057 19.71280591360005 24.39336591360004 29.573925913600075 35.25448591360006 41.43504591360009 48.11560591360008 55.29616591360005 62.9767259136001 71.15728591360008 79.83784591360012 89.0184059136001 98.69896591360006 108.87952591360005 119.56008591360019 130.74064591360016 142.42120591360012 154.60176591360008 167.28232591360003 180.46288591360025 194.1434459136002 208.32400591360013 223.0045659136001 238.18512591360005 253.8656859136003 270.0462459136003 286.72680591360023 303.90736591360013 321.5879259136004 339.76848591360033 358.4490459136003 377.62960591360024 397.31016591360014 +928.8541759999997 898.6281759999998 868.9021759999997 839.6761759999998 810.9501759999996 782.7241759999997 754.998176 727.7721759999997 701.0461759999998 674.8201759999997 649.0941759999997 623.8681759999996 599.1421759999997 574.9161759999998 551.1901759999997 527.9641759999998 505.2381759999998 483.0121759999998 461.28617599999995 440.0601759999998 419.3341759999999 399.1081759999999 379.3821759999999 360.15617599999985 341.43017599999985 323.2041759999999 305.4781759999999 288.2521759999999 271.5261759999999 255.30017599999982 239.57417599999988 224.34817599999985 209.62217599999988 195.39617599999985 181.67017599999986 168.4441759999999 155.7181759999999 143.4921759999999 131.7661759999999 120.54017599999987 109.81417599999993 99.58817599999988 89.86217599999992 80.63617599999995 71.91017599999991 63.684175999999944 55.9581759999999 48.73217599999994 42.006175999999904 35.78017599999993 30.05417599999996 24.828175999999935 20.102175999999957 15.876175999999944 12.150175999999963 8.92417599999998 6.198175999999969 3.972175999999983 2.246175999999979 1.0201759999999898 0.2941759999999967 0.06817600000000042 0.34217600000000475 1.1161760000000147 2.3901760000000167 4.1641760000000145 6.438176000000032 9.212176000000026 12.486176000000052 16.26017600000004 20.53417600000003 25.308176000000064 30.582176000000047 36.35617600000008 42.63017600000007 49.40417600000005 56.678176000000086 64.45217600000007 72.72617600000012 81.5001760000001 90.77417600000007 100.54817600000004 110.82217600000018 121.59617600000016 132.87017600000013 144.6441760000001 156.91817600000005 169.69217600000022 182.9661760000002 196.74017600000013 211.01417600000008 225.78817600000005 241.06217600000028 256.83617600000025 273.1101760000002 289.88417600000014 307.15817600000037 324.93217600000037 343.2061760000003 361.9801760000002 381.25417600000014 +954.7550590975997 924.1068190975999 893.9585790975997 864.3103390975999 835.1620990975997 806.5138590975998 778.3656190975998 750.7173790975997 723.5691390975999 696.9208990975997 670.7726590975998 645.1244190975997 619.9761790975998 595.3279390975999 571.1796990975997 547.5314590975998 524.3832190975996 501.7349790975998 479.58673909759995 457.93849909759984 436.7902590975999 416.14201909759976 395.9937790975999 376.34553909759984 357.19729909759985 338.54905909759987 320.4008190975999 302.7525790975999 285.60433909759985 268.95609909759986 252.8078590975999 237.15961909759986 222.01137909759987 207.36313909759988 193.21489909759984 179.5666590975999 166.4184190975999 153.77017909759988 141.6219390975999 129.97369909759988 118.82545909759995 108.17721909759987 98.02897909759993 88.38073909759996 79.23249909759993 70.58425909759995 62.43601909759991 54.78777909759994 47.63953909759991 40.991299097599935 34.84305909759996 29.194819097599936 24.04657909759996 19.39833909759994 15.250099097599962 11.601859097599979 8.453619097599967 5.805379097599982 3.6571390975999747 2.0088990975999863 0.8606590975999944 0.21241909759999544 0.06417909760000093 0.4159390976000082 1.267699097600011 2.6194590976000103 4.471219097600024 6.822979097600022 9.674739097600042 13.026499097600038 16.878259097600026 21.230019097600053 26.08177909760004 31.433539097600075 37.28529909760006 43.637059097600044 50.488819097600086 57.84057909760006 65.69233909760013 74.0440990976001 82.89585909760005 92.24761909760004 102.09937909760019 112.45113909760015 123.3028990976001 134.65465909760007 146.5064190976 158.8581790976002 171.70993909760017 185.06169909760013 198.91345909760008 213.26521909760004 228.11697909760025 243.4687390976002 259.3204990976002 275.6722590976001 292.5240190976004 309.8757790976003 327.7275390976003 346.0792990976002 364.93105909760015 +981.9965395456 950.9103795456001 920.3242195455997 890.2380595455998 860.6518995455999 831.5657395456 802.9795795456001 774.8934195455997 747.3072595455998 720.2210995455998 693.6349395456 667.5487795455998 641.9626195455996 616.8764595455998 592.2902995455999 568.2041395456 544.6179795455998 521.5318195455998 498.9456595455998 476.85949954559993 455.2733395456 434.18717954559986 413.60101954559974 393.5148595455998 373.9286995455998 354.8425395455999 336.2563795455998 318.1702195455998 300.5840595455998 283.49789954559986 266.9117395455999 250.8255795455999 235.2394195455999 220.15325954559987 205.5670995455999 191.48093954559994 177.89477954559993 164.8086195455999 152.22245954559992 140.13629954559988 128.55013954559993 117.4639795455999 106.87781954559993 96.79165954559997 87.20549954559992 78.11933954559996 69.53317954559992 61.44701954559994 53.8608595455999 46.77469954559994 40.188539545599966 34.10237954559994 28.516219545599963 23.430059545599942 18.843899545599964 14.757739545599978 11.171579545599965 8.08541954559998 5.499259545599971 3.4130995455999837 1.8269395455999933 0.7407795455999912 0.1546195455999977 0.06845954560000211 0.48229954560000593 1.3961395456000063 2.8099795456000174 4.723819545600016 7.137659545600034 10.051499545600027 13.465339545600019 17.379179545600046 21.793019545600036 26.706859545600064 32.12069954560005 38.03453954560003 44.44837954560007 51.36221954560005 58.776059545600084 66.68989954560008 75.10373954560005 84.01757954560003 93.43141954560016 103.34525954560014 113.7590995456001 124.67293954560007 136.08677954560002 148.0006195456002 160.41445954560015 173.32829954560012 186.74213954560008 200.65597954560002 215.06981954560024 229.9836595456002 245.39749954560014 261.31133954560005 277.72517954560027 294.63901954560026 312.0528595456002 329.96669954560014 348.3805395456001 +1010.6198168575999 979.0800568576 948.0402968575997 917.5005368575999 887.4607768575996 857.9210168575997 828.8812568575999 800.3414968575997 772.3017368575998 744.7619768575996 717.7222168575997 691.1824568575998 665.1426968575997 639.6029368575998 614.5631768575997 590.0234168575998 565.9836568575998 542.4438968575998 519.4041368575998 496.8643768575997 474.82461685759984 453.2848568575999 432.2450968575998 411.7053368575999 391.6655768575998 372.12581685759983 353.0860568575999 334.5462968575998 316.5065368575999 298.9667768575998 281.9270168575999 265.38725685759994 249.34749685759988 233.8077368575999 218.76797685759982 204.22821685759988 190.18845685759996 176.64869685759987 163.60893685759993 151.06917685759987 139.0294168575999 127.48965685759983 116.44989685759988 105.91013685759994 95.87037685759991 86.33061685759994 77.29085685759989 68.75109685759993 60.711336857599896 53.17157685759993 46.13181685759996 39.59205685759993 33.55229685759996 28.01253685759993 22.972776857599953 18.433016857599974 14.393256857599958 10.853496857599975 7.813736857599963 5.273976857599977 3.2342168575999892 1.6944568575999854 0.6546968575999937 0.11493685759999621 0.0751768576000021 0.5354168576000043 1.495656857600014 2.9558968576000133 4.916136857600029 7.376376857600026 10.33661685760002 13.796856857600044 17.757096857600033 22.217336857600063 27.177576857600048 32.637816857600036 38.59805685760008 45.058296857600055 52.01853685760009 59.478776857600074 67.43901685760004 75.89925685760002 84.85949685760015 94.31973685760012 104.27997685760012 114.74021685760007 125.70045685760006 137.16069685760024 149.12093685760019 161.58117685760016 174.5414168576001 188.00165685760007 201.96189685760027 216.42213685760024 231.38237685760018 246.84261685760012 262.8028568576004 279.2630968576003 296.22333685760026 313.6835768576002 331.64381685760014 +1040.6675657215999 1008.6585257216 977.1494857215998 946.1404457215998 915.6314057215998 885.6223657215999 856.1133257216 827.1042857215998 798.5952457216 770.5862057215999 743.0771657216 716.0681257215997 689.5590857215998 663.5500457215999 638.0410057215997 613.0319657215999 588.5229257215998 564.5138857215998 541.0048457216 517.9958057215998 495.48676572159997 473.4777257215998 451.96868572159997 430.9596457215998 410.45060572159986 390.44156572159994 370.93252572159986 351.92348572159995 333.41444572159986 315.4054057215999 297.8963657216 280.8873257215999 264.3782857215999 248.36924572159987 232.8602057215999 217.85116572159995 203.34212572159987 189.33308572159996 175.82404572159987 162.81500572159993 150.3059657216 138.2969257215999 126.78788572159996 115.7788457216 105.26980572159995 95.26076572159997 85.75172572159991 76.74268572159994 68.23364572159991 60.224605721599936 52.71556572159997 45.70652572159993 39.19748572159996 33.18844572159993 27.67940572159996 22.67036572159998 18.161325721599958 14.152285721599977 10.643245721599962 7.634205721599978 5.1251657215999895 3.1161257215999827 1.607085721599992 0.5980457215999911 0.08900572159999794 0.07996572160000114 0.5709257216000073 1.561885721600008 3.05284572160002 5.043805721600018 7.534765721600013 10.52572572160003 14.016685721600023 18.00764572160005 22.49860572160004 27.489565721600023 32.98052572160005 38.97148572160004 45.46244572160008 52.453405721600056 59.944365721600036 67.93532572160001 76.42628572160014 85.41724572160011 94.90820572160008 104.89916572160004 115.3901257216 126.38108572160016 137.8720457216001 149.86300572160008 162.35396572160005 175.3449257216 188.8358857216002 202.82684572160017 217.31780572160008 232.30876572160003 247.79972572160028 263.7906857216002 280.28164572160017 297.2726057216001 314.76356572160006 +1072.1839360000001 1039.689936 1007.695936 976.2019360000002 945.2079359999999 914.713936 884.7199360000001 855.225936 826.2319360000001 797.7379359999999 769.7439360000001 742.2499359999998 715.2559359999999 688.7619360000001 662.7679359999998 637.273936 612.2799359999999 587.785936 563.7919360000001 540.2979359999999 517.303936 494.80993599999994 472.81593599999997 451.3219359999999 430.3279359999999 409.83393600000005 389.8399359999999 370.345936 351.3519359999999 332.85793599999994 314.863936 297.36993599999994 280.375936 263.8819359999999 247.88793599999994 232.393936 217.3999359999999 202.90593599999997 188.91193599999988 175.41793599999994 162.42393599999997 149.92993599999994 137.93593599999997 126.441936 115.44793599999994 104.95393599999998 94.95993599999991 85.46593599999996 76.47193599999991 67.97793599999994 59.98393599999998 52.48993599999995 45.49593599999997 39.001935999999944 33.007935999999965 27.513935999999983 22.519935999999962 18.02593599999998 14.031935999999964 10.537935999999979 7.543935999999992 5.049935999999982 3.0559359999999924 1.5619359999999878 0.5679359999999954 0.07393599999999938 0.07993600000000207 0.5859360000000035 1.5919360000000122 3.0979360000000113 5.103936000000006 7.6099360000000225 10.615936000000014 14.121936000000037 18.127936000000027 22.63393600000001 27.639936000000038 33.14593600000003 39.15193600000006 45.65793600000004 52.66393600000002 60.169936 68.1759360000001 76.68193600000008 85.68793600000005 95.19393600000002 105.19993599999995 115.70593600000012 126.71193600000008 138.21793600000004 150.22393599999998 162.72993599999995 175.73593600000015 189.2419360000001 203.24793600000007 217.753936 232.75993600000024 248.26593600000015 264.27193600000015 280.7779360000001 297.78393600000004 +1105.2145527296 1072.2199127296 1039.7252727296 1007.7306327296 976.2359927295997 945.2413527296 914.7467127296 884.7520727295998 855.2574327295999 826.2627927295998 797.7681527295999 769.7735127296 742.2788727295998 715.2842327296 688.7895927295999 662.7949527295999 637.3003127296 612.3056727295999 587.8110327296 563.8163927295999 540.3217527296 517.3271127296 494.8324727295999 472.83783272959977 451.3431927295999 430.34855272959993 409.85391272960004 389.8592727295999 370.3646327295999 351.36999272959986 332.8753527295999 314.88071272959996 297.38607272959996 280.3914327295999 263.8967927295999 247.90215272959995 232.40751272959994 217.4128727295999 202.91823272959994 188.92359272959993 175.42895272959996 162.4343127295999 149.93967272959995 137.9450327296 126.45039272959994 115.45575272959998 104.9611127295999 94.96647272959996 85.47183272959991 76.47719272959995 67.98255272959999 59.987912729599934 52.49327272959996 45.49863272959993 39.00399272959996 33.00935272959998 27.514712729599957 22.520072729599978 18.02543272959996 14.030792729599975 10.53615272959999 7.541512729599978 5.04687272959999 3.0522327295999827 1.5575927295999923 0.562952729599998 0.06831272959999804 0.07367272960000117 0.5790327296000075 1.584392729600008 3.0897527296000047 5.095112729600018 7.600472729600012 10.605832729600031 14.111192729600022 18.11655272960001 22.621912729600037 27.627272729600026 33.132632729600054 39.137992729600036 45.64335272960002 52.648712729599985 60.1540727296001 68.15943272960008 76.66479272960005 85.67015272960003 95.17551272959999 105.18087272960014 115.68623272960012 126.69159272960009 138.19695272960004 150.2023127296 162.70767272960018 175.71303272960014 189.2183927296001 203.22375272960002 217.72911272960027 232.73447272960018 248.23983272960015 264.2451927296001 280.75055272960003 +1139.8065161215998 1106.2955561216 1073.2845961215999 1040.7736361216 1008.7626761216 977.2517161216 946.2407561216 915.7297961216 885.7188361216 856.2078761215998 827.1969161215999 798.6859561215998 770.6749961216 743.1640361216 716.1530761215998 689.6421161216 663.6311561215998 638.1201961216 613.1092361216 588.5982761216 564.5873161216 541.0763561215998 518.0653961216 495.55443612159985 473.54347612159995 452.03251612159994 431.0215561215999 410.5105961216 390.49963612159985 370.98867612159995 351.9777161216 333.4667561215999 315.4557961216 297.9448361215999 280.93387612159995 264.4229161216 248.4119561215999 232.90099612159997 217.89003612159988 203.37907612159995 189.3681161216 175.85715612159993 162.84619612159997 150.33523612160002 138.32427612159995 126.8133161216 115.80235612159996 105.29139612159997 95.28043612159992 85.76947612159995 76.75851612159998 68.24755612159993 60.23659612159996 52.725636121599926 45.71467612159996 39.20371612159998 33.19275612159995 27.68179612159998 22.670836121599955 18.159876121599975 14.148916121599992 10.637956121599975 7.626996121599987 5.116036121599978 3.1050761215999896 1.5941161215999968 0.5831561215999941 0.07219612159999889 0.06123612160000231 0.5502761216000045 1.5393161216000033 3.0283561216000137 5.017396121600009 7.506436121600026 10.495476121600019 13.98451612160001 17.973556121600033 22.46259612160002 27.45163612160005 32.94067612160003 38.92971612160001 45.41875612159999 52.40779612160009 59.896836121600074 67.88587612160006 76.37491612160002 85.3639561216 94.85299612160014 104.84203612160009 115.33107612160003 126.3201161216 137.80915612159998 149.79819612160014 162.2872361216001 175.27627612160003 188.7653161216 202.7543561216002 217.24339612160017 232.2324361216001 247.72147612160006 263.7105161216 +1176.0084015615992 1141.9654415615994 1108.4224815615992 1075.3795215615992 1042.8365615615992 1010.7936015615993 979.2506415615995 948.2076815615994 917.6647215615994 887.6217615615993 858.0788015615994 829.0358415615996 800.4928815615995 772.4499215615995 744.9069615615995 717.8640015615995 691.3210415615996 665.2780815615995 639.7351215615996 614.6921615615994 590.1492015615996 566.1062415615996 542.5632815615995 519.5203215615996 496.97736156159954 474.9344015615996 453.39144156159966 432.34848156159956 411.8055215615996 391.76256156159957 372.21960156159963 353.17664156159975 334.63368156159964 316.5907215615997 299.0477615615996 282.00480156159966 265.4618415615998 249.41888156159965 233.8759215615997 218.83296156159966 204.2900015615997 190.24704156159964 176.7040815615997 163.66112156159977 151.11816156159972 139.07520156159978 127.53224156159972 116.48928156159975 105.94632156159972 95.9033615615998 86.36040156159983 77.3174415615998 68.77448156159983 60.731521561599806 53.188561561599855 46.14560156159988 39.60264156159986 33.559681561599895 28.016721561599873 22.9737615615999 18.430801561599925 14.387841561599915 10.844881561599935 7.801921561599932 5.258961561599952 3.216001561599968 1.6730415615999705 0.6300815615999847 0.0871215615999928 0.0441615616000044 0.5012015616000124 1.4582415616000275 2.915281561600033 4.872321561600054 7.329361561600057 10.286401561600057 13.743441561600086 17.700481561600082 22.157521561600117 27.11456156160011 32.571601561600104 38.52864156160009 44.98568156160019 51.94272156160018 59.39976156160017 67.35680156160015 75.81384156160011 84.77088156160025 94.22792156160024 104.18496156160023 114.64200156160021 125.59904156160017 137.05608156160037 149.01312156160031 161.4701615616003 174.42720156160027 187.88424156160045 201.84128156160043 216.2983215616004 231.25536156160035 246.7124015616003 +1213.8702596095995 1179.2796196095996 1145.1889796095995 1111.5983396095996 1078.5076996095995 1045.9170596095996 1013.8264196095996 982.2357796095995 951.1451396095994 920.5544996095992 890.4638596095994 860.8732196095992 831.7825796095993 803.1919396095996 775.1012996095994 747.5106596095995 720.4200196095994 693.8293796095995 667.7387396095995 642.1480996095995 617.0574596095996 592.4668196095994 568.3761796095995 544.7855396095994 521.6948996095995 499.10425960959964 477.0136196095995 455.4229796095996 434.33233960959956 413.7416996095996 393.65105960959966 374.0604196095996 354.9697796095997 336.3791396095996 318.2884996095996 300.69785960959973 283.60721960959967 267.0165796095997 250.92593960959962 235.3352996095997 220.24465960959975 205.6540196095997 191.56337960959974 177.9727396095998 164.88209960959975 152.2914596095998 140.20081960959976 128.61017960959978 117.51953960959973 106.92889960959978 96.8382596095998 87.24761960959977 78.15697960959982 69.56633960959978 61.47569960959982 53.885059609599864 46.794419609599835 40.20377960959987 34.11313960959985 28.522499609599876 23.431859609599908 18.841219609599893 14.75057960959992 11.159939609599913 8.069299609599936 5.478659609599955 3.3880196095999553 1.7973796095999723 0.7067396095999781 0.11609960959999234 0.025459609600003034 0.4348196096000161 1.344179609600024 2.7535396096000433 4.662899609600049 7.07225960960005 9.981619609600076 13.390979609600077 17.300339609600105 21.709699609600104 26.619059609600097 32.02841960960009 37.937779609600184 44.34713960960018 51.25649960960016 58.66585960960015 66.57521960960011 74.98457960960025 83.89393960960024 93.30329960960022 103.21265960960017 113.62201960960013 124.53137960960031 135.94073960960029 147.85009960960025 160.2594596096002 173.16881960960043 186.5781796096004 200.48753960960033 214.8968996096003 229.80625960960026 +1253.4436159999993 1218.2896159999993 1183.6356159999993 1149.4816159999993 1115.8276159999991 1082.6736159999994 1050.0196159999994 1017.8656159999994 986.2116159999995 955.0576159999993 924.4036159999995 894.2496159999995 864.5956159999995 835.4416159999995 806.7876159999993 778.6336159999995 750.9796159999996 723.8256159999995 697.1716159999995 671.0176159999995 645.3636159999995 620.2096159999996 595.5556159999995 571.4016159999994 547.7476159999995 524.5936159999997 501.9396159999997 479.78561599999955 458.1316159999995 436.97761599999956 416.3236159999996 396.1696159999996 376.5156159999996 357.36161599999963 338.70761599999963 320.5536159999997 302.8996159999997 285.7456159999997 269.0916159999997 252.93761599999968 237.2836159999997 222.12961599999966 207.47561599999972 193.3216159999998 179.66761599999973 166.5136159999998 153.85961599999973 141.7056159999998 130.05161599999974 118.89761599999976 108.24361599999982 98.08961599999976 88.43561599999981 79.28161599999977 70.62761599999982 62.47361599999985 54.819615999999826 47.665615999999865 41.01161599999984 34.85761599999987 29.203615999999904 24.049615999999887 19.39561599999991 15.241615999999903 11.587615999999928 8.43361599999995 5.779615999999944 3.625615999999962 1.971615999999965 0.8176159999999805 0.16361599999999274 0.009616000000002217 0.3556160000000117 1.2016160000000276 2.5476160000000343 4.393616000000037 6.73961600000006 9.585616000000062 12.93161600000009 16.777616000000087 21.123616000000084 25.969616000000073 31.315616000000162 37.16161600000015 43.50761600000014 50.35361600000012 57.699616000000105 65.54561600000022 73.89161600000021 82.73761600000019 92.08361600000016 101.92961600000015 112.2756160000003 123.12161600000027 134.46761600000025 146.31361600000022 158.65961600000043 171.50561600000037 184.85161600000035 198.69761600000032 213.04361600000027 +1294.7814716415994 1259.0484316415996 1223.8153916415995 1189.0823516415996 1154.8493116415993 1121.1162716415993 1087.8832316415994 1055.1501916415996 1022.9171516415996 991.1841116415992 959.9510716415994 929.2180316415994 898.9849916415994 869.2519516415997 840.0189116415992 811.2858716415993 783.0528316415995 755.3197916415995 728.0867516415997 701.3537116415993 675.1206716415993 649.3876316415995 624.1545916415995 599.4215516415994 575.1885116415993 551.4554716415994 528.2224316415995 505.4893916415996 483.2563516415995 461.52331164159943 440.2902716415995 419.5572316415995 399.32419164159955 379.59115164159954 360.3581116415996 341.6250716415997 323.39203164159966 305.65899164159964 288.4259516415996 271.6929116415996 255.45987164159968 239.72683164159963 224.49379164159967 209.76075164159977 195.5277116415997 181.79467164159976 168.5616316415997 155.82859164159976 143.59555164159968 131.86251164159975 120.62947164159979 109.89643164159973 99.6633916415998 89.93035164159974 80.6973116415998 71.96427164159984 63.73123164159981 55.99819164159985 48.76515164159982 42.032111641599855 35.79907164159989 30.066031641599867 24.832991641599897 20.099951641599883 15.866911641599913 12.133871641599935 8.900831641599929 6.1677916415999485 3.934751641599949 2.201711641599967 0.9686716415999815 0.2356316415999883 0.0025916416000003107 0.2695516416000134 1.0365116416000226 2.3034716416000287 4.070431641600048 6.337391641600051 9.10435164160008 12.371311641600078 16.138271641600074 20.405231641600068 25.172191641600147 30.439151641600144 36.20611164160014 42.47307164160012 49.24003164160011 56.50699164160023 64.2739516416002 72.54091164160019 81.30787164160017 90.57483164160014 100.3417916416003 110.60875164160028 121.37571164160025 132.64267164160023 144.4096316416004 156.67659164160037 169.44355164160035 182.7105116416003 196.4774716416003 +1337.9383026175994 1301.6105426175995 1265.7827826175994 1230.4550226175995 1195.6272626175994 1161.2995026175995 1127.4717426175996 1094.1439826175995 1061.3162226175996 1028.9884626175995 997.1607026175994 965.8329426175997 935.0051826175995 904.6774226175995 874.8496626175995 845.5219026175995 816.6941426175996 788.3663826175996 760.5386226175996 733.2108626175994 706.3831026175995 680.0553426175996 654.2275826175995 628.8998226175995 604.0720626175995 579.7443026175996 555.9165426175997 532.5887826175996 509.7610226175995 487.4332626175996 465.6055026175997 444.27774261759976 423.4499826175997 403.1222226175996 383.29446261759966 363.96670261759976 345.13894261759975 326.81118261759974 308.98342261759973 291.6556626175997 274.8279026175998 258.5001426175997 242.67238261759977 227.3446226175998 212.51686261759974 198.1891026175998 184.36134261759972 171.03358261759976 158.20582261759972 145.87806261759977 134.0503026175998 122.72254261759979 111.89478261759982 101.56702261759978 91.73926261759982 82.41150261759987 73.58374261759982 65.25598261759986 57.42822261759983 50.10046261759987 43.2727026175999 36.94494261759988 31.11718261759991 25.789422617599886 20.961662617599917 16.63390261759994 12.806142617599928 9.478382617599948 6.650622617599944 4.322862617599961 2.495102617599976 1.1673426175999781 0.33958261759999026 0.011822617599998225 0.18406261760000778 0.8563026176000138 2.0285426176000287 3.7007826176000322 5.8730226176000535 8.545262617600054 11.71750261760005 15.389742617600044 19.561982617600115 24.234222617600107 29.406462617600102 35.07870261760009 41.25094261760007 47.923182617600176 55.095422617600164 62.767662617600145 70.93990261760013 79.6121426176001 88.78438261760024 98.45662261760022 108.62886261760018 119.30110261760016 130.47334261760034 142.1455826176003 154.31782261760029 166.99006261760022 180.1623026176002 +1382.9700601855996 1346.0319001855996 1309.593740185599 1273.6555801855993 1238.2174201855994 1203.2792601855997 1168.8411001855995 1134.9029401855992 1101.4647801855992 1068.5266201855995 1036.0884601855996 1004.1503001855995 972.7121401855992 941.7739801855994 911.3358201855995 881.3976601855996 851.9595001855995 823.0213401855992 794.5831801855995 766.6450201855996 739.2068601855997 712.2687001855995 685.8305401855994 659.8923801855994 634.4542201855996 609.5160601855997 585.0779001855997 561.1397401855995 537.7015801855996 514.7634201855997 492.32526018559975 470.38710018559965 448.94894018559955 428.0107801855996 407.5726201855997 387.63446018559966 368.1963001855997 349.2581401855997 330.81998018559966 312.8818201855997 295.4436601855997 278.50550018559966 262.0673401855997 246.12918018559978 230.6910201855997 215.7528601855998 201.31470018559972 187.37654018559977 173.93838018559973 161.00022018559974 148.56206018559982 136.62390018559978 125.18574018559981 114.24758018559976 103.80942018559982 93.87126018559987 84.43310018559981 75.49494018559986 67.05678018559982 59.11862018559985 51.68046018559989 44.74230018559986 38.30414018559989 32.365980185599874 26.9278201855999 21.989660185599927 17.551500185599913 13.613340185599938 10.175180185599928 7.237020185599949 4.798860185599967 2.8607001855999648 1.4225401855999795 0.48438018559998447 0.04622018559999637 0.1080601856000047 0.6699001856000167 1.7317401856000225 3.2935801856000406 5.355420185600044 7.9172601856000435 10.97910018560004 14.5409401856001 18.602780185600096 23.16462018560009 28.22646018560008 33.78830018560007 39.85014018560017 46.41198018560015 53.47382018560014 61.03566018560012 69.09750018560011 77.65934018560024 86.72118018560022 96.2830201856002 106.34486018560015 116.90670018560033 127.9685401856003 139.53038018560028 151.59222018560024 164.1540601856002 +1429.9341707775995 1392.3699307775996 1355.305690777599 1318.741450777599 1282.6772107775994 1247.1129707775995 1212.0487307775998 1177.4844907775991 1143.4202507775992 1109.8560107775995 1076.7917707775996 1044.2275307775994 1012.1632907775993 980.5990507775994 949.5348107775997 918.9705707775996 888.9063307775996 859.3420907775993 830.2778507775994 801.7136107775996 773.6493707775996 746.0851307775996 719.0208907775994 692.4566507775995 666.3924107775996 640.8281707775997 615.7639307775996 591.1996907775995 567.1354507775995 543.5712107775997 520.5069707775997 497.94273077759965 475.87849077759955 454.3142507775996 433.2500107775997 412.6857707775997 392.6215307775997 373.0572907775997 353.99305077759965 335.42881077759967 317.36457077759974 299.80033077759964 282.7360907775997 266.1718507775998 250.10761077759972 234.54337077759976 219.4791307775997 204.91489077759974 190.8506507775997 177.28641077759974 164.2221707775998 151.65793077759974 139.59369077759982 128.02945077759975 116.96521077759981 106.40097077759985 96.33673077759981 86.77249077759984 77.7082507775998 69.14401077759985 61.07977077759988 53.51553077759985 46.45129077759988 39.88705077759986 33.822810777599884 28.258570777599918 23.194330777599898 18.630090777599925 14.565850777599916 11.001610777599938 7.9373707775999565 5.373130777599952 3.308890777599969 1.7446507775999702 0.6804107775999844 0.11617077759999508 0.051930777600003766 0.4876907776000117 1.4234507776000267 2.859210777600032 4.794970777600033 7.230730777600032 10.166490777600083 13.602250777600084 17.53801077760008 21.97377077760007 26.90953077760006 32.34529077760015 38.281050777600136 44.716810777600124 51.65257077760011 59.08833077760009 67.02409077760022 75.4598507776002 84.39561077760018 93.83137077760016 103.7671307776003 114.20289077760029 125.13865077760025 136.57441077760024 148.5101707776002 +1478.8895359999995 1440.6835359999995 1402.9775359999992 1365.7715359999995 1329.0655359999992 1292.8595359999995 1257.1535359999996 1221.9475359999992 1187.2415359999995 1153.0355359999994 1119.3295359999995 1086.1235359999996 1053.4175359999995 1021.2115359999997 989.5055359999993 958.2995359999996 927.5935359999996 897.3875359999996 867.6815359999996 838.4755359999995 809.7695359999997 781.5635359999998 753.8575359999996 726.6515359999995 699.9455359999996 673.7395359999997 648.0335359999997 622.8275359999997 598.1215359999995 573.9155359999995 550.2095359999997 527.0035359999998 504.2975359999996 482.0915359999995 460.3855359999996 439.1795359999997 418.47353599999974 398.26753599999967 378.56153599999965 359.35553599999963 340.6495359999997 322.44353599999965 304.7375359999997 287.53153599999973 270.8255359999997 254.61953599999975 238.91353599999965 223.70753599999975 209.00153599999967 194.79553599999974 181.08953599999978 167.88353599999974 155.17753599999978 142.97153599999973 131.2655359999998 120.05953599999982 109.35353599999979 99.14753599999983 89.44153599999979 80.23553599999984 71.52953599999987 63.32353599999983 55.61753599999987 48.41153599999984 41.705535999999874 35.49953599999991 29.79353599999989 24.587535999999915 19.8815359999999 15.675535999999926 11.969535999999948 8.76353599999994 6.057535999999958 3.851535999999956 2.1455359999999724 0.9395359999999855 0.23353599999999056 0.02753600000000065 0.32153600000001203 1.1155360000000194 2.409536000000023 4.203536000000024 6.497536000000065 9.291536000000068 12.585536000000067 16.379536000000062 20.673536000000052 25.467536000000134 30.761536000000124 36.55553600000011 42.8495360000001 49.64353600000008 56.93753600000019 64.73153600000018 73.02553600000016 81.81953600000013 91.11353600000028 100.90753600000026 111.20153600000023 121.99553600000021 133.28953600000017 +1529.8965326335992 1491.0330926335994 1452.6696526335993 1414.8062126335994 1377.4427726335994 1340.5793326335993 1304.2158926335994 1268.3524526335993 1232.9890126335995 1198.1255726335992 1163.7621326335993 1129.8986926335992 1096.5352526335994 1063.6718126335995 1031.3083726335992 999.4449326335995 968.0814926335993 937.2180526335995 906.8546126335996 876.9911726335995 847.6277326335996 818.7642926335993 790.4008526335996 762.5374126335996 735.1739726335994 708.3105326335996 681.9470926335995 656.0836526335996 630.7202126335997 605.8567726335996 581.4933326335997 557.6298926335995 534.2664526335997 511.4030126335997 489.0395726335996 467.1761326335997 445.8126926335996 424.94925263359966 404.58581263359974 384.72237263359966 365.3589326335997 346.49549263359967 328.1320526335997 310.2686126335998 292.9051726335997 276.0417326335998 259.6782926335997 243.81485263359974 228.4514126335997 213.58797263359972 199.2245326335998 185.36109263359972 171.99765263359978 159.13421263359973 146.7707726335998 134.90733263359985 123.54389263359977 112.68045263359981 102.31701263359977 92.45357263359982 83.09013263359986 74.22669263359982 65.86325263359986 57.99981263359983 50.63637263359987 43.77293263359991 37.40949263359988 31.54605263359991 26.182612633599888 21.319172633599916 16.955732633599936 13.092292633599927 9.72885263359995 6.865412633599944 4.501972633599962 2.638532633599976 1.2750926335999775 0.41165263359998977 0.048212633599997425 0.18477263360000695 0.821332633600013 1.9578926336000153 3.5944526336000475 5.731012633600052 8.367572633600053 11.50413263360005 15.140692633600043 19.27725263360011 23.913812633600106 29.050372633600098 34.686932633600094 40.82349263360007 47.46005263360018 54.59661263360016 62.23317263360014 70.36973263360011 79.00629263360025 88.14285263360024 97.7794126336002 107.91597263360019 118.55253263360017 +1583.0170126335993 1543.4804526335993 1504.4438926335997 1465.9073326335997 1427.8707726335992 1390.3342126335992 1353.2976526335995 1316.7610926335997 1280.7245326335997 1245.1879726335992 1210.1514126335994 1175.6148526335994 1141.5782926335996 1108.0417326335996 1075.0051726335994 1042.4686126335994 1010.4320526335995 978.8954926335997 947.8589326335998 917.3223726335992 887.2858126335996 857.7492526335996 828.7126926335998 800.1761326335995 772.1395726335994 744.6030126335995 717.5664526335996 691.0298926335996 664.9933326335996 639.4567726335995 614.4202126335995 589.8836526335997 565.8470926335997 542.3105326335997 519.2739726335994 496.73741263359955 474.70085263359965 453.1642926335997 432.12773263359963 411.59117263359957 391.55461263359973 372.0180526335996 352.9814926335997 334.44493263359976 316.4083726335997 298.87181263359975 281.8352526335997 265.2986926335997 249.2621326335997 233.72557263359977 218.68901263359982 204.15245263359975 190.1158926335998 176.57933263359973 163.54277263359978 151.00621263359986 138.9696526335998 127.43309263359983 116.39653263359976 105.85997263359982 95.82341263359987 86.28685263359982 77.25029263359986 68.71373263359982 60.67717263359986 53.1406126335999 46.10405263359986 39.567492633599905 33.53093263359988 27.994372633599905 22.957812633599932 18.421252633599916 14.384692633599942 10.848132633599931 7.811572633599951 5.275012633599968 3.238452633599966 1.7018926335999798 0.6653326335999834 0.12877263359999488 0.09221263360000287 0.5556526336000073 1.5190926336000297 2.982532633600036 4.9459726336000385 7.409412633600037 10.372852633600035 13.836292633600092 17.799732633600087 22.26317263360008 27.22661263360007 32.690052633600054 38.65349263360015 45.11693263360014 52.08037263360012 59.54381263360011 67.50725263360023 75.97069263360021 84.93413263360019 94.39757263360016 104.36101263360014 +1638.3143031295992 1598.0889431295993 1558.3635831295996 1519.1382231295997 1480.4128631295991 1442.1875031295992 1404.4621431295996 1367.2367831295996 1330.5114231295997 1294.2860631295991 1258.5607031295995 1223.3353431295996 1188.6099831295996 1154.3846231295997 1120.6592631295994 1087.4339031295995 1054.7085431295995 1022.4831831295998 990.7578231295998 959.5324631295993 928.8071031295996 898.5817431295995 868.8563831295997 839.6310231295995 810.9056631295994 782.6803031295995 754.9549431295995 727.7295831295996 701.0042231295996 674.7788631295995 649.0535031295996 623.8281431295997 599.1027831295997 574.8774231295996 551.1520631295995 527.9267031295996 505.20134312959965 482.97598312959974 461.2506231295997 440.0252631295996 419.2999031295996 399.07454312959965 379.3491831295997 360.12382312959977 341.39846312959963 323.1731031295997 305.44774312959964 288.22238312959973 271.49702312959965 255.27166312959974 239.5463031295998 224.32094312959973 209.5955831295998 195.37022312959974 181.6448631295998 168.41950312959986 155.69414312959978 143.4687831295998 131.7434231295998 120.51806312959981 109.79270312959986 99.56734312959982 89.84198312959985 80.61662312959982 71.89126312959986 63.6659031295999 55.94054312959987 48.7151831295999 41.98982312959987 35.7644631295999 30.039103129599933 24.81374312959991 20.088383129599933 15.863023129599922 12.137663129599943 8.91230312959996 6.186943129599955 3.9615831295999713 2.2362231295999706 1.0108631295999837 0.2855031295999938 0.060143129600000116 0.3347831296000122 1.1094231296000203 2.384063129600025 4.158703129600026 6.433343129600023 9.20798312960007 12.48262312960007 16.25726312960007 20.53190312960006 25.306543129600048 30.581183129600134 36.35582312960012 42.63046312960011 49.40510312960009 56.67974312960021 64.45438312960017 72.72902312960017 81.50366312960014 90.77830312960012 +1695.8532064256 1654.9233664255994 1614.4935264255994 1574.5636864255998 1535.1338464255996 1496.2040064255996 1457.7741664255998 1419.8443264255995 1382.4144864255998 1345.4846464255995 1309.0548064255997 1273.1249664255995 1237.6951264255997 1202.7652864255997 1168.3354464255997 1134.4056064255997 1100.9757664255997 1068.0459264255996 1035.6160864255996 1003.6862464255995 972.2564064255997 941.3265664255996 910.8967264255997 880.9668864255997 851.5370464255994 822.6072064255997 794.1773664255995 766.2475264255996 738.8176864255997 711.8878464255996 685.4580064255997 659.5281664255996 634.0983264255997 609.1684864255998 584.7386464255995 560.8088064255996 537.3789664255996 514.4491264255997 492.0192864255998 470.08944642559965 448.6596064255998 427.7297664255996 407.2999264255997 387.3700864255998 367.9402464255997 349.0104064255998 330.5805664255997 312.65072642559977 295.22088642559964 278.29104642559975 261.8612064255998 245.93136642559975 230.5015264255998 215.57168642559972 201.1418464255998 187.21200642559984 173.78216642559977 160.8523264255998 148.42248642559977 136.49264642559982 125.06280642559987 114.13296642559982 103.70312642559986 93.7732864255998 84.34344642559985 75.4136064255999 66.98376642559985 59.0539264255999 51.62408642559987 44.6942464255999 38.26440642559993 32.33456642559991 26.90472642559993 21.974886425599912 17.545046425599935 13.615206425599958 10.185366425599945 7.255526425599965 4.82568642559996 2.8958464255999745 1.4660064255999863 0.5361664255999944 0.10632642559999589 0.17648642560000585 0.7466464256000123 1.816806425600015 3.3869664256000145 5.457126425600052 8.027286425600051 11.09744642560005 14.667606425600043 18.737766425600032 23.307926425600105 28.378086425600095 33.94824642560009 40.01840642560008 46.58856642560018 53.658726425600165 61.228886425600145 69.29904642560012 77.8692064256001 +1755.7000000000003 1714.0500000000004 1672.8999999999996 1632.25 1592.1000000000001 1552.4500000000003 1513.3000000000004 1474.6499999999999 1436.5 1398.8500000000001 1361.7000000000003 1325.05 1288.8999999999999 1253.25 1218.1000000000001 1183.45 1149.3 1115.6499999999999 1082.4999999999998 1049.8500000000001 1017.7000000000002 986.0500000000001 954.9 924.25 894.1000000000001 864.4500000000003 835.3000000000001 806.65 778.5000000000001 750.8500000000001 723.7000000000003 697.0500000000001 670.9 645.25 620.1000000000001 595.4500000000002 571.3000000000001 547.65 524.5000000000001 501.85 479.70000000000016 458.0499999999998 436.8999999999999 416.24999999999994 396.09999999999997 376.45000000000005 357.29999999999995 338.65 320.49999999999994 302.84999999999997 285.70000000000005 269.04999999999995 252.90000000000003 237.24999999999994 222.1 207.45000000000005 193.29999999999998 179.65000000000003 166.49999999999994 153.85000000000002 141.70000000000005 130.04999999999998 118.90000000000002 108.24999999999997 98.1 88.45000000000003 79.29999999999998 70.65000000000002 62.49999999999997 54.85 47.70000000000003 41.04999999999999 34.90000000000001 29.24999999999998 24.099999999999998 19.450000000000017 15.299999999999994 11.650000000000006 8.49999999999999 5.85 3.700000000000006 2.0500000000000096 0.8999999999999935 0.24999999999999853 0.10000000000000005 0.449999999999998 1.2999999999999925 2.6500000000000115 4.500000000000007 6.8500000000000005 9.699999999999989 13.049999999999974 16.90000000000003 21.250000000000018 26.099999999999998 31.44999999999998 37.30000000000007 43.650000000000055 50.50000000000003 57.85 65.69999999999997 diff --git a/FOAS/example/generate_img.py b/FOAS/example/generate_img.py new file mode 100644 index 0000000..30b5bc3 --- /dev/null +++ b/FOAS/example/generate_img.py @@ -0,0 +1,47 @@ +import csv +import numpy as np +import matplotlib.pyplot as plt +from pathlib import Path +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm + +# Set the print precision +np.set_printoptions(precision=4, suppress=True) + +# Set the data folder path +data_folder = Path("data") + +def read_matrix_file(fname): + with open(data_folder / fname) as fdata: + a = np.array([line.split() for line in fdata], dtype = np.float64) + return a + +# Data +box = read_matrix_file("box.d") +bl = read_matrix_file("bl.d").transpose().flatten() +bu = read_matrix_file("bu.d").transpose().flatten() +steps0 = read_matrix_file("steps[0].d").transpose().flatten() +steps1 = read_matrix_file("steps[1].d").transpose().flatten() +steps2 = read_matrix_file("steps[2].d").transpose().flatten() +X = read_matrix_file("X.d") +Y = read_matrix_file("Y.d") +z_box = read_matrix_file("z_box.d").transpose().flatten() +z_m = read_matrix_file("z_m.d") + +# Plot +fig = plt.figure() +ax = Axes3D(fig) +ax = fig.gca(projection='3d') +ax.grid(False) +ax.plot(box[0], box[1], z_box, 'k-', linewidth=1.5) +ax.plot([bl[0], bu[0], bu[0], bl[0], bl[0]], [bl[1], bl[1], bu[1], bu[1], bl[1]], -1.2*np.ones(5), 'k-') +ax.contour(X, Y, z_m, 15, offset=-1.2, cmap=cm.jet) +ax.plot_surface(X, Y, z_m, cmap=cm.jet, alpha=0.5) +ax.set_title('Rosenbrock Function') +ax.set_xlabel(r'$\mathit{x}$') +ax.set_ylabel(r'$\mathit{y}$') +ax.plot(steps0, steps1, steps2, 'o-', color='red', markersize=3, linewidth=2) +ax.azim = 160 +ax.elev = 35 +plt.savefig("./img/plot.png") +plt.clf() diff --git a/FOAS/example/img/plot.png b/FOAS/example/img/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..93056617d8fb4512de2750ce845a7fda9f2815eb GIT binary patch literal 113953 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 V`_&oN2w=cJSxF^{67i>g{{t2-X9fTO literal 0 HcmV?d00001 diff --git a/FOAS/example/output.txt b/FOAS/example/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..806dc956d00d7e16995f9f99a04d9f03523edc4d GIT binary patch literal 20866 zcmeHP+in{-5an}${(~NSb70*pyFeeB#tw=)7t~3BqUeL_*r{9J>fG9*-`@5d9??VY zQrfko(5hf8oL!OJ<(WA%oFSK+fB)&Y)jmFU9|7UUEgbFjB8(lk>o(oMedqSv7r?yd zPTZAy?cU(}0#`5H5&rGCGo0VJUr_cEzm9!f$Nh}+TX&AK4R?s^bARWR8{;YGxPxsk zasLHcp5pfz>f0mixc`$LZz5Oew$kH$F!0JVLvD}3#1pXd1|?#yG^(_}V2>(&3agow4Sv6^j}}KY`GP+`wZ8#*4f8&jQha%4u7W&PYBO%i?J6yj~Jgvzr(ZA^K^_i zWxEZ=A0Tt=(~Iiy0JeCFF(p`KDqHNBVeHf}-qarVpue%Vm=rB_c?Dbg9o!#5yNB-2NE_n4JjQesYQjg9 z9~xuo-QPk}$KD!gnH(YSL%)j19e045zkF%kZ}LdH?jEv%aO}FzT@SzP?s=^8ndker z=qdKRrmN}Nd^C~ztR~|;7!RPmG5$D`J;M{3?KEKv_0uti7Cb)&FZO#LjD~C9BP8SY z#MxIljCHOz-J%ik1@y+z@z{IsgUPRVUbiPcKE|;k#hk;Kw&1V%^_Y5&jYGR&ozdpZ zqa^Q5xIZ+~Ahls+oH@szeEfmeF!MM1Kg+J5+i?=(au~(<(DlLd2zmboe0w{xp?R#* zFn&8hLO)VQ*>STiHHT5Mcdy4FjYUBt9k&?9N6^)okKpy_VtvF{(=o=ay0y4?(_GT@ z$e441?1Ite^<+e1PDGZ+J~CFvrW{6by$xJLa7?bd7|RXwVtV`@XqZuP+`PaXf}`dt zVx(t}p*PJU#>gs^znLE5tDGLUY7vnZX?HEA#{+2b!o6>yztCe2qqy$Eue*tKIB^rMcj2iV16FUIO)1k@m}+KK zehH&S!?1d!5l0b5QTx!3kgI}u-Eo-RC=Zi$GxuQDH=eBWP0#US{lp_wTz+?bGYuFg zyzdxH9O3A=Py9SEzbgAF>T^dN*>d%FW$iSOa$>9GS`lyejL_=NPl6^EI~ylYFi!mn zA7M7AStS%Vo)Ru$s1KFWq@p|ab_#LUJ_7QK~P4_TB;4W_Q?Y$m*j1Fo)YuOKgd@4xFI z%fQP*57@!MHA}8z(O<+tFT+8u%&fM|RnA|AYb1+S=)}u5b_w-y#Jtcq1~{6^%CKR* z;rkr(7vkQ!mQN$N%2qGF z>|FDrcNJ9*=;vfh^2M?Y6Pe4fVZGFO;ae-#6LBBRjB38YnjwyuE0!@!h|8>(GFLfS zq-kk?3pUon5o1&ilj5e0ZCA#KG7?xXIaw6G7?xXIaw6`bDGIKJ$@3pwtui%zNraol7 zl)1{uqPQfeC7onMxnm%wmF#Nfz2uPL|bM zPws&U%A)mT&Rxh(%nN1FTAz(=xw2BW75d59m~zW?kfje6jF(ODLQ9Kzp>J^R9FJMK zvY@Y0=Q=Np=<6ekjaFe-Yw9n#cS*UjQhbDd#7l{6cm6&C)~2&$;SOc)34Mz<;$OnT zwC9aqV_sn&J@;Jk%VzGK=YHJqK3v~Ryhcg-z2SSbNN6qWpqfzv}xHrs=TyhLh1pzBlcT<(7*V+f6P>xD!m@6NDXP{9 z?M#+$md*;%X)d%l&Nfe|%CcNmIMZ%}VmWP0mVLK;W(K$9FF}@NG85JgmZSHkr-+yN z=N2XIY?2|=n~jB%)jJEL{wEB6BhT-C>tB3v-gSG2>G1>^_#YD_`^akFBk#DvZ~F!( zMH$ag;+p4}Ctfz(8@F%1HjHeml@NZFJu8dWif>q7h*x;{jM=r#i0Um;jLLvFkO|Mi zsJ%1OFwVZWj-a_D#n{~bHd+WH|1TEWqS+pE_m{}>SHX)+k0pI(n!n{)GK{Qm=QFeC zrL%n|x7MIu^Y~brVr=I#voX&0nc4T|aS|i{_F;L7{QUo`xDs;)YdrPe!Cm5f;zvBK VqWy?kuC;L0Kg{+!?kE48{{Yb#qMrZ& literal 0 HcmV?d00001 diff --git a/FOAS/images/KF_DG_unconst_tokyo_notriv-NF.png b/FOAS/images/KF_DG_unconst_tokyo_notriv-NF.png new file mode 100644 index 0000000000000000000000000000000000000000..ccce006aa127e44fcd3f2db1402a83cab153dc59 GIT binary patch literal 45317 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 literal 0 HcmV?d00001 diff --git a/FOAS/images/KF_DG_unconst_tokyo_notriv-NG.png b/FOAS/images/KF_DG_unconst_tokyo_notriv-NG.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf3b257470ebf3d8b7a690e6baf42addae41472 GIT binary patch literal 46913 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≺451;!>O^IKct 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 literal 0 HcmV?d00001 diff --git a/FOAS/images/KF_DG_unconst_tokyo_notriv-NT.png b/FOAS/images/KF_DG_unconst_tokyo_notriv-NT.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf3ba3b6b4397d7116175f81baa1169d31b15e7 GIT binary patch literal 45750 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 literal 0 HcmV?d00001 diff --git a/FOAS/images/Rosenbrock2dw.png b/FOAS/images/Rosenbrock2dw.png new file mode 100644 index 0000000000000000000000000000000000000000..714e8c1dc233be923ccd584bffc5ab6e3d637079 GIT binary patch literal 638792 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

    !2h&v|pCV&b^Dk22Y)_ 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

    1V+ip4&6|9WbfkqY^#= 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%0D)`TE@W!%a31e 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 cF;i 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 z zpyZTp&v_9d{m=ZcV-tk+iJsmn5bPIg9q-Tq#5Zpyg?l{0Q79M*x(`c~}}Sc)Rz6K{dBKyPo<0jas(ExQPEoA#M27i2f%n9&ME zig-_Cf%anAm4Y8YtCn{r|8o#`Okq|7#AQv#~) zTRPhpf=t(rdisLsK*@n=}WLIbc`RMZif*u?ooNNBJ@kz#y>*2qORw=xa+- zv)Y35m9%k5+dyQg^(~=bTOKp6$rE5c?Q=Gu30yK?`u6G>_Vm@HIzRe+Dt6 z%DVOK`U^%&*fVU;kY7XLmy5q#{L&3|R@PbBVk$iST>{U|yaCC1phuT&&m9Xg+WfiiZcw&)ec+!0gp^Ilj0O_aH%!&Q zcCDIs(~m(}<_HPw2b`8IXa~5sE06razJEtT)wnjU8nzEE${&-tE{o!H-YcfO!E!EOef|6cX?e_2Xf_V#sD5t z<=KDGo`1CelYp5h(Gc)OArIWYrq{WW1Rnpw7O6AfJUKn+3!86jueN6y_y+m*^4SJY z=RdRhnO`9BLgInMWH8nmYvuRAZEnlk{I7F1{NtK{i6D^xgb+mpxEenkdpQlXpNpoZ zuL7_8b&hws2%?`Q(`zA6D0j$r0AJCC34j;v#0!8w&FK$#W1;{GyoAlKn8yH))S->r0q+SW)yimkqkOi`du@vYf zAINhczoM_uKyGo3DGdYHx%>CeHwDYoYWo_cf%>b@pujkg^YpX&QlOGD3PCIuqvScD z4|PZd@ws}|{0@i>YAtgH|1z@lU-r3<1~d{G;yKXo6~3O)0i65N9$wuBwtY1hw)hA{ ziTRSf3&`QdEPXd%A)sY^ehEzNp{7!E$Iexar9zKZ3aZ&~m9Mm|l%sR&z0!?GZC;Z2?iwe8Acblpig5 zw&y_HHU(Q^fLGK>mJdLwYd&Dj1nQwyVDZW-F1AUa0$}7M#${zK7Ad!b+6fjxe z>j{C1ysI4#wFGliME`1Az`Qo{@mdFg-Ex;v4=9w|SVC0<&OJaQk2FBylI8qcsIsR> z@x7=3J+Q2xP=|=1k~60cL$BhIox9EhdrSX4{@4G5cJUYf!e9753TKB(SLHZ(Wz1`{ z-%Nlt_N%XTP6y{m+oAez0&v)P@FxrTufa2FUGOQc2tE=Gv&Qw^o{JL@gq zY%pqx4wiACA9SXchl0maI5oW;=uf(vyT^fA&A!@41LcT%+w?WadPYa>0aymOpU!&? zY{`{d?j8g8s<1V!!@7Puu#?neNcI3!6b0k$lZM33391E z+4CVN!%Pm-8c?hGl!u-M(@nql@KYczsWU7EzGVE!R+OH2|7AJaRwD?keG z(*X#F&{)HeVele*!|L19PA737ehX%GX&g*ZDQz~ zpw-CBOSua29Pi6uurv$)B`yd=PxA}*2+%K=4$iFr?R?RVj5DD8=+!XbYcRD57#)=h z;&bJUX(N!vhq4pkjU5-rbiPx1f$2^TSH1%CHBHSq3}r9-m=gwo_CeX`g0WzJ*1un5 z7f=nK2_acPC{sl;P|9h!8u*V(UR605J+u^)f$!xC{S4R!-W#^-HdKtz+eioKO5_ub z&0wD6A0F{F&{uq-R*8C4Nh>7DLL&^crKLS`)`8xp=vGz`sJ(q24}J?why89wECI%f z`)W@hkIl>gq8P$lFp8b`N``~>dbZ=%M(`O}SpC{V&=Tvs*y}yebG&`RR|4TO))>Lx zrIKn=Q`D@wQWFRzgisLU#W=h=?{JerH12F zKwVI4+GqOJ2ix}4B}dmmSyDuuM&EK%XO1cK3h0)zGfvQxVE$j)(;ED-F-+|tfmrVVDmrUCnK;Vh;zroxy{21u@M!Jy;hGJ~h$AH`-Tgp-}T*h(ZYw-G1 zJmLNv{ClfMDjP$|`&yB?F_d;T>f3gLw8^jV27DkXV6z`u#9+-(J~#kLUJ1}JYXvK%h}V{H5Uz5>f?%ahgsFlnYJQycKUVtI@Q5Wl); z@!8j*=!SRWum^yHw| zCxPo+=NiaCtl}Za0R5u-d(fX-qh*@bH#Yyr#E zg3WiwLB+lryV@NACMXw7H2@pw@-iT>;sD~rYhn)=(UqB{$G|f!uX;*3C>y=n__qS{ zs{v0&Zv`4E6O>nhBu0u)fljQK{Xo3!u{alix}qc^yD=!ubE@AP2Daal-#!%&+Gn;? zJ{O>Db>QTL7ePPoS3l}5m}*D$Yfulw5!1`omVlJk3@^aSS-I{XSiQi49f%jR#9=VT zyK0r^gXi1a#wj77d}WFB+5o2WLBX*-L7Y&&QGWvaf#j9PHiOnU@Uw{b!ShZ?Wc3F? z8yRN24fxSRyapVV$Bg~p*UJxjT-?O{BqxHnuFf*=2Xo8d()edVtXBif^?@wDmLsW>By0>= zd5r0RH;>5^5cKt}Y^m4;N>Eai-E! zauSTSu5INzfH?hzb_?WGeX+Y8xczbplD`HyPFv;{V4oUK%NQ_M4;i1Z9K;#ZDciRo zzPAo_yanQh`kBQJVzb)V`~nz(&hJZ-!1?w41!o6>$W{&WIIu;;HEWRy;-c-L<1%na zy3l|;`7?8YP%(hlfOGPuaUMLs<@CR+f$Q<~cdvzmWkKku8VXpNg`WW3Kq9}X6ADaL z<4uJ?iku;9@^?wL*5WK_U^pxLluQQKu+*2&PXObRr@!kvu$`*r)2tHIAfIC)Zvj{3 zOomgHo9Y)JTFe!vfpf-P<2HD_@(v|G2Cn)UBd*N^b6@{oqZ)waKokwOfbcSZXFUmA zlIKzkb8k7v)l{W`c^InD1(0n>c{_oD8DbwOlB zy-}dPU~}8wh6BItuYb4^Y!DlA)(?bX^M|b-)&Y84?K!qvH_*Rxed$aBcb%-yZ*2n4 z-TdYEi^24i|Kg~}z&bIqY2BtErdq~&MF1CMmq%7n2|$#X3P1yX1fYTs0E`#PPZyZL zc`(I#>LgU`xT3-C_dJ_D2Y(s-p)4D8%JWmR2KC^l3)|POn{h?+@&Oz%tt?#z@28PEDj~zA*>^1E* z?fxKzteOqHsb1AyQAHCsWhQ{pvg}fRd#I>!JNZy=sEAA+ai$-rl|Dm4x_~3K=H1rg z!5kFwd5zwn9`SxYC>_|RPBT9Vq_GKr`*J2t05@s!JUq((0rjW{pl#CjQ3&j23r;Y7 zWBQy(;2PH+-TSZI`@c(>Ruip&ULu5ZV7yz=zpxl82i|*lYAFam%WC`Az=MFds;>lP zqU-y@OprY)YUb%+JmtPukp*J9lB*sBWv3%Q;2kiv_30h@7AWhzy9B-g$|B1FM|mHnE-gmkXHbe01*QuisxAZ?nYUCZ-s+rLr8p)UfhQ+7KiL7Uq=zRjy$4=r5>q=EpiJ|ADQFsSMYc6gJetq{b9xrP zOKw)R+e8S}0fj(ffKEaeOF&;=(k6QfR2JWT;bdR1_o$W7<^Y%m`MJZEfxIef$nSw- zu5%i2lEzg)Cxh#NLbkjFT$K@W5wKmJGwK4r7+Z`Ske6kN@dR*NmdI|vd0E}~24pY2 zi~A~6e0S}@!404cb-dwwAFK)0dNo=P%r~rh0mv!FbS)q7P)-quW+YGuL=%Ee)d7rX zz(f$Se;bK^9F6`}@lW&eXG6Kwv!}rFI2g{)Fz#3)1Xr-Ge6~t`u zsnQaJ$F$mP0y>CrWhc;I8Lh+sv3xIVASNhJDH;fu7%7%Q$}{&@r4EN5M*aBOk7pq@ zE%i?7W$5~PgVk}JplhAh_ZmJ0fuoxr?zseH8!=S<4RE3%fl?~)0A(Cw9pK_Dn}9<0 z$*+M5d4&UjMm}kP{^+WaLkiGFWQ+dbj!o}%^F7ew@;`b|1HAkiEbCkdysM^~M*|g{ zlRN%Xw6~S!C!>Oe_MEFd1iTLL3w6* zW_c#qq)pl+*jC$C+gATq*X}REheDwzJt^xINO|{iSV|ALar|Ob&H}id zeEXPo0kV$d<(V8%amHCobOj};^!W$v!7EVzDq}8KSJ(%dM}x7$aXjKK=tnIz142Q6 zoyDfZpuMN8vRwtOn6;LE;PP>vFm?l9SYC8Y1M`HCa|z#r*&J{t_C>HnJIgYbfTecv z>sJne(>JtXn?9i5x6TQ!4#cxg#)IC-c$-{cp8ICSNic#-r)4|~hM!B6)d#hU_uC;C zKppK96dD0yuPV)t13!x(u?o~iP9yg?Sej-1dfX1qZlTXK`wHZX-uI)Q0-ADE_5w=y zNJfMHK}CL{6|`-IOVf9OIIhN;8-r;=KuUBWh$8DiZv*sry({Oz)Lp$UHvzHyD7--# z>;9r>H`o_sH9OJ+T;8FVo7DhMS8Jc(Euhyeo0^*s+QY){(#ybov20+;*I>G3ALrc@ ztc$|8*Z2_BA00k{^MPRIh#Vk~O>zqG`<7fja@gPEJ*7LC*A&OyTn);a(gvx+!R3hl zw&Tx0iRm%xFp!P3NS6n+1%iWMeQ;w zK$}rqmRStc$3Y;7?WP9Sx52z3&=orYlrdg6{H=gSIIVzk&dLqIza}Ph28$(Nba8F3 z{0JNiGhRCM9C%!jnT<@~TBA&|Jq6lZ`NL8>gVM?Nlur{d4GL@;{RW61m8<4T;2}$8 z4}ibr7Wwy3m2>2@*sCl9b4GFZ`$s_iHTT1$&!Oajqekp`AkXY?Uk+wha8X<$P%OvG z4DiI{mpynDWWHy%%Nxu`f)Zn+L1}2);P)0#$PJPJC%5H+KeYRIM`R?gi6bCy>uub- zz+_84bnrBYW5)dQY2Z$&wYO(2P~NiK^eO|=hPT z&)wrISA+X(-nEpiAdZ-NS*C#Z6P_ytW>DfSBh4A$Op0_jRzaDl+ugyS^zwXFJ_nTK zvL3m6fZuZO-1PxIEqy%CA50UijeHsddG;3rkAZ&1@~&S?(0t^5Wgj@#lrJo~2C_Kd zR<%B0jB(r!pAW`5j))mx9aofg?X_0%O;<0f7l9t4 z7yW_L+*E!9Oa1Idmv4bQlKa@TiBK^oETGPQFnt}IAO9JMewGG~1;Ed8sI&q5_*L!% ziYTUtf8=oa-I3m1yaw!)Kj@!==kvl#56^({O~tyR3^3OX4UJC&wVtWA^*yl1CEq;k z0@u!%n~mCnzRPEL@P444d|DR&s}ZIEF=D>B4syABi}NvXPtGk*UINN0^I>ZuSX%gn zhv$L%Lq$J!@S z2luMN+v(*X^W1?IZ-b?ANZo{UAYQYM@)`o9$_26=e@xE(kL@Hz%n~O+27B^coxqcq zH|>4{V84u)rC=@yJ&>>wEZs}aX8r`GcZX4H@E@fE0hygvy!1L)*Y2DnL;=l|97BoM~)Vjak?dXDEZ zcx?IA?r#O2(G^bwn41I_Bou;ZVX1Fh4RV(LgBAn?Y1P~xgV9yn=KKMy1Jj$|XaO}m zxdqu@fVsr;q5K*=Mfpop-vryun50INz}zG3g<2L+hT9way#mT*TaoWVPzr2mK5aoH zn5FG$5F^A1wF2B@veR$B3vNfw)VsI98W7dJeqS)hhU`oT1e~;D8jvRE@Dku6nd3lB zv4X20>u6fj7`(CM5Rl&%9s%CtDH>=#O^qa6~&(dFdWZTs?8<#6Hj5voWTx#wIivvFn{v;G)UW>LzZH5WS z6Yfsv50(d(8s-v^J9!9TyjlK9;T>=Vr$4wd1&o8vGbP)=@I5 zsJ(pphlYT)VZ_IEW`VN8>xaOGfJF?$54bBQ0H9F@RORjhjHX6Y^5A6elatT>0Glpv z>bE`;{7?I8J|Dx=`j91k7DD8QUe9Q6gJ)d1xv(af^8B=jfnZ%3)}h8PP`T4+W%h;j zj`fQ+Wx=`C=W3lj0o_Bpo4drrfL8{*^7w~fzGY4|*9N&59{|2J{EQLcd9xrfH51&Q zWZJIBf%wGowATT!JRg3kc5Co_s=ul<0xp*vO*;)ne%ZTO!+{=RqB0mvNBxIJ>;ZGX zfMGF{KpEt<*Z);uo-#t60^DW}SAYWfC658$v0SEr`&svM+yv7-(>-EAX{WTqAGpii zN3LY!(R@{3^ai3tZ=M2eM}B(h8gRBuO})?@%&kM8PdE?OJ&|wKO9JBsqSRkO%h9fr z1(vp^2F6y9BeWTnZ-M@9`A>xvpx-U)maBl#yKGBA9WbW3E#;{ovQ0l(wt%|M(I&7f zs7-tlLVJO-(2*UO0m?$_e6P#EOr@D=I}j;WG7Gd$xv!>70_VK6q>D4aezL~IHU~j{ z!f$E#dY}o*WjK&7(@BGKBhI~awjXS)yW!Y|qhLN`x@Inh5fvi`KQ$B@Eok(5CgtXBjUynsY8Lu>%o%KLE_eZW{+d8_b6u)kWz*8VA= zo7kl807}@xn}CZvnE@1Yk^NQkJh^}-^GT&@A6^3J6p;z|;e`#9FO>yiHslP-&CP2C zzl3exzF`Oyo=pnh`yMz}*Ph%u5ceY974?I3xXxs_(GB=N9|Vp=y5;EeT6eDgSE}pHe1^a(wn6>OK%4Lb^Yu5*M%Vuhddne5IT14 z*tKI<5EY_ARQ&1E|I_%3@c6HVR_x4o)`r4>^!C|4kka7FE2*2|hLZGn-T}DP@wUSg z1z9I^CyVyr*-)BOFc>VOw5JMx1z`kqihl~^9lx*Ria@OASv?cf8QK@c+kh5&q^lli zDb6p;)_~_5*AaIL$U^IBzsn%r4mgpp5iE6NTpB@4z6p(zk-%jR5N1($fi1;{$R@Toe;hg)QjE|f}RFCC_W|u zrteCY-n$Q`bA=nPod8!-)b}0V1^I(zhhGH{%Q6WN%Nv{nIm~G2@ddqC@$*@qfSyqn zkoOX(&Ap3*CxFQI7U7dYG*e$T2Y}LAN#!tbQOpyA!PKGP!8H@8&*Z#&p(&I-u`C0H!MO}&*sJPlyNe zD9Y+;XEhV3${ld;QEC4cF;GHn z@g#`5#!62b*z2Xee)tZ!9f6<3Yf$l-wwiZ9|DkB}!}-AD$`9%jU|Q|xh*$xp7XB-u zUj(sNjWRzAq_RkMrb@V`@*lMK@2DbN^2HBIA5hvm>lN+=%j(+?c65T$SN*2Ny$MQ4 z_{qAjf_lQMSAY#DdK9qlB1IktbR2{NE`mjEppZ7a45W*J;(I`&7F_|KN1`n6%4owE zsOSE%q73vwInUhM1Ez~ba~`Y!-=8YZrJe`RM-ej{yaH6$I%`KkpH%9|?*;njo{#l+ zfro*=#xDiAJy0f8fE;W)<$o58w@l@>w!jQ!i)k28%F}!UMoGowqCD_4%Aa|^1*rL6 z?E>n6X?Vcn(E~u4Wf-1?U{6dvd*~Xt#zh`zxE1u-K5HUY0ME(gQUm-5z#r&LC%OP$ zIPd}Xi%7#=Mm(K?8phjN9=JE4%`;YL=jL& zek*%{n5^Zy{6Kx8WN6k2kc;jooj(jpNy&!1Pk|GP({>rOgZ9C}OF-WmWKGx);?+QB zwVJ?b>owm^pfoX#X_vs>Go{+09^jTy(`&yD+E>2A!hZtIr*Of;7|?E)bt*UvmX<*~ zs$BzRuvdY97LdgrR#KHKB=sNki+tn&3Sy9$4}5J{^+VukS1>&FNicFwZbnm zd>%M%XZ&>WA~-u&i*7s~^iuEFgQ9^t^2JAIvgO~TO5%YCdhsmi?^K*ESOT8B{FA8* z!StF>yO3F6D)fIgq7;bXN9A##ob⪻9uuN$`Y@NBcKS^GvyjsGjG`U^njA_e(i&u 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

    3cXh&22CWD_Xbzy-S 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¬lD{?K>2&9;-0bMpnhhhldhi#hTK>qaK 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%0Dd?BG+R{?iBVM#mx3&@19Q`t-tcdB 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

    =ef+nv*e0NvM~~X>8GAQ(O<#$=>JjBns=A7 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

    g6lbhI`N%Kdf zmOXN<@FxbZf1ELfS7C3Y4VpyC>o6(OBCCylRjx9arkkt=1Q5v6G=(zEB3(ZhBz%Qc z8#hzUftufJ^vKDE@C}Sk1Pi33>CWG_;fWZv3#|oKdI@3U3(6(G2zbVeg*R2BB1)3w zGb0uWe^I3?jbUDU(J&5t@w%`1B^ukzi~ zjiGjKC$e3jWS=hR1rDb#Mt`~uccE5>s>(22DU0&{H)Hb*eq$aA<4*%wi6qudokA9~ zCh(ekVI!pl@^U9=x(*A)LItHd*-FADd~7~3#r6bL*X&r;pc&jbtcbcWZH;i4K#$M3_N81U_$-G^ao_-!<>#^pMs(*!DY=>4n^=j>d5 zq&pbny>zh7tWG-?yFw=M;?%2C>4d)cPaw|$4;!5aO?-H0uphuOqsXoE4u*I>M`AB{o1 zcF0{b2m0IR{l41%lNFFXL7|g)tkv*cGN5-&_HRJ6c&`l{{)wS-JSP6y!oD~jo|al@ zgi%ws8}OGM);K?6%>y3!PhP>E#nz?i>7Yxk&A{1OtJpOTZ~KrqY|*Cox?V^&#&=^6nTxSQ*}MQlRizO33!BgA|E4Fj`IW_ z)VJnkzaDtJ^scLpLcTv>sl$?bHF9c>uJ(z2qKENp5G2K3UtJG9*ATdlU*m8iZ-|Bj zy4|dw{c`pHvmahZ*?B*I>9AZusMtnvuYblFh9YR8_9NZV{|9n7L;`z<4j#q+MB`aL zd{N$+sjhHaNCtf#KLmvL$%>l%`LnjRcBkhLyBR>2eano&!BTX~o&ht*My`Grf9DEp zy2`}sHWyRD7jpj~k!JN%JEOCuLy0wi5UZvgbAH+MWc0>%_j_5q{5j?nrKSnstIR*h zGlu)N9%C;<+@sf2*)q~jeNjNRrvkiNr4hfe<85+vneOZQvTX7d=38^s(J#%0D|}yd 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%0Du3cuT^9KOm$rO%y0{geRpkn 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 literal 0 HcmV?d00001 diff --git a/FOAS/images/animated.gif b/FOAS/images/animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f6cd8fd302e8388ca6d45917443d16599c84b91 GIT binary patch literal 841650 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 z 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

    |1hA?_eBN71qZBN=gtwV|pY>{%C^g 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 HQ=q+jX+y$^<;|9FrX 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

    rEEJ!sU&c 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

    A%KsC(+?|qB&d{12MH+hXfMr~l0zBE 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

    T{cJc&H>iI7VDdf45j@MS22vd@!7_KVsZ7$S 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 R_ZAd7 zvA))oVx}-+_Fa^L+{hm}ZSXS@V@sfYhD=Jjf)E6vtiKN{_MohjVhH$R7n4q7+grdU zi+KXki@r*;#m=lCh|ED{C$qzS&AF7oz zc&B3eO$4GF_yt#S6ogn(!ng3~P-xZ-`INiJ$x@^L8u>rU2=rgqlasZ3V{Z|6&05^` z#=hqbklhp{gw_$$enyw3H;L9yGScXUNg89Yr-F4p79O&Xqrx8QLM>TA_PSGq8E^*J zhL*qp%`#>stnzzwWBKs3z5uxop4I}-9Qx|{k5kR6Po2xD+?1S@#!_6V3rt5%6kN3| z(g5w2CMqqWN!VfhE~{XXtl;mIhreXqehEB&Dl70d4HJ1K0M{#Tdirbx(>@M@8pqHJ zMxmS=F?q5W$25$j*+Wse6s*}x&1pB(!IJ|AmHErQI=oT8i_Fn8=x;_lNAPHYvK*6S zv`Eg^(ZuG;)^k>{1gG#U#?UJ=-P=9%A; zoMZOVb4D*n7A0uI-Sk`~bqWR<9qw)k!F+#&s^rfx^>ee;%1#gZITUm-^z31QzuKC? zU3~ZSq=bI)$L?Q9&BJv2Sz|3w(8D=9yI;iruptL!ZXSr|cMHxp8cZHcfeTq}76y=y zO^{+Y1lA4&rss%i8S$F)@!*rSeG?4L>SF@h*w&slB@Zd~Gz9ES3o|{moSYwz@Pc(L=xVOU;p-=9rZh&nDlPF&cj* z%IVtnRfOyH*sV}sKD2CyzUt#g(hp4?%1w}p=9muoh+X-p?Tq;SP21tS7(Fjcl{3`3 z>L>3MX2DzDz7=uCE`YT0Qv=1+UQOb8RX+dR|7g-jw;*_FAZujS0^IYH44!tp<3o)n z-d#&o!pA?7OEvMshMz~t{1iYw$M9xgEUD6`(E178KhfVQ?uC&kQ`g#p6cj13AtOU~ zDC1RGidCL-ja1PxUZaxYuv*y*{FE0&@SR(#?l7pNQpvoWE%2y z7%rF^^lXd0}ywZ2Ay zVztojp|YC(zoouN8yIIG=Gn8|?_+lEm4{r(9a{_@xlc~;J8-#=l$Q$)V?(>F+?cj* z|I21e=vCBS%QqpFFtgYFyT91%oAt!^^{;tCa-sKgYgcz``T549;O|+RR~bw0BlkJ{ zuW>afO(gzNFxS0n`^9bwEQ*TFv(RgQP)EQVDq<281!z*M>;n9(mnfl)vI57+)lf;} zq5o>(1sZk(7y;MxfQ9^)dr0%e#8iuCKdRYdj?e-1@u3U(zZwHWPF=yPbIwrs`;Qm_ zP?LIZ*%hN=*51~aTx~zYKr3(1|LLd7wKr>{`Lu0ec#XBaK21s6sT?tR%&f9Dsnrng z+11|lFMxH^nn~W0>DhS4r`NUAB;BXe2%q0tiZ&Kt+n}V3QWlUy*xgnXy2{YD>s+ZX zakJ~?uTE}-YHHg;Ej%M=(dMi|o@w>&y!G3MKW}H6Mjt5&NO1RgSq{?Ybvy)hs5vq? zOI}mM+w(c_H%Fo9h~a>k%Ev$733s&K@-4X3J`H<0NS&1-N>Rd?E_H`I+f8_XgC1D| zcp_cR>GvNZo)te*`gts3vn#y@z(53@Te(C zqhCIM;`uW5;LBY0(#tP8Vn=YpHQ=|8Uv|HI{SN&cnutmH!nprs`QpLLW6Vd5UJzX# zBY=06HTV@8`491RmG5h)I_l#W>j_%kwQIcVqYg~$os5)?JVy3+tJkeIw0K=aR)H&0 zAZ*BnSJp$MF^Z2)!K)~gZRrN#R zjV_Cz2~pxcYtGuwn<#0U1#OjMw(K7w7e`7|GbY(H5B{yuQy3NTAV%VkyFoJ+UjUIR zCzbpQa(rv4515Q!OlVtO5L6dl1)YjheHG99uC_+m`1Ri^J>`Ja_NN^$hz@Wb`a-(9 zb59F@j-oKq<^5(|+eIP2oj>?38p=c8g`lIX@L3%xtsUBZ{o9wTw8Fb)mOCii4UlK~ zwz~XJN^MPvw8lvMd%%MfK{(#6uok4EC0wx_s>|<-fbr{O5#AIG#IRp?{yg-ia4@_8 zA?h3md$+=JxW0HaUD7T%%Z`ZWQh16+U?sImKIP&<>3#~+sRHS}zak}JkISY? z4GMK05T*q6vz1Gozl=0hnw6#U?s3zHOwKhpPN~d*ZT3P+oYzOPN9&U&-cXNBei?14 zeVCTAZJ>DGQn%Wci8WFD(CYD7hXhs1(WA80Z;obMfAaN1Tf^3;Jhd3!+ix4cPnF%R zv>JQcv^!U4H=1+1z4^bTR$eEJ=&N9#k$q7OfIwEfr`FVxM|?|l1n zcfR4t^2g5hUk59FF?@I4b)5g$o~nHK>0RfaUx(|Xxp%tW{rhwFV|V#eSJ%ain>m0@ z&BeTK{sly^Y{k2P+W^4Ba4%twgfMl?_wYivcVnp^`4X{g;n=mv7HzDmaHc#26(!cZ zz2;QZIHPId(&4xsC+~c@rmm!#u>KN9bDoZ);l^$x5(E`Y1njcQHj)iAzfWRyJ5gy| zMh@khX;*Jw=9(6B8xs>P)0|3D+z>=NBEf^52#9$6UifhW?Ui8|HMO4PR!(3uA==PQ zMm^d*{L`W@9b38y%*W7YMgbhj06G!sB&4GBUb<|GvGw{gWq8yuG~x0|SWwz%mWZ1pshB zMYRk-UR+ira#=*A3xLZ7SXa>No&ZcPaJUO=>t!Qbz{LxiWlsR$@}^t>pi7V|#v1Sn z2k1ft*U`9_>*`j}&@9tHKhwY#kbq?rO+O0#6(zE$th}tC&<6ls02t1Ac@L0)3xMP| zB#MF*Ij6ZcOn@C+BTNE;Ix0^?DwpL53Fq{=FU?@05KPk zn~Y5E0(9llH(mf@mjPWDfUa7Ngi^@GGGO@vu)GYoxVWsyiwc8-3xkVErwHZPW|3tw z^5P}#BG>w&)?v8-88?K>9=EQU_bl!AjF`4gFDH>mv9Ynq$;nw+Swv!PVPRoqWo2Vy zV|#mhZf@5Fk$91td(qXkoK`}-=!#!%j*nkXNM0hoTaIrUEiYfLZdxRUP>AWrmsjN$ z{L6iFdignaRT^GyIJLR)Oxfh=Y;Rvp7-|lj*gD@_b>Mk zf9_wHo|>9kzAXLy7yr{-Tr6L12g?V)mRBk3>+8F_yFY&XxVU`2|6Be)JpiEqw4mIC zy1brH2&>5d4?Mm^szq~a*B1>Z|G(gIBul%YWbC!P*UsnRhSL9qM;@KVvWY@MvdDvx z#`6D#$84RZikV9DhW~}fxmxSKXdd0>s)b8 zCKV+CdMUJd@*(Z-<$%4F=~Q=(%YM<$P}S*o1)Bqpe^B9IIz`xXgw*9v%VAT%2iWV} zAo{x_PICQEHLxhtGoCVDD*kf0uj(LpAIi6bYIlt==$Cc*dl+y%uxF1VVhC z)Q`&Z{}%>EMo>9`L;Od^$Y_8^x8p{l!SLC898HbcI0h~w*$rT-vawZlC#>M8KoBA> z)r{`M+Lz`59GFf`bh=cmYdQje9(cCA$3Q!QA;29J00?G@^&HND5pW6F0h0=_ydYb6 z2#`v~phz`CZv_XmQmNa(y5Jj+q;aBT*HXiq;nH`EJ)zzY#XT(wfiX@V9mpqq%n&aRvO=YEJ_^y^$tDD!mp5THmD z_F*+u>|jiuAG00;`K+kJJyD=Y$BlwxRJ#kwp8NpSXuT2~?zx!E#41nT_$YuK=74=V z6gVy*Tfr96x#z)v15Q=2)dvFWJfQy0YU0aO_$BN(#siu6l>$C}?@?K295GlAK8B7p zFS(ay{8)>nXSfbZXOOWU($&f_SYc+sh|SKxjs5WE%*Ye9Y1w~!VNRh{HGv12V$WL3 zgk*}M!BC~5JgVZmwAX55Y2^=zRMIra#@Nps7u_Wle3hC5w9WF@$)Kl8 z#2=TjHwFB%b7VKw)A?Ab1n{f4)xqUoHC7qOaJC)n(q!;>LT$A0Ui0}NbN9e;NUr}k zp$<@Qw5hF*sju{wOa?WSRcY$w&#dNrn)nai)WEP`$Lmc$pb|lESRqZb;WtAXZHRO9 zFH2$4N}-Mfubq3VMtdSGLcU*%u^iw+RO5!Q@$N22 zh5?WTh>%AxL%rGutE!o*I<&nNEF1Qiz)WT@!Y!d;{hQ~ZXofzjD!K9TAVAp))*S)> z?H|Uo?5tv^4|@&S^Oo6*e-xUycB{ z!wY{j^Yt)X9n_t$#&TC^Xd%n%6pL!3ICq0r0JO5^a6q*Z0YiKI>4IY~iLnDkm)zVy zqYeNK(@jYaObM`td1g&4vL4N542M1YQP>-m7i=#K(~dO0`JEvvFx-9=9^YHUue+tH zUy=(v@r)_tj^z5m3i#4=Eye3(8>63jJA{bNx>{Vs-Mb)_Yv}nJ8CT(^&k3Ny;lec; z9|m(5y@AWk^5u;dUC2|%|94FC4jY^gc zIJ4ti>PVAF=6flS0F{Vw@rXHeb<9fTdL;K6aVApPlqvBMWPZ=&UUZ~wecCQ$egzrv z+Nwy?!`$A^tUW<@Xtk*>l@e-kPj_i?M*u`U^wgEnfGD$g+R~j$@4B3)9^8v+=(%0v zIYnApkoeU$E-+e<#r0+9zM1G)=d4f5=$FcstHAcu?(Mg_UysoOAV?$;j9$4U=*@PZ zj=+Ii0f|TPco6mc9Nv3$nezKr7l5gbNUOI3;yUYw=+}|hKCI9vo%O)t>&QZSt8^A; zz3jY_K_0!tulsC|ZLG<7ZWeGDCIkjSk>Q#>RJ@<9=?k%B7LkR}+p!>+98sMab__*f zix}b!2tvK%k?(;XeK%eK;J3tTHHkJT2gy+UvqLBuU^^f$*~?he0p&e2ggUYhAl(fj zdHC&V6A42U{-HXUCb?&b&>WRC*S+BzqS{Y~3Jtv55lY6|z+Sh8#Pt1*;&SN)SRB4V zdd7y5k-!1SkvfbQwZVe$^U#WK&=cHTBH1gNx>`l@&u1lEIt8F^64g=lfmEsxbx0T% zhwA9qF)=$wIzqhg1)skO+1;NK0}kB&=LFcH+nA~YsR`wAZ;&CVF-T93AdLr=c)LFW z4s((j*T~F9`ViDmTmomq8I5SVQp`WeXgnJy zBjgUG?@GNxIJ=b;??N8Q&esv2Ohz4GT12(9bFYwjKWX zTSTxzesG`1Gx{TlfUIXw8ca^e;o7BL6V5eEl1hA#>aQGKd5ItEnO#LXOrOS|j^Ir= z_PaIv9Kr$-V0&tk<{5MKxnT>GTmHG+VFODCmqHgsFuS2}Y5jLo7uZT-htch;&~;nsAy4s+Mr7Wrr8kLNEg-Zum@%&LGxfO&*hH-r^{ z79-V{=HtGa+aMBS2OU|~2wc904vZ)=y(%Qe5!T@t^1|VTMS^b%%xBX)c2z!J%H!pm zH{=gPu&Tj8zf!QgHI0S!3sS<1O6iEd5PpXFgx_Z{*mq9*jQFauK&9uf+rNB;wrq8f zcA7t9Srt&s9EpW;C>x?TV`AjpX4nfsSbZx6YS2Rc;F;K*nRcv6lHdZIznoKO8}_6% zzUC|%d(|;+)>he?CPWaHkpR9vo6J&>tkecK@Z&5$^KhJtZU05CHGdSkVk`E|wp2DE z0|z}fOZ|yTz56PdB`KVdCFNicW>n@`XdPN(8k1p=?5Mz*cSv)p5qaL4Ch{h|kcDP@ z9+p&+O3RY);jshnz4U+2(`&*-mNhf@P;_@EwJ(=o-xUi#BMYcB@wr&v-;ow5amvK} zyq;zZU{{AZOA6%40CE>-sJi*)JTpraRGFj&*sf#m_A1?)QlSoko)%prP|>zJWum-X zLWDE0Hm~wL;$em~Yjdzq@}7QXPeUn^PiDS3%SDOYfIZQc5=`{LpC-%58);nQ2QVXf zo*(N&kND!&04LhH)oL9U3$vrc?=lnfO0GOR~l*}~Y$EXUSDuY?d(_Or$dX0pLJ_gr>(-?(| z&_D~gQMtn@W=`saW&C66L{Vn$HdW&AuNCANEq8S{3l1BhWBvL~W2Df|td+Ig) z5g!PYrN^NGSjp>Ez~=undYlZ)lPuwy%i{f=KkJbSOY~1!bO_l3Fi%O^(d0X{ivFhXRs&UThvHP@4$NK4jT$Pkt6k+T#N#+*ZAS=3> z7A18`CH~C2`ioKd?f~(=yc+O^{q-Bp_BY&1Z+I);cpFr|N)}D?!kfRqIqGErWLd<_DMpQ0<6 zMPQc(@3HXE?tysWfUZCa&6A^UKNuV-$Mx}k| z9p4JY^MhkVU{|tes=FyqFh24kw_z@Ku0YkV=>a__1Lhx$z|><15O;iH-#bGpz+eFET0`Gc z5J3M)7d*eKn9!flQvy@1WcH|JnxKjsqOz!aPO@&k5PU8vBD1CqYv<~*{Ls$Ioi_=7 z``n`BDq5!PxU+4obvF~XY_Naq!b<<8bhNXcoRTk%ko@*0n%>O$1AglAZM+(HMpCRja z;D9P^OrB2u@C3~=`Z}(mwM(t{Tm+`h+D}GcPTFpA{?>1{znQ+$*{j}k6jjZ14bXJ+= zIzz?qG4=w^rj#>AB~{SaklvB)4I=;P0fFMR!?G;I zA-W1aQxUU(LYUg^X}6&1fzOjV)s43VkY8-grB2G!cbukTXNDl$mj7TEyD-7uut`}u zEh5!inw_%bfE>=zS$x9KXC~nR%l)V9!U`-L|6uNmFuUDIFZm~abc+kx&?k&WB|(d< zV_cQuEU>bS?#N0IG`VK0K!_G15gwzA^DC-edO5aKM)|@OuFaAfSGPO|yY~Gll|s9t z$3L-CzlGdEeLIasnFWX8mWn6&4)U!D<=QHG`9nO~pze7=^( zK|3^j%Ng0#N|IP67HhJ1dExg^w_$cWnA;V=0|uOcNW-EK6QOF}1Rg>dFnTGpGV~ zef-N3mx_4vz0IG3TpOjExO>ahTupqkT65N&qU-*UbdPE#iclK_y-B>FVzYg>meZB1n| zUS(<0(dG{W3ftOb|Ea-n4{BXA8OL|%CvM)_=%Zz!tvv6H{`l?b$2KtdJJe(6*~C|r zL^u<0mTA>r-^@$ot!?g?NADJ?p0VdpZX-xRpQsK2gI@fgr+F4@0IR7FoBKJw(yIA& z!VGmZPmw@Sfyc>{eWpAmmh5*-NZ?Zd@GLQt1}JmhmMaO|ENaK9^zHo}dFV`pA|4)H zeR0H|d&Jpw#JzmPdvS#1J4W9+#@wMCr5#e+8602ff`}c`3UtxpB##3wT^jCCU8|$b zkOcb^p%OS~umP3YA?QZkj|^)n^@Baa&2jD8*OXWK>#h<9m?AJnis^yr(4+DfK6e&R;eK4GXxekIv*JNPn(JrOei48Z8&Z*>ox0F)7!|GMP{9X{?~R*e1_jpWM3Pb=qloa0t3bBrtkOe{jK zK@7XzojchUd5^Yk(amiy%U^wdeCy)m;l=5Ti?iH|pVxx=uJv8?^#D*hlT-j!O&$a_ zAOsW6puwXISeaCfz9Re%D2W@x#PA3Ux*&Bnx=FmEbSa3470%>B$cO?oPgOVb#?$*^ z?o)R9**AkIU{2$0g942>UX4uS?`870v)>CFD%y zduBnwH^CfBze7!a_K?l%DKK~*+1;S=>-tm~7j65cd6ijIVra^{U44@IKmXIn39+>A z?A<_l_pgmM06_2Hx!c}SsW@>=BuQLaTLkook(P#71u(d;6ZuYVf7Goj^RERzI#e&| zzsArti+H(gb;}xc);sD_8b$F9QR-J7lHZ_}yB)z|1L2D(c-~%tBfY>|)}nAja9d^d z?S6hYgq~}puH5y-Q0bAMt{b&dFTn@{q9J<&1O!;YK>(sk(f}f@aAr~YU&-BVI2ho& zq6VmEpm==P5dMA64GG@1^%{xJ6d92Cm*#|e6EmtMkc!eRQl2RUJr7rpULiKpU}MbrKp|DeSXbYFSgE14*egx)jE_}Q{EjAab^0F8AC@_yp75yKyho2l7>PfKd{ltyzA?aZQqlX$p^VK zrJ7Ud2(k;(jF6|cFLA;@0J53>R3M-b=Kv6hBo>xK!D3uD0Fp0}3zsh}@IK9K*~>U- zw?fB{(FDyr;f1PaugBZdAHVb4$SMtZ&lz`I6uTW6tq#ejiJDWw?T@5e1q|HDnrW33 zCMyrw>5bJVU21wsQwhqCIb{l3OG*RL-S%^G;@5F|_FM1H{f5wPL%H^pZL`;QCiaXV z62oy)sra_ZIBC>knc8j|DjB$monh5A^u(kX9(|BFmHs@wZvrXo(a_f7)S$T`ueN4y z5H8bi!xZ7A#v`KTPxzk@kPQL@w#CZNe^iYhZ}>0kQ0eoz`X_fu-bQP5pz@y0)l^$G z@n;h;tbfgF=O6B8l1pz zNpHOHOaq7EBq4>DkYoi`ihK~Lo|qRj1-S|65BMz<$=iKBN5+0jO~79@qIoJoSIQ0& zm(*EM^(HR2RTcgsydku|lIF!~&(*T2u0vz*f-AAxx{soJUeRf!T3bIdvV@LmIM-rt zW^5+xq+*PmwveHRT+G{Wnd6fK0!^fjaj~LFh3QO%*?_ZY(_543ijc~O)KAO@6iw^X zd{S;`?0&Ya&~yAIBRr+9(@uJOQ`V>-656^et9^wsZr=2${QD?BLJI{}?LI^%9Ht0p z9YMLVrr1A!tvQbUQesMGu$OUVhp^BEqmK8sLC6cB z%SAY}RXpJbO;$mXyeL{8%_${pKVD|U9&&e#DXd{Y!}UwjQsRh27_%xwf@Mo*E}FsR zvAa~(^KaYN=XW%k{WSU>9JbDLx%8CMMyWH$9z*X54zM~PLxI9E5t6MwZ61f z8^58QI{VBdnSP%4#w`BR@-XzgZREjHYUlW?gs;Q!FuO-E8* zMcrSSREvrx|H6jIUxN+1uNR-CzrS`>Ag#%=fc?3LrrEnvA~Y)nvvF1$&p7iyjdifo zv$RP)+WpKv#-1I08QVNWC1XBWFyn7wS#G&K z^RBR(Y_35nBf_>mf<(Mr=v7xEH%?92R}cRfS*|q%mk&sNd}8*P8u~&r+V%M^|4ljh z_OHqi`a3x)s(TiYMgeAlUkvHaFG27il@UR5od;6da!Z-^*Qc4BE4hQ!Eadlb{FBwG zg`(6}SBKMul=rh+aSy`qV;fI*o7_k*NrjX8x~O>TMMG}Xj5>-O*{}xL{pqk(U*ohi zXJt87D>j$$P^Z@KZOU6w%4TA_N$-t-dlcZyVDr@ktEA15`ti1Kth9d;@D7pcp&y(1=B_-{iOvwHFC-tw)b=q-`Z6Xh*j0*4{E@39Dj!wM)< zK`DEsNcpcYn7?=e!4RCNDK!2R|2miB!;MEEgA~LKD7!gqYb=Yf3nGiU?=V9*gQV^l z51;YABRG@QI|xqWs~%ATB(#VlpgE*~vJnHV=<^K{+&@&ZLMoI(P!h!85WU_&0(MKf zrkf)qBCNnkwjvRPDB}?!IH{m1gdW&8*DC~{3PptQgdCtji|_=ay1=o+4Nm|>-{?RS zRHi~S#CD=Z6Olhfd`0PFwWWZ$jxYj17=&sAG8Iy(il8?$zyX8`k9|X|IXV>yY`j8n zJqyH&$ZM?(B!l6L6lgNObh^b_bf$1jr9~S=(1I^@!wMF}3dZt7B&#F>ytAD#0sthn z@><3%I1*>nv}hYFhyKB_#xasfTPu z0aM2$M98dIJYXyYys8L*nKy^|yXsN)Qse5`^@t2!mrhrO3(OP)I)T$*bsu;)_B-I?AGCCLJO{F__EWa3!YP3PRWc zoxF;#^N7ZBx0)nL2h*-g@(W_(j(ux0z?#5nL$bWG2tkO-rN}nmXv?>ROZw`dy$qwe zv`f0gH9Rm!{)|k>=K?O^V6TppzA+?2C4iS~1dkzkq65q>24oc@c#n8%qt=qZ+uF0n z!ljPbgpc&UKIBYS^UTkTHN6BR(kxBqk%KmvfC*p&t!WVpYQCWKK;n3>bbC&u08GKe z3gtY@kP?EvI-KuF%z4X3s8a%&1gBWx0Y5;-?6agHL_NkzHNyPD4bw#v8$IBN%UFZL z(X38HI{>P3fVOD~>g0+qL(SzVF~7u(*EGna&_j<1#zC+?l1xL~+`87P7rzh!>M#QR zv@0Uiy)8I3tsAJ0I0EzptzPsER}2C(I8X$Y%PykO2BjMaU;{b81Wb^F1}K29nb74C zMA2;i&TZVtt!Nhu5~z(t{>*PYLwL!_f;Q*h8MNKIvmlM13wFEs^HyAk}o9J>^s8fq(*FlT&J$PG|&k zJjdSXOSdGBKnTp=5Kz1`&aQJZp{g#TDj~!13m(CgCX>1GBBs-zBuFsJJcPupKm#Gb z(pF^6=qktPlv0{{RdHj00)Wh&@I3kgPgZTtAka|X$R5e_4S0FH_G}Bs`m`V%$?^V~ z)CNlrBiw=___$M}L-Vr;Cz}`KRK%ov?Qyrk`ZGw#%{Hq>dwUYc83jNP*hZzyv6RNi z+=Oba2u9tCPk^#*O-T4cRa|5Qpj=hv!PtytnOKdA0}vqmf|QUA%KEZcw&a5{aMvnL zNMBW2thhRlFpp0#4~sBEQAh&!G}bMt(Zytyfl7iQs0e8!HN;CWa?CT@PZXcgFcYo0QOu<$OFhXtrcK&66RO$;FO!4z`QbHIX*byK-z{ik%tv9Augm_RZvDaViW=7Kpq!1 zC;$nv;NduAuZV)4th0-uR{wh z9m$>9f)Op{k&D@U$u1YL&1;^_M(qIuf+09Hi8;PjL`_;nhFCKw>BPNhc21F9UTH&_ z1P7QZ1_+k!R0>I5xbHQs{%dixQn9 zYAli&u+5;o&398c9y!jfzR?m%*_B0+4mPo|ChPv4>)M=F>9kfmERt)w?jX`e6n;MD z7kOpBP7V=eKac_(TuRGMjZb|=Mtj-qV?Br&U_2OPQ)=cJ6dr|CjEj|QiR4Vn;pl5D z-f4)np1p?Rr;RnU-YnBT?VyNDb;W6&cG$2TTb~x_5PoFkP=bX$!gw6$q=qE->sP+J z%8qco8elvTPT|R9JUKj)=bob+h*Q^uGR{tshaG7HRTNu&T8q?f+(2vYh8b~@YYeV0 z)=m`HHUslkjspMa6PaTkUaZ3V?~b@(ft;?GH5~4y5u<#4@7Ei!yGSG8H z34|oT^5vN0%&Z8St#mc-l${|q6TbliBGHK%?R_0Kc<0FA+Oe z6a?Q!vHlhY|1TuRqoKjV@Gy`f)Lz(w=JK;C<7{x3~Uv) zZ*1Sg9+0<@G%cvJ2rfOUQIB|cfe|~m&3o_5uwe8(=5<5&ig$NzrXuLHY_mPb-fEt<$KJ&^An(DuWLGH>^CJ(GBvSn8Iqa$`>d={}KI z|Ll(U_{9y%2ZtMyFL`};1eEXTZi$4TCMg)_;du zcNJ@>-ym8CgAove#8-T7slUb#g7U`w6X|;-xbiz+j=?$GyDt(z=yZh!I|3sNB?!&PjJa9{@nNd-+vT}dsy-&esD=tA<$OkUk*Oo z`;MSlJu?Dj2Z&LdZWJ12aFh}w2NxO_8F;C(ximF?w=jrc4krW*j{l>h!720#K(? zt!niu)~s5$a_#;KRjSvQp7`)dT83=Xuwg$1+94zmOSM;8Q&X67trya-4v0*sb~Lh{92ya7Zlt z_h8^n7)fH}QL-^YC52pK+`<72MHcE+BzUT$QRvB%(-RN z6jKS-B%Fg0N;n~f72*V;R%4Zw6j>Gq#g=n{K*r>AUJFxiht&%nS@B!wT2QlXy5`>s}olG|=k(Vb%Kna+O;LXU;k_*jf znL&w-BE)46ZBZR4Lp~(Lj|Oc5tTWLRO+46A!uC>d~HEpN}>c7Ba9zGQs_bM32G8$h1B;D8l7U&8AgCi zi%|`ZS=xgqEMoKtqN3qP(eTXx#AACqjVx(iVXlbgZ&CBz%y@2WdJAVcPwf#6_cEqJ$ateX3G> z+m0thbuCJF1jBdkqG}esyYZ_p&_N4L6Tie2SF2LD=1Z`_2VzMkTQ~?<6N|$d zA>I}@#5}GL%wjxV4^JNna(@(g{G$?$Vgg8`7=@h@Ve7TX&1J;=)UJY_f$O1Y(A-Vi(RTs599drArKg(@i=E!ZDIDI$|`H332wTd#!MN zHmTYT_=3LGd1q@AxgVgkgoBcp?_xqc2xSgpHk0`-B}TC0Li9(&D31QC2W`8~if$qb zPXuU*ureWQ09U;Wda*W!i%Jk~@A0U)eMlSuGDeH`Hd>1Yy|t3Bj&k?ac{4^o3d%_s>2EacfFGm1Zs z-;IIe27vLB_aTsFa+ z%ZZN=3f0#p0wJ|@LX<9!Gzfoq09Q--sSwAUA|#HvkS7&yb(RsA{ZgX49m&V1oO;O- zKXMYfC82dp;sL`-W4i{HZ>;ws*v-cIw=rVYveq4Cb+h7$&^AqtksX+5k^9-a;Q+Y; z!HapLSxZDV@vnrUi4kgc(^2@Pbi4g&Z%1JU#8&2>{)V(lCunz-y9dSCYMrZrsAUB^a?~`LWZakf;HZWG8mPA`>v@hOyManPRci7 z+VWVlVJHJlb2%XGhq5-vnF0dDI6U#jCg~>-Ukb((VODP6OcRSdM2J2WU^EAX8TVf5 z$iO9XT2<>52L{W}9&ECPxjZH-Q@PPVV>D4Lcd!G2b&OF{Fp_zIJG~HDp6%RQ#m1Vf zO)=|p22@f_1_{W6+}Wt<@v-nc13bb4?-RBDq{N`nfP*6#8iWk?n^ao`X-5+qSB(CI zSKacKN|Q07GJ){hw@6Cqy1&p^yPYhs#=Wzn29-Fg7QOs#ey zc=0cPtQ}&|rMQfUP6D$RUF>~(G`q=0<%T;-$zYnQmKM5$P}1yTc7 z8-ZB^iEU7oi4lU%*QWzDGf`z-x=XeDFh+RWQBOPQ1k2lc$d+JK6k%0cWbU9q1Vb{FwR6-ndbv0=%?_89dpadF@Fj_O` z%?LL*f*Ut6EKL(0WMc0Pq`$Pet5EASi%%A}pG~OtE!XN;`@iEj>Y{CNGz*$8Civ${SK_3%k zO%gzxr6?Vb*n}Y50QJ2L_x?rEAZQy#q|FV9ACPojO>`ek{73JoTw;CNLY!Uljf?zM zUcqG*bm5;6IN6rH2JZQv5njb5yuk!az#D*qD-{5~L6+=&Q}LOB5J(NpU|=)>9uG*( z7O;dTD2W83ffjCt!(baS?Fr;HP;1!)B&dkoM3E=#5l+D1qp%v*-Nbw~Ox0-z8d#pe zwbM(@lzL2s0v=x=MBGPxg8fNQ5cRuyOW86i;>3Jkbj^#}lKmj-*(R7poGT>-k<#_nqOk$jN zXiIrPrJN-Gfdsml;+2zLPcmg3* z3=RlYwB3Ls6;E2-Ks@1uTAk0HsMFW96b%9ex_ulTPQ*NtO;Cu!leF6=n880nl>MC5 z43(HXrUoP=Sq@mHHs&4v?Eoqff@z|rdK!cr6hH&4rpqm$;I*YB#?M+FL0q;JB>Z81 zhFLq&CU8mL0pdg|qFG}O%W`c(EhWrg0>wcN)IuQT9RkH|1qI33L}2ivb?iwYZiYq# z%TE3Z#Y*Bpc=n+GG2(-z=X#!IC?G%qNCJEY%_bDWjT|4%0D>eUQzY2W4fJQa*w1V} z=4QyGrU|2h{-;vbj}fRyG%DzcaiAaorC5DWnf&;Sh-K@s@Dp;js-_(2iWzze)Uq)sX(P=X$0DyPICR%CeA6u zdc^}2fCOB~6+uEEAk}>4z>Nwix)cIK;pczS<|d?zZ2qT-0#_28lNT~mS{a@r3F(ol z76SezAkLPcEks8==SN(pbH)!+0;6=GU^ErMLs>_~bm&k(;5n(*h$vvwCPa@;Z9pa# z)E=LkCh3I9X~a_E#700zno02iLLeMpurO34h^ci@U3u{Ur?^IJ!fbpE{({F^$`;_I z+X6zjIVle$fnCy$lVXb`WzEgv;s9|QXX3;(;ZGDHC36Y|Oge>9H6~ti4pb;c)4I?h2k!4}jN!SJX|)Gg`> z!8_JO82+c)+T!&A#peK3Or>Dg*+j_k7M30ar7Z0sJs{{b>60k!%I(P!L{SKKZu@iv z!LVhpkZxs}?&;>9>OufWO^7G>Tp%nd=%DRZe1hVc0S?UMW**gajG^oz(-xT6S(V>M zOwt*mLERE?UW(|+_26eP%OtsNRcrzda3Hw})Ipd5&u&I?T4=@otRZO(OY|Dz3A*k2 zD1rB$SPXqGDMo_$X6=-j@A=jo1Q>w&t}k#P+X5GVX+Ij+BE>$X`A$@7hRb1&u^x{J} zuF!r+2tS}%J*HwzoLdgY2~(x~`AHUr#U^B>+2V0W!SMbb6I&nasaa;C91!yShHl6% zF&6SLoPG!+FKG~O0o@7&1Tr8GNZ=78$AEZsMk)+k)m$0CDG%uoW>a4+P6Ot3@!2uGE-@Aow%B z81pfYC0A`1$OeKPOHB_PfoTjvB}dcd8lYLVEvFPhLG+v%P+gD0lkMiHO5UyEHM9YK zuoaHs&@C;I4rn{i0(1ZrPn+ z5R-IH3_=oIVToF_4~uROxWM$e>F^p`Mz{4=;Qk#X6v7~Q^bx>rNOKBpmNZj!bCcjF zZyG^yRdn$!piF{vac%QL4D?78LUH+S5bLdYaHdN7Z8^tK6MwQm6oMEcR~h$CC||a+ zgz}FhNerzuO#l@uKkupK@hkKN+Afs%2u}9KFZ!QwoGR894j7=7O7K|SUukE`f2uTCXs+{MU&{za`E#X zI>m~qmU@#$W}-ng-?H0QbgG>&aB0L%{=4Zf2|_QIS7T7PTo8=>>2P&(${>K{y(~9# zAK@SrfYh`TV_Y{&CwD`FY(jiD4~XAL-z&_H^vd5^>KUk?lC*XqX|{euV!z1kD3Tx z53yV`6gIaLr$D(?%qU84ynMeAdq2vfzhVSGN_jB~ruHWX3`Ug!H&^gNHyRfB*?P2nmv)Er665;c){84<164 zm_akB(58}`3JEf^CFe??MwSXHgb}GyB{iJ#cv*DhCP-+u2yqHFl1QXmjIcCK_xG4y3ux`ASDnn(Y*l)??OQ}c-$?la1)>&KDY3tsAOg38&xUuFrtL( z;)O^DDLJxJvl6KZ8E)Dn$gj?xLXd2cYSeSaPml}-5`6>*jvhG%7911_677u=YbRH} zoOyHS&!JxwRA3MqL1@4tG2)tKkIgUv(L|k56hzfYw`@rwL@Y}lHI$$ML`kywsyDZ1 zRdTa4{>bxy&`Qgv`1(vX%Zytu?i1^ejZoln?@k8@v;)z)wCgh@iB5 z+sw3s#*1ztByl4Irz4K&p|>7fdT9_rC_(5U#4jl4o5iL}&GZ&IW~BDL&Se@GUZqMl6+~%K(GOlOC26#3vLzJ5azxB@^Vvy(p4V3DOAu zl8U)cR%`7Do=OvrlJS_uZOI&Zix!ZB3W?H8Dh+i$2s3M{q|xpc~Evk0Z?7bH)v!}O{Bwh)t{5GgIBUZ;eRP1d(4V=1;0 z%iAQ0o_K)CBE5V9YtzGS$dM``WHn6X6enVNxz!+pxHcKF(yEY*Ez=0IfJ@`c=EXL- zEi^+{DpDrGQZriIfO~R@sFtHc(&&TYeOK$Px$b(+tVdpLsr*=i&tgF{LJB6t+}n>| zv`JE}(;g~TwxOX#yp*L^FZyIp-_T%sqAeh!lm~Ae^4q5*;D)FWVlU#MR2BXo($zUZ zQd-bCq?)?%Wmsj@Nh{eJR}M)f72Zq`NH+bXkU_58smN`+T^DSxanD`%-9ftDR7mn< zF<>6IAjDydY`zca0gI=aqaQaJBrK=)E2}owx5yc+wEyNo^J0@=iC2v*Puy>@gc#o< zG$hC9Fp4ODDE;R?Id+TE7ZcWV=kp4kN4uru71)U;Y2P^wL_iU}&=}!aED6rk%H%uV zO^|{W)ZHcu@H+M6q&lb4r!!)6N#Tg3c-WuY{CpWYyJ+;Dw7%2;m>FO z8&HqTq#7k*312T+-KLsF5PP}jfkfeA?<^QcInGgQZu-f7%&;g*5eg?A5?D}@5JJ2p z?_Yq>TieVa$X;#2Q3{KX;6|pNu~?5m4no7TcnC@Vyhkl;X(10aGKd;fRK+iRD&w{SHKErXZ9BcmL6N+~x;Iipf^>A| zGoiT{Q8aT(NJ+|4IC!YifJKit0}WG*fR(lZ$Y4jA7aBU~p;@}cCb8U#zrezhimk9P z>*NUgSgDXEI~=z%B7BqNrP$}_`K-+^KY6r#)!J*g^9{_&3Ytzj<72tzt%aI8}Z zJEaCR0~C!)dXj^D35O>5qh>Twno^ZsqyXnZPoX+=FAp+|5X4z#MewGY`#g$lJhD_b z7h^Ou1cGdu*+ND|*pTx?2xvl3P^mbD21j}_Vsbeo4{o{Ch1 zHl=7N0KSZX1o_0|Z4|MqTdZjl?Bry4PZ=0xyV}KTGR2R+c~5M*IW#;SwFU~)3R&nf z+BL={GRq_ss%p@|*G7ggNq|vFl*j{3Vq~8a3B^VJn6f4c>0~o!HKpgs!nLwbz1fEkIR7)3QS36~Nekyysgm%ee7Z`d+xlO#MU zC8Mc~PwuD$Ingz=NmXiQBLvRjl?^Cza^onHhZIWam%M(84+T|Vzb9s;#|XEb<$}& z<<>&?6TUqJiz^A}&jh3u8VSm~T}1K;=gQqQZCTd!w)b-iQGi9GI6leN<+<|&h&2uf z4TPYC3@If&Owlcn-KEO(c(A>ZbPRJnCFHF9{LXld2_t2eRGoSc@3lWJy5CRD~VVl65 zwB222A3~5iuOQx0#5CVbEvdR-O3w8?S#8527WP?5$&!t$S`u+?kplEsg zpmYo`AOUhX0`(|D>>y$P(&TY&1Vg54$dYC8V6Xqc2{As9Ah@Z>hEB9dZM--O5D-uS zp)l|u0VO=pG61XwuuNZu0tqLCS*&RZBSc)-!wBq;Ck)F7(*wiSOS&ZN0SAFjB4kNY zLM4DtU(UurbjqdprTp)|LN6tN;aVGvS6+PbFwOs}76uEIQv?q&lMS53nD zQ0sbc0i3D@x= z20hC$`WP z_b?CjaTLVNmu@6qIPw*B%5nM;8UaM>mLkElF3bAu75$JSX|WmuPyq8KHoh@#8U-yn zsBQ?cZ^DOhNFpeyA_?e5ebglqSHkx0sw%3ZDU~eVa*pTnuq>aDD@Aj$=#6kpPEAOV z3ANE0hovH0(=tdBz_>&+a!VuSq(Ve-`0gqxz+ycPMRm4-l9r=mHl%Ry!ZFiE5SU9c z(WKmdAQQcUHS+2N1UzoG)HqgQ3}j9M0}pfETc?3-^eKUXvDBd?)VKmfDp>2 zuKwW`134*0Ib}&*hNULeB*N~FAZp4*XEOm7zFECX*UrIQm2 z4L$^{c!(ntZ^Ac3MmgkDM3hri;Lk-kEj)S2CXiq~s;mwP;sOm)HFSqS4fI7 zDLBgnNqfyNe6Ys~Lms10P5Tf#q;Wfl@J$^OFL$)ba&r_*$4kLX(OcMRPuk-$EJGH-x6Q_-%}bi`WC zQ1Mb5L-is7%n2#ASaIhK9KZkyU|BPDUDCAH=HzL5bW!n0PMnb@bd$?SP(jo(<_n>XPrAiDJEG zDmAtm&6Nx%v>*}oW=Hd5Lw0I8qGbCigVsx56Lx~Mc3%sD66k{&{dF&U(^3RBW@~Xf z>;)TJvt`v*33?CBtn+DQ&1iMUR?$We4Pxu4R8$|5AOIwf9yM#ZQ);R9a9Jv`#Pnxf zws9TzaT_;LS+*r6mu*${axrppy@MKC>u=F^X5~aET5)h86>4G4ZgXb{TJBEtun*-F zFKaVchsAAo@gHaQ2xY<`%hD{FLt9~YJn1tH+TBW7ERaf9_DOA;F$7j2D@Og}XV3{d_izJzq0S8FH2aHDsA zBSOB?r4#6vE2p<>>L3Po5b*Rhd5>2*1vY)n_x}Q|aVuARErVF|_krghhCSNw|bf_=Hh7g;jWkJ6IA}_=RD3ghfCGT%d+)SPw!t z6k>RXdANr!coQ%I6m%F9Jb{CYIEX=kh1Gz9DHwvCcqAm)aSC97$?|>4^NG7`f4Rm2 zs`n(}5oGZuRpl3pr#6Z!N8e)haVr;dE4OhEcq#N`PREvC#gmNVbH3_;i%${(BB<$$%)jwKmi?f%!B$Wwrix5Rd|VbRuQQMPSq zcclIiCe&ketN1N3!gqa6i?t>MEPx4c(USLY6ZZ=&%vX&k7jpx0fwK{Ef%Sk7m=+BYJ`CT-?0yrR+`zgOFBpBUvmml&rYZ-TuS9#(0nOMlKpgEe2b($UGpK(-Y3)Pk> zYHjJ+Nvu^3&zYXQES=k>4l=+3Fko05nM#Y1Y2$*(rX=XedBn8tkN&R`M(^P zq)9psl$D8>6%JY&pjk*0{m&kMf+=tMnR41kQe(ovqNf%n2{53iEx>;*qbMO7O0)N0 zWl@;Z)^c~*Cj=s#VzyLgHlKGFl^epPof>fg`*4fKAQa3gROdsv=Bv%AofL*{6s4Td znu|$N21SY!! z+}Y~d%dp3c2sfIc0|A(JH@ez&SNYKXu)~mEq%o;iGnZGQsgXOr8N`n024Xt%NOMaF;fL5PH*RuktB@`yZ7#4o8)_PRzm?SeLE*a^V}sN&LQ2^QcU%AtkhU zh!)|TTA*s+E>s!)pbW;It~p$}z}wFZG-SUr?WbORm+q|T5WAz(Y(@2NN?=D+22w$s z_LTF`FlM(j2AE$5Id?Hg%OU>#W9QE=v;)_oMa)^Jv{%DkzBoE;oQk~1G7F=?Eg%FM zs50P@ky=ny#_dcH0TB%05G?Pt6dSYhWQUGmTl8`MzWmBF_bIR>k|BM|!|2_dvI13& zjOjB8M15kL1I9XiId~kcGXcgdBYkL0RT4?3Z4E21APc}93)W9NYS?8`vwvs!|9n`AqBrMC=up(0JR2Q@IFB+nuC>tYw^>D3P^n+R^9F3 z%2Lv8z-j~&L;(R9fC2tM5|jc@ZD0Y|9^4ne4VG>b9?)!kuh2ZpzL$Ask(zC`8VPU} zry4^iww>}i#X}2!@KJI2m!szi;qVk)^6kyoPBS^QxDaq4+Qs#UZs4pZI|LTO6ExO9 zNbKO(V%&y?{#p89005u`03iKK000O81-4)b7@!GKKMS5f0cIf1U^Wy5^dhcWfC%R& z0b-QEfdmT*+_dEek0b^g4*UcN5D$e)&kw3OBdb=7 z9}y-IqR_||GhCetLZhTc))xf;xOKZAMTZnlwlqnRC9mGRR-mNV!UfTxL!6ox+@yqu zAdj00ZQ;QK5Xiuyh#p#2XEo-{hs&3cP-x$ z0i_vf%N8Xk_vsyRngL6~$000AW^ zfERdKT#?rWR}AT67Ur2W;VAK~*P22?R1{qytD)6HeL`$uk(7rOB1jT9S(yYHTSOw` zM+{boW}0fQ`PrFliWVPOnJxCFftwhCVN4pP1c-8=y;xL3C0am-L4_cfl@fobN1ve4!$R4%h}I1Xbcd)8ReYBM1%poY#CKdUhW;#6TQHU6 zC=ew98Bwoopf1L)8?*3<^mC z^H5?cwfL`k4q>1MuZTs`$Za(fJl>?TxRLTzhl;^VS4%wjk=z)CW<~_bru3&-wDMY~odr^dvT-PXp2xw@Q z2~o)eG#eUSX(gTzghZN1#*U10WUH*FJ%dup!`Q?%_k4&%lu$AUilu`nxq(sCD3a_E zN102}oF|%u9L3z=k_{o+EI%Rw72LoDCm`gdkW&HxG+{4LP^6E zzSd+Wo=(9X4}5}`Ru1pe>#w!8srnM>P-zQxXR{4CX19PA+%0nlV(wGByXfj z90$@T{7j^0%fbmrG(iRAxBy24P=E=R=9WZiYA;xj4niQLQi6d3bvksH3&LWMiH7K4Cr-<^WP6bzU69(hyo;LP zX+i>e^qoT>#FChV6nRO4&Mh24A;Mfqercpzju2P41a9DfvDP-o4vuKaY#t>zh?40x zB&t7&1cXC!!r^G(AnWYNCQ_uL{*K~Mxoi<245^hQv|)V{cuR}bs+S)i009S31bC{j zkmZz*zqBNYtH2_J`=Z2EVNurt3yfr-9{$)-Lg;}K6kNAfLRnakRf&WR!V{q2V6Pw< zROIed;(~~xvs*=u{zd_|zRlOO?t9)qFo6jKFn|Gac!MVpL7psd0Tcz{#3Ayc1^Irr zXhJ3lUegukl2GP3id}M&A3ZlmheV7z;YyDisFVf+ZzonZ$%=jwkr^#Eilk9iHf#gLb2}nwNGsc8$-eFC zwgA&CekeqjrW-;dtmx{-1X(7@@NlZ^VIc?stA=zn5mBrn<*MdI#wL|GN5Lq|aZgF( zI(AozDB`=$&S11ANwb#?@L&D={k9B_c{n#TgQY#}-(4pqL?4I}heQ>4*ULkrw_mX@sCWksnRj1Mc zZFj`)#;FqFduDYD9R4u=MRa_C=Gz0Iiy}8UR>`@H$aAq5-zcE>yz{k4A*GnyfkV+e zl`l+^x(nn6URR05OERbwjDA`j!T9ZOkb4s)j8T)MZMRn+we(EO>kbo6g<`g)gaPYx_ zE8!eQK!B=oF2Cj(G_imEr-C2>3U4q0YcL5%h9)kud=4~#K*wbwp?!l;12MrfCqW{^ z(E%V=5DQpQnE_E$XLU?~0mD%!&9QY(kr=*r810cKDt7}SXh36^e1EfYc(a0G7#nb4 z00m%%1u#SdvL^oJ^BxaGG=t+dUFZas5H;Zh956K&pa@Jv z6wxL*U_*rogG?(?PE!_1l!u5OQbcr;f@1hn5WogNF$o250C8{>4^RLTpoVH9Ah{8M z4rD%db6p1*5*pYNPA6)E(t%fThof)EBi1j)!O*H#kR7j#MSa3aBX zQ(<{V=n#p41ZWV1gQ5X?06p_Xgc}DVD?xmaXd#&)GUarILG_FU`DP7ph6k{T(&dQ- zp#}x8kiGLOA6EX0bmJ^hhJ89n67Eqi5U`>A)5Zh z8`!yp&?bjCnVR+_3TtqNW{3bp7n^V(X0?fI=Sc-{CZF?3pY>^<_lckRsh^RM1Vf;o z{|TT0Dxd>;pEaNdpg^Drs-O!xp9adHl0cx8-~tSKpA(v(mv9FaprISu1r{oxlpq92 zfC-t933ng@BCr7!Z~+_2q8qvacYq0?fS~e82}R%nL*NGi`Uo{J186{@m|zK=5D7f$ z2Qo^bK^h4}kOM^kXGZ#?`1uGnS_G5;XP$7M4|$&AIi8|~2@G(C3@{07P=*B%3L!B8 z{t(%ow)vJ`gA-NqIm_f?ue2VHQImN_*WRuC-&8EbhE zfN*Axm;;E4H6!;KmQj|Qx24XwldV|*5>TcCk(Uh+5^pey1<{F~x~573He#6|qToW! z(_toK2EF+ab?20z39B99l_4+`8=(oAKnHZN0Tz%mf-0yf`4E;-l^$_o!lauGaVWJq z5rBEr!7HyAF;M- zs{tAi0(4*pnm`k!J7n|sw;}f!lzS%zYkb296M-wZkcJ5eS(oftiW~kokZE!!g6T1W z;I$ybrlTV6(eFL44}U8MDj1X*Uyqz;tZ# zVc!^KQx!7Bxw5Z_cPkN`Be9Fht9u&ItIit~xskMY)gB~E61l;L$2u8W8V}d^+y93;R4CF!w ztRTPXH!52!?VEiMyuK3nJ0cOkBO2(LpgnF&r{} z=rM&5#Qp3M=zF~S3?If-G(52`oA3#cFbL+O5OZe~9~RJ=`M5FhC>k6a5k1pLHeiIQ z$fPk8X+t-eanq$C#)>(dc_-E)BM4QZ6XLd2kRcXdt!R%C)5$r#hT$A5{drsc$_IAQ zM~oUuF`6HPugqe(Q7ID0c@jrJ)T$vLgg^;v{cd_a#4X_oJRk%p%+d{oAX@F$!nI_d z;3aCpZF2)|RL0mHQFp6d5dA%RZLk&5S`nP_s|*sWwS!CcPue}Ev^Y_h<0641+C-XcLWckL@g#sher&!|1f;*1!Lbsh-;+iwEl5q?iJ z2RJ#<(8&|xAJgA#a>X5!Y-BPut|m~e*dQSYKTYK!lffC? zomhTbiLuMRLNrNW?@7|8Jf1|w~j@ZIA-l3 z>&jSz!eY%Cp6WIt5(Fa?;{AWC6IW1#ZzoPW&JG$bA}8cROVw`e8YG^CY2pSl+rAze zp+1<&9a%3+=d<_NMN1T>Z2l6>L1>(P5=jH(2~rc~R1wcy?^_D7$CU2{!oi3Q?4;q# zM0d7?b3dNfy$R4g@Xre(JCDwSV?w_7Xu6VHbEcU44& z-`kL%nh@T)Rv#0m{u(S(ULnG65JYG0DZ%-(&L~;`O^_1Xk_TXF0yz9-uHMV~aB1Yy z2m7f0WD|MIO)vHWf&1s7`M~yCSaKP`pYRqjaxsouE;)l|aT$&u6LO#YezWH_aReD; z=?U@tb@B;Eu=qxi`@=pN0B;h#PKhXw(J~GYMsDy(GRojVgb5Wc9JQ&C86G^0Y#Akr z;YExYH5#<|sn8Z718Z!Fw9zES0w-0jWZBZ?OPDcb&ZJq>=FN*Kaqj#ys0R-vg?66Y zlmzIep+i3jp_sI$5TPnDoh-y7sVG7`qT2ifa^OTrHj554)3jz$B?Grawdi!^CP7|# z078S*Z9<*?clGY&+t=@3z%TO#X1Qrg#I=Msp*c#pun<9xO)4>Ka;ix|O5AQ@I`fkm zAvl26z4-~vKr~xv8jh%>pyY%W7ehp?`tM-axpnX6-Fql*-wS0UL9N*67Q4X{e(GV{ zHyR-;FK^6zcT*2EE>T*(y9<9n`AOB z6PfcqL`4_NH1kZq-f+Nx0@^gGfI*NDQHik3gv*Gz zlIv>|{=$T96CU*J?FK&&noc9g`VzzlMjJIk2q7ja$tjBjLF|*7MDYX-BXmfjP`(WN zi78BZlkKC>lDH2|R$Fy-C_9vj1J8x&~g=W=rkjET+OHx>4j~(Ekr|+w@u&zq=p-?`xdW&GuC+HQU21+ zh)lSY5U2+w00A|(Pbld@ME~@95U7*=LZb&ka{~lH%TBss2h6EUb{sDmDU;spS(I zsG=QQ6iDBy%KXn8+Fr=tixwUCLA558$+R!|{Z9!Il@@y^hs>b(a5M;^L@>vL7rr;h z7gC}|B?wXYq@F}R{N4E$!&8aQlX{snh$rF=S-3T-u2pNPm5FY(s`tw<{)&Mj>Cd>n z?C;^0h+TYm`s@E~{*K!$zyK78*uxJ@1W0QaX}EKP=y1e#0-kCLKv#B2rmSoBtSR>8pcqE zJB*+RXE1{;m=J{%^aKSXQ3Myb(1SeGAt;VG1Q+Z84LKCx5Sf@lO86lOHArF&(2xWV zZi0tY(4YS7cSbbAWCCkkV;mMzyf+@?6X_9IYi>8kMLkbGUD1;1&T<+h`0;#{(M=(Y za1zupgnDJtR9XslFvJMbK@Yh>4o1Q>#cTl(I6%!7mIoeh8G%OrX(VMSH^L_UP2i3A zQ&IDbfP)->ttB4e4nc0G7ulqR2j;tyQGTYIqTEd}Z_`L37qToCX$W*6N>8Fap4GKJu8oEt4A z95bqtbiR^gVQc3gUa70W?PfbWs^><+gPetJL70HyUNKD~x9F|M2m!^2rVf**9!27( z3#z7d1R>3eEeIzOBZPNuAfkPJjH6SfD!9%$%gh`h2Z#Qn9;h55GSL_TY%N`C9ti@8 zqLK$9i!>TzB(nv4Zp4@gsfy+X>PhkxB1;m%P^b)(me$oLE?dN=Ok>iZh^dD=Ur~Y? z6jxQqmU0phplq8c3xP>&4Mc?)gc8=dp{^3;s3#R`;(+-PBP0!)~dG$_6L}CUsK*Dt_(P(6?tFbtg zv5aoa2~Qx=*^`FWBy<#M$$YySLBtM|V)>C7VtW%y%`{2G#K>F`q6FLS#x!_ZZcB<1 z8Xy%{CKD2b-uNmM0UH;hH#l5wXX1&E7!D|AF#c^#s(W1wpYg)8{4Q8^WQ!SFFv|gOq9uH>lu^>6yD2r2I|H0 z=FUV$aCLn?!l@nU8rSQ7mAZLyr#XcgAt5^)iT8vA5z8B-hY4g~M6m@;-^HK(@?OA` z1R&iOW}y0Jrj}=o5xT9+2o5HXAkf_(QR@X)0zovz-OX;0o9W|8@rXKMnP@CS;zu8j z=jSN?x|tE#Ezs#p4X&(^8IJr+I75DQtPP?7$s_5I3gJA7P_OFq=Iw}EtV<PgdpbtG`V$scJR%w232gN;+xnt;$u7C}OO%A2y%#1f z4#TV90nXrHEq=U&K=%#As^q)iic_3y4dy0)+(;pxDUQXw=DklmgnXhWojrnxNCvji z2S!suB`x}0-{G(dt}i{4bj3sMvddX#;1|icv~gFZyBoET5GCu83kOR&bh5bgF@xMf zz=q(PDA|Hvvz|eaCih7K37kAgfIuD)4WJ;J@#wzq8$sBpnnfc&&%>`j^Npwrudd6F z&N>`HKr6Rsi>^35>?!`THM5SiaSI`suG7hgPw+o(x&fGSiK@V{o$x8t2*8`z4ukqJ zm-qw-JRF%TD{1OLzA86?sX)(yr4M{TsUkr#WR(jOKSKCI&>FUC(GS}3wJC8!5lMpd zvx!I`4uVR!xA+l2*gc{kK&Rjqg2RYGz!}*xLOrC4h{z5H%m`8Gfj$(xx)Cv=o1B>$ z2<%Y1Mij#1Iw^*dKc%y{)PkkUsYL23LsS&Gyh_9JBN@RlHqz@XL=%L#JBWzcf+K)D zQ?#D_Ac$JDC)Z-U&PWQ}dp1HeI1tH_dP+jWE3%=Y!7IT<(RewPNEx}1CApE)#W?{*U|JMJOFw!$kvjB@^@zRr*#takJ%a$0W+adO z3qlFmxtoYKpEHT7=)s#%xrHi7@)#(k@x4nt5g=SDzIm#-h^}o4KcS+X!!d(-bO{kO zN0Ho#khDcQYQ@k4CY5V6BN&8V9EIjVvX3k>wDFLa5CrUaNtjrQ7n_M6%sq?HFi`8Dl{lWn@XoB$&uX3nb1nA{H|7vJV?;VB#A+J z%!uvy2{ceU#`~P3)QIrt$CvN~K*R}wG{%c~B$|k}x4ekOxR*^_h{bR_vCu2EfJLs+ ztB6n<{-g*@hL|I|&_Xo0xrXQo&^R2d+zYSdO3rMF&Gbw1Ge7)d!xkf(9*~*>*__CG z%2D_np#&-Z!X3(R%!MdMoC7GD_>tQgOp2gQTYQ${n~B_soq#eriwdmLFb$~_vGvKw zikiN{VoSadKS&4!Nchao%uZW@jT2OY&_F#x7|Rmd78fKj*#Iwzm_V+8C@=|{A7MnX zsLQh;LPPO1Kb$w9UrZaV~NEHQ5-f3tS7<6wFBA zn=cd*(7R6U%+SEV&UWgsuuPr^B`27?lZtUa)uSDtn8}|b%)-Evi6oC;tcfFdQG=NN zG5S;q4Y{*DjM0X~ljh7Zn7p_zT8XYm9|%!Vu7N8d&;dtNF6nH%C@G5&U5;-wgCl4~ zR}`G(;ZP0j(u3gAovgs}%K^|M&Apf-vy>&l+(0}jnEPaiyi2df_&JgxOOVRLnougd z6ijD>O(C$;gg6bkJc*T>i;VQWq3TN&Q>f8+Q-K++uv$xjp_^C2OeB3BFT_&Hu+HuD zQcraYFg3K${5(3DHY#k>8H^lRY{{JnkAC|tgcMFZoe5IoKa5ZvBs9XL^Mpoo)Pu;9 zoP4mMVvCJfIx9p>-;<{JgO>?0j1yCf%$zeZ?ZD3)N6-9JZ2b*1X`b&i(NO-8#T0!^ zlhT!?GKyCPsUPVp5Ftt!wbj%?MvY($v4I3coC$;x1lnATIXoGmaTs3>KV|*EPcjUP z8jVYRiACd^u(Vd02-R%mOot`84MfQmoKC%hr7MKVaaGelnp2f1gwy=jQK$-$9R(aX z5BmZHc)bW-HN=z1QCf|N^Wqfjn8yi0H!G2rp~<+#V71FR*r3s?@|%+_09tigCUKuO9}ibyyyf@qsloeMx6FLQk_)(E~^?NgUX6o6z13|xswsMkBy497f3t`*F? zy0pG4i<*c!(SRW7n48RUT~#l`}$QRXU4$P5m?o*jdU$ExCx0 z6qoS?zQF;gidIk^T-^mptf@RT^j5t!sj0KKs)by&N|;MC4P_$_FN)dBO$Z^7PK=;A zB8?Q8u#{nZiH~p?z!glop;ko&HeA%Q@2EU(vE8{y++x+nzAYK`ZP?w7UzI3a!st$l zmEO`oPvd3Xja}Qw$r5VJ2ule%-<#E-@ml*zGidW#h`RyWQxL@1L~A)hIAz^}En2)` zzer`vrE?#K#fgOVPV?iNNGRE^lwTA++WJ|vG=wFkd0$5~{wdU`8U1LqQU#HE^eTia zG6jAK&>e*Yh9{C;31vjsXYpUz7%0*xuJE{lBM4vDgENa694t8u(Fg>L#GR^KSloS_ z6#inWDW#JnRT>r58&g*~%9UO0Pnl(&SZxVH=mD9i0eiEr(m|(xL?=j@%hM17pf!xc z)Cf%(s5LeT0{za(R57{`4I#+exYfoK41_7Q3Hk-&tE=Q8K|yzcVR5Ch#syd$$UoWR z&*hkz`}{YTWeK>w&5O8Egz)2&5Cy(`iH1RgtJSl?wB_zC<=TXl7={eIObl#F1MOM8@;U<_<_Jw7Z}CEiJ8J%RvfkV24JNlnBeJ6uS7 zS~KKlOZI0MX<88pgj;5wLbO_e0fZhvf;YvIWpc!7(@#iXU_7pwxw6fK@XkN{=6Mq_ zmxzR)AZ6K@ryNwc*=wjxLD4RT36}2ac7tg!mT5c545-rQdFvJD*bW@9$H$Op*JB%( zz^|96srqCHToo8R`9plw&%@~G$27`~FlhdStsEYu!nA-yf_}hOEM$!#Yq8ES$UYNj zP96~6tE+}dp5_6U)`-I(<%3`h{{@s=GG~OCtGrGKT|J3UR>W{#iJ?O$1M}YpjHr1F zvf|*1KrlH-1ni8N?8vq*;NDg$3}{G1>rp6OR-L!c0fd{jMQui>iE9aCX$jyGXNBN2 zg%B&1Xl<@(w3soCig`=%PMF=Ay1O~my}{optj<>aSq%$r6drC@8Dp?{ZWx>=x2Com zE)0+L%QrTO>1GM-KJAMr@Pkllj1YpAeaxXAueyN>N2IdgH00za zCHj`{sS0s%@m;9GZ@weuhN8lV82)XekV|~@Z58WbgLJl}b~bcgh#IH?mY5kGRS+W- zB!pp*q*IT*p%=s^3r;R>3(aD2B5@JFnoEF#HF^V3(1=JVfHDp_Xzpx~T9jb&ZxEwA|y5WoXws;=)kzQV|8LP=XxLX-wUuYDIC! zf$}KVm`PxOGGY@o$cQXQf*lY7BuD~6*m7KJT7f=`)Dk99QG(}YjedL(QyZ@wZ)HKL zXkv=Cmwj!6RKoGf$GFCU%+3glz{PD-7!8MYyy0y?!1QoJ^h6JsI4}SSkb_IOgf=*U z0$2m7LPJ7G0!gQIO9yr*{?l}~_Py9V2vIPN(Jj_SJKcuxj+IdGjEJ#>P<4br_ltNVmN zfU4DKv=z@1drt@r@uM7RaD}J=j)&gPQFnvD+;%r=scx#_3+U<8= zMK;b(2xL1~Q^)51#Xtg;*pILb?=;pW3`^@q7Qgo)_bD1*YA8;xr=NN_Z@Y~!_u7PdfEXnZ z4UR1W4(xqq zmMj6{1IQ9If4HJet9C8hwr<~Eom2z}4I-4_X4O-JMiH!$Y|PN}*3XP0oh*UUN(o3` zwv=l4X-jEFR!M4W3>mVP5)49Z2}f4ziO`H1ceg$&QaG{WA}@-Z##G7mj6GLF!JQ2R z24B3se*+Jmw$dM&NPLVfyXP!dHB+Z9jV^sU_3GBIV@Eh)`}Q~wMLjSeL8VXZqDFa& zL?{VOAxQ{D$}WFt#2!j04HaahN5_MMco@;rCOjAfQV%7iq#sK+^d}G|C<$_dASj7q zME-#Z@~{#b2bx6Cg(-ca1P_29BnS^9Ht5nOfQYowd@maH2_b>dWK$AoP~wSD<-ypa zk3Rw#WOW8S2bDt)6cE8mJi_>ijO^J6pO8~}6cG+bAPCfkTbw6QeI%~5VnrVfn4(FW z7?I^k3?cO3Nt+~L=0jTup^_*WsWc#$9~Hub5ORW~L=P9PI1!jYg*eioR5JQWPVM2O z6H-hvTB)U%VtQSdT_OZQk}OgBBTVbrgajI!aGGh8f%MSBAVPhzVU`0fiV~b3I%FcC z4=Jb;mTeZb34J%2qRt4Zq|$}D{;jy< zl3VUaqIe2HOW_LnBoaahfd(PwV)w})N4OXi8U!W;2oKhRh(;17ZP7!X&7#!9ga^4P zRE5fVWQ4IO6$}ZV1g2_Ih!i2T1rA04?2?tP(rX<|G})TI8cL`nNS!I6v1r3VZ87ml#j0e)(;kTku}9M` zx^E9d|Ag&EA@f|+Xeg_^a&|4J9k<+bvjm4!4?vK&-j|#Nx25hzxij5C4brO7EB&Vg zz@Gq!_D4Y7COc#nS9-n;KH+dUPLQ%TbI%cHUf?|ZucekLLK(tc7zBfgXb#}r}|xhFz+ zeURn}T0QkoLcEGnpSvD}?7|OO-#tRp@*ud!Jgm>siiSJhyhENi%66p8|A=?`8z2Ga zCcv9T!hcBsU;!m3C_v~)WYk;M^=!2TGh7UP0vXV;!Y34DrNk4-qF4_AD2hnfM zeje!)u!3R)DSCu*D8bt6GD0?u2?1e+Xw?^;HLV_Ki-$5|TN3_qm?mfVNfD_U;`bMM>o<7m8;w)H;}eEZoZ*?$?T7S zx)M(;G;N-s5xlTTxB8^femzJUAyZPOhiq>Up4?y~_x_0>d#VHn?i+xqG|7Wp(2*>Gq)7lFgpsmzl4`Be zeyjxv0L67fk$o8{cY2eI4)CXYovkXFsk%9!NQsWGch8Bvl;FHQDM zS4?Ix2U${&^lB6+y;^0{H>{6fjhWRwi08mG{=MRAjGBXUlsI22T*V?)wzOTZ58>ts zPdI`Px+Mc|3p+p|%Imx(E1cq3@*lD#_e{Rz)grsvJpP( z&OVXlUsXy z10K%_2e5^iL1F1TPhdH)gT=CzAHrq+FJs!LND1>_2diS=;mjr*CYNf@IXf@$@=V+t zq@YQ~3EA zAYn$fV2>JXm%*gGfw*?2LUe>MB^RpE%WAHMEClchq@}TT2w4d>WUne2*G5R1h^}29 zc9zUhXzty#lbz)qJv-pFy$*cM;At~(HE!A70TL3MZ)|ZpxzCE;7Unr1uffwKO4!r7 z5z^dc;UM7xq4Tof&FW{u3vq?Ub|CgmS1el@%ia_?&Epttlob5KMy>Rd3GuE`XR2_k zUD4*={J61|`y(jq(3m=o)#v^?gnS?IEHfKi2$c#X5}E`NzRQtl=Dvv|uSs9ki=G^NhlLOE_(Y-5yosB_oyO%~hXZKWj{A@_M{-mFILPEs>3M z`X~lWPp{#Cc@`S!f2=iHkVMt=EoXSKT?T1tU)k*7(meBh$N8Y-yxPn@p3mczW=3I4 zq_&zM;{@pm+ix)UQ?zq00gsYd6Zos?O!tskbdVzq`F&d-m!m{2_L3dD?7M3||23T{ z6n~hqDW95AR8y%L$^L0fOWl}9d{4(zmM~e;tT~+^RM&Eq4%A7K#!ZY7)Yt~ulIT^6 zzB!ulA)f#W$@BGJ3SI{aZrWc3pcxF{&7gs((ch_|ME40qyYLMipix_(HTJ=au*JG-ITPP%8=j` z#$Xi=;w!2O{v#BC7%)O3@XUK5+oZMP-?ZEUWeO>E;3zDOjai~PK^+376~ts##}S@` zRTkf|A9g*>C)~g(N*2;#O8u##xg1~R@j=NHA}oqyOLRg3;6WIS02qXU7}z2>{Z-}d zVx#PoFJ4N0+@OpJ#1@2ASDg+e7|fjPqXW7j#Z=aU9fS@FL?KMlofym2t<({GTQ=?# z5`f^PKw8YjBc_DoIC5lE97HEDf*7D97|>!Pbi&JonZXfOMarXlTpx^J%RO4mQ1SCR~p7&H->1ZOdKnx)?B-Uxn5d>q8tcS{QTaa`k8T{MJbV4KG zfh>0ZerxLjpOj^sMlqVYL`q`@HlrJ@-ANKBr@X+a{_oDSh_LdadS%OunP!Fob<$$Fhyq|`r$kO@kObJ* zYz{(}9D;lTEvY6O7Q%Cw7$SH;zl1E+~!y+?#r;QJ|ol2C1;ssf@}8A;8N^Qin{@&i;V##2`SC zttDihf#MK?0-}y#Sq&kpHOLb^gy(bwte%9Q3duxPs&)9MvSsRYDkrC&-KRq9P=uqL zGN`IRTIKPgdmL+0$duRls!U-KLdvQ|4CSD0!KvWtL9kG|9wh1b*+a0&mU;=X0*SF& z$|HOpRf>zICMO=8a0bUDwUurMfym~br#bgZ6f{S-aW*T^~tRY#Dc-0Lug{&HV7zk z2tIy9)y~H!{2Y~NEgzgIjJPZqq@&l)$JmB#=1J~Ji0augEFb7%m>%hT4C)3U-6#%H z3FT!Ot(t1$?OirV-xAq8QJ~SLp=1pi;bw>7c5aVATD~f-rSPjdLhk-eu7S$I8*B#~ zOhU75%W+cY?*hrS>T8hbo5L=JLgb->#BImKlR(q}uIws=Q7PdGo)vW8)ahWB zs>u>5!3R4;g=PmdA;AG3h4U^fn&N>NJgyGw5DV|9DBv&Oh%L_mFbXfG<~}cC{&01u zZ(11y(LSo7=?)Q(Tw+}pUNWib=HonR-6udTcO5Zyw4C%#ha2zil=LnhfFl|2sHez5 zfu_wGv*VP&*N0&$?zWt&#t1eZEt_3$9j03z-vIvF+z75lNYj=G>ENZ*DJ5WvU+vxm znYu3-bn%S7?0~||3QKZOF+c&t8ZaZp%>t1v^Bu{IUCe?kAXH?S3-bxo;!)NS8cj7^jUf2Xi-F!ps;+8v9Ns;4Cfv zD=r5?8SL_WNT?RO1ehMJFXjy2y=+y)Fii&=T5k63#-++200FrQ#Fb+6S}n}$ z{!eFmn*tsgG#p@({$um)UjMG+9eR`>x8U_udS>{Wn54fKU406}P2 zMG|NRR`>xBScNBC1r5Z8RSbb(T!jmqMh#H5RZzkUP=a3QHDB8`SIG4e1P5-oMP2{F z3bb`-pEf91!Weu(S?9r9vvzH-g>&RDRi_|#bcadEfdLpm>UzXfTZbrg0!St^E)#I= zBK37VDR~Y;DHBWHi%F|;QNut)C$BoTSq$2#~HMAkLWXXf&u30 z4{_^u?+g!BoP=|%fhGG;nkM%~{hF(+3h{?-l23K+lJMPo{el5PZjX?}&m*$3X#%2R^4#nm(>NFZXqzsv-*o z?J5K%=v_;ZuB$nO3nbkbZcQr-L@|w`usDuUM+YJ70Dn@)wK@U`D+Rx1rOk~vSF%9? zOaOkbI1ZDfG8>}icCvFv^O7I3Z8A=lm_dQi;ddXz45Y{)%u_?-G?8hdu>SEV6sD9B z#k+tqQC#bn&&LzQ{%T`I5&mQq=jyp=Lrh(j5o6 znzW%speMVnPb%kN{V;_7gqzi#i;PUj$2zNbFGuyj5xNz|fdNFo8o&V?L;#Vb_@Xn^ zdXK77e;9{PhlD!$O%)ee5%Iecu@F%3O=d}ZhO@50a)Ssf(MlE-FGWV9x=^@p85Fxw zGEMrf&I*IKp6=>QJ;CfSbhgl#apRB*>P;=^ma#3<0TU zNd}L?__nUc6#^x&t~uNLN1*Dq15GZ^dr|PKjXD&$m-{whycaJomnX$VlEK6S1*$fD zGUY&Vu_l@z#E#|Qg(yL-6v2n|AVOXj!YBx|Q|(3n#F=47w|_fP0QzJK)y8LhDiJ-S zGy)j6_cHVF&%6Evsycm21hGTV32vs()8HA=5TO!aP+o>}NdP&JkK7Z_`$>gno!r? z!rZ`ZSunv94YnVJw%>g-X9tTfJ$q?B<~PvqZ~pRThnGKWQX_>-sY#za3)!S>OKG}5 z_(4fceUOJbR-H~NGrpH_;!-^PlCwH?aK6xYneYRDYy})jTRg#O?&O~n@*f4zjxHnw z7|V~snf~keK~MtqXTOGSj?Dvv5=b{j6*PDRkU@nD88%!<2#G_96CLsi!iQo;jRia5 z836{*Mv)^)mNa>?z)6)WS+;cf5@t-9GilZwmC|NTohv(u0oiHiC`V*4+T4UB(##`+ z76MZ8sfWQrMhZ?XxQWL?N(2jTQDRWg*Mds6h$6(b;8G(@6+((CGf707p30DU6tv^V zMnU=ZZHUuvV8Me47dE^T@L|O=JO141i4W1aNC?SvyYN$1BZaPJ9fj2(+JcyFY$}KZ zjX@)V4D#Ttgmu*$g>W$J0ST_$nih-d%!>!;V&Nx`sd2;0&i!XOBv9XxFIz36Q z{<%p=(wIkZE94I7h-%KGTo){@5L5Y4utS?RZ{GcSCG!^!3Li7B%|~R)c-q+r3@{jZ zj=;YPJP^SI6>O=w1)pn7KY781k=NIY9FwNW-JNWIZUTrW03J{+Wm zQ3er>hfQwyWTD&e(@iGG$Z*6rJOT{KK>`~LlE@;BL~h6s)QItlr6R>=tL6<5oMGf*a{1*ujngCkQ+Fx@4lDvqlvd3KN?U;<&x|Z z&_D%^>CZtGYx2ptBD-s*K)!@YiG&o&P6$as8wHI=%Nzw0vPc|{y|Gy1AvXE`lwixC z9>#O&&K&E)u%@0IGt{_3X}uNKTnn;QSHTbkvZnnggej0DV2b1|g8(sN3#!QEtdO^a zD3wz)#w5?Z7+Yfv#!YajvLFrZ#1W=PF3PDBCxPwtFkabx7hVP3jW?)Y6(s}Kmpnlt z5SX}AXpmf-tu!{_6k-suQq7Vji14(_CRx{|cd&Uu9+_mt zL@v3eMx30Erbo&cwxxahbxB;+JnSx#M`y#-4D{xFxS%PeA}CZ5IYf07Lh8(zT$ku7 zqhpUgM!Bz(slFO(nyk(mCPu&zBea7S^<2uYzTNC^JUwlLNpOsoQW z6tCLE)}Y$XGbo2uSIT)NbIEq;H?9NQTJgpmXYTR98k<_*$ntFoyR%n9NTJMr9wlxN z!?c)F&}1A7)g-ov)1dh(R>&!rBH2N6m(1XpCXd1hJMx?u?;ZHwe-FN-$#=syrkvG2 z=`w|2`_NiUzmj+~(>-$-bU~oZvy;3)1k8f^IwEv$2x>qxhhmj2i;CX1R$2l=$Y3i=R; zjniNd8{#9%fzNVQLJCWor==bMLQ)U=1ZY|qK-UPOMbu;1!?Fd5z!~I9Eg>9C$^bRS zsEdd{Oye3!HbgcW#CS4EqU;`}k}GNM2Fp4KCAhf4x{0U|Y|j>ikjS|do zx<78g3|pMxs8|yT9K7xzNGk~rZAS)~{F0q3ac4v+ikOPF#A`=930)3H5}~OC5OuuL z4z4AmO{fl#e+&y0@y56Fc!gpHfrKJYGRBsaF(&Eyd!-tA`)ETK_Z2b;wyI zTiJPFvM5{;cCcH!y)O}7Au6&9lYj+ppN4`4$}*68g;MWX~wOJY-%(506y z@zDe=d)eOp)-RX^W?N(C*p+-jmnHGUhmaLI78=2Nf0U6D2r)=)C81wV!5%{8T07;I zA-62)q!@q;x$>UZCc*_KJe_7-mDrXfN6?P9N?Vl}X|+45eb}@-g*R;};RvEp(@7Q! zz95)$CA&p$M%26Dv^IFSi2`3|M}h{%l7yus0)%Hka~>h&mqcu+;W<+<>uMvVwBlfT-EPort5wfY+ z3zx)!W7TYyC9-8cuhY-(^wDNXQXMdF1i9YT2ni{{tnw)#39Ct=3)eH7^Jwe8Mj#z7 zNwVURc%sGPmGGY#5@=Eb)6|*Fs60g}5>ICYJ68$ZqX3FhE)sbQmVVDw)6}*SI+-F+ z{&c8ULS^2bdRNF+cBz-`kQ=vTC=0B!NZwWu9H<*GEYd_i z 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 z zg+vbDog$L(^PS>&#l4*pvcC9kX_}4iZds<+^WE~?u)W=i!Wi+r%F<`PdsUU?&-b3c zXc_g!0;n?xAPWG1LDzx+01p5K0MI2SMs@)*us|2;aUC?E>e{t(YU(v8 zd>M*ZL;`ClXg>w?F0s2#Z{(V6D6B0#1il5O5&tAbz1CP3qM!UAQ zYqn0yLBXpRkHTu5V-0^}J-)g;-gj}O*!j*_v#;R+d;w5EMv}XLt_oPiIS_vibgcnh zwR+?=VC@`OTLUiU{`?$y{@i^3%<{Zjy-zK^MSP8jJWsM+%fX%(1g%xNoYx`~hOv2* zE;S2575za^W?eF>2n0fWe0*wZYHn^W9$!#WQc_)A-PF|7-rinN&~=W-pBEIIcXh2j zE61OAC9bt3Ca#fFKj1sp5}U`Ws@AF+7x9r4e8%C$T?NJe3hGa~y3V@_&d>4Z=NIR$ z^EJ}vs=48U^LH1Q1#drht?qaAP`bv>dV71v#>V>l*ZN16`xj?tW@gqdT7Uof|8(c) zYZu%8+WxP#4a(Nm)|W3|j*gDbFJAHgwEy=Az$kzroDWx5*b@a~761R0M4ebZ!-mq4 zR8h<4P9y)1BpNoBPvj^E?=6osR=oSaB+;m;a;gNED*k^_zDBQOqWv@LqZrf~7aa(fmF0AJr6<0Asujte4A^h8lMroCfIFFYm#(Aq@1;2*}&Uf|3aw?Z?c(}tny z?eICMUs1S9O3?R6;n<=c zq#!{+E7qhOi@hf)Ked4>oE!uA5apu&!w(U{iqAzN-+T?E$5YKb=WKXL)f5Sj@YRtL zfM|cXz(5CKF2JzVC!>MYbyiP?4k3r|iIxum6`4ny@pSaTpv()j{;;t@zWF+W9wRyT zp2h0EwjC4lSZ7x8-`8lLs24R4_p>F#S}R55OJgB$)zU)n?j?Te`G&+VUlM4p)L!I2 z13h3_D6%PjnVYGn{JB88{s2vjvK$d~=L`Ob3A?7Ez2=(QctWyp}MgpHxKUp3B| z$QVv>u@BRaC&{(3VqaU%hM2ks4kHU9K8bXIdSh+ejBLVXKg(xQi?OQCB>l{7DS{@B zhfu?#e;sZ$AHgp_s%M2Y&&8-mwz}fy>5?iCvZ_(uxZpkejmg=@7op7C#6!74#v~$^ z^*PNQ3d3zY;)!y<0mBGzhZMyJ;$Ti`gPQ$=6M4Z)|8~YZ=k>K4;$cz&y-m z3dU)QjF_sQMWN~Yz>><7laGK(q*wq90Db?F$h?OVoBN?{!DSK$U7XulD$IwUB(u>% z0HmNSt;(_~%873n!)O@$pB__UQ0dlR`Z=wrCNk3OSn&74PfQ4 zPd)co*&caGi_linM#qJ^8^Zh#TL>JUe-egV{8D7i{J`qK=QGx*K zO~eyLI~L%jDh@+)`0kwhYYIaLiZ-=Hjs}MWjnK}>4$KI#MhE3iEwLWVWsXFL9hLMx zEqv@DMm8i_UDQX*eHi00#*)%oDro#!%e1_J>NqH_gpb5~#0so5Ur7r-78NqhzINea z%H=5A=IdRQDYzb#gG_jS*OUhj*2Tu?Gu(X4@1m)6+ZZr<=uZ0)7i;ceqUK~x;$2q3 z9&H>)QM>lFAjnUd=Pu_j9eYn>@OstE5LSfueEMj!c=q6RkPukhs%+E_zA@pfAveso zjek#43u8?7ge`ovwvUZ>Yk2krwy-JvB*(c_KgiC*-L@TJGQQDVmq&?mv^V~+w5JDx z4&U)-a>2_loxJK!r}N(^)O|dNYV5gI6Es8kuz2}b+oaG~aW3!5o`bE##GAR$S7R&H z>xxwEdEGm&jaLuRdLTHt8-iJ{1y{~>T&%GketwXAkm3e{F3f9(jIB|A|LOu5>+m!t z>mc6KZkTBufpdHvs(RXkNUS4@m~7BGp7wI_OFs&n#;<eBIE*uAPr(H9f$LuUWfZ2sZl{Lq)UPxG$|JjWz1+DS)bH1jB9zCve>;H9;ww& zD;D+8vLlKp8i~m5j*RQ0r{xRS1RQ@HAcJzFh)Ajd*ck+YM0v2V-48TKY%~%6_<`VY z)yCg>Sa2bijKQE#>LennAwEj$BI!Ct8jtGe*t51hL;ApiwTqWOiMTt=NWurM{ksqB z(QePwfuckT`L>A{KpWTyl?W^nEY+UPrp49I1Db&AtQU?aV@a5YFT5;7`dLRQ3U$`# zCtw_&A<(6-RL$v@`5y-qcHtg74ZJ8k?KTiO9LeG!h0uYZSW9rd92${eZ9b}L z8ZA&0Gs|Ig;e$oxE#-kg^fBj0t<7;onYRo!p@!p5uhQTbF+43zNPo|ET`gsBV*&+6CUia%bS0_`TC zy8?ArN|`K7aj4-0GEXBHjYNiO+&MN@oAW9I%na7Y-ryC(ZP~w{M_s?SOT70`G>i|92{;q8X??fk0j%jy`ri$V{D# zYW=K^P( zlc6$PKGfcL{tP@07iJLjkiN%np9W7o^)SiS`@NSp=m2a#>^6DN-C5K>J_ErxkNC5(h;Sx4BqPxp++$;^})L#xw32k-@j>s85t&XRpLV z7LufU@r-RrOw7qO*JJh;Vn=BbOfv3W4hy_u*-vPm&1HRGU4gu|7?5&EDh6lIZ?g~2<@}S^fJ-n z2DFMhzAc$>#jIzg%(MY6H=`?)Zdb89G~{t3Co-UX9NQvv&tkkzlEW7N3*YsvJiHSP zXDN{u%7f5=*B!In4D2>7|4c#4%Pw06WmgzlXu2Ch@mi32s3ph<3}pLD1AhahD(`2r zZX+#&WTIq+I*#PNSt7Dr%zhK(1IalR+_FQ$nNd$!GPrqmV9Z{~#|$zlv{X;tQ}kht zHg{@bQY+oS_0QPcS?onTG!3H!t&e3v0M&G$$bK5)d`gtbyx`~JRoy6Ef4oSIA#EDM zK<~Y3I~+Ywu4&~~zzAIX&B}igD%b##A6G%F5dfBT;f(|FV0_`vrvmBC&)(UyOr3FK zcM*B>h-hg%?RAL#ue)m9@Tj^V{dHd-q-SLi8MVZGlx1>1U7vU?6=H*E15qgn(G-fA zwEG~y2;fyp7L|(w%{l;bD+QxuUR7y!wjs_@$ezWt>kxqHYHk#Z!%g~X zMM&REc5vpZ&xoW!guyyVWZwJfGf#VEn4Es7VgRrW2NtM+qR@N_bszvi1CNam=UJ7A z0|A3QY3JYBF0Y|RJZ07H>T8?8o9#-*1A(C}nbC`Su;RHW9e5zJ9Fi;vr$W>275R#@ zD2;NDpCTRsvGgeT_l0ola)^GNTgMVOO*FJxmNumuTo6WsBEJ}Y{bGFS#oOO6CV5^? z_|h;Qnr0#jG}1KB#YEQ#@|rB>d9g2PP%M~{WW_|J) zsQ#nVf~j)A$)8DTg%G33;;XIVN#6CSKP>^guTZKD7QV+A)L zfOrG)6RRGW3jM6F(Y^SlbqLa`>1vjavM`7WVo@6erYZR$yKaOi{&D4sgf@WBhoqO= z@zxE>6k~WIg_km+MQ)`(itD{I41a_q4a2orA@Sk}PKj3?AKLF4zaoEWg0WaNZRu+o z(IVZXcI(lHMS%LF*y@-c(*}?_${!lC2H!B@;it?+ z`=bc`I2=4cJGrm(Iv5yg&%c_B5P>wGNHG77i`U`fzC+90{2S4_hfsHEajd%+70_}n zd{0JPe#;Qi&fDWK-p(pnIL-Dt+^?JiE#G$drtPrxOEzN7P4hfU<=hp}B?@S#4PK@% zmx(Xaj1#j@tyF%|7fu+Yl>U&V&AzZ~WtKeXD$61E1@qYrA zzfD^_)HB!L^jb9^K7Gk_Sn|lEa|HdG@B%TvXZzRa_0wf$y{}w4b6u1#%{RZq2;YOa zanze;K-I7wMcI-`hgS{)JskE7V=-gBCZmc9i11A(Ni{_1ZIi|q z2pKhaAX#uIS3ZJO_DW+JOiTIbLoSJLqMVNJy(F{YUxdpJ;u_5}>aQVj`gdOHztESy zx}(N?FE=X|EJY8Yl-B3UhZBH1E>{8(RJ#XlZ`^^x29cLKIJnD|v3SIv@pq?1=zH{& zdrk=IM^ZFW2o^y==@Qk65OD1|!j^7|OJ+Lu;90_Q3VmcA{ZyDK=YwX);J|yn$)ik6}Np*g3x4`y{$gmmpiRL(WEJaTye9LfmG@3 z`AnL;AA#}N{X?98L5TcDOqX}7tdqi2{M_QeM6Wr(M!n|Jl~QM@&m`&8joM z=Vs2UoPZxJ&9=CeOoGM3ic`5ljm#fStXz91wUpKENSt5&PsT%no0*+~8Ao2Bm+_j* z0MC1QON~}5B0^{H&9x@1?p~v10-R~`WAEuR`$3m!>-(7^TaxU8OY6eJM&Jlu$aPy7 zozLo}&JO|_qEKm?wt>~wo-Q_&Pu~I}@HYbGoss^pKgGQJR(lXg#-H!|GJnm7q5yz! zxJ4hi{$Rsnj(&0BE5d?;Se8QkYnjr*!fO6(hrno6NLyAlTdEYXS5+T>3iEFN`l#ho zO=0X@TFJN<_be_(|83ZPa^evDiuA`|s#f)$9isimcm^7NMcS~-@0*ip2Dq3Okg2RvN|d}{~%=LblEL$u~0<|gG(_`gHZ z0(emX{3Ze_R&WqM3Br>PAN~M~yra<}A1DCehh(^R9Zl8`Q2GxVMI=Pp1&l3#E0K?1 zBo3X?HZ}e&*!B4S>CjZi2+LA3=^5>m@!R&-EaDdZbDro=uHx?-N&~N=_u!cMo zABWii?)eD@K zlA#^6_otQGC+@(!Km6%D|I;n-w^#FTzrf%5xu4PxO26k0f~d{uDfP(WxYK;EGrA(B zw|X_mw1r9d?$kp7O1ZgD{rS1pH+I(*MA0UqXLIgzon#GUt&Q5@Q(Y-OVIsjj@ZR}p z!TIm5^S^87l-hHkK62ji0H82mW-igYS$Q4>Zx&)0~@XVoCPALSSnB#oj?x^t6m@eev6LwS6l-yUv zMuPw)l}o^IHUbN-Qv);oTX8%M*c?a@Fvt&1vtAp?(^UFS(k*FtMCQ=8NHb?7L7hjr!>#gM9;TeVro}!7hZ-!aTYP*W%2{mgi!?HH^46L|D zd5Ku$JPd=F(Isrw1)GsE1os848!1xw$gqj@dFQ*-CvOYzdFvSX?-02K)+CEGi@ROa zO3SIQ*QlVVuoST;w;~ndD7X0pviPMO$Yl>Po!)n`e6_Ma}2r?#iXz7 z8qMj|xr?pDmgH|tiE9UQj0>YQ}E3g6|c`u z&)U4A`=_xrDz#%Mm}mrFI4O?iVTF~&o5u-!qN!3>)v;c=!r-jJbFYZGvU6<= z4voEL0dt3FD9RUAJ33aHsytS2L{dRr?o2G_m$ZrG><_B$*Y3^z@!Xw#Z!f0RaMbiN zG7aXjDwe_LJ@P0RSJGkfc0F!ik3kk|djtM{9DrxuI09w{)x^>in7wtxmC?8#f)@M; zBtf~f7}?Y82<{GsYbXK0)XO{ggnvtRsY--HT^08#|E&lw|35Jr5xY4#&ij1#oc37d zUKkstAQP7^qxe7@em5T+sGkSgeH-mZ{FLmPYM!vt_j$Y~=5oh3Lo{EJ28Kg&Gle`>6Ma@L7 zMB3lIZgooQQVnF`EI^;`m+5+n50#B>hocSfentYLKX7G8Dx66OT5O>gEMi)vRwBwG z9eCj|f4mV!P4XPloQ#7jWlx%fosCK@2eJakF{It z7@2=K?y8EqI>n$dn-@o<v&X2CmvPJo}lZsOPupJZj>zH!Jr3_GmkiRzu|?!H3xDx8;PRkRus& zt8{`31YY7|k@Uqe;HSh&dIMVXZI^n3jnA-&LbGxg`IpA_Upy5an;W0b$X4d{b{X&6HO~v~33#LiA{v2X?3jRUA z%9o?*pTD7MHhL(EEGV*c`U68KCCL`AD5W9lsb^+_c!d6Rjf)x{j~uS?uSTFW9$RD?Fno z^q{A@DVI&iNH)S7xJs{k(uGNMJ4Gx>6znO%>+<(d2}KDFjDHH+qR35Kb~{C0{>5mb zoHX}d%1jV;=@x8*BSI-zyo!FNHDpfpBf<0bsMNhP^U;aq zX9tEZU{xWw8g$RyIMjA#A+UWju#QDkjeqfSTZ}P3jz`zpln}7l=l_*W!_(eNvTY#q<+R%@kXW?P@TQFd$vWAM&IUc+sf_x-ll|@?Nr>lqf#_z* zLr{-d^2hXgNvO;|=Tz+A&zHeFMlAR_i6x1;(y13|eB^ zWHS~&h2`Yg6eXo=Z?0|5jJovL$E8;LISKH*>^M;G8COn>b#1jokPyW%e+l<87aM7wES3 zet6S06C6F=^#Pi@N+X*yO8$=T@B03-X3=HnSB?~(oPtJfB>YvhyW#7`Q-kZ zbj`udp(P0%EW|Qw>;w9MyLZ*2h#2U|^^2i+O{?-{gzVyHVb>hCc!$V zd$}#_n;uMkvk>99pxt$C?VbgsB~X7MLi^;cZ_jn^A(efG+6(5vxZruiPo|8&s!VIR z|1SPN0_w~;=#(gy3m;HdEW{2KueF{g8~4V%D6Vg_rc1hYdMj289Cu3445;pi&k_6E zsJUe+lJk!I6YHj!?!!6xvn#K+Ap%2a$@T z4zI(AUt-0Kd&F~uHium{nD^OjC7^QO+Pn5;>tY$Xkd{7*+AiYtRtrFBZ z^vgZKB^7OS3VO573a0SyN}#WU1g%JdlW)p1Wm)N7e&%IlS=O|U)fOwQ#5OT&$}_rv z-_&41_bjhg^pyyUOLn@opf)gc^q@3Z9-W=Y$Bybcr($N3B(q5>ZYz=*kR*s{Up<9r z@Fg4CL_Rw;;!*EOgUZJ6fE=#3=0~4|u22x0ft_SY zjG6(+*uYA1xXircraYv>LHc;tK)Jf~BEP=~PQVVAK2F8*O6Ot%Uh|-}qrJ7lw)H+6 z*GGHcWRX;3su)uIu*ad{M&a<*u=b7RRy_!v*1EcIpVWa$m(la$hhmz=+`?)7ROw%v z7zCq@a4hXS#ADS~vxBberV)*9!GEc`&YH@X}684WLR6 zkPMGAjN~?~uu4hg6OL>(>XFnGO&$~)lemEKmp!EQmq>JyH{Q0>Xfr7-3>mYSHmL{@ zdK-*$BG#;nGyb}YI|uhsq^&^rNA!=(Q!3+MbNJ?B@a%$>N%vU`=2E)LANJ!&klL-9 zgySx?+;KZqj62Hl$9Z1*y%>e^q8()H*a4epiO8~>Ec z4=H?3lgXPQYF_fAPZL7NCO5h&JrQs9S~d5jOQ}XTU*8dNaPDUk{p~%KoPrBr zQ8_a>y`j(<9j4n{yHI0C@NIDEbwD9;ENy0Y4Ctd@#EyQzhhDQ zf?&J6>v5&lmFpMoOtZ~yGct_0AF0$!+k_*HDpl)0Y-AZlMPnCi3Egt=FGe!ainp%8 zw96*NN^CYKu}U|Rn`TFp6ZoIzEo5t1S7QON__X2KcwWa9lF*Wdbd+YZG0`N-QHt>e z7=8j!pO}+m_^6kfYEXfFCW0wPn{gMAPa=8HQdJEhQ86f~JuSD0w6pz|X3g#=)LPP9 zZCzcSAfvQ!3H64=o%~$kbZR(#d8BN4w0U`KVA+@}N=7u21r{aa0vTstnG(7|8EJ;d z{~&OO8L2r;6j;A8(j2)qLF6PuOh`^V2xnC0 zipc^PGfXtYMR6iQD3?`U^0HBQeAQe10*XogQxKZoC& zL~*UsvmZTdeB<}>2$0pmxxyr8SwqLWq>0xdPeo&FHWpxCxg5-HO!H_h<^3HDpxQ(} z%X%)#E%HnXOu9f!;{Kt55FQjvqbGUz)WF840dx|Yv{;ah}lm7un1Ar+&( zfW%{?*Avx@rdvc+Msvgx*4d7)M$cAiS^vidN1MA^OqQZFKr-@hGQ%;(^+G-YJ~ zj>uQ6vjZ=Q6=IHn+JJQ(pSMyjK5WZZ9ux{r>mZTBskT~+`lDC) z+x(eJ%M@x(ZkGe!CKK&w?m%FVcfXu?zWnHroxgLb?)Hv3!P3M%eEC+pk>W2$D<6rr z)tZulv31k@?tx$(k@`CXQA_RohNGH2gYF%+)bG1t#7od9>ivz4VgGN>xPuJ+FrBqC z{%Nz689C(L&#(Zk9j`~9riT@kDW5)@(&6?T><6bhi8UpK!Y@Xi4MrB%4i?k7j>E70 z`*D3R(WQksdV)>rAu%>A(Z)Iey6;;P9sqkn;pRCrNm9J?<8k7RxeKZUqlM!BydvX$ z!)^4qg!$wLjlNBf2~|CzfdwbhdsYzV{3x;RU1Xt7mQ(s_5S;J74e)YY$?x!OSr>rvmkCBBgh4Zf6e{2%9e!N=BR#!+%7pcv^sQRG?*h3NJsa&pROUjf@BC;C`xX1;=PR3U3^W1r zou{AiA@V{gOj{5yGm^OfPWWHFi?z z@Xz1FUHNnMZ`GPd*AYJRQT?~{fp3)F!TT0J;#g?lnVgoR@mS54`gMwL*;6Ba2l-}?Z8p1*OBfx+laWAd^{&vHJbhIIwz;;&JWd_%$j|F zQUmNY68(-EXdAksEN4!ACOCCFF+dUM0zt zXql@|<0X9#F-EC{v_gxKx)!6EvbVDT9`D3+BR$`$5p<74%(I{b7AfCj(dkm74B0z- z$6{4Q=EjfrW(+F0t2HW2|4}gB1_&+bHsNb>ES|_jmITbWH>p@lM}QX{FZv28%9jhJ zzCPXJio!tTWa7O&j0dF%bV0PTFpMaFA*@^vZe)mTFw~@GO!0W}sk{KWGCLCN=Ur-H z+35f6x5C$jTHD}DD?S)bp`%)dm`Xu?7-95aL28*0q@tH=H-$|4 z^4Rc9VOB8kgNa(DQW_gZuwoyol#+z=_Wzh#0Q#A!rY2lb>$=a|e19;+>~EfK4xXAP z97%u=>LM+zZEak2)&)&2@eLdg2%%2huoa zG)w8Gi>M+SH;(dwU4E2fERv0sR9adD4pfKTLy1YCHWrg{gzcN$ZF%)Mk@Q#Z3q7;< zJxfj3eYA=6zjdtj@mc&o4hT!Mca{@VR#7R@p@2&!6ItGPY%#csidW613 zi0jL+-SCYcwS8O6{esQQk;?}I%y8Oi{r7DY4+N-!Jwl&Y==9uHe=PUNTS?~a%$5;@ zKSlX?D&y=aRUA0-{To$I1`d|36o*}VvA`e*6VW^-Y77&cC?!_H)*ve;^m#axT+*}< zpySTug{zzXdH%Z&=Ox=}Xe28`6>a}DOzfFt)q^xY>%#zxTDgT6qVH1qp>mal23ASd z(MJhWkc~GMQ$rTbMqs98HaI_*tN(2|0>gpW1KeW2OyPt-1(n8~7>nsyA8dxc1K7K69qG&-j?iC?0G_ zGOq2|ovb%nR|s}$*VfHJ`d5M)Qi~S1S9FKpFsJxw7^w;x(bl&m_A@;aG1TTw4I%Pw zBEnw@!cd7W|4bf8VOn078V5>1O%$U%M%qL@F+@=BJns>tC#2N_SjC zX%$V9M?U7F;KXh$N-0b9_^E2@CZ>wi(Rm|SV(F`}zMN5N9Ia>&itS=S;jNqcqK?MI zYUiqPFPv?3N4CBr6|}#p;O1&t&R9j#ytzl7{dgsef0v_qdUHHQK7>-5Om8wSn$^>P zU0USPdZm7e__jU#=E@x7Y2$!x|t;!&ur z1ml$_x>B}1oi@Eq+NVhV&{-1ma76b+k;ScWIR_rv507{_$}_w$m1w_QPx<(JY2>_X^;~ zTIlPw?SBh&oV;e#2p%mjUrLF+McVaAH(>O+d_L?MTU9U8luhl0)*9EmxvhYBF#!X;_u1Ir?1n|(85TuU4#p$Cc8%NTJaYdm-2oy$ z`N6O*Juzky)sm3D$xy3{@N$n4FQPG0u5<14l*jB`>viz`K}fx=jG6a+&}~RSvV9ns z*eh(5ql%vG9OP5JbBeKutI*<8si3>t-@gpEx&7`oOQd}16Uz3QTyPH8k-x`~_`rct z4xA10d*Lk?o2(7oCn|1#x#STxFJ*o7j3#{{m?tOzqUmQoY(}wpUP*s#=SJ$-WMQjsG}gf{ zxz}1aSNhAPJY}DB^mx_}-4Q+cm&EEoKQ!m#{fLvDcbcnbOX%w^A3izS)HUp@XA1A# z(p2*VJOW@pc2IP=r%mPS2Qx{N8J2pgD#Id?mJOg8 zqVmZQh#hJ>Jt~;zzkJ<#LQ#Ew6y{^h@@V`;iqqBCsa;<8lDkCr)9)S?GdWL-uBd;+ zS!K?Ns$iP(nTqn1x_L2Temq?B8eUa%L-cp+i<(3=F2&cCgujn&OrjbXeEA$(f?=-2lCiQ0@*-brBJNsM3Cupe_&nn8RW z@wH!%dDw!~wU#kr99kq?;BlO> z!IBZ|7$_JXFsf7`)LiZ1;4`9~BmfyES|nDc!~qz<5jJ8s72pAKR#Tz}&8eirfm{?C zWlVfR5;UNR1>QQIxis4_$k%)){Y|>Ul0Mt+FPfT=;OpJnAoE|5ffjnMW$$-_| z9NRknCQ(H~kM%$i>>KTw-K*?gnsBCPh9^PHfdM!`Xi5)Q=ABsbAp4}JSu#f?qyZPM zCQV>jD5_NR3E)~1OdjHA4)_$-X_p602Z?kS(* zsU=tf9}vM02tf?gKn)N95&S`)-f1Y@X(jvt5!e6>z`&s^|9z-go+JL1l>YRpx zBp~Vw&;X}O0w!=mouX7Rss>czz!tAqS{@p+CU{ZstwRUA;>Bw zNP-R6fT!ZA5D3Bko$i4Ud;*;^0-gQ=4IJyN(m=0LYbN}G4d5!DhUyNa!L?#5rVatA z5<#zCg0s@W`ZR^>JJp^5Ws4^_N%}CE5HIQ1;FVfrm4X? z1q2wt1S|-tjHVz2f)c2w4!CHJ5|tq!)Dbjb3aut5C=`&aV+wI7?j!*@VPP_@RNo~M zVfv_kiVuH=4hp@|LQp4m_}tjA&rfojOaKXn62Wc~)xu0DhPvN6rh#x2AUW~Cw9zQj z?q#hYt?+HAF)kRI9;_oKtOQUbmH=NM2!inW7(z(`md@pksuO06#b~A^;{^gCRIEg7 zL0c+qGK&6J113RTh8d9pQzLy@=(J7$L>pwHL^S2k+x(=({lrNEg;0r4TV4)P>_yV1 z4=7wL(=zRa{={gyU(|}Mf>o{6;@>DlfB|H!)+z|sswdb^t+B0W$_7Fjz!lNVXq&ig z=mh~fq6EQd*w_k54Oshq2J*8pZYsUv|Q127NF1vRnil!1$7{Z2X!5My%2dpXxFc&2?}CDuMDbh5@GR zebKH)tY{A?O%nX!ieh06YlPI;z}N~Gxy>YKt%nnZa7@tRAjOX1&f!nU34}fqa}wVt zpwJU%@SJ#XLM&ivDlHH{t>$iy)It^tr*OQ*!6ZUJ1l%zmW5R&2M&?2+>bhtWi_gWL zWB(%5b$D#XQg5LIvJyj~TP`2A9NQ455SC&~d^X@9jO~1Ipu8j}PBJeY7U(TDgyHIJ zePXZzew8xr1;UM`YztpN;z;r$QgsW^VTUXbp)5K>934kYbY*bkS<4bMGnqr8Ui6$^bw%`ZVza5GCQ6&h_LlADa5CmI?qFRSY%>cL@k~UrA@qn!b}{oM??0s#w&K+kE4+671m&GPAPM^7TplGt;URLU7@RwiF@Aat{9JfL}N`SrCo;$#6z9 zbXBrTaT_-f5`qCJjXL#3bQ^*p40nBA?6lD@^?nSvmb3vP!4>9pZ*4&(Ff#kB6lJT^ zeWihjoL}Je9b$9%cpFM?!nR zutn2!Ac5;r1fG00VDGG~A)J9@pY)dVH<7!t6f4c;id7JhIrSYlP#l4o1*CwJf=MOC zQ!7PLHm9+Pl>@dJ_R@DqEM*$Yd3CVvItmI{69o*9b^csu=bf`gi32+R`5Mgu2~8_4 z1eeIN<2CiJ^slqciZ1PA=jd`ujaybb$X)ucV;z@~xki|IW>v!GaE0)&q_Jc~s^^lc z2hyV(-kIZvAt1pzPH1d1ZKi`{ZnFgeOJ@3FMzK2>(t@~;DM2B4yF??q!_P!jweMuB zh?4g%X3%F4|22(c29q-+NFR108F^O)aiK7JDkgBD^tw4eF0_>MNrmOD)4ovqyJ#!^PCNN@PmV{Yd9 z1)pzdL&G>x9J|$@DPBx2TO*X7z;CZ#eA|Y7d|o%#Z+akfd;%MSd4rD zN0bB#G>A|nhl92RQeuP$jvPFA1W|JSCJiA&oJfTfIg(__lAH_;I+d(#XbZrZkQ=lFgw~+m*gkWDBHu>@}qNL~CwkQcHIZ{!u5}BY# za^f_|EX9jKkZh3&(r{;=pdt|>BuMd*965UEK&V8tq)43S8t^=uc5U0Yap%^(n|E*D zgA5Q#GbqhaBt|S3>@iqjAcv6Kjsj|P%a$ZTiWcNyLrI!ImGn+e84Pfar}r%Rrpq%)OiB-{^?m-5Kqf)i;tZDtfek1_h6=)nEk4n&Gfs>M&m<${Dk&|K zwm`x+Qr?Pd!^r}3OhS?TBIvA0f*&S^TC=N>A3kTZgaQ#<6&>&OuKay8^CigX&xKbh#I?Gxe{ed)X{rXtNqN%xNb>AolC9l=OUx zFp*y7jT6uk%X!8X8;T5QZ1KIQNsmhI5=WpLLf71>sjk}Ut38w2EBaO{uORLkwv#UQ z0)b1r^X3&BH_0OHfni@q>iNM%3mVlcP~Jo>4Yq#T0xv{)n6@OmF-k&hnhe3!D;_dU zxg=M$97G`e{wxgd9xLB zRy*1)kbwD$$7&qNWCPPN4 z5D7yvndR|d3mOYVMbaR+x$G#05GhIz+GChcD5x#vL)lLZ(LFA4;tVs(QqB4jm=(eA zF!qD~kBGu0866=>I|$K?L#6{NICXJHqUl#|Z1+Glu91zi3sXkUbA~@53QrPIP`);j zgbeB?c=iee-OhG~J;sU?f(lr7__j6c7{z({2}>G=MZ-j{*X~o^h9ndf1Ykh%j9^Guw7V6rND-#wKPNqrje2Cjgx;XvjH@4rr8+hMe(S zZ8YXFkx8{tq>&`RnwLsgVuW_#aVT?y8DgTDle4vlm};6#Akt951+fw+5K$#h>NS*t zFf1gqoC`VULcUUl#E3`CRS!NvEf5t1Q@y#B_~@fbjd)~*h6tOp%V1q-b2vc=DtmcUf>?g>VfOfp;hB49aUd zQOx0SSv~)?9t$ zoRF53u!S|OPtst3cNqZ*-dRZ6e&W_UJ@cn;Le8E9qp!zSl~gua35=YAn(bu9nmt=j zo6=x|fbHZcS%Ky>t&*3h;)zo>s32?e!j>d>C^tjo!6d;_PoIdwD=aBjfc_{ln6G{k zb70XAeJbOU72y<6FWQ~JG(%mUZRlk^+v8|efB2Q}7Nu4)c!e{wy|kazY6`&=76> zW`r|`B#B>V!$>;g_Tf++@LKnboa6 zCc4%Gk^8_Fp;1X&rq^b#6JCm7Q(ClS6e7L6oVc0c!~yGY{fR9Q#KnNp3cFMkh)h?k zAf671tE&3w8E-+dUfLYPG6h9~=o2vIxgvGDUEd*paIM-Mmz7-|Z+VZ)5C$kTW(U(T zS%OP4Z3@IR;gg0!R6>P_QeKRnqQ~tjvM4;5-fbu*xgN0Q)35dMf9*CO7CRi*q?kxs zv|SU2({3_I5Lkgu)m$6n%-jg|oep6J>Sf`(S4r*?yyu<%bDd|Y-chPV#|w(O3Gb;- zWVUt;nQ{hmGi(cuqzgpe^HY{BY9|pX4waF^sIMi2t!ulXByEG7xrBViHD2J2haw}t z96d`zmZo%TPVBdW8o`*=h^cL^!|Ar$Y*m}uEB#_Vz<5)|kBJmc#kLI1)faZ02>g5`rcP5sJ+|FUV#dapZv z552a8|G>+k0>JdztoYe$Bn zcYu!sQKAwYa5NMJX#`>*^2Pc%4+Dj2O}=nmz>qTh5D(c$oiZZhR%k1L3*^*e3z&ou zaL`LGjUdz})@JTq;tuGjh5;$#>LifOlKzCs+T#z=i;5c238AnQ{Z0}NAiMa54?*o( zn&VAGE$iTd2-z&N2BV{>%s74uBL3*Jh)kN=g%*u0BYb2idXdcPgcU)p5TK;a1SGDo zF6*F-{dA(gY*8A0#G!P8JDAGbRsuEpRg@@Y0qPbofu5Co#xWQYASXKQ3` z)Lx?9Hp3E84Z{2ooOEv!YccDnEFu=7^KK2KOz|KQk|dh28tV}t1F|@(NfGIA7_ISE zDDoPqObdsDtB1w#3!0N{)IE6`aARb{x5{%?MY`{6V zD=b({2`n)kzk(1bg4<;0RtRAn{%grPkN^cKFl<=xq`=TWGEy3aaTt*UI1=(I5fa{{ zLpltBBDQc9`A`q>F(f2`C1A@h;H9!yaZM1%4~?-oR$?Xm!x%GC-=4`2D=QX3@*f8y zGrDnYCSxexZk-w?OF$ue3xgJwo#El82M!oK9618K&Hqy*=&ND%?Ity#d5JY=KN-VkTX~a?~8j+5k>9eGX z=89tlldvjCsW*m`REl%{mCWTKEkP+mILc&MM%2jY%1<;?@AS!D1S*HL#6s0$b5@B)ze3z_ zz}1wHA028(tx-WTl0U%`MdtzsRg^`!w1I$wv4&!zKq5S2CzLo73>`}^r_l=e#7D{` zg!^fQ841!hSyE0t%RQtkCa8o=I|EN|vohWzGXc@6 zcFa0w=}e!g$%+FSqZA~mvA>!yQiYX);NSrczyOfdQp?3mW6eyEMoK|7juN#YqJ>nk z%)ahpj3|-J#Iamlwe3LdP4JV=d<4njbR?K`Sldo4A5~r5RW~NU01`j~lJzT`kUP0k z8Ch{r{ZKgY>!*GSv_7!0o-Zsrbd3_!zyw4`$u(Yv%}!W#L%vm9_;30Akw6!T_G4!Q6GWn3l>#`d@norSHBt6tu`%l=E+c(!D9+$M)bLu(oR}o7=HYq$dYN^&RNOu1sC=~G(Y9DB8^A*Ct zLmByXQ32MeRw4qUQW}HNQ*VW3kwYVNZ_GCGX>FE)ik5*m^d!DeG&C_vf3_quvOVOe zHbW6Wr?zSl*DJ2}C%%*lTlR4wH*z1BP*>I zxwbm*c7cRI<-Ex$@iJSfEHN(2Tk5m)b$GW@MMU{IUy55VTUu}6FS(4g*X&icnvDJf+hHgZ{vOu z#{dc#Ea4Ylp_tYBH+C$*dix>=+!18uhE?Y`i=$SGO#(PTH*y_VWh?h_&vzrL!>Nu} zU%Atad1H&Q#typpi*sNl4GVe`mU;QGiVa!TtYcH1(K~iEOl8(h97_!2*edbKET9QWM2T>=kWH}8 z1T~Z&w~aHGd@omWAvccWIDunUK$-)b!c_Sb&=p>S!yx4DYX|2aj#9z zr&P6KPYY|al}izptwsYZfCFk-$nH`=d=WLP(IID3mveWOlQ(`viiBpV zjH`KA(O3Z?HD?1A8sGMB129pG$66Ooi{r}OFtPvWF(ddYz(~rbeRnA$Ofa=hV3Gg>blL&{ z*e`_gQfqXOZ}b(7x`C&XA`b#KVKy#hc2Tc5dP91tgLkik_h&={!Qigz*odo*(wqXu zZT#en%DRh3G6;?-Vg2yHKv{O#mLxy7kyY`E#l^4rx@tXJf}v}8RzyjQ^lCuEvZPBu zFp!VSnwHVhOSV#`?y@}=)B`_tOmcBoN3~JABw`8rvxQr6hx?j9MP@oJb`1OJPN)aa zqvJrJu{+?MSw_7A+skH=FZXk&%xGi5b6p2noA(MXc~wV`y8d$eLaB>;y?N%1+~#G^ zLs5U4y{pJ9kXu8kWw{xzkYe?xOq&!MyPa=^v*ZT({%F*y@$O<`zOe*Xp=4+KRw^%> zBpZ?6^Y?G$e~t z%etaV#CU$DO%R*{18s>op%8MjXL0*e-&O#9@28;h8f}ruC;XS8Jj&I3#fux>gz&Zj zF!qp4#c8~n_sIsj0=QdsiC8QMu-7+aIl$TP3=X8uDD9@WJb#`|bh?AVPBi}n2z4wa zAn(Izt@t~yt!*2lfc5o|p~OY0oW4C){>;vW(x61bC$&69kZxMmasmsoVB4{P?NH*tMW>%+ z$G!y8F@C+*S@hiZ&m||30#9v!3C)SP#IPX*s=Or48=DkL{fohk-@d7AT*3wtZxOb= z;1ywOLIbSLBk^cjJqAy(c~k(sgAfoM-F;n7=Mgh^gc-Y)W2qu0IbAqEWVf(_TG+X< zMPRpTbzM>CggA<|C4>tKe%rY~fIy)vb!WByXl%2xGzp(gW?*Swx=A|J-QumY=#6qb zl9DmjYF2@|BTF7j)H!kHQ%juP0xsYQR)YO(Ij4l;sgB@0jYkV+J`1#7oieT_pCs zFK9GS3erg@A*CDXn_9BUiK3i+$X47fBc3g5yb_s=WY~&SAc3{bDytw z-`{)8Qyin=vy2lmiTDA6l)!-m3mP;yh)1M@3>!LR$Y~1>9)S#zvVbw89fC@5c>HMb zp}>eqf=o2Bkh3%8-zxOD3toI2>`L?wg3 z+WiYyDW^h6>}GOnh(}<9oNVwo!)c(Mj2Sl(1oiQw5r?BVrJ0x}jo*f8jPOu$=4)h9 zhZ8htP=ra)**`zb)-pR$UH(p-ByHKEBnXd*PzUlJlv0U}n2$#{ow~)PN#aVCP+sB)i%4rbH(|xm_e{a@lpt^_K+Hh`{(-|IV41%C+0SE?7_Yn`P zF_r`lN#J+aXFP0S&?Ex@;6eZZ0Pp|p*}2uz-blGGGO5 zP+ai=fKp6BMYTa`p$Jw!b7DZV0)qz%Asw-Iuy+Yz$(EIijZ&4A425t3fD8>{CJxmp+vY={q|pPtyE5j| z3wQ!RfC(ljKtKUd%+^7e8AUN07gD7Ny~?FS8UPpqLzs1J10jN~ z`JlZ5;hU;Vfn+k_g(hV7!U+Xv7}OLt3mOz64slZSs&}Py(pQrgl7>mAsr0lVX)LEA z=nh?tcIv9HZkAZ-<+a{SRkKc4dS+Wp`&qAw%@o^a;lO)ZYsT6uWp^+{amPH!*^r}F zEo#swTdbGFYH$o-z=be$jKc{5FkYL@831KP6%8qz1Jw&VT=_GkF}nNNslhQ;Y2wRzRja%q_kn%S-?RiXO!6At4A;L!81rVHM;PX|Rgv z&~^TXy(GaP5x^7oJVJmxRqF~<$QETjFa@9tAOeh$2!HIhun|tq5Fw-&?r24o<(vk3 ztxKR0k2tpd;YEO9`x_F+B0aO^uYb#8U|JIM7mD3*DRZMt-5B$fG!TM&Xc|ZoY~YoX z4P<06nGu5u2LJ_}5C;pmkhl1h5kEmL3swMt8z|L5$Q;B`TkEanPP+=!sR7n*+iH&QjlD2!97be zQ&d3ll#mgGW14Kp2nui^IiAo2003VWJRpTDSfGU-2+AUwg1HB|OKA1uPqVT!82$&% zh%KKO#F{2TM73lG6a)*UInVi?O0r~OXG7;8*Q5l49T6pMIptDt@E0tOrFfMoNJ36F zichR7Gf=^SArC?_QYu9Rz`W1`=BNMw;0!3&%0h=|QxzWApj`r?O37@HgikbYdgbb6 zd_>0sIGL1I)eM9>-3il}qUEK{bChFjKtPy!<|>=4#01k~Pm$y$KfohP7c=t3fo$n6 zG3pqDOtX|tQ~?LXybuBAn8G{m2`E_bOGMVg(SeMU5Dp3_S|Z}PK&WvoR9O!a=0{VR z%5|=%a|<>VwwEa;Fd{sSWUcgikf1&!m3A?LUSCO&ApDddlCYnd%9ti2{wx+EPw)r| z@N@$1T^0aa-B7ql!9kcPYI4BonLL@IriF#(EocSJK?xF9y2^I8u@#IVp27np_zj%_ z70zk-2U4~O)*<+$3&ke;5Po9hSEN|cLu#3sAJ*!%BSqY1StiVnRMnV3al+y@goua~ z@{mS=6Lrgi%`F^ZBC}*mdL6Xdy3TgK^c_-Q_<9<^@{eS?OkgE62-LPg7A}$iFjFc> z84ZkNn-AdxfeO@KQj|%Rj0pq|a^P5xs0>d8P=L$uq}427feEfjz#?XY1uW2uGty&k zDa+z0lLXrs^n6;GJ)_2FD)Nxrn6NDZpLBFh16ReQ<*R>4(mm%$pOAgk$lrYt; zN)#^0C>lE)Go_CdMPrqCGi;_40KiTwyHf%Lun62_feVxB1Q&jyh44PNWHkP9s+Lvd zlP1V=WbrYN|BOUGnb!y(%=3mVZf$5i-G7eW3wpN0(YpA*s2nVNNCxykG`OV zJp$&;435lr%HEj$AdxIc&L9@vLKZ#?kpxvSE!lAi4hZ|Ss0HG;@&&Z7=_=^6R&EO- z4W)kg^J3QNGr&JCE?iP|76el!$qf!d5R`htPS;YTt|c$G?oYDIa_@Z0d}}c` z;F{9#^1ZIOfI-OfQkHCxspZ@(1~1E`t8i_l*vcSVnPZkMUU3}Apb4<7VG_p67$hu9 zZBHCI0Mu9%`3l2 z$yZB47XHLnK^|+bI(=Di!1c8>{48NoLFjAskcZRWBeo9^rT8YuK_)1q4@t~}ir-+4 zDSj=I2l--}zx@0c3I8lT&Gc875dU{D*hg@v1$%7)eftC;7oY=6v3-MuVS`tG<|h!5 z&=F0>7^V?$@FN^`MivQT1OiA}%Hn}!Q%?Gaf}s)$a6kcUKnXbpDwMNxPZWUs69iB; z7IZfdgkS@3!7*s@AC%Dn8(0tt$PoNBP!TwFO@INEF(#gYbrA6sy9W_Q;1z7~86ikN zUI%~kW))qNf??Psac}?zV1@=jL)sxK{?bz%Ped~OBXnq?g970as}y<+(S4BTHc9~s z!g3r>zyUU60gKQ>#FjKgLxqEsOKh@)?HsHZ~+B{3nKh76ENg7nEQC2p|Wn z0RaX;0csd3*^wCjhD6gtJI7Uk4tR%5v2>CaCPd(huy`_cAcz<+176`}Zr6AQH7ECy zQM*Me7M6&1fpYdI5SDm}JoW%)=m4Pr7ti>Kf0FT%A}DYhVBhDHj0aU_@B{Wc!#k)hCB#VUg$s9B2_H9WZ?~F%}UKh&Cf2B9V*_ zF$yCyc_MfhL3VdG2aH|FQnw~g14)qdH41Hj0B7g`b7&B9U;q+8CqwBF{Sq)$0*<+} zhpTgdWC4^2r+u$j5RLw!j}U}2^TD>g}s)O zZ}||R@Qh}dkTh8kZD0UvP!O14014m_X$F#!hf zNA6+(2QVZ-CMS0J9vuF}X#KN5s$&ErH;!ZxnQ6h83Fk$}*$`V$7!0uqc2EcK7$%wk z5hb@2rI(mXksv|fnO4>q+sPK5F?pZRg*dsII>`oSXod-(gR>b2R(6|1!k$%-3HOPg z`Kh1#$)Ek{pa1!vl8^*K0H6hGpa+Ve3EH1Fum_=_pbrY65t^SiFgOu92?|;XFCd}) zsi6;w33yNeAu6I((4hw!3Y8E9M1TpJpb2;|0wAyf6>tF}N~0pW0eGNs4vL?ZKm;!! z1b=X#kYEEekOmu?qm^I-KJW*jpra9b37#McL!bjhaGy+Sr2h#CJxT-gbpSUSspC^@~QWZv2daDy1895f>$W{h+VCl%5 z1`!IQPzNGVl9Z7#mU(;8lag2w2wTP$MRS&CB@tlx7h5rwMKq>kx|6SI029!r1A&(g zz!Y#GiUq-mrrK*VXpc!U3LRub42Cvm@SD9;aL6TKXTg;rfRP8W33pHj)5)mCiV-Kd zMq6QbW6^4(z?%nACb!x)9>X2(M`U8!spnLtXP5wUzz_z|08B9lXjl+JIRW-XDUxNL zt7g&?hG zp#+5>ivV&5c<=T@N7Oj?R^Oql1D466Sv2XbR2oSO&Aqu0q z6tl?&1Ca>_fB-{RDiisv=CK7m=s&-@HDU{uWKoB1fq_i10XoaJx!3_spaOfLR{U77 zv?gI)0SaA<5IFFhS@a1vr?&=ytxGFOQX3bcaE%in2X1hUPwSRxVzi->vbhrk4(lW< z`*UQm1!`FqeHUeItFs!Q0U=Nacd!Y(fx2n&33LXuXu*aKTP5PT783EQeMY#q3seXG zNtf|SidBfIF-T9q3AST9sESDzao84>YjmJ%nW9U&hetLV7`O$o6}8KqeU(pE;jZ6` zyWLAF4HgJVH!2R+jjBU!Ta%nQc)T&W7KT+8xX8S>rvbwXy>^ipg}EuhQL<%`7`n<@ z!atM zXHhia3>at2I*zC{=g6{}OwXji%Vzt}X<`VKlLW-96xG|hXdw~aS^kQ-%+Gk&&I5sRLpF9JQ5roH(uuLD;|Z~U;V3OkuX&us&gB*oW31OYkb@3Uw%uPI^!cU_sNHWuY zop1LB3OW)h&}P0x)iB_v%_32}oomnyW6=SfnGxaD<%|T8{><5){nu{c8ErY3Ge*`( zVkud(+6~w<0IMJD2~KG-pKs-Dl3g76k~e+W5eR3B6ssT7J~rPY$fBZqQSo% zp3D7XPhr{Y3ezHv<+5doGB^l5Zm-?lDn<@4!A<5&QLk@d;c9Lb46Zv>t>={D7zI8a zq0L_UQ|FAVjR4mqMFZwEo+Odb(fh0vgRa|r{wZ1nK7#HN)p;%h|%K|LcJ~(urpaSJr_^BEoLo zB-K2=zg`eJI4*H9)N))oVP&b2UOQ1^?B78-P+}~lMCZ*OQ`kzF9sVA#ZROq(=5jpT z2BCwP3>QIQ%1DA=Ktexsmf2}xYaRU6$ie;<)#1$S-n|2iOYnXkb&c4KT^IkH@3ejp zwEESR<4A2+Z*~Mq&gC71T@N;%Twu@WFC* zOMi{H>KC*X4|3~+xgY#N?UIi2-rL#7hVgIFK_c(9XAUa*Uh_&Z;Rb~5fq_kXW=H@& z$OErC-(GBsu6l{LQcSV#NpDUEZe%|n>PKHBpK#Hpk`jTw%P0=paDiX%))vnP_fpYA zZvV%7Cg6^&_P9&uoS@uJvL7$+(lP%YW^VV}Ocy9Y_9Gc~to5jIF>H=Mo;Jky_ICJ) zKbW9bBt;|m;F0r6Qs~4j)F>|b;r=l+KFnH;xYKOGk_LYyYQkRYy56IIyJ;^F&)4*u zQfTig%Q2Ys0-=NV{$r4j&Y%??Tygtnl?EK+>UwV}Eh)z>!4-x7`@p}n!aov&a0CeS z=n_HFeSQR~4;bC<5OinUagi*J9}%As#5f%vCq09qQ}px%5Ti&9Bv{bkL4*kvA`}S9 z(3T)Lc-Yt?Y2ihT1r226*wN!hkRe5mBw5nrNt7v7Ufj6St`dhk$U=w(MvNoaDq zc@tESEj?8RvFR~WM?*Y%jw-~Xs7g=}B^uchNo7unXM$c$qD11Bq5_3}JV>tmm3F=Ic z95mIg1eHc&8o(#__EnN3@j-!t&+zyhdM@76v1QMuUHc|%+YCu@^4f!OV4Yjm<~GR5 zi0j&Ef_!wG5i(m&J<^E$1TpiL-zls21-lZfbmWOS5!y1fdu-gq)vssYKJWqe3d;uJ zaXxSw>G6$+mtASO(T>vCLM)+pn{FYo1QR48=>~i$svdMm0x<$j+A9a}Y|F`r)@(~J zJ`h6`(LGA$m?NV!44{fX_c%F2BE;$fMF}1bWRDZ4)B{B+02LzyuAH1QWJn^1G>bzX zfMU@?&+@x!Fuy+jsja$*YFsiePB{5+L@vAZaxOR?IKTihIWm9{BrsIMsxHf#X|up= z$ni!VhO-TaD+_84qr>DH#0WqGH6n;0sIo{Xfd=6Yl&b>au&Ubjnh7XIX-n-P%#wib zOHMoW^ri_6Xh4E8Giu49G>o9>$2MuKsjeh^`=mnK6jkrI9y6L#Hd;9=&o5GX9f^}b zBr=UQtZFPIH%=ni0?9N28EDH-tF`vpgfbDURE%(oN!23;$csXSP7LwPh!{}{(l-%P@-SxplsN-!D!Z+N0vF_ zOjvU&?~JCfRI!V8xT>V&k^D-uF_Ga`_rZ*-I< zunQbyCc9@#D)Q6THXEUq6Z+Fy-o852q|U08cjq*e!0_j+Z_4)!g{@AbkV@_{e0Sb! zLmVL`RJ{6Jk7DB5YC2nLiyCPINh5Qflym7oC;M0mmw62XKRoCF4iutF5ZP=*WC zAPs1+g-UqvfuC@oB#7{W5?XMEF${$dh46wMqydKf``{2oScyL*!3IFIK^l@^K~BuD z3iYdB{Ji)@l2Aa5Vw3~@+~*chjE8Hai5)4@_$TDCCn|lJ8FUDy1mcNjF|sj)5gMbI z@OA7HUg4L&bW$JbNyZQ_(g8(+hNUe8A_t$@LLRjfEhD4|jGN?SM#faXHJH&%{s}Q2 z#=OQkjyS|Rere-dQsWgK1kyYBsiV-605>e54I`mL$gV)-t{NFKB59E2TZn}u`{+zE z36sdrayJlVhJU zfFcQ*vkRWEhY@?lr!z3}SF!3tmjopNGeMx|Tt1NmB-KqN1Oi0_tMoY6xG$R%#ipE* z1Yc_8pt>N8Lk)6CmI{F#9AGG36{BcVojS2IiUbspIf4$X_BD~^i))$wF~ZeK`jWE9 zEE3Tq39%?gR>=$|F2Z zCGuEjDoQwm$Rzqy$Tp1<5uhxYC>w!EL`^h|Q-U}ngjJjjLZf*Ftf zVsx@om&Dbr*&|MnSQ)I5fWlD=vyU+a#GrXTWv?a4SKW}5$@N+2A%2_48PX7m(}Co% zk)`g#Q&PDl}BEMMzySqq6%wFUCt{bO3>bHI-{!O z)=Z!U!!4qwHi)@RB)`xx1VV9OwZEX`6U&W=)y@#OlyJAY6Ndhugg*ib?`DjnYP(nu zx*Afu#3TtA>aD*9!_L68wk|fv(_0JTJlXJu#3aG#v%V4+PV|&DR>JXJjrP;>5~M83 zNoo&}5C}uSR=N~svQsTQEJHwMCS66PLP|MKtwH89MLncydm@Gr>gD^ z>sM)BCT21Omw_Q^F_PG(VGFXCqM4@EflmvqLtg#Bl&O--07KSPg(6ip8 zpet<%kLJK@hQ5gLNVDPT9dZllJ&B@v@Mw>;ZfEh$7XC&I!D+h8=$|D4CY!(P&j-Vq zuo9^vpJ#X6RR`uFse+NMX?^ZanVU0VRg;$sV!VtYTbfAlu)94n8YP&S##^{FTkLre z7Z2n)K^@F=D2=bV+S@__PVigw)q@-uq2a_G1i9<;>9L@SLm8X6y3zgd5qbPUcRhlx zzqaUuV3IheYyHriLlg9ULJT zj-*6FHWyIDWVe~A8_Gova;&q55C%{}A%LA5ha8Wz$-~HAKH61z;{=vUcxFj(ItYHk zg)en|i3DGI5hN@NE*_(i!V{9yQOnNaFqYjz{`~5f_o_`_e(S+Jt)g^kX4Fv|=fM%` zh8#|S;;2Zwde%Kpt}}HO;ypM**CWyL#Kfd=eW6@<5=3YXhsBtNP{K@5TvkP)1un03 zII|C;^L(|VijRL{Z9zAjs#KityVopfnapQo?TMMb+?xQ!+XcLfiu7IbH0n3E^B3h%Pl%&ZumBr`MZSnc%t&tx~D$ zS?OJcKIeK{^V3j-!{I+swZ8gkc|J`ozxRzY!f7$r|(kS!@ zvIhJ!+tzm9-biU<2p_%^g0;<>>n9XK`%59^*Hbxyw+UN7xfeehic`v?0y|VaJ9S%{ ze*8fZKjoCwsLf2ZzGIi3AFqbau)tVHbSJx-r zG(x^QX*Vc|%cm%SRHbfs8tA7yx8w(U|q39-~GUn-+63uuOKF7Nx=K)o* z5uO=$M&D2g`R#R<>R`A3PK&kPeU%sU>{5C1Vz|$sh}=?wVEGHG8T5Zk zMC*iGl9%O}guEpCOsO=kcxSuo&+HKI8>{FiGZfdo-=BHa=dICB z?$Cph^d^kPKO2|J#_>OBen`}BNfq^wY1xC;BRFqVqETWgQbNjVfLgR8=5i0W4SC5d{aZnsZ`Xy`Ew}HD|3frdM4aFfV%*6q{SCqhFbGG(edeHU9qD zv~yy7bw$4UYX{SNDF;p5I;K6xx2uk|-dX*+_&Q--Ue3iXT9QmNGjA|S@#nuP8GGby zV5KbnB2Y56xtK**eBRDXujMU5Km3M#f{8<>g@{>_$eW95AltaX_+d$oFQ$sEQtJD? z$3zORhlQsGx9z`5seI_%R9Q}Zfhe9T~%N{k=|3n(AJx z6)b3)ems9+%*8@a__cuC5*EzZ1(c|gvQ^{Z-{;@FHe59b<_nSPpV^JonQA|q;P zDB0VdJeTlfI(C_IL*)KsETmOKn>@)G-DBBdQpll=WC%`XzwSuRwJ+#)?dZuGY;v7> zVMOT`XsizzZ}flTA7eCCbG3fP(x*HALc4AV!lJ~YB#wqLOSI=zd_4WQBq<7^=#2ef zca2P-i!P;))>|G+*;4W5VPz$>H{C?4VVD+9>(C9Q-7uB0lNpZZ!p)_#DRWak3q}!X z!*QYdGQ3Suz0g~{=kTIwX}C@4gl)23j3Y8a1j513LL$*yW0{ylkMdtFUt~&V7giwC z!>>sH%(yF$k|mjY{8LFD1zsZX{I;_#)Q*n46I&@sx*N}uTim^?WPK$&_t_Wb1O<&? zqSfT^G-WI06Aohe2cl2;@Ob*2u`jM#ApxLa^Y1|BxgJy1DC?$u$K9M+@}Lq1rC!!C zL!r(Vj@?`!WG1mnUxLpiyc~Yz(D7-&RxA55Eph1m*#Wr@%|!OR9DydT1!ko9W;|ev zcE~eJChKXteJYb|nq_4YwM?k&x_PCeW{M>GF*VVoQaC@2nkyPx^nTtdcfs@az+HyV zTBEH`96E-T9a!w*3qcj|o@QdME3t3SU4|5^6Etnvbb2_)SHG>68Y8bELq1{xMVGeH{$OKa z%?e4t2xX~gY)D3O13^2m@sE5bQNA;!jQt&i$eUMny5~Ubt!l?=Ys|;z>(hkTLyV>fMh9W26utSSz^u55 zwFH5P9uX$uZ~e)I8}?!|sRM}>bgmNDZAM`N7iRhsM7q%p^NP2Y3}|X@ejFhzCRvA- zVrq0yxmZc)%+u8N1b==R+JhTNYqHVJFVv!U#6sr8WtKAf)ZHAJA`6JZ^wQ&-Wk}rE zE2UI$)kOGv$3s2$r%vuqLv5!d>7lPK79{g~b>2DtP3mf@D$t{Y|0UfP=39C!C(;f< z7qwsnqx%3~yh-OGTtVnMuZbek!6_iQOb>fUT)6hoBZ074546uVG@8klhvdxmSqsO4 zXQP*-!!>s}Q7_f%HP~O($$BB{5^f5zWH$;(m*U`N($9>pFk*Z7$)+2c^H!h#N!Myp zh;3QF#}VEu!(F9;FG)BRr&K4HtWMq;A_%^^@^FN^uj~4$5K~6ANzieLwE}0=gY$`IQ3q!jRb?;@6Ese;kiXK{rz$TUP(pA-A?| z418y){zhZ{G48W4ZgTPBPOa({)myC?abjrkV(_V4yAE&h2`@1eA9H#9d=s@#;Q{NxkHaNXi0=@FSB^Avu*1@NeOxCigz{hZrs04R@IH+x7iV1V$+ZDI5*Bv zsNA>+%V)j!P-9fPOyypT#38na@0@qclu2jQOMm4Y2<;LcV>f`+1L;OR(62aTYCdeE zrI&yByEd-mn@i!|{ut{gMJ{Ay;u~!jRwM_!BkOGu!XMj+-$V0r1b=bLRGmK-;(YK$ z%+L9mtP97nHxq-I68XFfZhTx#{X_CdJk~3CP)o;vF_nE*l=#-mQ24ur$gAdy{(<49 zdx^dFo!5^DAr23p`So7*2N`dL=iVvHNfOyRs3IU0ZG`oAfVcgc!hQvl1yk@>LjK8- zJfu^j-9i+ue0m6SSTntU1*AvOi#f~Bew{a+d`m8nW0MeaS*-4M8T+r2;A`giPMB$v z&f8qA>JYidA^Mg-eziZ!?a5G%mijKFk3kb*A%_ta$I;#kEAG=u8LHus1FL_ZXpB6p zh&{6X(>Nf%OAcg#RO!P+4GlWBC+$@w|MYy>=>KX-_d^<0>P@=IgeC@mEDEJ>b$;xV zMMvk4|DGzV9}+Z?ajehbS@CmLa?ZVb?$6N2V^gp-Q*yr5g-)BOnt>}LL#U%zv=d#> zU++|ItqH*aqq5QKqOLOgpGQ#S<}TXn@=Jf8=vF+&K4XY^@=`c)m7E*omrB?icZ^;nF**TO9iJSJ?57_diZ6GH>{7y$o5mo%^%*Us@|p~ zGE}A8PiDn1^!G`Q^_ms5?QLK4`imxjSI3xj+T3~(;4fW984gnxnuof-x=7H)fAi1<1JbdhB{ql>MZvUD)J&Z{=WdZ$-S%F z&)MMEW$PF-JwMmcd;jqk-wMBAtB2#!$Ty;A* zleC1}sL@=S^ya2fC<7F?G@%qR_4J}Fg8`hl-eSQ;wB6U&y;!DOLeb)~D^2<+igvVO z#JJ$;FECU&VG0Ww3la`Rv%Y8(*8R`ro$zunRGL9z&G141&m=*?o*K>RoNdX8;Yp|J zbNMQ^XhRj_LCJ>T7(q@fX1Qu3TE-xiGe(C{Ofn#Q3(Ck8p71!E{HM%YR+@pf*Yo1I2JJ_Y{ly?&(fSlm)2Il=!$LzRKHR2RE^aHC zi=oX8!tT$vUY@H!*e|GaVC3R4`+Wq1)M|Yq)7Gjp?Spq-Y!>I#bvC9B5FHDQ6!ODQf6K-fx9qGPs6)H`nE0F9M6nznsW$@N6(<{b-2+tOUbPCncYGpZJp{%H;QTy)w`}(8SnwPYsu|Aw_3~Zn2rc}~ol7}&p5!s{H zfp-hu`c6B(SdbdL&r8p_w{S%YIo7@1^>d8>*TO|kmE9>Nwn|)IA@pSsPUk|HIka2l zP@jxE5`0M2(I$q6+t&z^Hd){guD(`>(hMegHF5hph6VnQa9^S<9^X#D^vb&}zoZlY zJM!pu8p1jSa6Pd4a3rd1PwKw8UeAjh(qyqTveC>??C$+P(iqZR(@hcYr$wzC!yrY_?J)G*R=`(RU)LE z+QObZXxi1sJw|@&7o;DgJHFFk_vK_+{a;;)Nu5= z2{9K+N?V`S&{r@eVntRfh?#Y=@FJ%JxNBIYN77$CGI!{y1(zQ`WJ;L|`ElUV7*{-) z?l6vUNXcWpWm60@8ih7r%`v2z&OV1n#`^zvn93RL`9_1!G$gz;8F~=jo}OBDyA)u1 z#=2ULrcBF_a{)Inc^VkbwB2_MXE- zs-)b__B^Zc+G}c|cCv(D(V~DYH(gK1DTuWMo8x}?L+q^_+^_a5Ro~l*abzSvu~yq@ z9};j%&lS4&CRsJc^Ib`*h)Qa|B_L6xD;HmXZ$1ECj zsgiy>95~`1sf%7su==Dg)HQtB_^^iJ%}m{fy)ia_u$6pmYa45vJxD2fAZ74!6Pw^a z_RM@AXE^{YP2l4;@jmcl*8Xx3COgxqGXtQ6PzB!tNGh2tmHOXGsDz(bI0CBXPdiV z*~j@z$hK6f!Gjc7y+16LW!FXs9Vu1&SqS;}7TwH5WO z9!wjYS|n#gKq0YzF3De?Mx5tg>2Ue9zs$D42WsYq{&9&^nM?25Tu_RNuUtG9;(akM zPxafL#bsKunCs8|Kr^lz5fl+@9yh+@b#0R6?A_XjA{sp_Hp<2HT47=6R_rQ z+!U7!k-+(=>#RYrFJF|>c0+lP2k-0Q2`b;clS#3B>eZ_4V$$i;cIKo>o68Mk1g&%J zwl!!rA5pPVm%F_#|9Jb;YD(ve?0j}S{gWfUp$me3 zG2qa5bi?;pj^g|ZjpI#z-CK*cxN$UoN<>m7OYbGp>m>Rgjl~< zGwu1?&I@!Wg-PGsGNiS?pq4^8qg3Z#8DE{#<|8#9TuP$4BHZ4$>E&IlT(G(52DP9I z#iTaumet^9}YO_Ns;mPcJH;cN-nbU*cMGq0f5p8$7+M7>a z(=F-sNRNDIHQG)b=&IV0A`vSFXstZ-K0OL?=I?s;dVQz>Z~tg`Y@ zzQ`i3@SnEm+i&(2d(MUkV^cKylA|!Dr4Xa$f*XPb4o2s~`^2ASNcWJ4Hg~gs&xOL8h9e z=m^Mlj1lixy%HKDEr1py1DWsy0SZuI_U#9Fk*p5$=}(D@^{5T_2p`@GS!IlrFUHJC zx@nJXpJR>CHVah=a8vUFrPwKkMNVpwX0j-kC9DD}G~9l>qCrB6+@u|@pjU?%+`D`8%8#+a3n4N`}-1zx627zH`a@iIvY$ln& z5$jXeCOP$%DP775Xq}8xuy{7+$v*PKye2KN(0IFw8 z3YdP;cDi$$j|9A5sw?HLS2rr^lqX_-%fe4Li~gfOhVA$#zZN})9+}Zdy|Z#!c{K%+gHnP*Kz4eND1IeZNxZXk(nZ4 zc3htBL8K+_l|<>tcc4Y2%-%?BA2Q#~!{`RfXExCZXsou9TdBZ}?&ZQ#&vWEx?ESD( zSDO1itH;wIuy$XCdQ9Jw;#dWzIkTrD>3pEiJO4 zo9$@^sfZz#j3jvm99P6K7vrRoqL_!JD_vCIGq3+mPvBice-=Dpt#S~;A=lCQmBvPb zZc~({Y_90wZ}_`@%xOVu?JhDl`_kqQsxmrO_abEC!eSYP(#S!&@R?DACe}hB8&fEV zh}?b_KhG8k!cdWL%6qn$Y?9j;4NFR>pjA2hz0uOC2x{4^hwt1!-H4XeF1aczetIiY zvHJXJ!$0Asmb(?rB1YRZExc~J2cS~M`k#Oyn`lo z%2P`l`wfbZ-NoYE+W+o!W{bqPp!C>%iimdti#_5KkTZ@X&Qi!r1Dum_F$N%S{Slq# z`u^E-TQo1JJN12!K?#xUlhpFj(_kdI$VW}gJ-W>&=tQ^aJ)kMn2!TU-T7m3KiYm3_L+N=i+)l41D`5lV&oe>RP-?%zPK3Gk$-z>YG@jy=rjftd7>+9 zO4JD(@sp_7W!$+emff|r8)rn%&qw~izTBTgWIK$h{$!U&{4Vhxxr2#a?Dod_%chQh zTl@We!GJk^0~5W!lho_?m5~=@`o>BVkIJN;bl}_!zC}3+{7SgPh1_lIl5c-+@Huh= zUD|hpvk*gD20Y9BmYi(mpo6-Z&TIG}|0uyPm?F9s@CGM#x76s%qOALgEc|z<7kx{g zh;M|58Xln+1r;8!N3zxN5;vsZ>Deftk%}RjIr<_dTa}t-E?%o^^ zrVzv98EneUHS@!q$44;LE8Rs#a8H5x9`hgXJ;!+BZ(6*z-cO^KKNx(X>BVJVW_}NH z`0*cx>Ub{`@QU$XQiGpZ$QsXpT-96P zQ^qmAinY|mUH)nEjF)%(UJXVbf)c0~x=iM*R6Y-va;e>DvK_*z#%;3u56q4@+1u=X zjG{@y?@9jo&Xu_JYowx^Nu}#NmjmF)CpkFu3dOVZMjB_YI8H{aI|U<*aWG&%)RAL! zLiRDA@LeFMXASB{;m)O@gvf$5;}KL4_&n;%<5%*Rc{o#GgIjJwUPD%D`E9bx{k;&- z@QCZ1d_`y`L2f<@FV<+}i+US?&pv-4oZtB!~5Ki^=z{=#w@@r(PE zzseWtSrl^u<&s9MVE7Qq-a)34I`=S26Qsx-E!OjOUNJtjZwKSx)-gE#- zk}yoEXaS{uOMWn-639~6hx9*ku2x&s^`Vd)mleH1aQlEujBq#Y5ZFBQ62md#qqs z1HjfM$kCx+;0e%rmtgzs*lS?$LGBN;19%82O8adePz11{La%*0O4?;x@t2>tme<*i zVH=STZW+*T;8U~V=(DKICQm{hXP_iwF%Leyb6QnZ)UG>vV6LW`wBB}}QE)bQ*@rIi zr<=CE5m;D2h4ag0Jp zkEhBFejJu8p(R4do~8!Oy}812NuK|q-0<&QaH5C^p1uJ?6KNsPBlIJ8AK_Y?GslOd z9R#j9gF6R*acej6%VOpvSoBGEp%8!8etoEXa&6u?I;`3QGaY|r5PS2~$hSnWQZe@O zOV|G9itr9Ob1cL{7t{-kVYVt({QZ>lKoFs5wr=0@j&xW!-ap|saGCri)S8{CkMGi3 zpza0hZ&h$hB9aJ_asroM)-XccZx@c}_+Ei~dfFOm(ciQGy)M{7PpR(>efjJua=Z6l ze0dHJDNbQK64f^a1xA-H@?$@=Xp$SGTOK|U4A#`>kc-F(4lz~k>c9Etk$Qj5e=mtY zgvnscpou5lsOh^X+380&V3d3=+w@%Xz%45+u%_q8)&*-~4j*@2pgy;_rsV;y zP5F~((mB^@{o!#p<)XcxbO60`=IA?;wEC+j!S7*sIb}|Z96_qMgVDVH0lUX{>9}EA z(S}_>x4F`vrL(5xz~CrRTD=gheD6^(<=@iHuY`&ROPp^(79taGrvT zqb6gC-4j0B3{4o8!)%p4v7p!nsr3YTKCPhH*d3Xi0k{9FXt}yVM=wL5W8zZ{nOH7S zc?!M!AOy<8rOzQFrira|fguY+SykO|%esWz5T07n?PWeB9r!s?9qO(h_Bs?a8n^zipndAu#FEW(8fLwS9ypWkc`Iy&W*x2!p@&DQSV zF%mOz`|rr^B#k>6d-J?J(Q1lZl!Vkz6448EkrK(Jm(agBF;qyA5ZdQLLFNx1w}=%M%fniuKr|3c;LRZIrLLU(yBDbe88^XWH`}N+LCUS&nm%$I79xnAucmGOr7Qx%+6Y2|m*_ioQ^d5GiK%97 zbJ#)#Zq;InncgMDV;Z{@$;h5-YOI@N)9a_@E?C*k;qHMz%BoiAG4IC3lf zDaVnxY5c)w?P%E1h3ZZn9CK9%v~^2 znX<1LJD&T>Gh?cqw=-=!NL0_2cp+-Pn{-Y3)v|LE%MxOwmS#HqR*$D1gJLRDC8_$@VL)wVOw?j+@a(A1Y4g?wC{?u94qVz`jkeiC{ERo5qq^sU`Q_Lf>f z>rYusfN{(leDmwRD@izebxbg--yL%#B8J0)udi}iEvBdC z-7h1k)xxbkUus_ns*ZJ5g?wu(){^}sBde(*!tQC6VxW3IoFGGims+;b!4st-dx3DN zlJ=pZ3lFa5I9c~sXe%f0P@?7S1$fn=CV1e(n`T4H#jDj-mNNPV&J=dq>04^+Zf6*&+?4Ldn#)`zg;^Nh@xEp{Kkw^8HhIk< zWzO91pa)0dj+PN4vQ+V;)zK;xJ>Jr5`N%hV$S*9=@@2~%I*T`r9FAWewR1Bw>T}je zLTPU<7^u;GS$`REQRzM@#yk!Y(A%Cp!776iaTILhGV~AlS;%xZMXj?+)lMP;6~G-c zTFeDe-S-6dHbJEoujs0`;mEgH_yR1a>It~wMAIq>t2#YBWt@4@V%)Zo4RyjVvOd>5 zddsR-CiNjF6~Zr~_rc+{w0amd|8VBEhF5<$)6ax#3_;8gTs0;=RQN2TS6f4xzLU0%GpxLjbunLjA)G^ae&s*G)u9;Q?cY%v`FRr6zD|)kL-JxmxtP4EDZ`W z%uz6R(s116D(#42pt}tZov+Lc%Im~f-_Z)FEkD(19$d95dL4NIDMG-S5}BRzz$D+P zS;B{iys+On-8AO1wySJ%=2H_kMWjPCVL8^B!cBiD1~Dv7^L^!yH<)5%=z_NX`0RAL z^eVtb7PDRSWnzOLjm2K&YO#F!v zSw_WG;@)jiy_|X=h%6 zjk;2`*&mG-F8@cb@R=>dM2UPPIL~eGi zY-OJe>4ybkk!;3M*(u4_ZmDXk-I6wL7&AWp>dAelivg?UQDrjn37szYUhH_CJ0U%W zVyCf9u>3T;Ky6JPT1h?MC~78y3QO9zO|vuj#kzh<=BH%D9ohPN$hwEAQ^q5{b%h%p zP&-Yt_ykA(t0c)r@fqAIhkW(jDm&}$y;1aADC^^y(?|{l*3=TV)G$Km|ZCA&ak+6TA7_I#;6cbW-eIL>WWL z`j)T5aN}|79i5*!5&;C};PR=JhNaUV&)EinQs|g^4a6>3v=e{!k8|%idF*tP@55AWIL;1T@aF{128joUq=Rd=}o}@q;ss9yo93^t=3igRB zp$%4ZCz2R^)3&-L&>v11vZ1)vUD-(yR<9$hAP6n%iW z0{(7+pVAf`DPP$yrNpLE0?SfY7vNrM;=NgCl=NMP-T4Aq8;*d7K-_qm-Yp-S$OsXZ zg<>~N$B%_1xEjKB)waE-&`a2U2>xCr1S1LQGp?f|HGjZCOfp;z(*1O2`-uP#SrB_K z=w|&8pWn(XjN8?e(SyS1Gr@Qd3JyFkKBa&kPk^66A>mN47J>8iG7CwG@dANC9u5Jn zfWs!ZywQwz0j4UqIDFAySvaFO1}t@pF>#qA1`jy_FuD3eT=0;${v2USZ0TsoWG@Sa z0x`sMQv4aU``8amIet+%{!qXlXuS-Md-NXBAm&DBeIn0lFJKwa>2MFqP#pRszOZ`x zy^!k&u^MsRRb3wOPhdcK&S%0OI~mgdMwa-a5bGs2xo4@I#52zD0S)5<0IBhO{KlVc z?*Xioxr(s#;-Evl$t#|BR5o<=eU~{PtF{7KpB|voPEe>Y&RMq`s3H8YrP-Nnl6EdV z0Nl?@cW(cP`O}cZ6U12@!t@v2AOWofUW*2&l58kRh}EBJp03#r3iQYwcqONBy_v`~ zj-AE{`{J@fXM$ z%9BJy815rDWC5c0ktsyf&O2C`3y{qHO(FGWVzC(*y}u zHdzj=_@7BcNv^B*({ zeVkIbRikj*Kry8sIb6%dM*K9wav{XUNv|jqTP$@+U-@r@t)|MiAT$ccB{RE^5N}p~ z5pjvv`zNXYYoRZV9n@zGau0z8_^Z@S!P;l;u~=4tQ{TabR8WdQ2+>#Bruh=b?xkBP zhdco^uD%PpQ=A&|>kDC1j`%^SZ?D;DB{;4yarp-<2!;}tm?ueS+8?OrT+Gc5v@iTY z&6h)&e}}nqfe}T&BsMwx20wb=(Y)*XOr#hpvJck-%gm-+TL^6U#C`c7R@%2@^XuDR zr~04|-#AW+kq@{LvIHgNemV|Ul*w1~8E$OK6h@FIPQcO&HV%_&mbQ(SP|{-xaA9GF zgRgEOYH=xT0My?*YFTuJP>G#T;`Q)V+UJYf=iI7v)uJI~?AT8@{m!vcUB9V;G&fbP zxAtmfxYS&kL|l!u7-2_%OmE;Xp2bs>d#JyeEWvjU)=QLtCG$wENPV+JGY+E1X)Y7l z;b3AfQfCtWwpqHgQG$xTE}U}X{h>Br8nxKs%U&Z)ClweBGC4w-T0kCC-dshF7vd86zPLQF5fS1Q#-bL->vO)Ua$ks8tjF7d!eX*4 z?UGuJEHClidXAIpzkadUq>UGhLU6A#O$JO$N1Z2U$AtkbDZO%-qw}p!x1Y13$W;I{Wrn`|GrvofY-mBD+tdr4b zRYN4Tx&N>-k+DVdQJYcD52MNVzQb*|AeY@_B)p;@+<7Ezf*5eE$LXr>O2)Y~wc!&_ zBybOB(VVM3H(Cz`xcz;$?*(q-gk3L-yLxegB$AMosuVTVSVSAEVeTwaQCFDLHA~_< zl5^EV|2RYe$jThH7yA2vfj$%eW6I&FF+s-~kae1IY9q_H->%`cMLUL=X>yD&(E zd|UO0YhP&MlDe)xnwf!+Qc4T3{?}m*tNdWeZSA&gll1jP(nLCLp;e{gt^_sELSq^f z9_W;GM^Y<|=jtqc`GrJ(x(iZ(_%GIXjeGg^5sbd?wh+jK83CpM^#2;YKJjvT6d+kL z5+DbHC=#UCZLH1-sLqvvW-sA8$$A67yh$ZGz_f5p#iw$$0Ws50bB==8iXQ{{qf_SO z`qh%4=`@!qRngU3^^r<8{TC7vz{PCO96(0GSX&kvk-$cbwy=%sA;)oe+3)ika~3~f zTdhbg?EgLpRlFxb2Q-}6pj&E*W$7m;9VPy;r8fNvcD@w&kS`|X3!=CU4I(7@wCQMZ zlW)4mf{Rm_R%11OB`g2d+~PNrEB1ibKil+_!1U|IE$<%={e_f73KN~hS2?8~!H#W% z@3cp{+Qo@g5%qr&A4Nzf_8M<&X2{7WB$_ybi6rGK3UVLsW!XjM+Qq%ilt^fSyUoG( zNV-$r2>;$%RTOwRNK@D(lyj9cIYlBMBWx@yHw9GK4S6O*w0*DkYeECF-XGTURLO@pP6f*n={)rYXs$RJz8w*I(x{ld^d16{7>~EAFxr)3RW> zbFkU;J1mH@KTUEsLq}afp)AEvJ)vBg;&dB<>Jp)!)RS6mo6`BJXDNdZnTU*JNjBNI zgM5TXd^7wwO9CxKoVI@+$Vn{v4L5rEweXUb1TY}b#oKpTS;S70SJKkQ<`y!Ihx$7d z{O2)!XXJ$4gNhVNMbj0=yU!Vk5I^mvlrK^HvvBWEks<N$@!Z$^qStxj>nD`#MP zq>mHcFqK23xAhYKJq%@Ekad+-@@KBC`O0U{BtDkp2Ah+#qeu7HR)3O)W)ikJGwa;V zu#2P@&hG_-?>uhv%DIK;6$W#CrOq{I&BM`zS{5vH54V)Ag%P3yFB|H86Cm80ho7dm zPil1YE3>aJ_pZ4xROECxroo2hVfd>EMOP(nZCJi^l;Ekp>`(5EdFLcS_?`ClM>gFa z!4-p<)eNhJoDyvAFJV`|Ay|RU^sa39P74gylnK<%0qSSN_JVVJUubui-E4ESV>N&( z^tE38FlZbfeSy^_e2O`CII!GVqb=(ZRU>#PmfD&r*ub&MiZC!{%bGYWzR2cMG8Lor zJ|QSD=oxtR4MB6LnWo+CH4b1$gQgPuY+e@T*tUGbHi9L<##rUBH?noUPIPeGn@@0i zb!y|2@m6inIZav$4T3I@_uYTq{kf~V1fE>T_2)e9+AsUH3T&PY#aeQ;3D~1AKYOP! zbwm4|^f`bU-!LouA<*$daNdW<3m=||&V@V9Mdi)KF3cq^%yr)Hb~O8#wD7S&^izrB zr;5B!HKKF3uiaq%2|X984)*yT(a#^l`PqO%!nQaZ*yFBmy}v!GKm)QbZ|D*> z4jq>3U+tKcQWdUqC%=LLets4W`#RwCl?{Ica9Uz$+Jp4(2EAH&A@cp>;!aA~3gq4H z_QFy@K1``-R?ewg`QNzo@{c32%TnD_7p_e+&=wX7VW2$#Yr&L)=rm{V7r`Y>_wGHq z{Mog_{U2Scn5Efk|6OXy1L0r6B*H!){#%$1gUJ`H-EuxM)B4D826O*!d7*ck1+*=S zU-P;~TMRr?ZBhQgu)2`=-_q_Y7`-`2?bYw3o@-whjy4zeZ**-6-d}56I<*U5V(DMv zaQQvGZ~_K#vjc$R&lcYlz($t-4HU>TpZCl4m5(= zozKG-9#UXcPUu(tmdeTVdVg~RbYSUNscDHpo&oPpsd|cz)xt=t&y-OL>XE2no4k>M zZELpUXxsDo7yfG_d4@0Q7CJ)?b{0lo)Gzhm=~%>!UN)=@kh$fY-o9*Hdqa^l%r~O7 zH+>n+yy&y|w!L}tU7=R2*o}^s?deL38mF<2*4+;cw@34Dbhdq)e;K&DIM(^%$5L-N zi@0&u%b#mQDRR!^UF`>(6D5WP#@!u9yK~JxOXJ-dx3BO-iaBUuYJVMUO$&2G^!Db4 z^RTL!n)JN-_c?$S2DMW9k7)Xf0kw>;9s~nrvRZzf<6bXs6}p!I1{qC#G(A@$1TLo! z1C8%&twh0Smk2;`CjV+Qs(gqKsVZ8z8msg=GZh7DSGEvV*{EDgkk>xXD=l^DFN)UW z^IA`0ZNG&EdH3B%gZ{#0zNBh0+pS`_1fak)hoG!gluVK6DgN)cKN?m6eBwM@UEr1^`G&Nhv5OsH&=JXlOtI=Nr&m z?B*^27c}DyEiEl0BO`Njb9;MxH#avQAD;*3?Bgd-T+nDV08kA8EHN^k0RTVf=#~Jm zv-1%KTauOS0iX*2F7;5;ALluTX!Mzj%aXY(;OrUWQUCxz0swlHRR}JC3^bqz9@fC< zUu9}q$jG?F$n=>J`Vj_Lf-_R#5{q!zPnw!b>godk;2D7RL`>`lKxqR8r@>@@a|$n; zLVsM)n*u!Tg&Azy*euyNd=3a)L}Sj-`lo2OuP$LfTyD{9y{GX2d;uVh0;BW*dMY6G zXMmV9K+h7O=Q%F3obhZ4uyh7kS^}J%osY1yYSSNwR;N>5QJQgWvP&e`St9zZz~!vo zeW@50KZMSkaH*RMsGtT!&A4P#g@=d7#l@whq~zx2;_(F~B_%aAH7zYIot>R{e9svk ze^yX%*3+|;UXDNONmy!2NLWfvo5#OeN@yLes#>aQ{)i{g@EQB(dleM_D`-6K={f5u zI6K3iot@8n&X!_!s%D1@&fcA`7L0H9EdJ=}qxFpb?(gp(9UY}om#D*^sUK&ir>B?B z8A&}C>0cIKt=a`M|j!zJdCZA`} zB2ZZ}pq~aVv?X-DRs;6eRM4f&RQ>|Lr)x0o39|+6AJCzd3=lHEdDH=TfS^~gIN)nH zJs~uJ=dd93SQ`bmJ`t_Vr<1I@vWNq5kgCN#Y#l=DD6^IxO%8%~)q+isaE$>IFbsZn#1(?Br_cD!Q=;j2190NY+Aejc?1mF%FMxf_TO&-qYGDTDJ9#5%53!i$c z5P)==rlpu{O8^Gwq|@Lg}|no|UYCeoEv$kms94cV$^Xq1^ifo)ID;Xyn0%%VGNXwznZgZ)S*aA>6_)Q?A% z5CLMVa;Ee%r|uGbSyiQy<|98muiblXm=wqJRyj%}Br*zsSrs$IKZ#_vyanV~ms?Dm z+m|co0dT9n5uUY%iGv^~9rDPY_Bw~#K`D{NTGFfaNBLe5bVS3Br0we*L7^8ADI#^zHaz(UoViX_%-9X(N zdSWVdx%vvB`|EvHG;q3_zv&6^WfD`Ux0Zr4J$4>tiVTDmI?))8$M4rPSVp~3Vc2IH zYn%74$UIn$V`04r$~upd4jJm^n=W&*BIIY^b6GyZ+H$}SwPr5=`x@aDUR(F%N49*> z%Svh0(inOsjnYE8ZBZwN4^0WXyYb))^>JV{6iBba2y2P^EGXVrUM)VVGYD=|yGR1v z{e%DcT5CxiyW~wq)8CtmQ>M^o#jm_s`c>zY35(?SmYJUlo1oOk$b4=4{f47=aGy{R zx*^>K>W{H@HLwm**;LJB(C5~ePCUwOD`HG|`+$Kn;@AFK>j9JE(?)Jc>ulsTLf0+) z2bRPNsES6or(WQW-O9vFbL~UUb<+ODLiR)wn!6f&m&W!04~atY<{3rt=5Pq@U zk4g~$STPUb4%FPJ-f;z!jWGcCS97krA)aJ&1nT`KJ#2jKcen)W09~!x#KcoTrHhO| z1OWQJm%zDmOJ;7b-(0{bmht24*5|@}rsGB)W_kcj5*wrb*%0r7L zuL+=#eG00EFG>x;1&HKH%)D+kzERk$%S0P~PbUiltH10^26!%DB-EjJ+B=sF-(@zl z%$B@sE+8&F>U!L4KKaFKBbAvP7_Tw?k)$EP)U|ZS%wu`|BI0Ix1CO+5 z)>V!Gm4B?g88=0~pg(680JiF$7Uiz#$`Q=(GUIqwyHLn&*m%P4xa7~QRhCb~rvL(I zkcy`F$vz$MPxq~xAk$T03)CBPvc&Dx?P~1e-Z(J(LWQ`zo^abkz>TigFQkbB4bS(q)Qs9GKRrUw*xtzP#Fqvj-@)K&-G zUMcX^1&iN~MHopuvx|bfM1bimw z(z?mUgjzLRilw~Z;X(Dj;%l0xo&M?pus7hrM#~`KlU|5%1CjsjGNZ;xA2gwXByF_9 zeDkDVU|fl?8_NwoN$*h;4wvKsMZ;15hobWgWb19icoIQk9(&YCBKB5l6A{GTtM;l< z6tzqLL=dBPtx~%+TcfqLRux6mN4e_Il=wO)S*Ej%z97NItk)%7i7i=_0+`}b+Xb;zT(MNehT>RXB z+~wU6xI*LbVTuT?G7@KY6&pUCg57a_(=0{F1RJ2zir4^DWZKYxTnhiw<$3r8v@Jo> z|Ng{fE}BmQ&wH6V#ufYdew$I?JbjxOIygfN3Ty8{z^st#KvO=Bc_bF#m)@kiZv*2R z?f({DRn5%zO&Y3p6Y%2KrzkeQ|Z9NJEgN2#+Y6s)98GlOa*mg^etP+Z({YI;~e3^ zRS(BhDIP6^(as=44jG{N$nOa_*}}O0^aFaESDar<-!+&uEiu1}9;K~2F0(h<7X0J- z?G6W&0a}@aK93twoermxg~xu0a!m&I^1XK+-&G#CJCq$x%LEs)3AvjOC@bEO`QfhO z8kp=#A^nAdY)jKH62%7dY%Bmwg`(+vLh;Pem>&@^S(vb5fK7Wy`n3qlcW^$th<76% z`mS)A3aH{EAoU#}1rulJBnV^^U&co>w1jIdg;L7Go8N^f?zmGhQ6wXPgdbi;&0+8g zs;eTt)TB5>N1TCAxL!^S-TKX=*SDySVzRw`-i7->kWhyu_t|6*SA1Yb0RX%MzHx{f z6(;eUlgPcYBwBD{x-B8l76v(T&zFh7uTezRLg#<}rvlI@Jq9YWZdB`r&}n(nkkBL_ z5>Iey*AW~jj7*Dg_wWHUvu>&af#(rHkYK3%qI<9~T(uoA=)Va+3KJ#~zC@twNvT}f z=^f^trm$ofQ@~SUAiX`{{54dV8rD8rX#Gemw7mRh3V;4W{)|2I+%6Y(7btrN zB$>t093|EOK^oI=;&ccebkk49t2QS~V4Uf!&M5l6F7Z?{%m(OU1}iC0S1KFz`2rLG zsH3$A9CV%P5CkDqQy^u#>NNYifPYBD&_$j(6vTABBms3@ChQs%J94N8!f@DR)+Xto3#jH08d^cQ1R?&g|0 z2ks(L>15%D=aDueP<+4pi(eG^_^<{nP3{^+MH01ObK}JO#;IS8)7(w7Dot;rsTm-q zMKWa?d75A`kxvA9O_W(#eG@fO_6LPzcwW;7LY>{7N=bB6b}EoXBj1aa!LU49grJVZ zfW}ndAJ(Cny8$8FP$Wwg4Pr{)1u~WIq0Sr3lA-q_J(NxU{IQa*oVtJ*wbUMZv!FXER+ z-Qq4e4s9b97y@D0OK_|48ic##ZVT#oAoyP} z=m08v5GpR6VEIn~C?W$O=iE;FHc^)Ms?^gwe_5&DZq+USqN)Z!u@+s!%T#P9zV0Z* zzh%|R`bR9;&$oSE=Eg@mECcZ(k6m`d9fWgK`V$G|RPy#T)WY&k)9t-0{R|~7FB&xI zh*mZUtrSRvoE}ZJSqDY7L=L5W^ic1@8!QN+t@P$;@uNN<3w|zJ@$fxRKK>LIgw3vc zVNL;hbqA2n9SVSeOblN#$G@x<8O}O-1OzuQRx~giQFyIT#_GXtTnP$QtioD8gl6|J zmb~h|G5}RE1|g^;(jKv+EU`UUb4wiNT#CalZS)l5|f$k7J0Q zpftZBrF3Dkk0XurP{UfL z_581~a-Q+|RBCjC6!@?hCs)r=%ya8dQjS7C?YAnbaRhfVL}W!f5Xwd=Oxr!xi~9S9 zaL-Tcni!d@?@GKFt9)2^NAH{n*?&+uEo(=ksD=Gky$BtrZfCQb@W_``30X!s2 z;B|@o+W}04^C{@U(r*Mjz0ru5QQ7^|3hpaP zr65bvp{oUBBqBpVfv(aa2=MND*Dp&@d8=@fHXi0Gop5>2*?)Upfs&p8zWM{yv665} zfLQ>fED8Q82r{h)Y{X|c&1X}X3NrrW&{dSu9fg}I-f6pY`*wj}j#(HfhE-1zAfCP| z%Nfr-Yja0E@V^R9UM>HXU32@nA`R0#_Fz#*a$4L8(2tdb%t|J+Y3D>&m$OgW^riP# zEHKWzWXP^$)Cz$0Qe=?|p0l^BnECk7&sbP5WI8d~1#n6zGjaR{Zoda|KzB5NI4fJ& z)#(3L;lxT_i)yF$Op{mYB$=3(3WquyD8~|cd8nPqBOrefM+qBk^Nq6THtWa{ey|ZZU_c<$Yt*2Rf}AOC1!;;XcxP4N5X$iv^3_ z2TQY(%IjWh4J2>Yfg6LRfWaTY`$~$UEzKqKwG`BXlLB z7E|$(Ro3^_642B)JljrDcrctR(|=T-`xBfZ$$n%}r^71}l zMh2cr0))jGoEfZfWiy>3jROuy!NQ2|Q6_&KXLQC?JvNO6G^To>PN_0>d)U$iJCX#)YT>bSDV?)sqJAgBk+|L4E|^dQi}m@ zuN8mzx)a3rrNj`E_Yi1s=J=+*;k5%e9{|nNVay-9C3RuW?2S?Qhae4BVY(rZ42UU6 zO)mH@ zVekMIty8`^X1}JjweSAXoLM&>Yqvvfb%=^Lb?w7xN zKmC4j31|NFd%68==VA4s<7)~wGrAT;dD?k0`M*C56^d`Yo*;&oW-oSTCtgFSTmoNk zFE}$T(K87%Fo|ZwGCbI*VhD3;_F{0Ld4ImDd@bTw^WUkhO{+*Uhgl{)wMbc(Hf>y(X4r$o)lcSVZT3Y=dRTQ|Hl z^%&(;r|_+1*2YBfRCXrdD=ajof9+VMHZt-W74kqgKbJ2g5JLY@^4J}^4kps`^QDit zV__;RkT^PJ(1XHkfguS&P~0nnP_;R7RAd&x3mSlZ5aS=!I%%Fw(OYo=0xhJ1c>Mdu z-aQUn?Th_K#pie)R9s!TE%eYa>QGOZC;sf}d=_(gQn=YOvVfH+FLh6cI<5eolaT-7 zt24pwZ}bn+f&|s{`Hew}kj>$!&!9MBCWv9U>$}E#$WkL}8C6w{GJhZE3L2#WY6O3M z8#2`-`$3xTk?7>~+vgZ^e7h_n=TdM?rZ`z0He1#`r3XfyvbtP`Gur8T{TBYUd_v%H zsnl-QN>yx-NMcsc`#qf6vB3;3xieI|N?r7^qx9=bKPU+Up%h7!O+$k)48)DAV;~T! zx;E$0=}=>p(d8cJ@=Ciz4l%kAfmj-qo*GUIz(6~IkEu!yRK6VzB@g>NJ*AKtjVhBiC!M~(bbPWE< z-Qn2CqpX!#HPsnfs~-(B$oV=8dCn>X^QHY{(mm&vEM>L;g~xOh&9T*|*GB8{S71=CElEa^Zx5WQ6kwusfik*fz>sYQLA{05OAm{@|8}1s zJFr3s!<3J~<2WLu~j_d}NQy$g;o$8bKlD-DeuO%_y!T=uDeZ;1~ zunVbNOej7%-3#iO@`4kOWp6c4vNE4+j9^vZZV~wod1Y3D&nC3gNLC!iucglSsqL*< zo~N{>G@UIj##iMy)OmpV27 zC@OdNs*@kYz3nSMo9Eru zPr?@(T+YO<^sCsk<}WmQ>)gCf9c9@*CGq%8^$pY95aa6JhT4w_0y{e z)(#KHUuc-Lu;LIgU|vE3CC zWEJKS8}9r(Nnm!z!|u^WWF2x0LJkWFUm+@C)1pSjZ78CuJ9Dl(Ri@Z0CbhGDGt2|W zZ9lIr(&~=&9~t5X-_euECj3A&6~}PYmkdl*le7Pdt-@+zX6Awx2QfNJ|4+Y2MYER$ zCZ6gl+N>&?Gr{q}@7ljV3e4XMZVHdaInF*DpvyKgxOT7gO)AWvx@FSi;?MQe!|7N0 z8|pA_PeC}!w-AMsA>I+sfsWA#vf@U!%n@!$Z~Q|0f1OF2xT}38bAdb4f1;a1lgs;{ z6jIeu#FRgK)OVP*}rMD^s+h5ExqftIqgz_`MZ%#qhH&Z4;H883??8Jsm(QD z?JTKi;-E}#a!xF+%Z?E?A9lVSzbd2lSKqM| zAJz!XH0~Kr?VkoL(hpqJSWl^}8WB z{dM6^*yqmI$xdGzMdGLNM+dj!Prcz0wk6c@Zf}Yp|-CB5Y>i$5s&C_o4GIS;St(1%7lj_b{&8gGI{tgKP**kjq zq=T3$!L1LHK1haJB&ks3S|f*AVs`gtvn}+n`NxC%HNS7KraRAG3)47RDgKAQ_hKV) zs%MX)rJ=lc!BAP4MFHE>9g|D6xuC_4vdZ_Un`+U%5~Jk4-n-C~Dz=h(QK=d7xi{m1 zD0xovk4H`EhUo4}>aI${b4!|@?$paRg4%=dQB~;V0=)jdBZf9nFjDNDJ0b3kq^T@F zDvmReg+I+zsj*g$BTxFOjQXdgR@u&%(J1l&^F*z99uwHGU~}jmUM7Kk_@3C;u3Kpm zY0YWqq3-WyL&{av-#8h|nO>qXEbmlF<`j+mZUn(+B=od$b!{uFfaG2-R_?c^%`8@; zq!wqy#Hu!2gSb}irxInDT1)Xv5ZgEq-!6cJik~o{?CL6%iTtq6B~@sJiVhJ($=9is z2BNHa-@pD9gFU?mSZR5?<8;y=J6_r;Q=hGYD6coZuy>$&@D+vzh}gAu)NN!zJuFr` zf!DS65T-QJEnwBsKc-4tn!_|U_b%;WL_!A}LDx2K3Omp1_+s_e4>i{hF%CmCoWnGu z%)>%&&<59YL{IX*_VjxJBz52Z6ROG=sh0 zc#{l~Z)dDQ32HO1p)>J7 zp+$CkKI)O5jA%uYZI5--oAIAuBS?hQTHMpDiBzJMVNVuE5Hu4tFiyEI1@mV^M`qqh zt6FNs)c016Zq#J#5Jy*1&0x5-Aj3|y-XCsb?D(5GBA-fR0!=MQai^HWUhxm}xP!l; z{F3ZmquRj!z3ggOj!H|vLCJSJqa|*h6E{LJTG;*wjEU4Gb-f<4knD+*uzT}DmIt$& zCn%qVTRVqNRbeaVr*u_8jRa7qea*eA!xi(XY`+ax3n!Brhc(q6d8+l;_-lV;?OE#P zc!_}QVIcqJ8wB?Iq=KF|tJY@VA#c%=?xB;r?q*w&)1L(;V&#%CPC{(7Q#^njr zBA^yoa*DunxSoUsW#VAwYHGy#4E^fF3#H?G^Y=aN&{-;ah8g+Se3cgHSU!tdvxTwgqWBlCpQm>dCig;&XD_f<#br8TnTE}r%0Nig@BL6{|pEKM)O=8V;O35bJNpKlr$GtXD%#zA~? zMPrLhBZ&)+R!xV7(>xhkuBM-q%ml4WTIci*wfp1UCoB$W`RlYqhq_L%kLLQ(`buv! zs#R9a5~k1@@6wH#j^@N))!DyNq85o8TZQNATRlv*b}f0rct-!NOU+$cPf=*`<8ARYq*l^?RulBIWfvn(BwI{uEzVSEpE- zw;-`D)=bhoJ%OFTC{LPU3g|?^EYm71iRVnp-0*474grNR40KR@6#ox z|F6wU{}!A2o{8hsX8MBq=kN2Q5?1186C;@#+!KVhR;SKZ-%@^}S3JMuen9d|4$}|Q=agt}J$>|V9&)_Bq(F-t*Z@u(sDcCyLcp1+)N4HA(-uJGO zY5ilH+CQe=080pcd-<>iGiNHY6A8V}8Z}*8YB;LHI##+?;7d+`)D~;2XNRA?=LElN zrDTX^o7oe0lt*W}AIOumOiYU$L?OLPG>i(e6;^ugqX z)vUM5ZMCd2+^KBXl{a#pd+CgMIo)72$0Lkurw@l0K9Ldj6}?`OybhCwOglV_UhQ-0 zS28m=Jp1J4i>z9SfY2kJT^pq}*>w<{%`of*? zWiy9@q7d{cI3ZIKq^;o@QoWVqWsKAEmSE2?u_MF@F+{akwrQu;`Zqt^C9pKTy_isb zIT!ye75pLZ#+yHz{P=Rrokq|BO!cD&5az`e@5O#~-Tvbm+9o?fV;5Hkg>{Ni1MEk= z&zWaG^0mny{9>5PZvk!Hu$yZehi3nOwRLK!9qH@pplP^6t;uU?_?`i02?A=%xMDwpP-)vGA_WhRV4Mvy4+d}J&R18sC zZi4&btly9Cstt~B+y3X&|JykSC9*}=;17;9wL0Un0zb*$31$O_NNRfH@rR+#tmp{G z7e=W<5h3~OY2WihVrGMM;kw-~j<=S422O*w0AkV!Y~?ghhI-Xvr_H0$UqM1HbLR<4 zsZ;SA%v<73!_+W(c`>6flpP#G;o_<85)h=kp`97D#eM308%p=oJqVoGb&aA`;n>xQ zfY4-8CC{dIE}QHInC=#NeT8uvl)qBj-&e^IXdbw^PqIaaC4b1kSQ_#t-Dc`K(a{P* zk@qG857Do`(T<1d3Q$mtN{5iGSsBXCbih6yn&C+~z{(RvqnA4ghi#Wv%MvV-j0 z^|JrDckfH2oYHByi)}XJ)zA{VT)imPB4Vj-9Vh%5+Vz4U)x$d-)kNehRoKeOtu&=R z697Zm86H(7&nZ12p_zDCUBarpFSbBCk1|=!INd`PIW#%8VH}~2)Etr$7r?`Bx8kQt z7k~cu@bnqKY{iD)IV~fZv|OUg?dLFy>Pa2s7U68u_^FOcq zuTQpM&#J$Z9#F!xY7CJ2a))aJCMpa_PXcsZ3r$4iqvV1SxhY2ZW;}S(7{*XV1?2`a zuh7rbP|4rh)Xp);hiU&c6F3o?Dp5faJ^{&Vfyy9oZh)Qs6U#Nd{!$eEk0R>(@n#K~7 zZ7lxagAWJHR8*KygTvA|Z38MlZha>Gf($1i;b)_Ad6{MuXWMkIaIPO3)$arLDETv6 zv+NwXuyOYA#g@*9lWzyV6@xx?uZ;g_n@@kgGSEce#^Jtw-BP7IXim9mm6Ke9J?M;7 zIvf}%6{)P=5!m`{k;(XXdfzrT^9T@T+Fhzs#}*umvZEYR|G|XgPc8|zwC?YWz zwoF>aq*>>2;hgM*Q?mgk0PSY@Ton%eh|sxciq_qlX-4 z3O~alyLV#>{c&zxl!YS6ME+tyCrlz+j`QBtaI}6Uby!Q47tt;p9}CpQ7YjW!N8_Kf zu7m6!X~rF+bSh+2xbMEB?-VSkIA^s@>0+>24fbAYcWgM`>yduxxRoZ>G$QLYLcabx zNp1{b(BH#fJb#pu%dG-qqhZ<@pQo&#K=$l2(DBa)<2bn5OUo%F2h2r_W#W@!1%)?5 zI6ma)5yNCm3WkTgyWce2{PU=Iv9I^O)Wu^O;QU^Eke^CRMKZE8Unb`*j1F(R-_AVtb~2~diqx<#N6WItk^ z5&Y@ZBW>8xJVvUo^Onk;R%By1d%;6xsRZwH3(I=NJjT@K^c#5$T&9VGl8`hP$wrh( z>m!Pnjc>y~U2yB33KyaY?$o0CE~21Ii3X2nfan~nVOE?T@s#{MDN_6$<7N^s#{mu_ zC2u!)U0Z42>r#JY&SO0#GH!lduYEl)Qx|_*RNnjLb^MIiMfrV- zs2x?WSvV)nnEbE#!ipcAFR@PavdMBOLI%N>gg=4g$BFvx?ohB)AI|bogm3+e)vexv zBJ(QlQwn{Z`h_M7bi+$oUomroXUR4JH2{+GCrPxN_|wYFF~JzO(3v3kByNu}+28k~9}W_wlKVq&p|Wpdf^ zg05xyF0!_<>VSmPqpl;L$32NrHkIp<(Jbl*qMi)Vb#X2+eZ0VHXq~Ydj?ZcTNpy$n zB$AxZ=Tq8b*<)WHyc_r!W?Y||)mGdmCEE0c%?tta^KX<0rEW>!e8~QMKE=)Ol<@IE z=wN;t`lIWmSBa!H@i<<>$1O;>x4hD=gdu_Zibid_oS?VA4 zv&L!PqO*H8syO0}zC9q9bf19X^K;`IIyyI|#s>*5qE%jJ;3NiEhd$gpeUQ_S+6)Io zeauoss?J~dS5UO)7zNa=rhNhjTwqoRp>(#b&IE-g%<#0*Xq@5A-djm{ox!;^`E-vn}c--i_nNuv-4PE3C$V7XZ z9XvpDmQ_cVnYS6ac9(7Z>Ss15XYVlNV0Hi%yPyX|xvGRoYrSMhBbxbZzIE}tiagG& z)`P2e#MzCbx6uI+Bc!F-8UUcZ?>16xWSBLM3!K}WqWJOMVZq=f*8RLkQo-ih_qoo(P>cebpiu zm<3+_xlnr>Uha|#?d}W3zysF^D^5O9H@iNb-@Q=OOm$l%-v4-%PfU*Zpm;{JspGmh zz{tntDBoD<@kEf)aWb{m^%0I<&4eVgTXGaXtrV#ezxBGnRkrk8W-Js%xc(TG;!EQ` zi%9>*Jo;smZu!b~U<5hJR|vfO>}TA)YaCv}5*114y!$I<@i`1RX0J?uH`G3ds_*+h zQcjy2>a>stio9AwNoxqfl_`DXuW`JvZ|_Eq_nEzHlG?JEvgO!wCs7ITkF5WwN^MvD zT0}WHjN5tc-Fg`d6Sndv3L3f9Sq**AUxt^Q#F~mpzjN}l&?#)U`Er3=WSsuM?2uI2 zC!?l3ES;d}Y;z@|cP^4cPI4~!KZDhTYteZAy>L{q_*=`lf8gP24KI_teSXmg z>$Ng6{kn}Omd6T1IUFzI=meg);&q=-iJqSu&{|lVfR5*Vyud7kf{jFYn0GKIy!c_z ztp54f#(mv#8OOb6qaQHY{0C54gYkKNCzD$4VYO16j4afhcGI)K4yCh$|sP5k%qMe zr`fNaT+2jr9I?%apS#dTS*=MQM@&=sv=iM3TTPR9#*4qoBGfIGEBoHz>2-Hextt<|iU=fTN*bWfvnVYanj+q`MTtYwGEA9d(m!0S&B>ZxmnXBl#bHLrf?)On`;7DiCT0P z&=t^;N)}0n;LNaKPK;uzmGHUoQP_qxK93y*E`yD7JSk93%3zM9KTcnldaw7&u{^yQ z32a%p0F<}rS$KR)%-E`;H$S(l@vJ|$F@MHE54IPPr+W6h3|UgZ4f0Avy62j+ceuIh z+}JYX#DFD`vvF2nK394wj;Z(xXwDmL^9pljN)ZV#rv}IRy?4WPj3dp?@0-cAwE@W= zfJ7t`$8v#YQY!yNcmIYN%N^@7QY6E}Y14nhfOaFgjf?PAGG1x>6Ox;-zdVLQL2dkM zygx#1!>hRxAxG9oq&uZAR$qHo$JBL#p@g<=z#5HYbQqg6!O^MbBcb5zuhT@8Ut0@n z1*QzsCe`%jS%a2m^xUf+xL4`dm$N=qSG~|5%sv9KY_1)|6IKt#|9#N+zAF@og7UKV zQ;=@_AZ{__Sug8T{w3Df&rdI)|>qCYMmfxkZCQB zZnVEbs9wkp!jBWH*@&x=+AB#NL?is@mOzh9utK5O(#m=vP6GE*9DQj0!)tpb*9Vz~ zF^m!emD^5D8*ze4Vhl@h$WcEbBM8G<+~W;jCe{IR>9H159HjIbq!dD+=lR8z6p>dZ9xtx?yp~X7P4szspiv!3}O) z6o2`n;U)R&%T{oSiF+~ozAX-Oi95wXGSGAci=z(=hoH2NJ`}uI?fV{316N_SJU?AT zI2D&l!20vac@Ev#d&jkRQ!7&9r^>X5_&+!FWQ27=g{IpZq3NzcyaR#PfDt2+q!*te z>*7;7`Bg6Bv`0l|X|}?EfFq~JRu-Ja+!FGreP}vUFItaGh-*7k3OgV#28^9Bb%4gt!FS-5_X;wm{Daxlk-Pt9*c z)M`2N8l`{Jf4@!LQRrbJ;t0KaAdcELAx#-0MRDhFn^4DFvZ7eWRCBt*)rZ47P*J*z zMk}C+5e@!`r`;T6wBtz!`|WJqu-WztB!@kLrsrKcB&O&g%>DuIqIE<7KJNWE`&rT_ zvt;G`Zzr;@=dYOlgOqYtH;KI1x{QZqAn3N0-=A^U5#9$G-(BHhfO7ZyWBXl?+$Xrg z5iP)XrPT77ZblZPrzta8o8*j5w4-zm7vWFp?2nM|EBbNZ80m8=y%tFX3v1cYy&&H; zN2-Jh$?GW)2;XK`0OZjQqtzrc$UQZ19mevIVXgn2R6+MxHAO=c*8P=)9P>A5AXuNW z93yf^^6~i5W7Yd>P4>-H2}DT#)0r26IN5_8rKTJAo8d1@c#PbkMsd)IBOY%8ai3~S z!#|n~N*fRQWY-8DuRW@PzIOL##;5W(NHg`;Ol7Bi`g2I)_1?oxWX3eb1tIFuUyS*_ ztNpEtUNc{N-$*hGf)JeKLwx$w$8Ua_sBt4BGn2kW%+BFp_8RP!h2g&=f3t`=0CylJgyEMMf^;wZUD_)$3R3 zDO=DT!$|oQd-s-D8HDFQNU1 z5Lx7ztt>UIaZ5Mo`R-jPQ=R}LqG*o$q@?i7-qO=L#?$GFEAwGL-_Y|Rp;K>{WI>6w z%hvR_MmPryi#5c87?)%Dht`o&Gs5H>GGC)vqoekNSAos@9orVP!teMzJ^p=f_zhYvN?R zeGg2e6VJr&zQe`q&%#X!LCLUSj-LYTSg_SSRppV}{Da86b6Ig~xt?5|%x8kcQ;1kR z`^NL&uz0~ynZFaPUOl<`+uvPRsJ#TPCBJ)XzFmu&?2z1z`yRuiN;3$i9%sfW-q~V> z3(c9O$tC$YS$z7*Q**HK{;*U>VN>iNyzzO2?OEc#t0T^bj+%97)>GQdCpr#iK~+lS z;(^{H-V>NseLsKq&N7^|96hD021|2wwdYaEKC(RCBU8Shp((rI$BFg5&BYrE{Qr2JJ5IB3G_O*_8W$_`=c1D4wE@Y8jOqt5Jq{gQv;2 zAtT>>zu@zoCl~?nc!cs0_&Y|nwD(Q^-8ZU#Gk)p!`;<3F&4#?P7`dR7o*B8JM8D8_ z%j_GDqJ3`h&sCM)1s9ZuuQ$>t#wyeHR9!V?>xlMeWaLf7g$`)MYa@eJvZ6~B-yK=q zbb{NeLEA=11eId6K`!-3VWAN<#|mEolcJzqzmVY$OFauz_zO-vn$jbk=j0nvU?}`- zP??Kb?UDb!UUTM)FV})tAJ}SAm1*iC(a+Kib%tE}R(5q;1|mm$ zy8o8ig!%8rvmEaIZ6!H9Ub$6Hr5X9WYEd)yC_(CEtE@x&PxJ5%qU)7jTTKa_p|h}@ z7q%rDd!H{)E(il$RA?t>^6MAEm~pjP=wxCy%$+ctoWZLR1Go{$y2cgSr3Q(t$~m56 zIi(Ct*f}qhRyy8>S;cb}ZE)WxsPi=YP{6oMURB>>E|K)6BKNKkTS_Z!4go(uak^aR zJ0R%i$F~=fon`UV#V~9Zxgd-bl2=%mN5cIbuu3tZ0krM8<@}sIS%1fft}eXSE`DJK ztG}$ai_psITbRqR6jk8E_i&>UuhMXNq1o`+An&pYG@F<_J~)S0_3j~N6nBc&FZsfL zsP-T{V5KAY%VOVyh+ChCG^`fd_(?NCyadM|S-T2Ea@I-?#IMb;KoFP8ej1;U!mX8m zYGTU8)MX;XL_3!sgEzB$%-Qq!r^Ll0LwQ3Z1IC84zhq`DA?;lVeE}?(BTZ-kWD(VJ)~EgkFyEsCdhS#T&`4eP%<8 zZV`+ODu2g4E5o_RST2vQ#e|+yd^W`>kz1}==mBf7h)Ft0B=G9WjwJ;>=cM@U;Vy!O z2mJBF)^BEc%<~xnsz_eEj243=YLI}ZaW~B5AmYjN0ea|2rKTleL1m(Wv^J_05Qs3smJ2ds zYXR{(dfV0DG0At1&HYXHG_D3gOM)u&b3n{Upt8boG&W&U~A7hE$Vd7RdqbQk8J zshQNPoeD_P6IS)-Vj@@JHD5hbE-AKn(H0r*y_t?srK5(+e%u<}7Slalo%6JWPMR1? zA^W(LA!X_5kj3nY=pc?z)M0`#H2T72>o3w;E;xHpDWopfWyq5dDDvTU-IMow4J|+X z{hsbP)b$cNZ!ej2FR?(S4yLLi{8!Owr^!jNyklQ3_ZmJ{Pq9%f3JOcV>S%j`Gq?9S z$0I%|&wW*(wohY5t+sL;7jl4j^5GnFO}+u^#Q^L299=Lnc;0-Ct%_1CPn$-$6~$ea zm%rE4mf`ec+4nK~4?jWQt3xpn-v)t%K0=X7sjA|z?~vnuHBjlO!YKO5CT=HyovGUDk&*C-aOTC4l#)>&(S>|G%gIPvNQ5rjgBT#cD1-d{f)nX*>QU>{hlZutbFYUtON3M2c zreP_DVzSkP2c|61hj8&kV^8Hp=m7EUWs z2396ML+z{(YJGDTeRlMao$vSPvy+J)qtl`MeIjvhe0jNDpz@FuqIgZ#kc;|9wF(#( zhSi?(jl@(D<yWc~D+54;pnQ6b($!b@4OaKCtCFM=(udL=gp%qEA zQnmLn@uOl`rrkLlyh zb5*{O-B6Wc7@66Vbz*_;3*d`oazB4u81G1=KB~{w-gsx^m62C1X#F{QBv+WSk2V2% zm3Xs}vscyJ+stL9sPf6!gYr5zz=g$#Lu7nlw0v0eVth1Kj#5+s!JG^4G5A2kJU4~M z%2@Eif2rwf*aWoPxM~4W&y~}BX_u`rJIs%K2^TB-MUp#<_NJ8`XRhh zo0hl*H?T8mli4=^LYl8mRM>ZmtxSUS)4~l7r?B%sayvf4i!re*A+=o6ccUzwuGz!W zO9;gWp4-J54yF(0;}S68k7+Y-<_0z!QU#m_^^qH_3{ssenJr#$zHwuwSd4!2(wuPB zA&ntLXq*15uAsEx4y_>;PUj-0D&L^#$QaI{F5G1dKn%8w+@~n!}T$ zVTPD$!ZKwucRKY0vp9EVz&y|Nzf_@dROeukmt=(bGsFsB4^ZiJ^S1bU-*gcQ|EJ8s z{(NWZDM-HQzME0YFCEw4HJg|GWRsQ{4$q2fM@5xmKFlJ_!s%L3dc+p#*p?EnYwtT) zc-k3!WH$=_(Ohz+!I@d~EGj>V_Ab9u^*tX~vI)FNfg47)5%X@k1(X)H(ej;Sd?Ty1 zM}!mLn$ti4ISDGC=9%JB6l}Z~qwt{jb(AyHO&50K0$0hj;y%A`u_+UEM|(v5FS`ZR zjQg7denksSx;MHPDYAc$wnvzoJ3P9rJnhNL*#rN7J|qll2nk8kQ+35@er%DNh!y>+Sp6lGE_& z6^h4oWmnIe-sCz&0SawmkIgb%l4+A5WD6e*TY`m%T3(Evvd8W&vM4^F-fb#2xgW3w z)X@z1P7I}<7CSuIrI<)twp|m4*KRUO7+8T$_1qih?A!?jUY6KBw1GKB$z76ny>XuY z^DNyvN-rlDVkju{K6Rm>Cu9m5&fT!qk_sa40cy(@wUdYxr^?7-6xb5dR<`AElD0w4 zTtZG`8#55cLy?hRu5CFYPh_0$CN^A&tYB(t#MCuka%XO?bG`3fH+jDa*0;}x>k3!*Nd{w>u-AlBY~*60&)yf) z4-drLp*g)43h@X};#x|W$l2PwqwU_>n0)vB@2}+d=^U643Q@yx{M;CY$i(NG9uL(m zJecZieumGNd7a~FSc^G*5}&6@C_*Xv2jwvB~ph%a^W1hX=0 zFsunY5HBo~cdA7DxO%gX<)r{=`LbN~AzG&8T)lmXPWG zw295=YDcUo$U3f$peetquEqk80F_VxCBXm`B+A4LBXEGqHsN&>Kf3$d>~1xtUd5hy{yO(lm2iCJ#p_Q!2q_a zU+R#^+^ad>MAWPfF4&9``EM{hs>+N5s33xZK5Iu51UvpK3i(6~Bf`#zu1-pk$P58W zfbkZO(CT*aR{m?utnL|)P$#&fslII`P@_)(G1t^U2bMseW@Ge}0u%~CAe?P>&QEi= zX6;7p2Wf6Ih7fDkW5OsSoNR9rUD4{QEFu;{^KLDqKJgy`k|YFSv5t(c@G&2Y!u?U=Q6wgTC1}kr;>EH`aZM8E4u_&S*hN6BBb)+H7Kg0}^Q$;i z5d$5N|Ck^%sF7_ZV<;?$VH_q)LP2{D2RCYxE|%bJ#^+oRQ3t#c=3-4afD#AU%IDJ6#DI`(8m zmM%*w20;KvHwyDG2w}Mrb6mzP2n-RfB*6$}4#2L0GR`dLFjF(7)3CSNEUNI&87VyLJ6(| z3UhBqB9I>?qk*EcKT-6JIzfU^>!JMTD$>){3Y0R0qfC|sM2}3f{Dd;^ZlCUDpms=0 zCbYABjFn;(EXGX-Wb^}z@A#6k6`N5(kTO59vP9=X22V6awe*32qp^m9qCmnsV@H%M zQwtw!E=7|UrPMV?NIxAYPy_*yaP9v7Ascca9ko{*C=MXN019AOC)HfYG}g?74RJIg zb?-iW=dQ|7%kb+y%E;Y_E*s6IPR*0Z-lRS$(MOWZO+_L}ebq7NkWtGuU3Y^53IG8n zfLOmG3AJ)w4{R9W5>bUizkmv;z^u(2Yx%NLL*1xA5lldC^jqa+*z5#VeM4JSwFsS5 zDI4NS7fJcwXVgAVurEcXJ9Z+Rmb0103N;x(uG`4A>7Vo%Bf;5p{ znO0P-wq_*^Jcbcby>?%pY9$yDDO1*6n$ctDCY_d=^B=JcF zm02%wj$%_2`SWR`HgMzBzPj`YQ}%EXH*pmgIRf=$4Z?BHwqzw2a{p^NRuLLm)-9ct zBSx`r`|)a}Gj1KI2vqKyiZZ{bwaQpiG)Hq#3AG+wHV7Gl9|Lv{zl2KwS8#RLCqOnS zcy4yR)@$u`c!{@oC2Sb8HhDpJcgaO`8>j_JLxmx z@Jp}4I{uF#pu}^LH*0y9{(0Fq_^vEn1gL$X(s^s=4rrhT`Oa#GH+b(*Efu9U!8iX5 zcY7UIa(PvL5xDQ(cUXtj3N+z?Avl61c!DXof-U%hF*t)Yc!N2(gFX0zK{$j(c!VpM z5=i)jQFwz*pax=~ged+axS&e>aM+2a@FLt0DId*QuGbluorxt@{JjJ zaEleL=yiYjcL|>U>NUala7VU#4br3PQ6T_Xc*k;i3(QgDICe@v1Ds$fv8i4oQBgSe zk`tGVC6^;9cX1OpfCE_65K=(Ul8}v0QPk41VwaL%^WGZyn4R{0vus|wmPQSsP0r*^ z>MG_7lmn zp6z){D?tJ{dRRGH0w}?01NT^ouSLOZ|5kSQDmr!!`sX~W3q(Kz7W!5+!jr`{GpSd? z%2$oQEHwVtHzAQAu8F(dlQ5lO10eS`fbj4!WlV3vRb zWLg96*DrFCQd@0SO%WA!IVo9}8JqDSkU*OOO+Z{0QJq+ng?gxWx2|^=XhcK7sO$CK zh^pc0oCM}={3MOKnu<4)2zKyvx6oj5VrO*~Ws#DQN70Gn&8{)KE%5q?rHgo0)y<{q9st7F$S9$g&=&n25IZ;=-J2zyrGrMVdyOBG4X7ZG! zZw!e12R%BD1P(g{$XQ6%L_1vxiHJY zXZgvY+%L-e#NS)qc}l%A5pA;(?x>c`{GCgB|v?k@F8zB7DWgcAnmuk0pI}VJ0SsG`Sy~J zuGTvt_tj_VlQGCd35K&f>w+Sx9cLoNLIeNrqmtEf-Vg-utQvLMPQGDx;}EX6-*QL? zxcab5KqNq+Xy-%mwn;EN<|m#hJk4V$n!o{`!1K2N3l_iz2txj}Ru&W88_)0LgLVSV zsKP4RA`}#YSAyzebsw{HzubJxQyjzLmsyiGB#r@skPk_v3K~3!FrmVQ2|IPs;X}}& zQW`2+ymOF=j*T2AGCb&T2@!}$x}fp6uu~y5Oh%GqB1jM*P$Ifm@#3Wm3l>{?`s|5C z3X3jY5*hXMF{x68otXF_q_oqaEkh z3zx0fxOD4&luC#R5{OI)fwc=bFxgIqlmOQB_K*+3OmX-?)5+i+ixxQ@48@Tnl8>Z1 zse!0Q&EJKjx)AZfM9tU81_KQMu!6zQ**!Pe+YDV@tWyY}teyL zTY_x1U4dOJ#GeLsBy>n-8!>@UCxTQpWqE4s;8lwUeey{c04(re0$gM`MF$;dFy|B* za)DG?&c)~h5@;M~5GbLTbRKHYnMvFsf*_}y{-3L{Roo#!B1vhbmR`Euq?nSon`u>v zwkdm^_;6!dO{&$24v5+%NmT?XG#P)E{io$()q$cBs7iI##ScHIv8sz-#_(XV4QN4I z6j6-8-xO3-fyHcGEK=SQ_vzr3uEY_7#$J4BYmjHdK4?WRX%j#*GGds#8(%VxYa4l z((w#dyZ|rFbkp1sQou_+JI$S!Nc>CwHC+Y6bt+nfKq=U$U^C+Xb(bM(jD#9@0&N*3PeVEsINc2@|=cs;-wdrV$T6$SspQS_VPLirrtd!wF8qk^f5Q@)+1DX&h zU7WXsnVeWqEC3G&@lyi;q)b@{K4D=6LwV_dhLK&WaWxZ5yjt@?!V}3j(W>nL5gO%R zmAUHfzn}G_#f2!{)bOwMVfWhKuav-VyL4^>l1P6cJR zkoNI!hdjKL4)H=i(#5TZV-a5Wa0tI&{ZB253CzLrbCt4D=4=gdiW&;RKrR_%2{`ad z#tc%iy%1r27vw+-WT1ctagc!}+d>oqM<)%~2`B(~14tkU8HEgrD^OJ663#=$_8fwH z=|f^tbV$TRDv~{j1j!*n*QY=(5+UOH(hqt!Nt^j#65&G&0LOxa8OB8~WZ^`WFoKX) zbwNG4%M4UP;gpFX#9@+Dh#f$%ku*L?0SsiGPZ|({ENFlVQxL&V7=aa&Ktz_-sn}NV zvnuNlMnPk23n&QjCH{^Xk~22zL?bf^&T!V{n@qW0>cn}OFEJrs{40rDK6w=#1g42( zv0Y_mIgoIH!dts@SRWH&F-|VU1TEl53W}8g2KLP-QRqntX=6AXfU6W!xfl+X01Ac- zYA;^dCQ}CK12WaJJ?D!EInjyIl$PbBXd9Gca9}@_dS*e2w1fdom6p5!CRN*%qD81^ zkS8%EMGw2t)vm$`D`=?($=jQj+L)oAXyGpoInP9g$S(x}4}V4z#248zmGdZ}d@NO| zSG-fu~YJ2^b`J^ppo7!c7e_3G``6i(Nv(Uzq}hhs8hz z#Ztf;ITFCnNy6KS_i` z_;{B;lIgf*k!BZ?u*^=L#k&d;?MF~++Vo};z2z|+6W*#ii^-CImax@Y?D`R%)@2g* zB?|&6;{g{{Gbx<_P=HohkSvL^A%f7s4g~wKCAG7|WQwgL&K!-YZVG!B<~&y)Rn&VwW9!^(s|5TPN_E z6jB8KHaJ?^!IW}Vy6ZytVYDlSCMx`(00aO42Vg+7w%`Rbc_I-#;evIAd$ASk$uz%O z@ahgxpu?Gk#xkxm{ODX3BcjG5;@zP@=KDS-5EiFr5l~%Je3ss701ro&9aSVDi6#ry z&HrbRENQr8(&c={DxvtI@b9S!vS@C?9 zPULK78J(nk@YCnb(Nit>O$lz}Vj8skmoh!R3lWGAR0cvMSPqf)?p%8iO^Ct)22g+s z;LwRY9c0&RTk8T}%+>Ikk9=*xwXNUnGR;2y} z`~HZa^_g7dNW?|z+Y6?(L<2Qbc6bItRJDCDw2%C*EfB;HCfjm7B;+U9D}}eo!71wpV<+Y9U?ghYA9i;Q17tIToWjHur=I!GZ_D5~Bo${tDrI%GWTvg%F`& zE5!i?AfPfDzz7u71-*tgIb(zg0ZTj67F+QHJGMPKu!q`laYoXGR2X9t;0AV42?cNf zbYNu=PyiKxBbH(viUEH-G(4T7TlQBL3HTO2muOYOfCyoVN}&T8V+VK00X5K31SVfm z@fjo6YKDVtDrX?u(Q(Cd5RK@F>4k{}@BpF^7Z6|oa}X{FPyqNvjFa;vy%=bJ*fhg- z7H4P>F$WhpR~E}=5%z|I3*i(>pawHoB_6;Bt#e&AXdgOYgGNgkc1cbOiO|g z(^!n8r3nv^g$EFcZ6OMjh!AX000l{F@={={$T_SNk^N=<7Tj16_GlKR5qD%!B_UvM zHa8euV23K>A4(C7Nmen4IDuV41V5m5_|ssz7&c3oFaG$Cq(usDZ~$5O02Y}LbD)I? zK?gy}5b#1TM~022^EI6#eXe5`0JnT=h!Bd_0%LJ`e5e$h@OeK)V9zv<4}k+KDL!9v zbG5evNf{R@$%N;1lWnOKqHv6q=muqo5N?o(2$2Z|fB+w%1_c0-N74!T=yHZgDHxd) zK8cEMVVDV1B~8hf6v+@6bcaC26h$~|aVC~%sA+EDFhqcrJ2fU<;D)2+mZixMr0@ni ziG|5%78Otcc61P=PyhySNG;hrbjcnMw2`XgKbro71R1xDX5pA>k(g!ic_lEM4ABK5 zW*zFm33p%z>R2V4kP_KfmJD%ui@6k^K?IrkdX7PuxwnT;Xp^RilWmZNScm}JNC5>P z2b46Mhm@XHpb7P9pZAHM`Kh1#$)Ek%pOdfzMc|(UN}vU5pa;62IKT&@fS?WPpbvVV zI3NfRN(l&R2{8bn`-!0qnhAN30UrvYU$CJDY6&x<37fD9d0+x2@BtaH0U!#aAo>A$ zplu9lpO$b0F;E16P@s{312&)r8Cs*3fCE4P2%=!44~hw&FbPJ$14mGwNGhcL83{Rh z1eQ>rps=3`nV#ioo+@=^S?Bzf{BwDm^Bnwk z71{_^ka-p2SP}S#RGeT3Uoet)c!vRo5D!!pXxSx#u$gR;GuOE~55bRuu@zx?7GCpVbb2SSa{uK(l7TKz;L=*v8C;`gI5C#CQS3wE}U;s5U0R<2T z=gN9Npn{abMfU@M*~q81S{8;-t)*xPsmLFAkOxo@ode6W{NVw45EC*Yn$NIFu zk!6vFZ?UXbF|0i+w<^N{A>afoz!zSXYq7)@o!AwjFt)R#1NiDhps;d*+mBIOj95z- zq5zE)Fb8h{ja93v4N-oZ(z2#Q1Q4quYU`9_v7Bosl?E}la_a#ePy%*<2b{1Qt*aIU zbbD+eJPjKa51Sniv9u!osJOdZkphW@2k@SosDPDfDM#kCOG5}|+cbbWuVX=mZ?U;% zp=hOR5vQBFdPf&W7JhEA6}g)fIYYd50e36-3axd1c4 zGe^I0LA#RCvmQVK{mUKT$8v9>v`M?ctFr_axWEm}!YjO;n};dA**SU&F!#H*WRZ3n z>`_{Is3Z^qR^Y!Oyr^(72|uvDV1+%|@fpXf77X0NRQOG!GP>k(ukK^ROLN8ZOBSS; z78kq}oKONJ;KBaEN}UPzvVsAAlG+~NNi?<#7}CVXyZ6L%Jh6kJ!tN(>ym`Q(5__H$ zK%83&Ud*(BtQ6qKsAiFiZ-GUJEW0I~esm1UXmL_ zYay?>|?UI}$hfH$_N36wTA-`)8yOeVAmS)@i}d ztDTGFi`D0izz^}$nBw3Mj#i8}yB0n<9lpt^eI#6*;a0iF{RZQqlE8Z%6;@>3XW0qG zebXoo$?CUqNFs)5Tifg5J)PV?HLl@Kz9}2s&h2qEI-b|)H!mkH;sB@l!E>p8~)m$%jyJX>OsPNRng~t zYcq;7>|z2Y@-h|AUcR;7!2YOY4(KB(9Opi=&F@<52*HikLKoxhe!F&6lS=82ZZysQ z9lAy&pwdaSPVI~2rGY6|IYQek&K;iae#vcyIK1s2(Y}`wS39H1dSd=D9%mOD6Y1_} z99)qa)I9IIo2`M!=-{E(jqU5*@yXoi+(;ep*+GJj!MRkI>TE&a?A{&Y0~!ZE?GsP& zq7qB`et(WZ^A{N2Jc0xQRn$u%<2kkFPvb8kABTka>V?AZgcc-q3QJ! zTkGv3CQ;~0k@K3D(INRM=L~#AuRs(u_t^nw9OJG}|MvWo-OzpV-SKNT4;XSt`8b#6 zO2LhNzr}cefeJ$PcQnLx@pqS>ZqNi5jNkaa7bMyn`fb6g_5L!-l>+Pw!HwiD%9)=X zH#7PpPA2the&toXY_F~^y!zUT=fL;+__Js8a%2}TBwt?;x33$VuPy~4JY!Pebgu>u zBkOVDC531Dt3wFdpWt?(`p2(2mi{40a8BRRVkx~Tosa~FpB=bw`%~xdXkpG_^BmX$ z5Jb9=Dpktwq7EV=Hgmed%CJ0`xP z$RmaZLCL!ZeG=;j9+t37E}RzIfxY3Da>xhQhO4hX7F%>tze?z!BP2Bn*r+`N(Rj$R z!a`vJMg2PY%DzyxVi2=J09)#-Lz;B5NxM$|6bMJySS#=>H5vm&xbRRyk;=(B>14$h z%QW-M!Qz0xfCAbSsenS17?BCH%&e=Z)F8uQNc@C^Za5vlL?}CuDie$lBob8=2_lHt zh^46rA_Toq&Jx6-F6snsv7!X3G&tl;GHnU|&@}Z_RFk5h00$;;GbEr&YRIT0?fmhm z!j@PL6cC4-)IJ0^Yl+X_dQ~kxh&tM-6G0xLZPO)MGsL(~B?EACe$MP~*hf@zcOS$+A4*Na^B-=mepcB0@j%;ZJZ2vWPV#c+_dh6 zye>{lF*q>^5d;SvywkR?fHT&3<5K>}{fNxEm_Xt*CIrzmKT<3jc{z5My|v}S2voQ> zK^7FLUy5|tIJ^^=n0cnfycC2GV%92V@ux#M#CYpmZpxCIDNVm(&03V*I*Tsjo|9;}?@3_r2S1^JPKxjgM z10-Mp33v%W903P1u)+TVXg~-?P=XVrAOtO;1{~O+2oJ1a2PbHWBQ$Ulnh=EtO?bir zTEYfLKw%3{cmx)DkP;p&LJVDaLmWmBgf_527c4=-3W9=ylQ=>QR>;8|-cS@oEJ6%= zpavTbu!KoOp(OyZ1RNL<2YcgSCvs>7{_zigV`+OCQvsMCOdtznjIaiSpgypg^;-eBIL6$ zpjg6*1fkHI$R!jP^wQ;a)6H*Ybd=-7SW7}7iH1}xd2u`!*r4~D@a#yIN@2_q{P~pd z_>y}q`(8rmmY>Dw00}RZ2qGDS7oO@Q6qER=gRTi0i8%yAxa@=>$fJW1>FZ+}rD|3C zl1iF{!ZS(!;KAX}1~ZF%O(P?P7^0jdiKE(tS)5BNXtH#fF4QxaAkj*nSQ8*l#>67? z)JTSuv>3Ov4l;JZ;x=U}6S;^9KH?z@6VL!Nj9OK)SF3~sEZZi_N}v*2gN-B#!Gt7K z%xsAhNnI{=8YFy`mnK0%(v~@zYc1z8ObO~v>N?ktgs()6bd0jH+Dw)Sh9P6or68Wk zokKkIM4y!3P0VRHAK(BDYLJBMWD?oQW>;f#2x9?CDF@DK$g^TqZD~KdvXY(DF#mZ= zCC~DsT^eRmhgA|VKT^|!FyS-7Sq-|H3$%j*sjU$e7$Nw!#g$_75DnGA;d+}BP?!X| zjwSxBPOz(843F``=^XFKXa!cXrHfAgEW{EAg0<%}Bp$NrlC4_aL`U52xx3-GQaFZvy;hI>)Get>lD<#sr!&zCll`|$= zGV)r_sbRl^nGJ3!@~@_$>se7o)|x?6vl0DwDhzYpO2Qcv5H03u@-ak$X98s>2ij_Y z9?f}4MhNvPGfZ6(BhbY9zM%yy4$tG-JYGfDOo0CcXK+-c2v;OSt zJCPWd;t-xDjE@L-$=e6< z8p)QeRwevkk;`HX6PA4AE@b*I`@AnmbSt|oeJ9lmx$C@->8yK)#BM*>0TLeU+#=^V z)O?YZLr8Y6%lecJ-`hzFlwvEyaJ3gsw{h?TH!6lz#xv3SarWS&n#V!(NmX z6FDOr_X%zPa$A0Z1kHcRc9fao9l-<5E)LsdQp_3H<%l~ZO%16|BXo#=d(>_X$)s#B zNBQK|3~EV>>me|&dGJ4u-b48;%1^J~LX5tkpdhM;tGx1ReHOKYi`TUx9io`i{w$Z{ z4#A-f5^4(yhNzgln~71=sl(eNFL|)W`-r;0ptR_%24t3I@&SQJJ>x5cOM#zN!$5&~ zyv;ccqZk_M_`dKv!O7T~k19XU)2}|eBMtO0vZ4sD$ujjLuu|Cm5buaSfl)K=2#^MJ z2_mpAg^00G2*9(@k>{uht+274@F{6YituO_AN#Ee%#7CakEHSe)at&-(Lm5jxe@%j zazQ~eOqIxrIztFU4tXBo=o-&Rx$>Hb8Z?R<%!x@*0=Nsp+pr!UbihxVi)$%3iYNq| z@rh~Uh#=Go0mG$x`GM;ZK)V?ci&8KGc?j=dJ3ger?DMdMqQ8XDs)nFA9=IH%qX`o{ zLsk3>LbHf9G{5vZw#%qD&Y3$o3Wb{CzB?qcJy`-<6bU>6x@8fKq`Vj!B#a;fKs#PpU7YVsJdc`>b#il_N zl0myrSVO8C$E=Ev*h8!X87B4UGFxpR-Mu|g@O_Ye1Lnwk&tGiN~D7!=y zAwms#D5$~<>ar$;7^;A)KF6X*CNoEn)DII>EH(^1UTQf2K?3EW!OuFJEQ}nr`H-3* z1n>Aon}`Y>yNMypJ&KsI5Xq923JoVb7`0i*hjf^g5{n#r$&5^{6G;Mg%t(qPnW%h< zR18V1{0YEVLGy!3Nw7&JX-T{Q6I`4F} zB1*VhmgH(Lph>QbP#UK=$Vr<*F2oBf>zYC+jsC-_N>* zBEwMJ9Iu>;nDa@x@Gk+(48lwZV>}&y`NM+v5m_2QMdY`)087MUOh*z43b7lM5G>VL zjnc@Zq^ZhkQ3LARCbkodsFQ?2kc6v@Oy~T_zZoy{gQxVPO#!qP8T3GbIWG%LKd5M^ zFTtiCQMmnUOQ1o*o%;wK_(LHPxR8KCqtq+DF*n$drT~eHkDw6pfF1ccO~BdBzDk_L zGBB}%2)JNM2b_e53d0crJ?4B)2u;B|lFpO^JNWd8l^Y&;T;f-oVfB5rBQ?9yp2w@ zoXH!Ek5U6PNP_7s8I$p&=8RA(C8zw*szK;VHMp09PU=8zZiIf7JgFH1irHcTIkTET=)6xhcT?o4w8If|#sgOE0 zgr_c8PFSf@Nd=544GYTryb)8<#Xy&Wfu0PNKa~uM^YAytaE{Xy7&a}RLmU)}P#u~` z#H9lT02$MHs!0edD*ObAk3yErkVUl`)J8K13Rw&jdkaOCLJdp;F8sWzL&Zsb)~Tpe zsQ4_T+0ws24*9b~)terj!zQNwAXUBk5x+Xo)`J_lOday@{Vi&V`+mn)Rrb zq{~ob0xw+_=a30m)j$51XbYV<-i1rHE-mT#!(kah1=v zFr5tbSDn4d_Cu{gr8O{ph`ur3P}D}GfkZ)=gg`CW^!?yB!Jm(kM;=fb3!b!IYYm0b zDgen;=dwqzV*ZNih0{MIUjKchjg5(AtO<8XRhK}HyGo6;Iu9L4f_HU5IJ20OVHUS&s^1n=k}?xd|LlFZ^0h zx$#H28CmdP4I((poC=W56;^q9h*SLB+Yk@$7#(K08w;dQ)zHQk90a$uN-Tb4s`)0b zNrKPw&S@1~z@;@z;y;YL+>fBSf3ufWm5H)d%}xu6J8lV5uuGa~7~q|s0eoez4MhTZ zx@ufoO#%_pXqdioTPgNDL6}=J(PBs*Iby~SFz&jiIF}zlgOjQYWhG!;C6FU7g?lML z#n=d&{@65Ao-`LV2yJc&#t6zpS+blOx>j|I@C`cCxJ`QFt49$E1s&KEme69p=Z?v) zMWf^-D1;6^h*R4aYm?<00|kv>r>IbaAOr<5V=?|hp8si&B48e#GxH#e7@&nc9Eelzd>MHU^GO$;8#IFvgli@>J^e|9tlYZ z;5b&8no3QCV1iNhk8oBDeWQs!Qj(5UW#ZVh;JP3KA9lWULQaI@&d7Iq*PrU?jN~%@ zH^W8ch(z_6;;7PU`v~i=ZZgL4{*BQu~N3(cjx3-jGOYx&|M+ zwy6W2OVHMe(@xykYudfks|w5~AZrcP2xjxE>fnj&$JQ?1K9i`M;?wJDc2y)o&OezJ z7{-w11KCl8_?4Mhg3e~qiQs00NG+GhiF^5c^c3-X>hCXHK0-l+Em;rLFKc&xFdH4k1^sIv57kD~r&x#48G z_}{FE)1i)2(N+i?zyX;ckQj9d)>uM{C^k}9I{5Hocrom>xLsWA${`b_5f5>z$pkq# zqc{)+keGx5C~J`eW6fSZL_uST%?OVa%Kr`x=QfBz)GHdV?q`c@%s6U_kX1Nm^PNiF zfzn?QscCEK3MSwIJukGoVOINgoF|8Jjj03&2qQK*C5pguCFlVnP=X~e1TDX{m#*Yx zX)T%Jls-}n#%RmrnC|>E=s1GogMeuJnl^DRaJu^L)I}F6VU`^L@)uQBG*})DcXd2V zTBH#K^rospH}rs+0|TG{I>>}fc!L8dfHs&aH8g}Jc=Sl0^h$5COa5PLY$8ozT@6nz ztvxZF#SrYDmWdZ*)yT20at{ef_<@C6*9Or6XQVm7&Os|#Gj2zbK?mqZ^z}dsc47Y( zQ5Xe;pakzC$BYyOXqR?Lr}V4~g+Yj_g8>i~pQjlxG-z;%VDOlz+R|PKU}9W# z2kKCK-Wjj+o^oXwbqj*-!-wc{J0B5Y?)QIxPBszviKw4=g!V>J8isGTYwz29RB>1r zH6Zj4#Z`(MSBSVWcW*9;X~SVTe)Ve3$M%pE9UuapYHBbqh(@Y-I(&FYWbfUsdFN!4 zqr$GCQUfI*0!Ux@YNx8z9qvCYgp3#+yU*A)bw-9z0+(>r{>~_H|3wPVRfxHEz^R{z zx6`qo5}Q2tr3tDYGkWX!@YU*LGX98&lox=fCn)6teOO9kM_6kok_@d`zj45*_&6uJ7CJjQPq(=`TN(K#@WKv;)nnsTz zO{#P$)22?JLXCQo6a)ioUKYrjm5rvZUcZ73E7t3!KTVnl=^>NjYrru?xt?kx!UJg|#Gv@LWqc0MWH%11zPuIEoaJYYB)U zx{EQ#1!c$v4!>d}9bpW)@(~$FTx+^i8?o0>cXbPyG59a>;>M4|y%b1|n!P=8uJ z#1EYiREQ5q%+!ew5;+vg4;Z}^piDXtIFSA(ClR6pAyXkCk$V^-1d|#MP6QEyFm=L& z4}uUxhz~1PSkp!;k))rEOod{|AUpN6#2}G?B2arYt#_l5MJUXJ73Qj8M5+^3)BBBaO2veALF4YNzFfoDPONZz%CrC)t z2~#KnPAbR_B^|}z4}-j#s*adyivAs{-I80bx#v1WN~sdeH13jEDnSGhY8Zm9ccB!L zM2$zOu^>Sk`7qQ=p{VhZLtXrUVzejyu%U%Yks>EdNGN*}!Y(Ov5TOGz@q@tvb+H2y z0@L*6toCwu(~dn65iWP`q8zi#GwU}&0qnL*?oDdYw}h)SLzVBoHG$GE#sUfAC`_Pq z!KOl_sKEqGg!K868k63MR2LOzl5b751{&46(N&6s)nKFT5Z4#6pZqv6swQTr}g6AH*@HFeKRg+p# z61dE&&L^*Zz7JozA^PGzaMFv0B9habGhIC>M2t;P=Mi$9wNXUSdeT9^E~KGDB86X& zwLbhDvJdGes5VKFN1qTVmclJl&^r?F`e(oc-mQQ-!wIH*hCnZMOb|gTnbHKJpzXn_ z3uq{m57-BiKuzQj0>lXz`*AdB6= zh_J9j$O>)Jvevf#l(@Sd4)9Y&93ma-n4~${s}u6+SrQ+}AI!l-Z5t~^zxbDsI0-_G z6zO6{4gt2(Y4Iorv04=iLNSGyZgmqOL_{iQMnWhuBelDh2ZPrMxb-e(c(fxcTlq2s zsw`fqL?9@7Frbnp!F5Or*h}IBNQ!h2PAF`X=ss7Ig>mpCmpr8V1O+XOfkFvC_+>^Q zH8cZSs%Jh#*(zP>&2KiPn>16+60~$cf?acs)BF$`aacNuC8P^V0HY=oval`21d76p zUn!PZ5N7ccX*yWc^-31ObHdF>6Rev!!RgS4#sm}%Z5t?dB(H5Ajz8Q=&=0nU$X*7s zAm1xQC@ua7LMuWDpD@`$K;h{Sf3^sjUP=Nl&*XzgN=tFk0|iccG>C=bZK4nzDp3dG zhXR-Z4UmXL9kJ9CHN??wozRyd+aw6oJ+68&#pDlwnh=*-@nb5b=Sh-4O@Y94AS$xj zwO&U?nOH8J8HF20gId(P;#>7$HUc5uGLIhg&?KX*VR*o zksU~|4z@voj5UM_%ZMO|P||)@GOY=j)(?gvi3809osXp%09m!s0}3^-vTbFRKtYPW z`W3KeP%2YlISHQiD5^8#j~Y*sw4tPAvd_Ze2ji!pj8rzW4q<|FOTjD;dQBrpsBS4j zm;R=dyj5BUMeGh;D_q1bHMX-|?-1z*3Q$1854knNZU>9aJlSi}y` zSFpW}UXFTpUL&dv!vdMsqL#p212HpxYB=k26D*U;DujxgeDE+EgoLWaskD9q#dzDM zGM`rUZlH*Sd_hcKKlowAr5JIEyF9#xPPwmtRWXYvv4o4hxLl#2s!f#E3FdsZ6kjX| zA#gB}Nfa0)#Vmz%zZ&6xEjV>2rAU#>6S6cJ>#XtI!E0Gd*EG)z6j&a!8L+J7{)BMZ z%bK=pQ^Jgfz>+z5JL^eZ(KR9&ulc(jf)n^OQs{pTnjq2Yb3yiO#Xno{)y8rzv?}Bx z+2u3|Q8t&QoY!dd`eDpx@PmETv*~ApGt&c^aF(uOv{x!E1~embyd zz_ydk+yf;XcHe5dH_|*u&XDL+lwqGE5-n zoRwk7K|r#o6gg4!=9LsDXmFeg`z>kN2oH)kWwbmn8ChCDtp5}efw_wxOWzrSKpk*;_ucVMs4L0M%zN#8a*nQLGu3-3Vv z$MPOj`K$HM+v)8!;-z{KVGpdS{Dn<88gl21msY=pNd#RfkJOI!eQ~SZ^466%OuTHU zqDxO3$Jk>lg}PZ>&qLpoxb#x8cjANBx)^e1@S4c4MmatM`Rf1XFES)9;BfWtHSI&o z1Pk)(mJdE7?%Abpo4wwo8~;8xbN}Uc(sx-mccTYF7fw8fhSZ2piPbJ>{c0D&^UB?B z#+VuRcGk!buYGoU%uWyv&{s4`_vX*Z%C_Bjmd1(e@_kIHm#+@8kYFu)|^2PA1n+V|5vzO=a4tBMjL>!@F`n7 z<${(cd(l09#}|FfueFgsu&K0i@Hm@MfJCh_03Nd&odWg3eUfzr#c}V0C)iLej-USl z9YM50J~zfq7xR~IR!2Irs+60_VJ*-_Ki?YtYN1mRoPZ6~R$NZ6nGC9~^> zLXO{$-g{0k*dR%~#RzmUiOhEZ9Qf;xx6)y&Ze0pCtJF<=*;b=ruQpLj36;y_5CSN5pLRbmPp4^9+*_4WkVG$_W z6L!AmQxXMKP`o64Rw^z8VGRG+ITDey7`-{MExcH?YRY@{1rEG031j2(@#;W9N@>RM z5P!i#6{`Zh2jo#fwHO}2SwDuKRs?2UwPldh#|GcLe9X(2e4YN?mU#H+Rb$xZ!psYw z&4bG}BUhd0w6;*#(cyJ~;r1F{56Wl*TBwl3s5Ua@xo=*==I&X^|L1*6wr9vs)N9-u9r;{l1bN{3a%PQV0b@;@<}z@s}%ce`Oi|gCK3h zIcui#s^>VbtfRdyIYeq#S((we*7F%=M)M?W=iYX^`w7kyR^=MwW?SWag~kd~ynu3W z3K_7sSa~m+Izh$YCVXH(IVT|et+-iie2t&vLo?7|q@`nKFf~kzT5*@a3g%htxLR!o zULv`X4FvU#XYMy`u_^6zvTeo-&(;=YI!ow>D!?VDKC4HAz8qToL6hNaCNJo0F}rT+ zEUv=&Ie4(onZM6s#ZdhlZ{A7CmEwm10v^O-gXj$pKq1b(W=oA`vok%${GbaZ} zVn;^G&eCT=LPG2=!iQ!Z6IyM{;`)XeCd_=DsV1i>bThKaV|1$|Ln5(4_+p9N-L;@H zg@ZDB+e7l0E2VAAl4mnE%B8!zI*QoO;ADoH9NlDQO_yIosnDJpJ;R?=@*m*U>fQ|} zg42o^ZJ;N7VVM{JN zG{b=GB&BI<M(oc#c?Q1IV^LjTir(>46RM2-PHtwFFJMe6w0YyWZ}F7;BQ zKw=}-J46e*XUWm&QFC2k$M8x?3(fOhc0^jL#%0?tx=o+cgY_2@_g+ao&S*^NwoP}e zzd^coaIoH+?NyDR&o>*a`kHZLH+i{0+%077QKT77j_VgIE4LJ=7#+jG_xXKQpfA_HN~Swt*PSU{?Pn`uZ#M=gyj8&a2h?g&s_scZ+vx2 z$%X^{PP^n}rSih=KfTM-w_pBB5^zPkT4pc?N9!1iuQ%rWy@>1wx>k;sCi=8c)!B<0!bH1R+)GIUtnf2e|zqzsSM;oI1<`aRTl#BeV4c*r`R;q> z>5KnjvS1w$?z?Zf)bJ2I{(Lmqy~>kj5w7>r^;MH($d;iKc3?>c#qpnc^dA7-P`l!5 z*%i)^`wqbzSNd<#w@IY0aa*FTK;wOIVpS%Drf`g=`Oq{2N`}7EN;onCq}=xXqCDz( z{k|~X(LHM`*P?TKf+|=a7e}5<#r*u7DPaT4>;D)>7?iLhMCtAbjKG-=Gf%#3Hf^%S zdOe$rKAxH2Si~hWNM&X(*NDW$Ru{(J9MSI+MC~>*XuTt&eBL*@=zVB|@1Io8VgxjX z%LN7FKD*rc>m|*q+Qg$)&ogesVc4XpjECsuN%6j&IP>5X{PI+PJH)8pWJ`BLiG+$I z%_>U|Z^_s`yT-}|sekQT*XmB`ZT2tvTk^z42y>x$2uGX3aY`iIHAZ?8{X?qVOkjRI ztMuqFl5nvwJkB%nqZlIjMVG{LcJPx>RAVZdv+A+SI)&jn|m~Qsc;qb?>)GV~F z%|rQ{4g_2_gr*eFF4u3vsmu2~nzjNW&=7R%W(-)}=QG}F!xfE8phPbb1-SYK!{db3 z07qgBSgK<(pkHskxCE)~Wv$Um+VZz-5l3#NqVS zKj5}G(k=fgtZ==za?uKEiRS;1QAL(%*Hu>xXX?{<50e*!ZKn8Am=7@KC*}qdLOwL1 z1VsKg4cr@g`x-VI8UQx3n zLrHOClF=q6w?B*Ko+)7fc${I3Azl@ISd9Rrx5wLYMbS}?0vw-M`Vh(MZP(p^ln&feflG2f)8}uY3Qn_NR(cI>6uyuPb4$i~a zc}jo_SGadMAw{gE0&i)N<4nF5KY;~q#jCPDm!y6vO0QD3^Nx$H7uFKZ)zJr&(@&B- z)9h4ywy_tFYzfxdeaJ~EBnS)Yt7-({KBzvJuBVTVjUG!-DdI~QHq63Lu4W9@Rvg`^ zs{Q0k-xJ!G&()py#~XsscrJ&xw|;tGmXWo<6C56UnGF;Xdj?JhZVR8f_&90RmgT6j zK%PCksD`|A#{6@YCx&0hQRo18U7}SJ(1q~ye(Np{=5D_@$I9q`1V*;^M7Fv8D|FrySb6C zGS#4^@k$|whwnMb+BGWo#`xt+PO3C4=!;*a9*Fn3vhORs|Kt0K<4h`&1AA=F_D#Wk zsQZ3IRKscQ>g*Kjy@(t(233^`RmG6>Zi~CMI(*|}-<71KD+G=--XZ#9vpQ;7_>APn$^M2rWb~gbG6-C8#GklP8ysQBb z-pV;%lWk;}zog8mrr{D{?$cGFBHQ}%YK;CuonpTauFKrLSG_GFw zL|K$qp-}|Ndp>SW7pr)hs+Y*=Ckhf1Nm_v$vp>xJ4|5XYSQVqV!U9qTaum~s^OIMK zO0gdf$XYPralUpYU)F5CpW9}2h)m<^#K>nKOAYfRSM4q{{h^_ajz_e+@yWX5_agap z=yZ!XCncfuYG5Dix|6ZS4jZkX%5dmIVP@=E#Iq|GRb7P4cQcxG%oA_}6FKB;YzoLo z+gFxNAp9s};wD@hZu=YXa8Ftmy?2!n(D3rZQ$=%S4r9}pru8f1-%piyjP=qwz#wjiOssiw>=pf_4g1(hG5HxYjesz~#+ zS9ZQz>%gU%Y>#a{t9u<@Rnr(Xf|MQxj0N`X>_(~&tityf%?b$E>8Eh4Q!`m2Nn9_h zCQ71GRN;kqg2E4)4Gqg2zuad_jW>>Od-t{&7aa}e1#(FZR=i`CiM;;uolg#f0bI7k zF#4~il<3MyGuvC0phSr^F}*8EOkOpW`r*Uf{BjD#&z?y4KHz%#HthUy$ZE8pe!%j# zIK)oN)h4mBk8000{apB1 z?VMZY;|W&jHyt~*1+CTB)TphVxX16(wd1uDUiZbji7c=hjkZ?j|I?-0iLf_XQq-WW zuZ>~NhQGwJwf$*yi56YBsX-GByB|g+3Kff6)(Wg6KXwhG_g>!3?$10U_i0^|Szjxb z)9d3Qr~9+Ru$tj=o!>3%4Ro&~el(p>XlRW(mYvekLgqOL4IbgNfoyGjeH3EX6ZvB! zM%atn^6%15#d}z64wE_tW0)lc^pYPxF>|UM-@{+0x~Rgk)N2R1ovwy)Ui;M+0Ow|o zQFzXIOP?U!75O+iQZliG^VYPEfnAewZugepKxtP#{B3|RX3k(qPCy{Enzq_ArP5ZY zPF{H3f+8_L(%?GHojR>Vap8}t4k&petK+=Bq8tIm>snmP-+VAPd75T^QS{I=P{%v) z14B&$Sko$IZ|E#z%dxnoSSH`-%|uhKP^BD1pvJC+U`axvKEpRMgPV%ir);_SN@soz zwGu}thtbZEM5)F@8Rl6pfkujt>{}juosM6}K_>fpbN;WST`fk9+%f znq|{eZbBd*Uhs}(fM6cjoe)I}w9xljbibZdl=%Or|igTWN z$R|qw_^F{2)yk(ekJFeT!WfZdv|0H{XowJApt{f9Tcw&|MoLApN(&JvS~F&MT#{VV zigAlOaN);Z4^c?0<_HqimvKYQM}MJ~{ThR|2!*S7^^;}QLnp+nvlLm86DV1J{j26O ztafb`x~K{t*O0}<*EYZMeB#)hEm27~Ghxg;DwlSx5=i@hq;-s>Na*HPSd{$daOxD% zujvsF7VAk_E{9(?2XCwt0KfCT`*8T16BaZ0FsjQO;+78CmfuR}9H;kZmYd#^_(%d* z1@sSoKQJ}U*_!KS)3_5e^>S?uyB|@=lE}fVnwgWT2R{Cj9G2j>ihMg_As#Shb=TBz zA!*>%uy}*=P_F}J7u(=o@{yL(pZRpQ)>JfQ2 zI^J#P(ofQcCb7h__TRG`F46wa(99Y2e-HdyU><|>8Hz9+Dwaj z!&`|;ogYf960?JDc->;>TzFy}tm!q5DiiX1hwL9y0}Xtrg?Sg=Iw;BsaSlx; z@m3tTu4iD6w2TaDyd}rn%4p>IHw}Y-ri0mNr9HHX%E*cXpu%+z>t*ttty&C8pgrAU zQnt!vSa`1F8H&C>^u*eMSz118be-){vi?bPrnFz!*8uy!-CB+S&HUD8)_vUa!|?6} z0yoZyA!B05<+jQCN7)8WjyE;*684I)aa^bDTjdvFBi<{wP)fZ*QfYT56jk}(ON?x2 zLszBUPZh=pbMo3#-4Y(IY7GnI=wvv`;YGjT{QlsupmFb;kyW1Gok^OI?b6!u_#Won zng}gDvK6gvjV3uW&105$W@a=Pv>pAyh)EJDKQD=!7Uz#j-HT!PH+jcOXC2@pqV*u( zLTMq&{Tl|*AtT?RgEt0d`nP9@>(x+1!TV=4Wx_Ol*Vg#N0wi!;iF`%IeB>tpJqW=V zKnyh)L@EAUxI-9-j_>I0;V!5m}~)JU_T}8C^dS5dt#ZTtnqb zfh06Sa-Av^q?XcVIt8dhdr`q4DwK!{mqGw#@YGVqYzOKTJXPu%{U0=9wiJ;sMc<32 z(Jn)pmLki^4b-|2kU9gTodOxB;0pk?zZBJSHI(NFIrf5is}$HkV|e`Db7Y{y`A#`R zia>E}2cOnKP3JUD=ir6BopVqAT6*=>uqb+F{_>-8BRaVwK>nJB3Ip{55e;4}L(sEb z_FV~;Z1QVlR+{3o0dY=@I2E7qbfN+*!N?B)QBWOQ=Ou$^YG2PYa>c#iY)`#nLaXUA%&ALLS;JSL=ufE-g3NvqQ{&?Uysx}Nn^96 zal?&V?~z&Cy%^pA2DNvX#76wPYm5SZd?XXT+|qu54b>(RZ>2spIz==UjnQ*PliT{Y zQNjaq8=TVR2Syu5@20rek4>Z++1QV>4ww8785(cj|a5$SL@b^66jFSVN%;^kUy6!4eNiHw+*!AUv74Px{a znq`9m^Y1n*$_9w=rWQ+W;4W(}iS-Fn585(7sEznDq5zI(;(Xz2Ec^sOcSHSdplYYN z>8}s6L%n}{r@FMD&o~G|K@O;w_*N7YEcm>b%byY4JB-r9(v{%^`-Anc>OZs8?~kfq zZjMzES98yjdK>VEE{WnVJ*Yw(zF8w}i%7hi7Qklh-al|Ny{^*j40sb`WhGgr#l*`|`hWloW zyX1w{(E|;Psxr;whBqg+HLtW`9c21n5}>GYhA87T${*xuLvb3TH`$`n1f1pztw&D# z$!2IZ7jrEby^a6nNFuzS@IfHvie|rrEEFGdV)9qcuKPq)H0#Nw7#;c}RX<~tI2!59^+FUB?{&{tR|*L(>DWy=3-c0i-! z;O^!7tDI)deR){XupOKO59(+T23QnPUFUCazxjAg@E zJLd1N8G*k+_J6f*jI3GVur~#8L~kyVHRT)JwM9>9_oy@42^p+uWp`yz5Tf-$F5N zny%|415-nhbacy0AVWn{hr8dCo#2bx2v80R5YCfw3Q18KaYDoxQ3lJYH{Hljg1x0^ zttU)u@cF#K22D3&>VByFQv-h8tUbD1jf<6A>(B+E$`vUD`h0SNhefmw*XG<|+OPH**=IpoQcLH4muxNg* z;8Nw;CpL$*r3}Hsmd8KEKxfhuZm>_lGkhs>8i4 zxHRWjT4Q`PwLqOPzO)nh+R&iQUy7PG!S3zpad;dK%f(-w!M6eS zYEnn_YQp;XR{4z4&DwT%5NpBk@LaTANWS~oJ+JT>sZKjj`N!7-)!xa7%+J6K#lrcV z0z1RvO?n?za?}K7l6sUe!}*whb6T3PYW6_!#7}YhnAB+5bWUgq6ZVn*{PXv=3*8+r zII&O1PTgO*hBEb24QSFEJZE8NkGQWa#Al23<%mA#Xpodn8wlTA8gn%Vi@%rT*RnIG(=0j!~IM^F^~9)u2;LubVF3$WQPWbb2P} zB={qr+~yk5`H|XNaN`PRzY#0c>}6d&jg$6UCq8y#8B5!yx8Yc0bk(wT+p_iw5y|Ea z)=~aVMQr#_wVRgg&e_Lv@R7Uqag+A5CM z{XVu|XAzA8E|4PFURCVBzdev5YgiFhS|x3^z&7tXW(G)9y&CNRuxKfvp#0=LYT`>!?;a|u^QM3k-N_%{uaWj&)0jm{0dS3qdg;>(?#1R?i|vmW zyOtMwxR>7CS{i!1GQE;`Ph=XlWFGKZJ(3a4tdJ){T|V>`zg@?jbQml-L;P2!K3@J(yP~Y7HlP_f zaN{+KW(^oMVZxRIBE4Tk8xOcM_uuj;Z*%QndV!{5=49V#U7qh>c{E^LTe@~kGjy|Ist|L+IB|Zm7@A^6Xo$Dha$=dv&`S;b5-?S8~qUZw_ zr`5lgH!JTQ(U$+ZNB)ylA~kvMgq?7vO{QP5!%UMQk+0Vpz08f3+`7i8t~L21R;}Ld z$$BkacynpcP<~>bu~;J#(uB-wZjLlnj^!~?%BbaoRTG6uf%{7%&4L5UR01s-AE*e? z(7;HMTca()CfDFJ7NtM7iP1{N&0fo+@;K8ntrYB6gSO`j%^t#50e&rCDGWR}M;|X< z`w-hk-7vj8*8csC!L`LppcD-g#fD z`H<)8%a*+l)#kN!6E9o8d~9$YE56#*_I0r%@XN|XSNr$X-dI{*&LOy2yG_IW$KLHy1n#PCq?bo?xu4Ao8JtD`X$e;49{p6VyvFR z-d2{X<+Rm9Q!CHUIov5RM97_n&s4b%4}{$`QOr^r!jIr1-dp)TZHZf)7pyWI?K`3(R$ z2k1_Dc)kNt+h`0KE%FD+xn>IgEvYvR-0MXf>{(l{THjm>2wcHyoa6P+@Gb`qQQsXL z$u?de92`oB0I>upNk^ym06j0j7tMNw3BY*|a9)BwUj@> z5=)*uc~Vd~r@Bo|lxI_w=mhRuRv8QdiqjQ&-co7KyJ{Q(MQLJzIU& zd_jaK6Z4KQ?kXw&ucYzUMOW-8IX@?!pI;n%&R6qyp3M!HoWH-gEP1!nv+}*CkK8l% zr@y~{Y;0^`V0B<*X<%XI!-o&67j0nR{C`g8=c^an_to#eSJ%m#o10(0eEIR?$N9x8 z{{QX&^$WnsfI5Opuc5Rr7S1H{|0t7BhSJcQNnH9(6(d>yE0a>rqec47|0|PE-|e;_i`5xMK28aOrwQ^qI;1w)7+=uz3B>b1Q5XS11ySkVH_e^m`3yMmZV&CUp zdw@#~g?@-xm$yj|290(%9-3Ifi6N;in9}h7;$Y}_3OBy!@X-kp7P#H(v6W#u(lLmq zs<)oRF{?@S0$`D&lg0(qu#W-?C*pIgX-*tMsjkXE@+gU(rty@ONC@;+K*%5tQHP0! z>|@Z;Fs4YEkz$l7KK*gTv@%$F&rBv7LZN0_p^GVC&qneg4ePbx9?WvlaZvha_UZjJ*)fT2V*nfICg?dFImxF`qZs|_z@H8e`B1~!6bUJnMudB5ird2o zi$asQ+vrj|GUcx}|JnwN_#qj}W5h(;qTkc}9~;TEbh6MaIyskNL)~K2H6$IM*xW42 zB8*_eh(6JrQTXp5&NKFTedPB7vEYtsLAi<~7(%t8lwyzDj`Cwu>X$Dm)RHffsqr8L zCPRg8NnT>-y~si3_11Yy-KHc<-TD73eoBFeqpZ1CAWzRo~dcM;_uk7bi zB?=ep&f|UY*u-z|;bVMttHJ?-j~>=-7fN(ZUtrhLEHF=d3PW|c);&ZEWv@a)LMvd! zrkBYcfu$4=^t7;7y!0sX6r7*%9fvmGFHCUo$fv^u>Z>nqt!or$7_j!&Ah%rjmsSM> z;KV<-Ym;bbO~_nqZ&(-%E-R4M@xwNFo=?(*EB{Crkr^p*4woBGG-JbsgoZ9S-au4x zg5W1V)i^(YbgIynAerUzf7ktzh5wQI)aD6P%6c|bvfQm4HWDf;N7=uQ)^Xh-(uvBA zM)#7+-_!lla#VIqZ?G7~_46rm%h2AdHBT%1#il5&Kb;*u15OizWQ?u+&{xMlvzmM6LWNimG=^92$uBo-_gOethliBvY6sv=>R$pLoa2 zBGdQOZ74E$+$j9y*=u1>fDRqaj*^e`iNz03H;6;Tkf|KA4ub;}kWbuv^ap&Ue|%{A zV~QMaP?y3G-oK4WZnBPuNF27U$2mC1a(ablaI|7F9$x)QxER&Vy_}=>wj|g2xYy<(nAh6c z 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

    %}1MgztR@`8E=A+#{Ia*-$W%l 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
    2D Rosenbrock example @@ -34,7 +34,7 @@ The following example illustrates the simple usage of FOAS to solve the bound-co [Fortran example](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04kff.html#example) | [Python example](https://www.nag.co.uk/numeric/py/nagdoc_latest/naginterfaces.library.opt.html#naginterfaces.library.examples.opt.handle_solve_bounds_foas_ex.main) ] -## A modern replacement for NAG solver [`uncon_conjgrd_comp` (`e04dg`)](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04dgf.html) +## A modern replacement for NAG solver [uncon_conjgrd_comp (e04dg)](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04dgf.html) One of the main design objectives for `handle_solve_bounds_foas` (`e04kf`) was to provide a modern and attractive replacement for the CG solver `e04dg` introduced in Mark 12. While this solver was targeted for unconstrained NLPs, `e04kf` has been extended with an active-set method in order to solve bound-constrained NLPs. More recent and modern methods have been incorporated into `e04kf` making it much faster than `e04dg`. The following Figure 2 reports performance profiles over 114 unconstrained NLP CUTEst problems for both solvers `e04kf` and `e04dg`. Contrasting the three plots, it is evident that the new solver is more efficient in time (40% faster) and in general terms is less expensive: requires less function and gradient evaluations. @@ -53,7 +53,7 @@ Notes and comments on migrating your code from [`uncon_conjgrd_comp (e04dg)`](ht [`e04kfc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html)): - * [Java](./migration/Migration_E04DG_E04KF.java) + * [Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/Migration_E04DG_E04KF.java) * [Fortran 90](https://www.nag.com/numeric/nl/nagdoc_latest/flhtml/genint/replace.html#e04dgf) * [C](https://www.nag.com/numeric/nl/nagdoc_latest/clhtml/genint/replace.html#e04dgc) * [Python](https://github.com/numericalalgorithmsgroup/NAGPythonExamples/blob/master/local_optimization/FOAS/migration/migration_e04dg_e04kf.ipynb) From da8f695a1b1283e63a4d29893bc717263b0794b1 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 4 May 2021 15:38:38 +0300 Subject: [PATCH 175/196] Small doc fixes --- FOAS/example/Readme.md | 6 +++--- FOAS/migration/Readme.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FOAS/example/Readme.md b/FOAS/example/Readme.md index f14ca33..dca5559 100644 --- a/FOAS/example/Readme.md +++ b/FOAS/example/Readme.md @@ -1,7 +1,7 @@ > ## Important Information > You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/example) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example). > -> The source of this example can be found [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/example/Rosenbrock2d.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/output.txt). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/Rosenbrock2d.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). @@ -107,7 +107,7 @@ steps[1].add(x[1]); steps[2].add(rinfo[0]); ``` -
    +
    ``` ---------------------------------------------------------- @@ -234,7 +234,7 @@ for (int i = 0; i < mult.length; i += 2) { } ``` -
    +
    ``` Lagrange multipliers: [ -0.4 0.0 ] diff --git a/FOAS/migration/Readme.md b/FOAS/migration/Readme.md index 9cdd69f..fd7abe9 100644 --- a/FOAS/migration/Readme.md +++ b/FOAS/migration/Readme.md @@ -30,7 +30,7 @@ public static class OBJFUN_E04DG extends E04DG.Abstract_E04DG_OBJFUN { } ``` -
    +
    ```java // Define user call-backs for E04KF @@ -64,7 +64,7 @@ public static class MONIT_E04KF extends E04KF.Abstract_E04KF_MONIT { } ``` -
    +
    ```java // The initial guess @@ -99,7 +99,7 @@ ifail = 0; e04dg.eval(n, objfun_e04dg, iter, objf, objgrd, x, iwork, work, iuser, ruser, lwsav, iwsav, rwsav, ifail); ``` -
    +
    ``` Solution: 1.0000067567705557 1.0000135365609837 @@ -158,7 +158,7 @@ E04RZ e04rz = new E04RZ(); e04rz.eval(handle, ifail); ``` -
    +
    ``` E04KF, First order method for bound-constrained problems From 98390e955c3737fb611cd47d96064dbbc3a26deb Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 4 May 2021 15:44:18 +0300 Subject: [PATCH 176/196] Small doc fixes --- FOAS/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FOAS/Readme.md b/FOAS/Readme.md index 4149d65..9dbf96c 100644 --- a/FOAS/Readme.md +++ b/FOAS/Readme.md @@ -53,7 +53,7 @@ Notes and comments on migrating your code from [`uncon_conjgrd_comp (e04dg)`](ht [`e04kfc`](https://www.nag.co.uk/numeric/nl/nagdoc_latest/clhtml/e04/e04kfc.html)): - * [Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/Migration_E04DG_E04KF.java) + * [Java](./migration) * [Fortran 90](https://www.nag.com/numeric/nl/nagdoc_latest/flhtml/genint/replace.html#e04dgf) * [C](https://www.nag.com/numeric/nl/nagdoc_latest/clhtml/genint/replace.html#e04dgc) * [Python](https://github.com/numericalalgorithmsgroup/NAGPythonExamples/blob/master/local_optimization/FOAS/migration/migration_e04dg_e04kf.ipynb) From 6340c898e2a58063ecfd1058e88a4fcc84503564 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 4 May 2021 15:46:36 +0300 Subject: [PATCH 177/196] Small doc fixes --- FOAS/migration/Readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FOAS/migration/Readme.md b/FOAS/migration/Readme.md index fd7abe9..de34858 100644 --- a/FOAS/migration/Readme.md +++ b/FOAS/migration/Readme.md @@ -1,11 +1,11 @@ > ## Important Information > You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/migration) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration). > -> The source of this example can be found [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/migration/Migration_E04DG_E04KF.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/output.txt). +> The source of this example can be found [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/Migration_E04DG_E04KF.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/output.txt). > > See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). -# Migrating from `E04DG` to `E04KF` +# Migrating from E04DG to E04KF This page illustrates the steps required to upgrade from the solver `uncon_conjgrd_comp` (`E04DG`) to `handle_solve_bounds_foas` (`E04KF`) introduced at Mark 27 of the NAG Library. @@ -71,7 +71,7 @@ public static class MONIT_E04KF extends E04KF.Abstract_E04KF_MONIT { double[] x = new double[] { -1.5, 1.9 }; ``` -## Solve the problem with `E04DG` +## Solve the problem with E04DG ```java E04WB e04wb = new E04WB(); @@ -105,7 +105,7 @@ e04dg.eval(n, objfun_e04dg, iter, objf, objgrd, x, iwork, work, iuser, ruser, lw Solution: 1.0000067567705557 1.0000135365609837 ``` -## Now solve with the new solver `E04KF` +## Now solve with the new solver E04KF ```java // Now solve with the new solver E04KF From 6d4382ff183bb2f2316cc314795e0be4018e7831 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Wed, 5 May 2021 14:33:46 +0100 Subject: [PATCH 178/196] Simple Examples Synced with branch MK27.2 --- simple_examples/baseresults/a00aaje.r | 2 +- simple_examples/baseresults/outputexample.r | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r index f55ff48..282acb3 100644 --- a/simple_examples/baseresults/a00aaje.r +++ b/simple_examples/baseresults/a00aaje.r @@ -5,6 +5,6 @@ Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) Precision: double precision Product Code: CLL6I262CL - Mark: 27.3.0 (self-contained) + Mark: 27.2.1 (self-contained) *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r index 9794ff3..fd4bc95 100644 --- a/simple_examples/baseresults/outputexample.r +++ b/simple_examples/baseresults/outputexample.r @@ -3,7 +3,7 @@ Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran Precision: double precision Product Code: NLL6I27DBL - Mark: 27.3.0 (self-contained) + Mark: 27.2.1 (self-contained) This is a 64-bit library using 32-bit integers. From 929a4ca4c165ce0f6d4b0514b5aa9de937cecdf8 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Wed, 5 May 2021 14:46:46 +0100 Subject: [PATCH 179/196] Simple Examples Synced with branch MK27.1 --- simple_examples/baseresults/a00aaje.r | 2 +- simple_examples/baseresults/outputexample.r | 2 +- .../source/{int64_unsupported => int64}/A00AAJE.java | 0 .../source/{int64_unsupported => int64}/A00ADJE.java | 0 .../source/{int64_unsupported => int64}/C05AYJE.java | 0 .../source/{int64_unsupported => int64}/C05AZJE.java | 0 .../source/{int64_unsupported => int64}/C05MBJE.java | 0 .../source/{int64_unsupported => int64}/C05QBJE.java | 0 .../source/{int64_unsupported => int64}/D01BDJE.java | 0 .../source/{int64_unsupported => int64}/D02NEJE.java | 0 .../source/{int64_unsupported => int64}/DTFSMJE.java | 0 .../source/{int64_unsupported => int64}/E01DAJE.java | 0 .../source/{int64_unsupported => int64}/E04FCJE.java | 0 .../source/{int64_unsupported => int64}/E04MTJE.java | 0 .../source/{int64_unsupported => int64}/E04NFJE.java | 0 .../source/{int64_unsupported => int64}/E04UCJE.java | 0 .../source/{int64_unsupported => int64}/F02EKJE.java | 0 17 files changed, 2 insertions(+), 2 deletions(-) rename simple_examples/source/{int64_unsupported => int64}/A00AAJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/A00ADJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/C05AYJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/C05AZJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/C05MBJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/C05QBJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/D01BDJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/D02NEJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/DTFSMJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/E01DAJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/E04FCJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/E04MTJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/E04NFJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/E04UCJE.java (100%) rename simple_examples/source/{int64_unsupported => int64}/F02EKJE.java (100%) diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r index 282acb3..f2f68d2 100644 --- a/simple_examples/baseresults/a00aaje.r +++ b/simple_examples/baseresults/a00aaje.r @@ -5,6 +5,6 @@ Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) Precision: double precision Product Code: CLL6I262CL - Mark: 27.2.1 (self-contained) + Mark: 27.1.3 (self-contained) *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r index fd4bc95..a692e85 100644 --- a/simple_examples/baseresults/outputexample.r +++ b/simple_examples/baseresults/outputexample.r @@ -3,7 +3,7 @@ Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran Precision: double precision Product Code: NLL6I27DBL - Mark: 27.2.1 (self-contained) + Mark: 27.1.3 (self-contained) This is a 64-bit library using 32-bit integers. diff --git a/simple_examples/source/int64_unsupported/A00AAJE.java b/simple_examples/source/int64/A00AAJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/A00AAJE.java rename to simple_examples/source/int64/A00AAJE.java diff --git a/simple_examples/source/int64_unsupported/A00ADJE.java b/simple_examples/source/int64/A00ADJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/A00ADJE.java rename to simple_examples/source/int64/A00ADJE.java diff --git a/simple_examples/source/int64_unsupported/C05AYJE.java b/simple_examples/source/int64/C05AYJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/C05AYJE.java rename to simple_examples/source/int64/C05AYJE.java diff --git a/simple_examples/source/int64_unsupported/C05AZJE.java b/simple_examples/source/int64/C05AZJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/C05AZJE.java rename to simple_examples/source/int64/C05AZJE.java diff --git a/simple_examples/source/int64_unsupported/C05MBJE.java b/simple_examples/source/int64/C05MBJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/C05MBJE.java rename to simple_examples/source/int64/C05MBJE.java diff --git a/simple_examples/source/int64_unsupported/C05QBJE.java b/simple_examples/source/int64/C05QBJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/C05QBJE.java rename to simple_examples/source/int64/C05QBJE.java diff --git a/simple_examples/source/int64_unsupported/D01BDJE.java b/simple_examples/source/int64/D01BDJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/D01BDJE.java rename to simple_examples/source/int64/D01BDJE.java diff --git a/simple_examples/source/int64_unsupported/D02NEJE.java b/simple_examples/source/int64/D02NEJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/D02NEJE.java rename to simple_examples/source/int64/D02NEJE.java diff --git a/simple_examples/source/int64_unsupported/DTFSMJE.java b/simple_examples/source/int64/DTFSMJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/DTFSMJE.java rename to simple_examples/source/int64/DTFSMJE.java diff --git a/simple_examples/source/int64_unsupported/E01DAJE.java b/simple_examples/source/int64/E01DAJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/E01DAJE.java rename to simple_examples/source/int64/E01DAJE.java diff --git a/simple_examples/source/int64_unsupported/E04FCJE.java b/simple_examples/source/int64/E04FCJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/E04FCJE.java rename to simple_examples/source/int64/E04FCJE.java diff --git a/simple_examples/source/int64_unsupported/E04MTJE.java b/simple_examples/source/int64/E04MTJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/E04MTJE.java rename to simple_examples/source/int64/E04MTJE.java diff --git a/simple_examples/source/int64_unsupported/E04NFJE.java b/simple_examples/source/int64/E04NFJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/E04NFJE.java rename to simple_examples/source/int64/E04NFJE.java diff --git a/simple_examples/source/int64_unsupported/E04UCJE.java b/simple_examples/source/int64/E04UCJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/E04UCJE.java rename to simple_examples/source/int64/E04UCJE.java diff --git a/simple_examples/source/int64_unsupported/F02EKJE.java b/simple_examples/source/int64/F02EKJE.java similarity index 100% rename from simple_examples/source/int64_unsupported/F02EKJE.java rename to simple_examples/source/int64/F02EKJE.java From f625b3f043c5c14a88d7ecbc04374acf75d63c82 Mon Sep 17 00:00:00 2001 From: Christos Efstathiou Date: Wed, 5 May 2021 14:48:37 +0100 Subject: [PATCH 180/196] Simple Examples Synced with branch MK27.2 --- simple_examples/baseresults/a00aaje.r | 2 +- simple_examples/baseresults/outputexample.r | 2 +- .../source/{int64 => int64_unsupported}/A00AAJE.java | 0 .../source/{int64 => int64_unsupported}/A00ADJE.java | 0 .../source/{int64 => int64_unsupported}/C05AYJE.java | 0 .../source/{int64 => int64_unsupported}/C05AZJE.java | 0 .../source/{int64 => int64_unsupported}/C05MBJE.java | 0 .../source/{int64 => int64_unsupported}/C05QBJE.java | 0 .../source/{int64 => int64_unsupported}/D01BDJE.java | 0 .../source/{int64 => int64_unsupported}/D02NEJE.java | 0 .../source/{int64 => int64_unsupported}/DTFSMJE.java | 0 .../source/{int64 => int64_unsupported}/E01DAJE.java | 0 .../source/{int64 => int64_unsupported}/E04FCJE.java | 0 .../source/{int64 => int64_unsupported}/E04MTJE.java | 0 .../source/{int64 => int64_unsupported}/E04NFJE.java | 0 .../source/{int64 => int64_unsupported}/E04UCJE.java | 0 .../source/{int64 => int64_unsupported}/F02EKJE.java | 0 17 files changed, 2 insertions(+), 2 deletions(-) rename simple_examples/source/{int64 => int64_unsupported}/A00AAJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/A00ADJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05AYJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05AZJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05MBJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/C05QBJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/D01BDJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/D02NEJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/DTFSMJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E01DAJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04FCJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04MTJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04NFJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/E04UCJE.java (100%) rename simple_examples/source/{int64 => int64_unsupported}/F02EKJE.java (100%) diff --git a/simple_examples/baseresults/a00aaje.r b/simple_examples/baseresults/a00aaje.r index f2f68d2..282acb3 100644 --- a/simple_examples/baseresults/a00aaje.r +++ b/simple_examples/baseresults/a00aaje.r @@ -5,6 +5,6 @@ Implementation title: Linux, 64-bit, Intel C/C++ (32-bit integers) Precision: double precision Product Code: CLL6I262CL - Mark: 27.1.3 (self-contained) + Mark: 27.2.1 (self-contained) *** End of NAG Library implementation details *** diff --git a/simple_examples/baseresults/outputexample.r b/simple_examples/baseresults/outputexample.r index a692e85..fd4bc95 100644 --- a/simple_examples/baseresults/outputexample.r +++ b/simple_examples/baseresults/outputexample.r @@ -3,7 +3,7 @@ Implementation title: Linux, 64-bit, Intel C/C++ or Intel Fortran Precision: double precision Product Code: NLL6I27DBL - Mark: 27.1.3 (self-contained) + Mark: 27.2.1 (self-contained) This is a 64-bit library using 32-bit integers. diff --git a/simple_examples/source/int64/A00AAJE.java b/simple_examples/source/int64_unsupported/A00AAJE.java similarity index 100% rename from simple_examples/source/int64/A00AAJE.java rename to simple_examples/source/int64_unsupported/A00AAJE.java diff --git a/simple_examples/source/int64/A00ADJE.java b/simple_examples/source/int64_unsupported/A00ADJE.java similarity index 100% rename from simple_examples/source/int64/A00ADJE.java rename to simple_examples/source/int64_unsupported/A00ADJE.java diff --git a/simple_examples/source/int64/C05AYJE.java b/simple_examples/source/int64_unsupported/C05AYJE.java similarity index 100% rename from simple_examples/source/int64/C05AYJE.java rename to simple_examples/source/int64_unsupported/C05AYJE.java diff --git a/simple_examples/source/int64/C05AZJE.java b/simple_examples/source/int64_unsupported/C05AZJE.java similarity index 100% rename from simple_examples/source/int64/C05AZJE.java rename to simple_examples/source/int64_unsupported/C05AZJE.java diff --git a/simple_examples/source/int64/C05MBJE.java b/simple_examples/source/int64_unsupported/C05MBJE.java similarity index 100% rename from simple_examples/source/int64/C05MBJE.java rename to simple_examples/source/int64_unsupported/C05MBJE.java diff --git a/simple_examples/source/int64/C05QBJE.java b/simple_examples/source/int64_unsupported/C05QBJE.java similarity index 100% rename from simple_examples/source/int64/C05QBJE.java rename to simple_examples/source/int64_unsupported/C05QBJE.java diff --git a/simple_examples/source/int64/D01BDJE.java b/simple_examples/source/int64_unsupported/D01BDJE.java similarity index 100% rename from simple_examples/source/int64/D01BDJE.java rename to simple_examples/source/int64_unsupported/D01BDJE.java diff --git a/simple_examples/source/int64/D02NEJE.java b/simple_examples/source/int64_unsupported/D02NEJE.java similarity index 100% rename from simple_examples/source/int64/D02NEJE.java rename to simple_examples/source/int64_unsupported/D02NEJE.java diff --git a/simple_examples/source/int64/DTFSMJE.java b/simple_examples/source/int64_unsupported/DTFSMJE.java similarity index 100% rename from simple_examples/source/int64/DTFSMJE.java rename to simple_examples/source/int64_unsupported/DTFSMJE.java diff --git a/simple_examples/source/int64/E01DAJE.java b/simple_examples/source/int64_unsupported/E01DAJE.java similarity index 100% rename from simple_examples/source/int64/E01DAJE.java rename to simple_examples/source/int64_unsupported/E01DAJE.java diff --git a/simple_examples/source/int64/E04FCJE.java b/simple_examples/source/int64_unsupported/E04FCJE.java similarity index 100% rename from simple_examples/source/int64/E04FCJE.java rename to simple_examples/source/int64_unsupported/E04FCJE.java diff --git a/simple_examples/source/int64/E04MTJE.java b/simple_examples/source/int64_unsupported/E04MTJE.java similarity index 100% rename from simple_examples/source/int64/E04MTJE.java rename to simple_examples/source/int64_unsupported/E04MTJE.java diff --git a/simple_examples/source/int64/E04NFJE.java b/simple_examples/source/int64_unsupported/E04NFJE.java similarity index 100% rename from simple_examples/source/int64/E04NFJE.java rename to simple_examples/source/int64_unsupported/E04NFJE.java diff --git a/simple_examples/source/int64/E04UCJE.java b/simple_examples/source/int64_unsupported/E04UCJE.java similarity index 100% rename from simple_examples/source/int64/E04UCJE.java rename to simple_examples/source/int64_unsupported/E04UCJE.java diff --git a/simple_examples/source/int64/F02EKJE.java b/simple_examples/source/int64_unsupported/F02EKJE.java similarity index 100% rename from simple_examples/source/int64/F02EKJE.java rename to simple_examples/source/int64_unsupported/F02EKJE.java From 66ea9d0a228d1cd2c5d85408435b0d02c16ee5e0 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 20 Feb 2023 18:21:59 -0600 Subject: [PATCH 181/196] Adding NLDF example images, source code (.java), and Readme --- NLDF/GenDFEx.java | 209 +++++++++++++++++++++ NLDF/Readme.md | 340 +++++++++++++++++++++++++++++++++++ NLDF/images/fig1.pdf | Bin 0 -> 6237 bytes NLDF/images/fig1.png | Bin 0 -> 4137 bytes NLDF/images/fig2.pdf | Bin 0 -> 10318 bytes NLDF/images/fig2.png | Bin 0 -> 8418 bytes NLDF/images/fig3.pdf | Bin 0 -> 10317 bytes NLDF/images/fig3.png | Bin 0 -> 8031 bytes NLDF/images/fig4.pdf | Bin 0 -> 6241 bytes NLDF/images/fig4.png | Bin 0 -> 4218 bytes NLDF/images/fig5.png | Bin 0 -> 18296 bytes NLDF/images/fig5_simple.pdf | Bin 0 -> 5971 bytes NLDF/images/fig6_simple.pdf | Bin 0 -> 744138 bytes NLDF/images/fig7.pdf | Bin 0 -> 11163 bytes NLDF/images/nldf_contour.png | Bin 0 -> 136801 bytes 15 files changed, 549 insertions(+) create mode 100644 NLDF/GenDFEx.java create mode 100644 NLDF/Readme.md create mode 100644 NLDF/images/fig1.pdf create mode 100644 NLDF/images/fig1.png create mode 100644 NLDF/images/fig2.pdf create mode 100644 NLDF/images/fig2.png create mode 100644 NLDF/images/fig3.pdf create mode 100644 NLDF/images/fig3.png create mode 100644 NLDF/images/fig4.pdf create mode 100644 NLDF/images/fig4.png create mode 100644 NLDF/images/fig5.png create mode 100644 NLDF/images/fig5_simple.pdf create mode 100644 NLDF/images/fig6_simple.pdf create mode 100644 NLDF/images/fig7.pdf create mode 100644 NLDF/images/nldf_contour.png diff --git a/NLDF/GenDFEx.java b/NLDF/GenDFEx.java new file mode 100644 index 0000000..20cfd3f --- /dev/null +++ b/NLDF/GenDFEx.java @@ -0,0 +1,209 @@ +import com.nag.routines.E04.E04GN; // nagf_opt_handle_solve_nldf +import com.nag.routines.E04.E04GNU; // monit +import com.nag.routines.E04.E04GNX; // confun dummy +import com.nag.routines.E04.E04GNY; // congrd dummy +import com.nag.routines.E04.E04RA; // Handle init +import com.nag.routines.E04.E04RH; //box bounds +import com.nag.routines.E04.E04RJ; // linear constraints +import com.nag.routines.E04.E04RM; // add model and residual sparsity structure +import com.nag.routines.E04.E04RZ; //destroy handle +import com.nag.routines.E04.E04ZM; // optional parameters + +import java.lang.Math; +import java.util.Arrays; +//import java.io.File; +//import java.io.IOException; +///import java.io.FileWriter; + +public class GenDFEx { + + public static void main (String[] args) { + + E04GN e04gn = new E04GN(); // the solver + E04RA e04ra = new E04RA(); // the handle initializer + E04RM e04rm = new E04RM(); // for setting model and residual sparsity structure + E04ZM e04zm = new E04ZM(); // for setting optional parameters + E04RZ e04rz = new E04RZ(); // handle destroyer + + + MONIT monit = new MONIT(); // defined below using E04GNU + CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy) + CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy) + + + // Set up data and initial handle parameters + double [] t = linspace(0.5, 2.5, 21); + double [] ruser1 = toydata1(t); // For Example 1 + double [] ruser2 = toydata2(t); // For Example 2 + + double [] x = new double [2]; // instatiate an array for as many variable you need + long handle = 0; + int nvar = x.length; + int ifail; + int nres = t.length; + + // Init for sparsity structure + int isparse = 0; + int nnzrd = 0; + int [] irowrd = new int [nnzrd]; + int [] icolrd = new int [nnzrd]; + + + + // Get handle + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // define the residual functions and sparsity structure + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + ifail = 0; + e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = Yes", ifail); + + // Initialize all the remaining parameters + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + double [] rx = new double[nres]; + double [] rinfo = new double[100]; + double [] stats = new double [100]; + int [] iuser = new int[0]; + long cpuser = 0; + + // Solve + System.out.println("\n----Solving Toy Dataset #1 with L2 Loss Function----"); + ifail = 0; + x = init_x(); //give x the initial guess you want to start from + // x will be changed during solve + e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser1, cpuser, ifail); + + System.out.println("\n----Solving Toy Dataset #1 with L1 Loss Function----"); + ifail = 0; + x = init_x(); + e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail); + e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser1, cpuser, ifail); + + + + // The trade-off of a loss function + // The handle can keep getting used. We are only changing the data passed to the + // solver using ruser2 (first 3 and last 3 data points different from middle) + System.out.println("\n----Solving Toy Dataset #2 with L2 Loss Function----"); + ifail = 0; + x = init_x(); + e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); + e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); + + System.out.println("\n----Solving Toy Dataset #2 with L1 Loss Function----"); + ifail = 0; + x = init_x(); + e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail); + e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); + + System.out.println("\n----Solving Toy Dataset #2 with ATAN Loss Function----"); + ifail = 0; + x = init_x(); + e04zm.eval(handle, "NLDF Loss Function Type = ATAN", ifail); + e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); + + e04rz.eval(handle,ifail); // destroy the handle + + } + + + private static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { + public void eval() { + for(int i = 0; i < NRES; i++){ + this.RX[i] = RUSER[NRES + i] - X[0] * Math.sin(X[1] * RUSER[i]); + } + } + } + + private static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { + public void eval() { + for(int i = 0; i < NRES; i++){ + this.RDX[i * NVAR] = (-1 * Math.sin(X[1]*RUSER[i])); + this.RDX[i* NVAR + 1] = (-1 * RUSER[i] * X[0] * Math.cos(X[1] * RUSER[i])); + } + } + } + + // Dummy Functions required for NLDF solver + private static class CONFUN extends E04GNX implements E04GN.E04GN_CONFUN { + public void eval(){ + super.eval(); + } + } + + private static class CONGRD extends E04GNY implements E04GN.E04GN_CONGRD { + public void eval(){ + super.eval(); + } + } + + private static class MONIT extends E04GNU implements E04GN.E04GN_MONIT { + public void eval(){ + super.eval(); + } + } + + // Utilities for setting up data for problem + private static double[] linspace(double startPoint, double endPoint, int length) { + double[] a = new double[length]; + double step = (endPoint - startPoint) / (length - 1); + a[0] = startPoint; + a[length - 1] = endPoint; + for (int i = 1; i < length - 1; i++) { + a[i] = startPoint + i * step; + } + return a; + } + + private static double[] toydata1(double [] t) { + double [] y = new double[t.length * 2]; + for(int i = 0; i < t.length * 2; i++){ + if(i < t.length){ + y[i] = t[i]; + } + else{ + y[i] = Math.sin(t[i-t.length]); + if(i - t.length == 10){ + y[i] = 5 * y[i]; + } + } + } + return y; + } + + private static double[] toydata2(double [] t) { + double [] y = new double[t.length * 2]; + for(int i = 0; i < t.length * 2; i++){ + if(i < t.length){ + y[i] = t[i]; + } + else{ + y[i] = Math.sin(t[i-t.length]); + if((i - t.length >= 3) && (i - t.length < 18)){ + y[i] = 5 * y[i]; + } + } + } + return y; + } + + // For resetting the initial guess + private static double[] init_x() { + double [] x = new double [] {2.1,1.4}; + return x; + } +} \ No newline at end of file diff --git a/NLDF/Readme.md b/NLDF/Readme.md new file mode 100644 index 0000000..b49b75e --- /dev/null +++ b/NLDF/Readme.md @@ -0,0 +1,340 @@ +> ## Important Information +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](URL-PLACEHOLDER) or access this as a regular github [repository](URL-PLACEHOLDER). +> +> The source of this example can be found [here](URL-PLACEHOLDER) and the output [here](URL-PLACEHOLDER). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](URL-PLACEHOLDER). + +# Loss Function and Robustness in Data-Fitting + +## Technical Setup + +### NAG Library Install + +To run this example, you will need to install the NAG Library (Mark 28.5 or newer) and a license key. You will also need the NAG Library for Java wrappers. You can find the software, wrappers, and request a license key from our website here: [Getting Started with NAG Library](https://www.nag.com/content/getting-started-nag-library) + +### Using These Example Files + +This directory contains a Java source code and a couple images files to help illustrate this example. With NAG Library and wrappers properly installed, the Java file can be compiled and run as it is to produce a data set and execute all the example scenarios described below. + + +## Introduction +Fitting a non-linear model to data is typically modelled as a minimisation problem, where the objective function serves as a measurement of the quality of the model’s fit to data, depending on our parameters. A general model involves summing over our data points, + +$$ +\underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), +$$ + +where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $n_\text{res}$ data points, and $r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$ residual, equal to the difference between the observed and predicted values of the independent variable at time $t_i$, denoted $y_i$ and $\varphi(t_i;x)$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $|r_i\left(x\right)|$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. + +There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. + +### Java Imports +The packages we need to import for this example consist entirely of the following. +```java +import com.nag.routines.E04.E04GN; // nagf_opt_handle_solve_nldf +import com.nag.routines.E04.E04GNU; // monit +import com.nag.routines.E04.E04GNX; // confun dummy +import com.nag.routines.E04.E04GNY; // congrd dummy +import com.nag.routines.E04.E04RA; // Handle init +import com.nag.routines.E04.E04RH; //box bounds +import com.nag.routines.E04.E04RJ; // linear constraints +import com.nag.routines.E04.E04RM; // add model and residual sparsity structure +import com.nag.routines.E04.E04RZ; //destroy handle +import com.nag.routines.E04.E04ZM; // optional parameters + +import java.lang.Math; +import java.util.Arrays; +``` + +### Utility Functions and Setup +We need to define a few dummy functions required by the Generalized Data Fitting solver interface +```java +private static class CONFUN extends E04GNX implements E04GN.E04GN_CONFUN { + public void eval(){ + super.eval(); + } +} + +private static class CONGRD extends E04GNY implements E04GN.E04GN_CONGRD { + public void eval(){ + super.eval(); + } +} + +private static class MONIT extends E04GNU implements E04GN.E04GN_MONIT { + public void eval(){ + super.eval(); + } +} +``` + +Inside our 'main', we will initialize all our variables and create our handle. +```java + E04GN e04gn = new E04GN(); // the solver + E04RA e04ra = new E04RA(); // the handle initializer + E04RM e04rm = new E04RM(); // for setting model and residual sparsity structure + E04ZM e04zm = new E04ZM(); // for setting optional parameters + E04RZ e04rz = new E04RZ(); // handle destroyer + + + MONIT monit = new MONIT(); // defined below using E04GNU + CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy) + CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy) + + double [] x = new double [2]; // instatiate an array for as many variable you need + long handle = 0; + int nvar = x.length; + int ifail; + int nres = t.length; + + // Init for sparsity structure + int isparse = 0; + int nnzrd = 0; + int [] irowrd = new int [nnzrd]; + int [] icolrd = new int [nnzrd]; + + // Get handle + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // define the residual functions and sparsity structure + ifail = 0; + e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + + // Set options + ifail = 0; + e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); + e04zm.eval(handle, "Print Level = 1", ifail); + e04zm.eval(handle, "Print Options = No", ifail); + e04zm.eval(handle, "Print Solution = Yes", ifail); + + // Initialize all the remaining parameters + LSQFUN lsqfun = new LSQFUN(); + LSQGRD lsqgrd = new LSQGRD(); + double [] rx = new double[nres]; + double [] rinfo = new double[100]; + double [] stats = new double [100]; + int [] iuser = new int[0]; + long cpuser = 0; +``` + +We also define $t$ as an array of 21 points from $0.5$ to $2.5$. + +## Single-outlier example + +To investigate the robustness aspect, here’s a toy dataset which is generated from $\sin(t)$ and has an outlier at $t=1.5$, which is generated by $5\sin(t)$. + +![toy1](images/fig1.png) + +```java +private static double[] toydata1(double [] t) { + double [] y = new double[t.length * 2]; + for(int i = 0; i < t.length * 2; i++){ + if(i < t.length){ + y[i] = t[i]; + } + else{ + y[i] = Math.sin(t[i-t.length]); + if(i - t.length == 10){ + y[i] = 5 * y[i]; + } + } + } + return y; +} +```` + +We will fit it with a model + +$$ +\varphi(t;x)\ =x_1\sin(x_2t) +$$ + +using a variety of loss functions provided by NAG’s data-fitting solver **handle_solve_nldf** (`e04gn`), which constructs the appropriate objective function for us. + +To set up this model, we must define it and its gradient inside the functions `LSQFUN` and `LSQGRD` +```java +private static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { + public void eval() { + for(int i = 0; i < NRES; i++){ + this.RX[i] = RUSER[NRES + i] - X[0] * Math.sin(X[1] * RUSER[i]); + } + } +} + +private static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { + public void eval() { + for(int i = 0; i < NRES; i++){ + this.RDX[i * NVAR] = (-1 * Math.sin(X[1]*RUSER[i])); + this.RDX[i* NVAR + 1] = (-1 * RUSER[i] * X[0] * Math.cos(X[1] * RUSER[i])); + } + } +} +``` + +### Start with $l_2$-norm loss function - Example 1 +Starting with one of the most common loss functions, the $l_2$-norm, we form the problem + +$$ +\underset{x \in \mathbb{R}^{2}}{\text{minimize}}~f(x) =\sum_{i=1}^{21} r_i(x)^2 +$$ + +which is just least squares regression. $l_2$-norm loss has low robustness against outliers, so we should expect that the solution will be affected heavily by this one outlier. Let’s solve from a starting point at + +$$ +x\ =\ (2.1,1.4) +$$ + +to see what this outlier does to the minimum. + +For this Java example, we set up a function to reset $x$ variable to the starting point, since it gets passed to the solver and returns the solution. + +```java +private static double[] init_x() { + double [] x = new double [] {2.1,1.4}; + return x; +} +``` +We first set up the options parameter to select the loss function and the printing options. + +Since we already set up the handle and initialized the loss function to $l2$, we can just set our initial guess and solve. + +```java +ifail = 0; +x = init_x(); +e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser1, cpuser, ifail); +``` + +This first solve will print out the solution: +``` +E04GN, Nonlinear Data-Fitting +Status: converged, an optimal solution found +Final objective value 1.470963E+01 + +Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.30111E+00 inf + 2 -inf 1.06956E+00 inf +```` + +And the curve this produces looks like this: + +![L2](images/fig2.png) + +The single outlier was able to disrupt the fit, since $l_2$-norm loss makes outliers contribute heavily to the objective function and search direction. + +### Try $l_1$-norm loss function - Example 2 +Using $l_1$-norm loss gives us the problem + +$$ +\underset{x \in \mathbb{R}^{2}}{\text{minimize}}~f(x) =\sum_{i=1}^{21} |r_i(x)|, +$$ + +which is more robust against outliers. This means if some large portion of the data is well-fitted by some solution $x^\ast$, there is likely to be a local minimum very close to $x^\ast$ which is relatively undisturbed by the remaining data that is outlying to the solution $x^\ast$. Here’s the solution, again starting at $x=(2.1,1.4)$, using $l_1$ loss. + +Now all we need to do is change the loss function parameter, reset $x$, and solve again. +```java +ifail = 0; +x = init_x(); +e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail); +e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser1, cpuser, ifail); +``` + +The results of this solve look like this: +``` +E04GN, Nonlinear Data-Fitting +Status: converged, an optimal solution found +Final objective value 3.989980E+00 + +Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.00000E+00 inf + 2 -inf 1.00000E+00 inf +``` + +![L1](images/fig3.png) + +Clearly, this is a much better fit for most of the data, and the outlier hasn’t dragged the model off most of the data. + +## The trade-off of a loss function + +We can reuse the handle, the residual function (and gradient). Just changing the data and options, we can demonstrate more principles to consider regarding loss functions. + +There is a danger in choosing a very robust loss function. During an iterative optimization process, a loss function which is robust against outliers will usually prefer the data which is close to the current model. This means that if the algorithm finds local minima of the objective function, the search can fall into a local minimum when the model fits some subset of the data very well but fits the majority of the data very badly. + +To illustrate this, here’s a new dataset which we will try to fit with the same model, again starting at $x= (2.1,1.4)$. Most of the data was generated by $5\sin(t)$, with the 3 data points at either end being generated by $\sin(t)$. + +![toy2](images/fig4.png) + +```java +private static double[] toydata2(double [] t) { + double [] y = new double[t.length * 2]; + for(int i = 0; i < t.length * 2; i++){ + if(i < t.length){ + y[i] = t[i]; + } + else{ + y[i] = Math.sin(t[i-t.length]); + if((i - t.length >= 3) && (i - t.length < 18)){ + y[i] = 5 * y[i]; + } + } + } + return y; +} +``` + +We will fit this data set using 3 different loss functions with the same model $\varphi(t;x)$ each time and discuss the results under the plots all at once below. + +```java +ifail = 0; +x = init_x(); +e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); +e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); + +ifail = 0; +x = init_x(); +e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail); +e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); + +ifail = 0; +x = init_x(); +e04zm.eval(handle, "NLDF Loss Function Type = ATAN", ifail); +e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, + stats, iuser, ruser2, cpuser, ifail); +``` + +Here are all the curves plotted together: + +![All](images/fig5.png) + +In the first row of plots, the data is fitted using $l_2$-norm loss, $l_1$-norm loss, and $\arctan$ loss. Shown below each is the contour plot of the objective function value, where the black circles represent the parameters used to generate the data, the cyan circles represents the starting point for the solver, and the cyan wedges represent the optimized solution found by the solver. + +![Contour](images/nldf_contour.png) + +In the $l_2$-norm case in the left column, the outliers generated by $\sin(t)$ have pulled the optimal solution away from $x = (5,1)$. The contour plot for $l_2$-norm loss indicates that we don’t have to worry too much about what starting point to use, since there are no local minima in the region displayed, other than global best solution. + +The behaviour of the solver is quite different when using an extremely robust loss function like $\arctan$ loss, which looks like + +$$ +\underset{x \in \mathbb{R}^{2}}{\text{minimize}} ~ f(x) =\sum_{i=1}^{21} \text{arctan}(r_i(x)^2) +$$ + +The fitted model and corresponding contour plot for the $\arctan$ case are in the middle. Here, there are eight local minima in the contour plot for $\arctan$ loss, with seven of them being substantially worse solutions than the global minimum, and it is one of these we’ve converged to. Therefore, in this case the selection of initial estimation of the parameters is much more important. + +The model fitted with $l_1$-norm loss and the corresponding contour plot are in the right column. Looking at the contour plot, there are still a few local minima that do not correspond to the optimal solution, but the starting point of $x = (2.1,1.4)$ still converges to the global minimum, which lies at +$x = (5,1)$, meaning the part of the dataset generated from $\sin(t)$ is effectively being ignoring. From the plots of the loss functions, we can see that $l_1$-norm loss is more robust than $l_2$-norm loss but less so than $\arctan$ loss. + +So, what has happened in each case is: using $l_2$-norm loss, we move to the global minimum which is affected by the whole dataset. Using $l_1$-norm loss, we move to the global minimum which fits most of the data very well and ignores a small portion, treating them as outliers. Using $\arctan$ loss we move to a local minimum which ignores a large portion of the data (treating them as outliers) and fits a small amount of data very well. + +## Conclusion + +The lesson here is that the same thing that makes a loss function robust – ignoring data that lies far from the current model to some degree – can populate the search space with local minima where the model predicts some of the data well and ignores most of it. In extreme cases like arctan loss, if the starting point fits some of the data very well, the model will likely just be optimized for that portion of the data, even if it is a small portion of the whole dataset. It is therefore important to try a variety of loss functions and stating points when setting up a data-fitting problem, since these will affect both the optimal solution, as well as how easily an optimal solution is found. + +[Learn more about the NAG Library](https://www.nag.com/content/nag-library) \ No newline at end of file diff --git a/NLDF/images/fig1.pdf b/NLDF/images/fig1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..972a0062d4b0f5de91605da667e0209819602c83 GIT binary patch literal 6237 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 literal 0 HcmV?d00001 diff --git a/NLDF/images/fig1.png b/NLDF/images/fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..040e27796d537beda9cdd525ebe309115fdc0182 GIT binary patch literal 4137 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 AX8-^I literal 0 HcmV?d00001 diff --git a/NLDF/images/fig2.png b/NLDF/images/fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..c728aa7e3ef88e9e958857d61e7b1af88e29d01a GIT binary patch literal 8418 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 literal 0 HcmV?d00001 diff --git a/NLDF/images/fig3.png b/NLDF/images/fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6823b9471130c858e7123f0bd0ca74c2445a5c GIT binary patch literal 8031 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 C4HdNj literal 0 HcmV?d00001 diff --git a/NLDF/images/fig4.pdf b/NLDF/images/fig4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8002df0f891eec1f80574bfec7c4f1835f762727 GIT binary patch literal 6241 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 QEs}}jG&3{Dc}}$d0-_HmHUIzs literal 0 HcmV?d00001 diff --git a/NLDF/images/fig4.png b/NLDF/images/fig4.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4a4b6bd2121a1513e3f9ee044e0ee5ed9e843b GIT binary patch literal 4218 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 a3BXTZS$&5c@(B4401yryv105e|MY)Yx8HC8 literal 0 HcmV?d00001 diff --git a/NLDF/images/fig5.png b/NLDF/images/fig5.png new file mode 100644 index 0000000000000000000000000000000000000000..083b387a845cac62521dbf4c81c74b0f554b54c1 GIT binary patch literal 18296 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 Pg2UkH>gTe~DWM4foN%_s literal 0 HcmV?d00001 diff --git a/NLDF/images/fig5_simple.pdf b/NLDF/images/fig5_simple.pdf new file mode 100644 index 0000000000000000000000000000000000000000..294aea4befac61dd67ed87deac86d211f7ab03a4 GIT binary patch literal 5971 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 literal 0 HcmV?d00001 diff --git a/NLDF/images/fig6_simple.pdf b/NLDF/images/fig6_simple.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a5c6f0d26a2631da05c346d9cfe3f0f6b5a194b1 GIT binary patch literal 744138 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�P)?uF_82w~*ru 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

    |i93}N_f3FqxAvd} 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%0D4?0nPIMC9XeZp6I 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�(m`UNbA$E1iE!%s8B0 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�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 E0W`e`EC2ui literal 0 HcmV?d00001 diff --git a/NLDF/images/fig7.pdf b/NLDF/images/fig7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ac916796dcb8bf2e4830f77a9a8dcb1089cc570 GIT binary patch literal 11163 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 -N7 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 rVNVr%2JuQ^FIViPO|KOG*E@(i>E->8Kj2StSv1 Date: Mon, 20 Feb 2023 18:27:30 -0600 Subject: [PATCH 182/196] Update Readme.md fixing links --- NLDF/Readme.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index b49b75e..01ad067 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -1,9 +1,7 @@ > ## Important Information -> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](URL-PLACEHOLDER) or access this as a regular github [repository](URL-PLACEHOLDER). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/NLDF/) or access this as a regular github [repository](https://github.com/caleb-hamilton/NAGJavaExamples/tree/main/NLDF). > -> The source of this example can be found [here](URL-PLACEHOLDER) and the output [here](URL-PLACEHOLDER). -> -> See the top directory of this repository for instructions to set up the [NAG Library for Java](URL-PLACEHOLDER). +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). # Loss Function and Robustness in Data-Fitting @@ -337,4 +335,4 @@ So, what has happened in each case is: using $l_2$-norm loss, we move to the glo The lesson here is that the same thing that makes a loss function robust – ignoring data that lies far from the current model to some degree – can populate the search space with local minima where the model predicts some of the data well and ignores most of it. In extreme cases like arctan loss, if the starting point fits some of the data very well, the model will likely just be optimized for that portion of the data, even if it is a small portion of the whole dataset. It is therefore important to try a variety of loss functions and stating points when setting up a data-fitting problem, since these will affect both the optimal solution, as well as how easily an optimal solution is found. -[Learn more about the NAG Library](https://www.nag.com/content/nag-library) \ No newline at end of file +[Learn more about the NAG Library](https://www.nag.com/content/nag-library) From f6f87a9e2f0e3021f4d6d1332542638d9f1d21ab Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 20 Feb 2023 18:38:40 -0600 Subject: [PATCH 183/196] Update Readme.md fixing urls --- NLDF/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 01ad067..ea153a2 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -1,7 +1,7 @@ > ## Important Information -> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/NLDF/) or access this as a regular github [repository](https://github.com/caleb-hamilton/NAGJavaExamples/tree/main/NLDF). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://caleb-hamilton.github.io/NAGJavaExamples/NLDF/) or access this as a regular github [repository](https://github.com/caleb-hamilton/NAGJavaExamples/tree/main/NLDF). > -> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/caleb-hamilton/NAGJavaExamples). # Loss Function and Robustness in Data-Fitting From 0e31c75db4fdf7372af5c1cf835743d3060549a9 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 20 Feb 2023 18:52:31 -0600 Subject: [PATCH 184/196] Update Readme.md fixing math formatting in intro --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index ea153a2..6efbfde 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,7 +23,7 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $n_\text{res}$ data points, and $r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$ residual, equal to the difference between the observed and predicted values of the independent variable at time $t_i$, denoted $y_i$ and $\varphi(t_i;x)$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $|r_i\left(x\right)|$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $n_\text{res}$ data points, and $r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$ residual, equal to the difference between the observed and predicted values of the independent variable at time $t_i$, denoted $y_i$ and $\varphi(t_i;x)$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $\left|r_i\left(x\right)\right|$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. From a88d77ea195be898bb0c4ee7afd023c870a77d41 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 21 Feb 2023 17:34:56 -0600 Subject: [PATCH 185/196] Update Readme.md testing inline math format --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 6efbfde..71396eb 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,7 +23,7 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $n_\text{res}$ data points, and $r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$ residual, equal to the difference between the observed and predicted values of the independent variable at time $t_i$, denoted $y_i$ and $\varphi(t_i;x)$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $\left|r_i\left(x\right)\right|$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\left|r_i\left(x\right)\right|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. From c6c0ef956baf3458bc89d1d3b16895115c9cecfd Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 21 Feb 2023 17:38:02 -0600 Subject: [PATCH 186/196] Update Readme.md testing again --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 71396eb..c70c246 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,7 +23,7 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $x$ is a vector holding our model parameters, of which there are $n_\text{var}$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$ is the $i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\left|r_i\left(x\right)\right|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\left|r_i\left(x\right)\right|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. From 79b54e3ddf835395b159ff0e53fc2093ae3387f8 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 21 Feb 2023 17:41:40 -0600 Subject: [PATCH 187/196] Update Readme.md abs{} --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index c70c246..0b5d646 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,7 +23,7 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\left|r_i\left(x\right)\right|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\abs{r_i\left(x\right)}$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. From fe78c4aabad2db2e042de67ac0def755150ef15e Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 21 Feb 2023 17:43:55 -0600 Subject: [PATCH 188/196] Update Readme.md abs || --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 0b5d646..0f479b1 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,7 +23,7 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\abs{r_i\left(x\right)}$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\|{r_i\left(x\right)}\|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. From 83d822feb351d3eb02525aa9cb94d08c5cbcbf9a Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 6 Mar 2023 18:03:17 -0600 Subject: [PATCH 189/196] Update Readme.md math formatting for webpage style --- NLDF/Readme.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 0f479b1..b0e3053 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -118,11 +118,11 @@ Inside our 'main', we will initialize all our variables and create our handle. long cpuser = 0; ``` -We also define $t$ as an array of 21 points from $0.5$ to $2.5$. +We also define $$t$$ as an array of 21 points from $$0.5$$ to $$2.5$$. ## Single-outlier example -To investigate the robustness aspect, here’s a toy dataset which is generated from $\sin(t)$ and has an outlier at $t=1.5$, which is generated by $5\sin(t)$. +To investigate the robustness aspect, here’s a toy dataset which is generated from $$\sin(t)$$ and has an outlier at $$t=1.5$$, which is generated by $$5\sin(t)$$. ![toy1](images/fig1.png) @@ -172,14 +172,14 @@ private static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { } ``` -### Start with $l_2$-norm loss function - Example 1 -Starting with one of the most common loss functions, the $l_2$-norm, we form the problem +### Start with $$l_2$$-norm loss function - Example 1 +Starting with one of the most common loss functions, the $$l_2$$-norm, we form the problem $$ \underset{x \in \mathbb{R}^{2}}{\text{minimize}}~f(x) =\sum_{i=1}^{21} r_i(x)^2 $$ -which is just least squares regression. $l_2$-norm loss has low robustness against outliers, so we should expect that the solution will be affected heavily by this one outlier. Let’s solve from a starting point at +which is just least squares regression. $$l_2$$-norm loss has low robustness against outliers, so we should expect that the solution will be affected heavily by this one outlier. Let’s solve from a starting point at $$ x\ =\ (2.1,1.4) @@ -187,7 +187,7 @@ $$ to see what this outlier does to the minimum. -For this Java example, we set up a function to reset $x$ variable to the starting point, since it gets passed to the solver and returns the solution. +For this Java example, we set up a function to reset $$x$$ variable to the starting point, since it gets passed to the solver and returns the solution. ```java private static double[] init_x() { @@ -197,7 +197,7 @@ private static double[] init_x() { ``` We first set up the options parameter to select the loss function and the printing options. -Since we already set up the handle and initialized the loss function to $l2$, we can just set our initial guess and solve. +Since we already set up the handle and initialized the loss function to $$l2$$, we can just set our initial guess and solve. ```java ifail = 0; @@ -222,18 +222,18 @@ And the curve this produces looks like this: ![L2](images/fig2.png) -The single outlier was able to disrupt the fit, since $l_2$-norm loss makes outliers contribute heavily to the objective function and search direction. +The single outlier was able to disrupt the fit, since $$l_2$$-norm loss makes outliers contribute heavily to the objective function and search direction. -### Try $l_1$-norm loss function - Example 2 -Using $l_1$-norm loss gives us the problem +### Try $$l_1$$-norm loss function - Example 2 +Using $$l_1$$-norm loss gives us the problem $$ \underset{x \in \mathbb{R}^{2}}{\text{minimize}}~f(x) =\sum_{i=1}^{21} |r_i(x)|, $$ -which is more robust against outliers. This means if some large portion of the data is well-fitted by some solution $x^\ast$, there is likely to be a local minimum very close to $x^\ast$ which is relatively undisturbed by the remaining data that is outlying to the solution $x^\ast$. Here’s the solution, again starting at $x=(2.1,1.4)$, using $l_1$ loss. +which is more robust against outliers. This means if some large portion of the data is well-fitted by some solution $$x^\ast$$, there is likely to be a local minimum very close to $x^\ast$ which is relatively undisturbed by the remaining data that is outlying to the solution $$x^\ast$$. Here’s the solution, again starting at $$x=(2.1,1.4)$$, using $$l_1$$ loss. -Now all we need to do is change the loss function parameter, reset $x$, and solve again. +Now all we need to do is change the loss function parameter, reset $$x$$, and solve again. ```java ifail = 0; x = init_x(); @@ -264,7 +264,7 @@ We can reuse the handle, the residual function (and gradient). Just changing the There is a danger in choosing a very robust loss function. During an iterative optimization process, a loss function which is robust against outliers will usually prefer the data which is close to the current model. This means that if the algorithm finds local minima of the objective function, the search can fall into a local minimum when the model fits some subset of the data very well but fits the majority of the data very badly. -To illustrate this, here’s a new dataset which we will try to fit with the same model, again starting at $x= (2.1,1.4)$. Most of the data was generated by $5\sin(t)$, with the 3 data points at either end being generated by $\sin(t)$. +To illustrate this, here’s a new dataset which we will try to fit with the same model, again starting at $$x= (2.1,1.4)$$. Most of the data was generated by $$5\sin(t)$$, with the 3 data points at either end being generated by $$\sin(t)$$. ![toy2](images/fig4.png) @@ -286,7 +286,7 @@ private static double[] toydata2(double [] t) { } ``` -We will fit this data set using 3 different loss functions with the same model $\varphi(t;x)$ each time and discuss the results under the plots all at once below. +We will fit this data set using 3 different loss functions with the same model $$\varphi(t;x)$$ each time and discuss the results under the plots all at once below. ```java ifail = 0; @@ -312,24 +312,24 @@ Here are all the curves plotted together: ![All](images/fig5.png) -In the first row of plots, the data is fitted using $l_2$-norm loss, $l_1$-norm loss, and $\arctan$ loss. Shown below each is the contour plot of the objective function value, where the black circles represent the parameters used to generate the data, the cyan circles represents the starting point for the solver, and the cyan wedges represent the optimized solution found by the solver. +In the first row of plots, the data is fitted using $$l_2$$-norm loss, $$l_1$$-norm loss, and $$\arctan$$ loss. Shown below each is the contour plot of the objective function value, where the black circles represent the parameters used to generate the data, the cyan circles represents the starting point for the solver, and the cyan wedges represent the optimized solution found by the solver. ![Contour](images/nldf_contour.png) -In the $l_2$-norm case in the left column, the outliers generated by $\sin(t)$ have pulled the optimal solution away from $x = (5,1)$. The contour plot for $l_2$-norm loss indicates that we don’t have to worry too much about what starting point to use, since there are no local minima in the region displayed, other than global best solution. +In the $$l_2$$-norm case in the left column, the outliers generated by $$\sin(t)$$ have pulled the optimal solution away from $$x = (5,1)$$. The contour plot for $$l_2$$-norm loss indicates that we don’t have to worry too much about what starting point to use, since there are no local minima in the region displayed, other than global best solution. -The behaviour of the solver is quite different when using an extremely robust loss function like $\arctan$ loss, which looks like +The behaviour of the solver is quite different when using an extremely robust loss function like $$\arctan$$ loss, which looks like $$ \underset{x \in \mathbb{R}^{2}}{\text{minimize}} ~ f(x) =\sum_{i=1}^{21} \text{arctan}(r_i(x)^2) $$ -The fitted model and corresponding contour plot for the $\arctan$ case are in the middle. Here, there are eight local minima in the contour plot for $\arctan$ loss, with seven of them being substantially worse solutions than the global minimum, and it is one of these we’ve converged to. Therefore, in this case the selection of initial estimation of the parameters is much more important. +The fitted model and corresponding contour plot for the $$\arctan$$ case are in the middle. Here, there are eight local minima in the contour plot for $$\arctan$$ loss, with seven of them being substantially worse solutions than the global minimum, and it is one of these we’ve converged to. Therefore, in this case the selection of initial estimation of the parameters is much more important. -The model fitted with $l_1$-norm loss and the corresponding contour plot are in the right column. Looking at the contour plot, there are still a few local minima that do not correspond to the optimal solution, but the starting point of $x = (2.1,1.4)$ still converges to the global minimum, which lies at -$x = (5,1)$, meaning the part of the dataset generated from $\sin(t)$ is effectively being ignoring. From the plots of the loss functions, we can see that $l_1$-norm loss is more robust than $l_2$-norm loss but less so than $\arctan$ loss. +The model fitted with $$l_1$$-norm loss and the corresponding contour plot are in the right column. Looking at the contour plot, there are still a few local minima that do not correspond to the optimal solution, but the starting point of $$x = (2.1,1.4)$$ still converges to the global minimum, which lies at +$$x = (5,1)$$, meaning the part of the dataset generated from $$\sin(t)$$ is effectively being ignoring. From the plots of the loss functions, we can see that $$l_1$$-norm loss is more robust than $$l_2$$-norm loss but less so than $$\arctan$$ loss. -So, what has happened in each case is: using $l_2$-norm loss, we move to the global minimum which is affected by the whole dataset. Using $l_1$-norm loss, we move to the global minimum which fits most of the data very well and ignores a small portion, treating them as outliers. Using $\arctan$ loss we move to a local minimum which ignores a large portion of the data (treating them as outliers) and fits a small amount of data very well. +So, what has happened in each case is: using $$l_2$$-norm loss, we move to the global minimum which is affected by the whole dataset. Using $$l_1$$-norm loss, we move to the global minimum which fits most of the data very well and ignores a small portion, treating them as outliers. Using $$\arctan$$ loss we move to a local minimum which ignores a large portion of the data (treating them as outliers) and fits a small amount of data very well. ## Conclusion From 96f7f3e5d305105ca500933ee185d79398f36e76 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 6 Mar 2023 18:10:38 -0600 Subject: [PATCH 190/196] Update Readme.md last math style cleanups --- NLDF/Readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index b0e3053..6939b6d 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -23,9 +23,9 @@ $$ \underset{x \in \mathbb{R}^{n_{\text{var}}}}{\text{minimize}} ~f(x) =\sum_{i=1}^{n_{\text{res}}} \chi(r_i(x)), $$ -where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $\chi$ has desirable properties such as being bounded from below, and increasing with $$\|{r_i\left(x\right)}\|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. +where $$x$$ is a vector holding our model parameters, of which there are $$n_\text{var}$$. We have $$n_\text{res}$$ data points, and $$r_i(x)= y_i - \varphi(t_i;x), \quad i = 1,...,n_\text{res}$$ is the $$i^{th}$$ residual, equal to the difference between the observed and predicted values of the independent variable at time $$t_i$$, denoted $$y_i$$ and $$\varphi(t_i;x)$$ respectively. The loss function $$\chi$$ has desirable properties such as being bounded from below, and increasing with $$\|{r_i\left(x\right)}\|$$. Summing over all data points then, the objective function will be small when the model fits the whole dataset well, which is what we want. -There are plenty of choices for function $\chi$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. +There are plenty of choices for function $$\chi$$, so how does our choice of loss function affect the fit we end up with? One important consideration is robustness. If some of the observed data points are far from the fitted model, how can we control the influence of those outliers? A robust loss function is one which doesn’t get thrown off easily by outliers in the data. ### Java Imports The packages we need to import for this example consist entirely of the following. @@ -231,7 +231,7 @@ $$ \underset{x \in \mathbb{R}^{2}}{\text{minimize}}~f(x) =\sum_{i=1}^{21} |r_i(x)|, $$ -which is more robust against outliers. This means if some large portion of the data is well-fitted by some solution $$x^\ast$$, there is likely to be a local minimum very close to $x^\ast$ which is relatively undisturbed by the remaining data that is outlying to the solution $$x^\ast$$. Here’s the solution, again starting at $$x=(2.1,1.4)$$, using $$l_1$$ loss. +which is more robust against outliers. This means if some large portion of the data is well-fitted by some solution $$x^\ast$$, there is likely to be a local minimum very close to $$x^\ast$$ which is relatively undisturbed by the remaining data that is outlying to the solution $$x^\ast$$. Here’s the solution, again starting at $$x=(2.1,1.4)$$, using $$l_1$$ loss. Now all we need to do is change the loss function parameter, reset $$x$$, and solve again. ```java From 21e1373c8bb9f490aca8080555873bd856b7c2cf Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 7 Mar 2023 18:13:19 -0600 Subject: [PATCH 191/196] fix typos and switch to public classes and using abstractions --- NLDF/GenDFEx.java | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/NLDF/GenDFEx.java b/NLDF/GenDFEx.java index 20cfd3f..1c06b89 100644 --- a/NLDF/GenDFEx.java +++ b/NLDF/GenDFEx.java @@ -3,17 +3,15 @@ import com.nag.routines.E04.E04GNX; // confun dummy import com.nag.routines.E04.E04GNY; // congrd dummy import com.nag.routines.E04.E04RA; // Handle init -import com.nag.routines.E04.E04RH; //box bounds +import com.nag.routines.E04.E04RH; // box bounds import com.nag.routines.E04.E04RJ; // linear constraints import com.nag.routines.E04.E04RM; // add model and residual sparsity structure -import com.nag.routines.E04.E04RZ; //destroy handle +import com.nag.routines.E04.E04RZ; // destroy handle import com.nag.routines.E04.E04ZM; // optional parameters import java.lang.Math; import java.util.Arrays; -//import java.io.File; -//import java.io.IOException; -///import java.io.FileWriter; + public class GenDFEx { @@ -36,7 +34,7 @@ public static void main (String[] args) { double [] ruser1 = toydata1(t); // For Example 1 double [] ruser2 = toydata2(t); // For Example 2 - double [] x = new double [2]; // instatiate an array for as many variable you need + double [] x = new double [2]; // instantiate an array for as many variable you need long handle = 0; int nvar = x.length; int ifail; @@ -55,7 +53,7 @@ public static void main (String[] args) { e04ra.eval(handle, nvar, ifail); handle = e04ra.getHANDLE(); - // define the residual functions and sparsity structure + // Define the residual functions and sparsity structure ifail = 0; e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); @@ -79,7 +77,7 @@ public static void main (String[] args) { System.out.println("\n----Solving Toy Dataset #1 with L2 Loss Function----"); ifail = 0; x = init_x(); //give x the initial guess you want to start from - // x will be changed during solve + // NOTE: x will be changed during solve e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser1, cpuser, ifail); @@ -116,12 +114,12 @@ public static void main (String[] args) { e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser2, cpuser, ifail); - e04rz.eval(handle,ifail); // destroy the handle + e04rz.eval(handle,ifail); // Destroy the handle } - private static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { + public static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { public void eval() { for(int i = 0; i < NRES; i++){ this.RX[i] = RUSER[NRES + i] - X[0] * Math.sin(X[1] * RUSER[i]); @@ -129,7 +127,7 @@ public void eval() { } } - private static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { + public static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { public void eval() { for(int i = 0; i < NRES; i++){ this.RDX[i * NVAR] = (-1 * Math.sin(X[1]*RUSER[i])); @@ -139,26 +137,26 @@ public void eval() { } // Dummy Functions required for NLDF solver - private static class CONFUN extends E04GNX implements E04GN.E04GN_CONFUN { + public static class CONFUN extends E04GN.Abstract_E04GN_CONFUN { public void eval(){ - super.eval(); + this.eval(); } } - private static class CONGRD extends E04GNY implements E04GN.E04GN_CONGRD { + public static class CONGRD extends E04GN.Abstract_E04GN_CONGRD { public void eval(){ - super.eval(); + this.eval(); } } - private static class MONIT extends E04GNU implements E04GN.E04GN_MONIT { + public static class MONIT extends E04GN.Abstract_E04GN_MONIT { public void eval(){ - super.eval(); + this.eval(); } } // Utilities for setting up data for problem - private static double[] linspace(double startPoint, double endPoint, int length) { + public static double[] linspace(double startPoint, double endPoint, int length) { double[] a = new double[length]; double step = (endPoint - startPoint) / (length - 1); a[0] = startPoint; @@ -169,7 +167,7 @@ private static double[] linspace(double startPoint, double endPoint, int length) return a; } - private static double[] toydata1(double [] t) { + public static double[] toydata1(double [] t) { double [] y = new double[t.length * 2]; for(int i = 0; i < t.length * 2; i++){ if(i < t.length){ @@ -185,7 +183,7 @@ private static double[] toydata1(double [] t) { return y; } - private static double[] toydata2(double [] t) { + public static double[] toydata2(double [] t) { double [] y = new double[t.length * 2]; for(int i = 0; i < t.length * 2; i++){ if(i < t.length){ @@ -202,7 +200,7 @@ private static double[] toydata2(double [] t) { } // For resetting the initial guess - private static double[] init_x() { + public static double[] init_x() { double [] x = new double [] {2.1,1.4}; return x; } From a8f82b17a3b0877a3af2d9fbf394fcc73ac82ee4 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 7 Mar 2023 18:32:07 -0600 Subject: [PATCH 192/196] fix typos in Readme --- NLDF/Readme.md | 126 +++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 6939b6d..ec2a629 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -9,11 +9,11 @@ ### NAG Library Install -To run this example, you will need to install the NAG Library (Mark 28.5 or newer) and a license key. You will also need the NAG Library for Java wrappers. You can find the software, wrappers, and request a license key from our website here: [Getting Started with NAG Library](https://www.nag.com/content/getting-started-nag-library) +To run this example, you will need to install the NAG Library (Mark 28.5 or newer) and a license key. You will also need the NAG Library for Java wrappers. You can find the software, wrappers, and request a license key from our website here: [Getting Started with NAG Library](https://www.nag.com/content/getting-started-nag-library?lang=jv) ### Using These Example Files -This directory contains a Java source code and a couple images files to help illustrate this example. With NAG Library and wrappers properly installed, the Java file can be compiled and run as it is to produce a data set and execute all the example scenarios described below. +This directory contains the [Java source code](./GenDFEx.java) and a couple images files to help illustrate this example. With NAG Library and wrappers properly installed, the Java file can be compiled and run as it is to produce a data set and execute all the example scenarios described below. ## Introduction @@ -34,11 +34,11 @@ import com.nag.routines.E04.E04GN; // nagf_opt_handle_solve_nldf import com.nag.routines.E04.E04GNU; // monit import com.nag.routines.E04.E04GNX; // confun dummy import com.nag.routines.E04.E04GNY; // congrd dummy -import com.nag.routines.E04.E04RA; // Handle init -import com.nag.routines.E04.E04RH; //box bounds +import com.nag.routines.E04.E04RA; // handle init +import com.nag.routines.E04.E04RH; // box bounds import com.nag.routines.E04.E04RJ; // linear constraints import com.nag.routines.E04.E04RM; // add model and residual sparsity structure -import com.nag.routines.E04.E04RZ; //destroy handle +import com.nag.routines.E04.E04RZ; // destroy handle import com.nag.routines.E04.E04ZM; // optional parameters import java.lang.Math; @@ -48,74 +48,74 @@ import java.util.Arrays; ### Utility Functions and Setup We need to define a few dummy functions required by the Generalized Data Fitting solver interface ```java -private static class CONFUN extends E04GNX implements E04GN.E04GN_CONFUN { +public static class CONFUN extends E04GN.Abstract_E04GN_CONFUN { public void eval(){ - super.eval(); + this.eval(); } } -private static class CONGRD extends E04GNY implements E04GN.E04GN_CONGRD { +public static class CONGRD extends E04GN.Abstract_E04GN_CONGRD { public void eval(){ - super.eval(); + this.eval(); } } -private static class MONIT extends E04GNU implements E04GN.E04GN_MONIT { +public static class MONIT extends E04GN.Abstract_E04GN_MONIT { public void eval(){ - super.eval(); + this.eval(); } } ``` Inside our 'main', we will initialize all our variables and create our handle. ```java - E04GN e04gn = new E04GN(); // the solver - E04RA e04ra = new E04RA(); // the handle initializer - E04RM e04rm = new E04RM(); // for setting model and residual sparsity structure - E04ZM e04zm = new E04ZM(); // for setting optional parameters - E04RZ e04rz = new E04RZ(); // handle destroyer +E04GN e04gn = new E04GN(); // the solver +E04RA e04ra = new E04RA(); // the handle initializer +E04RM e04rm = new E04RM(); // for setting model and residual sparsity structure +E04ZM e04zm = new E04ZM(); // for setting optional parameters +E04RZ e04rz = new E04RZ(); // handle destroyer - MONIT monit = new MONIT(); // defined below using E04GNU - CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy) - CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy) +MONIT monit = new MONIT(); // defined below using E04GNU +CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy) +CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy) - double [] x = new double [2]; // instatiate an array for as many variable you need - long handle = 0; - int nvar = x.length; - int ifail; - int nres = t.length; - - // Init for sparsity structure - int isparse = 0; - int nnzrd = 0; - int [] irowrd = new int [nnzrd]; - int [] icolrd = new int [nnzrd]; - - // Get handle - ifail = 0; - e04ra.eval(handle, nvar, ifail); - handle = e04ra.getHANDLE(); - - // define the residual functions and sparsity structure - ifail = 0; - e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); - - // Set options - ifail = 0; - e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); - e04zm.eval(handle, "Print Level = 1", ifail); - e04zm.eval(handle, "Print Options = No", ifail); - e04zm.eval(handle, "Print Solution = Yes", ifail); - - // Initialize all the remaining parameters - LSQFUN lsqfun = new LSQFUN(); - LSQGRD lsqgrd = new LSQGRD(); - double [] rx = new double[nres]; - double [] rinfo = new double[100]; - double [] stats = new double [100]; - int [] iuser = new int[0]; - long cpuser = 0; +double [] x = new double [2]; // instatiate an array for as many variable you need +long handle = 0; +int nvar = x.length; +int ifail; +int nres = t.length; + +// Init for sparsity structure +int isparse = 0; +int nnzrd = 0; +int [] irowrd = new int [nnzrd]; +int [] icolrd = new int [nnzrd]; + +// Get handle +ifail = 0; +e04ra.eval(handle, nvar, ifail); +handle = e04ra.getHANDLE(); + +// define the residual functions and sparsity structure +ifail = 0; +e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail); + +// Set options +ifail = 0; +e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail); +e04zm.eval(handle, "Print Level = 1", ifail); +e04zm.eval(handle, "Print Options = No", ifail); +e04zm.eval(handle, "Print Solution = Yes", ifail); + +// Initialize all the remaining parameters +LSQFUN lsqfun = new LSQFUN(); +LSQGRD lsqgrd = new LSQGRD(); +double [] rx = new double[nres]; +double [] rinfo = new double[100]; +double [] stats = new double [100]; +int [] iuser = new int[0]; +long cpuser = 0; ``` We also define $$t$$ as an array of 21 points from $$0.5$$ to $$2.5$$. @@ -127,7 +127,7 @@ To investigate the robustness aspect, here’s a toy dataset which is generated ![toy1](images/fig1.png) ```java -private static double[] toydata1(double [] t) { +public static double[] toydata1(double [] t) { double [] y = new double[t.length * 2]; for(int i = 0; i < t.length * 2; i++){ if(i < t.length){ @@ -154,7 +154,7 @@ using a variety of loss functions provided by NAG’s data-fitting solver **hand To set up this model, we must define it and its gradient inside the functions `LSQFUN` and `LSQGRD` ```java -private static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { +public static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { public void eval() { for(int i = 0; i < NRES; i++){ this.RX[i] = RUSER[NRES + i] - X[0] * Math.sin(X[1] * RUSER[i]); @@ -162,7 +162,7 @@ private static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN { } } -private static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { +public static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD { public void eval() { for(int i = 0; i < NRES; i++){ this.RDX[i * NVAR] = (-1 * Math.sin(X[1]*RUSER[i])); @@ -190,7 +190,7 @@ to see what this outlier does to the minimum. For this Java example, we set up a function to reset $$x$$ variable to the starting point, since it gets passed to the solver and returns the solution. ```java -private static double[] init_x() { +public static double[] init_x() { double [] x = new double [] {2.1,1.4}; return x; } @@ -269,7 +269,7 @@ To illustrate this, here’s a new dataset which we will try to fit with the sam ![toy2](images/fig4.png) ```java -private static double[] toydata2(double [] t) { +public static double[] toydata2(double [] t) { double [] y = new double[t.length * 2]; for(int i = 0; i < t.length * 2; i++){ if(i < t.length){ @@ -286,7 +286,7 @@ private static double[] toydata2(double [] t) { } ``` -We will fit this data set using 3 different loss functions with the same model $$\varphi(t;x)$$ each time and discuss the results under the plots all at once below. +We will fit this data set using 3 different loss functions with the same model $$\varphi(t;x)$$ each time and discuss the results under the plots all at once below. And we'll lastly clear the handle completely. ```java ifail = 0; @@ -306,6 +306,8 @@ x = init_x(); e04zm.eval(handle, "NLDF Loss Function Type = ATAN", ifail); e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo, stats, iuser, ruser2, cpuser, ifail); + +e04rz.eval(handle,ifail); // Destroy the handle ``` Here are all the curves plotted together: @@ -327,7 +329,7 @@ $$ The fitted model and corresponding contour plot for the $$\arctan$$ case are in the middle. Here, there are eight local minima in the contour plot for $$\arctan$$ loss, with seven of them being substantially worse solutions than the global minimum, and it is one of these we’ve converged to. Therefore, in this case the selection of initial estimation of the parameters is much more important. The model fitted with $$l_1$$-norm loss and the corresponding contour plot are in the right column. Looking at the contour plot, there are still a few local minima that do not correspond to the optimal solution, but the starting point of $$x = (2.1,1.4)$$ still converges to the global minimum, which lies at -$$x = (5,1)$$, meaning the part of the dataset generated from $$\sin(t)$$ is effectively being ignoring. From the plots of the loss functions, we can see that $$l_1$$-norm loss is more robust than $$l_2$$-norm loss but less so than $$\arctan$$ loss. +$$x = (5,1)$$, meaning the part of the dataset generated from $$\sin(t)$$ is effectively being ignored. From the plots of the loss functions, we can see that $$l_1$$-norm loss is more robust than $$l_2$$-norm loss but less so than $$\arctan$$ loss. So, what has happened in each case is: using $$l_2$$-norm loss, we move to the global minimum which is affected by the whole dataset. Using $$l_1$$-norm loss, we move to the global minimum which fits most of the data very well and ignores a small portion, treating them as outliers. Using $$\arctan$$ loss we move to a local minimum which ignores a large portion of the data (treating them as outliers) and fits a small amount of data very well. From 0a74e33a905af855c04038ab73f40e1df6c69a71 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Wed, 8 Mar 2023 09:16:45 -0600 Subject: [PATCH 193/196] Update Readme.md typo correction --- NLDF/Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index ec2a629..06093f5 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -80,7 +80,7 @@ MONIT monit = new MONIT(); // defined below using E04GNU CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy) CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy) -double [] x = new double [2]; // instatiate an array for as many variable you need +double [] x = new double [2]; // instantiate an array for as many variable you need long handle = 0; int nvar = x.length; int ifail; From 5b83d7f72c6d4ae154394cf77369bea4b722c06a Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Mon, 13 Mar 2023 13:45:54 -0500 Subject: [PATCH 194/196] Update Readme.md fixing links --- NLDF/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NLDF/Readme.md b/NLDF/Readme.md index 06093f5..0fd4012 100644 --- a/NLDF/Readme.md +++ b/NLDF/Readme.md @@ -1,7 +1,7 @@ > ## Important Information -> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://caleb-hamilton.github.io/NAGJavaExamples/NLDF/) or access this as a regular github [repository](https://github.com/caleb-hamilton/NAGJavaExamples/tree/main/NLDF). +> This file has a lot of Latex and GitHub currently cannot render it on Markdown files. You can read all the math clearly as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/NLDF/) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/NLDF). > -> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/caleb-hamilton/NAGJavaExamples). +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). # Loss Function and Robustness in Data-Fitting From 1658a9ed3ae87f64c85a44c25ff7a3ce55fd709e Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Tue, 21 Mar 2023 11:42:33 -0500 Subject: [PATCH 195/196] Update README.md added link to NLDF --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a8ae330..f2971d6 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This repository contains examples and demonstrations using the [NAG Library for * [Fast Implied Volatilities](./opt_imp_vol) * [Nonlinear Least-Squares Trust-Region Method (BXNL)](./BXNL) * [First-order active-set method (FOAS)](./FOAS) +* [Generalized Nonlinear Data Fitting](./NLDF) ## Examples that ship with the product From bfa65a6bc498423e55483d4df03c5c47a0565bb7 Mon Sep 17 00:00:00 2001 From: Caleb Hamilton Date: Thu, 14 Nov 2024 09:47:02 -0600 Subject: [PATCH 196/196] Update README.md brand updates --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f2971d6..0758216 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ > ## Important Information > This repository can viewed as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/) or as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/). -# Examples using the NAG Library for Java +# Examples using the *n*AG Library for Java -This repository contains examples and demonstrations using the [NAG Library for Java](https://www.nag.com/content/nag-library-for-java). The NAG Library for Java contains 1900+ functions spanning many areas of numerical computing and data science. +This repository contains examples and demonstrations using the [*n*AG Library for Java](https://www.nag.com/content/nag-library-for-java). The *n*AG Library for Java contains 1900+ functions spanning many areas of numerical computing and data science. ## Directory of GitHub examples @@ -16,24 +16,24 @@ This repository contains examples and demonstrations using the [NAG Library for ## Examples that ship with the product -The NAG Library for Java ships with a set of usage [examples](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/simple_examples). +The *n*AG Library for Java ships with a set of usage [examples](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/simple_examples). ## Prerequisites -The NAG Library for Java is NOT compatible with all implementations of the NAG Library. It is therefore important that you ensure that the correct implementation of the NAG Library is installed in order to use these wrappers. +The *n*AG Library for Java is NOT compatible with all implementations of the *n*AG Library. It is therefore important that you ensure that the correct implementation of the *n*AG Library is installed in order to use these wrappers. -The NAG Library for Java Mark 27.1 is available for the following platforms: +The *n*AG Library for Java Mark 27.1 is available for the following platforms: -| Platform | NAG Library | +| Platform | *n*AG Library | | --- | --- | | Linux 64-bit | NLL6I271BL | | Windows 64-bit | NLW6I271EL | -You can get the NAG Library from [here](https://www.nag.com/content/nag-library). +You can get the *n*AG Library from [here](https://www.nag.com/content/nag-library). ## Obtaining a license -Before you can use the NAG Library for Java, you'll need a license. Free trial licenses are available! +Before you can use the *n*AG Library for Java, you'll need a license. Free trial licenses are available! To request a licence key, you first need to know your Kusari *hostid* and email that along with the *Product Code* to [support@nag.com](mailto:support@nag.com). @@ -62,18 +62,18 @@ or More detailed installation instructions are availavle in the [Installer's Note](https://www.nag.com/content/nag-library-mark-27). -## NAG Library for Java installation +## *n*AG Library for Java installation -You can get the NAG Library for Java from [here](https://www.nag.com/content/nag-library-java-download). +You can get the *n*AG Library for Java from [here](https://www.nag.com/content/nag-library-java-download). ### Linux -To install the NAG Library for Java, you simply have to unzip the distribution file and copy two files to convenient locations on your system: +To install the *n*AG Library for Java, you simply have to unzip the distribution file and copy two files to convenient locations on your system: * NAGJava.jar * libnag_jni271.so -The following **must** be in your *LD_LIBRARY_PATH* environment variable to use the NAG Library for Java: +The following **must** be in your *LD_LIBRARY_PATH* environment variable to use the *n*AG Library for Java: * The directory containing *libnag_jni271.so* * The directories *lp64/lib* and *rtl/lib/intel64* of the underlying library NLL6I271BL @@ -96,12 +96,12 @@ If you are using an IDE such as Eclipse, you may need to configure your project ### Windows -To install the NAG Library for Java, you simply have to unzip the distribution file and copy two files to convenient locations on your system: +To install the *n*AG Library for Java, you simply have to unzip the distribution file and copy two files to convenient locations on your system: * NAGJava.jar * nag_jni271.dll -The following **must** be in your *PATH* environment variable to use the NAG Library for Java: +The following **must** be in your *PATH* environment variable to use the *n*AG Library for Java: * The directory containing *nag_jni271.dll* * The directories *bin* and *rtl\bin* of the underlying library NLW6I271EL

    @HintIhD@N6PXHFeIZpJ; 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 z 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 literal 0 HcmV?d00001 diff --git a/FOAS/migration/Migration_E04DG_E04KF.java b/FOAS/migration/Migration_E04DG_E04KF.java new file mode 100644 index 0000000..59b5a8d --- /dev/null +++ b/FOAS/migration/Migration_E04DG_E04KF.java @@ -0,0 +1,139 @@ +import com.nag.routines.E04.E04DG; +import com.nag.routines.E04.E04WB; +import com.nag.routines.E04.E04RA; +import com.nag.routines.E04.E04RG; +import com.nag.routines.E04.E04RH; +import com.nag.routines.E04.E04ZM; +import com.nag.routines.E04.E04RZ; +import com.nag.routines.E04.E04KF; +import com.nag.routines.E04.E04KFU; + +import java.lang.Math; +import java.util.Arrays; + +public class Migration_E04DG_E04KF { + public static void main(String[] args) { + + // The initial guess + double[] x = new double[] { -1.5, 1.9 }; + + E04WB e04wb = new E04WB(); + String[] cwsav = new String[1]; + Arrays.fill(cwsav, " "); + boolean[] lwsav = new boolean[120]; + int[] iwsav = new int[610]; + double[] rwsav = new double[475]; + int ifail = 0; + e04wb.eval("e04dga", cwsav, 1, lwsav, 120, iwsav, 610, rwsav, 475, ifail); + + // Solve the problem with E04DG + + E04DG e04dg = new E04DG(); + OBJFUN_E04DG objfun_e04dg = new OBJFUN_E04DG(); + int n = x.length; + int iter = 0; + double objf = 0; + double[] objgrd = new double[n]; + int[] iwork = new int[n + 1]; + double[] work = new double[13 * n]; + int[] iuser = new int[0]; + double[] ruser = new double[0]; + ifail = 0; + e04dg.eval(n, objfun_e04dg, iter, objf, objgrd, x, iwork, work, iuser, ruser, lwsav, iwsav, rwsav, ifail); + + System.out.println("Solution: " + x[0] + " " + x[1]); + System.out.println(); + + // Now solve with the new solver E04KF + + // The initial guess + x = new double[] { -1.5, 1.9 }; + + E04RA e04ra = new E04RA(); + E04RG e04rg = new E04RG(); + E04RH e04rh = new E04RH(); + E04ZM e04zm = new E04ZM(); + E04KF e04kf = new E04KF(); + + // Create an empty handle for the problem + int nvar = x.length; + long handle = 0; + ifail = 0; + e04ra.eval(handle, nvar, ifail); + handle = e04ra.getHANDLE(); + + // Define the nonlinear objective in the handle + // Setup a gradient vector of length nvar + int[] idxfd = new int[nvar]; + for (int i = 0; i < nvar; i++) { + idxfd[i] = i + 1; + } + ifail = 0; + e04rg.eval(handle, nvar, idxfd, ifail); + + // Set some algorithmic options + ifail = 0; + e04zm.eval(handle, "Print Options = Yes", ifail); // print Options? + e04zm.eval(handle, "Print Solution = Yes", ifail); // print on the screen the solution point X + e04zm.eval(handle, "Print Level = 1", ifail); // print details of each iteration (screen) + + // Solve the problem and print the solution + OBJFUN_E04KF obfun_e04kf = new OBJFUN_E04KF(); + OBJGRD_E04KF objgrd_e04kf = new OBJGRD_E04KF(); + MONIT_E04KF monit_e04kf = new MONIT_E04KF(); + double[] rinfo = new double[100]; + double[] stats = new double[100]; + iuser = new int[0]; + ruser = new double[0]; + long cpuser = 0; + ifail = 0; + e04kf.eval(handle, obfun_e04kf, objgrd_e04kf, monit_e04kf, nvar, x, rinfo, stats, iuser, ruser, cpuser, ifail); + + // Destroy the handle and free allocated memory + E04RZ e04rz = new E04RZ(); + e04rz.eval(handle, ifail); + } + + // Define E04DG user call-back + public static class OBJFUN_E04DG extends E04DG.Abstract_E04DG_OBJFUN { + public void eval() { + this.OBJF = Math.pow(1.0 - this.X[0], 2) + 100.0 * Math.pow(this.X[1] - Math.pow(this.X[0], 2), 2); + + if (this.MODE == 2) { + this.OBJGRD[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.OBJGRD[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + } + } + + // Define user call-backs for E04KF + /** + * Return the objective function value + */ + public static class OBJFUN_E04KF extends E04KF.Abstract_E04KF_OBJFUN { + public void eval() { + this.FX = Math.pow(1.0 - this.X[0], 2) + 100.0 * Math.pow(this.X[1] - Math.pow(this.X[0], 2), 2); + } + } + + /** + * The objective's gradient. Note that fdx has to be updated IN-PLACE + */ + public static class OBJGRD_E04KF extends E04KF.Abstract_E04KF_OBJGRD { + public void eval() { + this.FDX[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.FDX[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + } + + /** + * Dummy monit + */ + public static class MONIT_E04KF extends E04KF.Abstract_E04KF_MONIT { + public void eval() { + E04KFU e04kfu = new E04KFU(); + e04kfu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04kfu.getINFORM(); + } + } +} diff --git a/FOAS/migration/Readme.md b/FOAS/migration/Readme.md new file mode 100644 index 0000000..9cdd69f --- /dev/null +++ b/FOAS/migration/Readme.md @@ -0,0 +1,202 @@ +> ## Important Information +> You can view this page as a [webpage](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/migration) or access this as a regular github [repository](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration). +> +> The source of this example can be found [here](https://numericalalgorithmsgroup.github.io/NAGJavaExamples/FOAS/migration/Migration_E04DG_E04KF.java) and the output [here](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/migration/output.txt). +> +> See the top directory of this repository for instructions to set up the [NAG Library for Java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples). + +# Migrating from `E04DG` to `E04KF` + +This page illustrates the steps required to upgrade from the solver `uncon_conjgrd_comp` (`E04DG`) to `handle_solve_bounds_foas` (`E04KF`) introduced at Mark 27 of the NAG Library. + +From the usage perspective, the main difference between the solvers is the user call-backs, +`E04DG` has a single user call-back that can return *objective +function* and *gradient* evaluations, while `E04KF` has two separate user call-backs, +one for the *objective funtion* and one for the *objective gradient*. + +On this page the 2d Rosenbrock problem is solved with both solvers and illustrates the changes necessary for the migration to `E04KF`. The solution to the problem is (1, 1). + +```java +// Define E04DG user call-back +public static class OBJFUN_E04DG extends E04DG.Abstract_E04DG_OBJFUN { + public void eval() { + this.OBJF = Math.pow(1.0 - this.X[0], 2) + 100.0 * Math.pow(this.X[1] - Math.pow(this.X[0], 2), 2); + + if (this.MODE == 2) { + this.OBJGRD[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.OBJGRD[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + } +} +``` + +
    + +```java +// Define user call-backs for E04KF +/** + * Return the objective function value + */ +public static class OBJFUN_E04KF extends E04KF.Abstract_E04KF_OBJFUN { + public void eval() { + this.FX = Math.pow(1.0 - this.X[0], 2) + 100.0 * Math.pow(this.X[1] - Math.pow(this.X[0], 2), 2); + } +} + +/** + * The objective's gradient. Note that fdx has to be updated IN-PLACE + */ +public static class OBJGRD_E04KF extends E04KF.Abstract_E04KF_OBJGRD { + public void eval() { + this.FDX[0] = 2.0 * this.X[0] - 400.0 * this.X[0] * (this.X[1] - Math.pow(this.X[0], 2)) - 2.0; + this.FDX[1] = 200.0 * (this.X[1] - Math.pow(this.X[0], 2)); + } + +/** + * Dummy monit + */ +public static class MONIT_E04KF extends E04KF.Abstract_E04KF_MONIT { + public void eval() { + E04KFU e04kfu = new E04KFU(); + e04kfu.eval(this.NVAR, this.X, this.INFORM, this.RINFO, this.STATS, this.IUSER, this.RUSER, this.CPUSER); + this.INFORM = e04kfu.getINFORM(); + } +} +``` + +
    + +```java +// The initial guess +double[] x = new double[] { -1.5, 1.9 }; +``` + +## Solve the problem with `E04DG` + +```java +E04WB e04wb = new E04WB(); +String[] cwsav = new String[1]; +Arrays.fill(cwsav, " "); +boolean[] lwsav = new boolean[120]; +int[] iwsav = new int[610]; +double[] rwsav = new double[475]; +int ifail = 0; +e04wb.eval("e04dga", cwsav, 1, lwsav, 120, iwsav, 610, rwsav, 475, ifail); + +// Solve the problem with E04DG + +E04DG e04dg = new E04DG(); +OBJFUN_E04DG objfun_e04dg = new OBJFUN_E04DG(); +int n = x.length; +int iter = 0; +double objf = 0; +double[] objgrd = new double[n]; +int[] iwork = new int[n + 1]; +double[] work = new double[13 * n]; +int[] iuser = new int[0]; +double[] ruser = new double[0]; +ifail = 0; +e04dg.eval(n, objfun_e04dg, iter, objf, objgrd, x, iwork, work, iuser, ruser, lwsav, iwsav, rwsav, ifail); +``` + +
    + +``` +Solution: 1.0000067567705557 1.0000135365609837 +``` + +## Now solve with the new solver `E04KF` + +```java +// Now solve with the new solver E04KF + +// The initial guess +x = new double[] { -1.5, 1.9 }; + +E04RA e04ra = new E04RA(); +E04RG e04rg = new E04RG(); +E04RH e04rh = new E04RH(); +E04ZM e04zm = new E04ZM(); +E04KF e04kf = new E04KF(); + +// Create an empty handle for the problem +int nvar = x.length; +long handle = 0; +ifail = 0; +e04ra.eval(handle, nvar, ifail); +handle = e04ra.getHANDLE(); + +// Define the nonlinear objective in the handle +// Setup a gradient vector of length nvar +int[] idxfd = new int[nvar]; +for (int i = 0; i < nvar; i++) { + idxfd[i] = i + 1; +} +ifail = 0; +e04rg.eval(handle, nvar, idxfd, ifail); + +// Set some algorithmic options +ifail = 0; +e04zm.eval(handle, "Print Options = Yes", ifail); // print Options? +e04zm.eval(handle, "Print Solution = Yes", ifail); // print on the screen the solution point X +e04zm.eval(handle, "Print Level = 1", ifail); // print details of each iteration (screen) + +// Solve the problem and print the solution +OBJFUN_E04KF obfun_e04kf = new OBJFUN_E04KF(); +OBJGRD_E04KF objgrd_e04kf = new OBJGRD_E04KF(); +MONIT_E04KF monit_e04kf = new MONIT_E04KF(); +double[] rinfo = new double[100]; +double[] stats = new double[100]; +iuser = new int[0]; +ruser = new double[0]; +long cpuser = 0; +ifail = 0; +e04kf.eval(handle, obfun_e04kf, objgrd_e04kf, monit_e04kf, nvar, x, rinfo, stats, iuser, ruser, cpuser, ifail); + +// Destroy the handle and free allocated memory +E04RZ e04rz = new E04RZ(); +e04rz.eval(handle, ifail); +``` + +
    + +``` +E04KF, First order method for bound-constrained problems + Begin of Options + Print File = 6 * d + Print Level = 1 * U + Print Options = Yes * U + Print Solution = All * U + Monitoring File = -1 * d + Monitoring Level = 4 * d + Foas Monitor Frequency = 0 * d + Foas Print Frequency = 1 * d + + Infinite Bound Size = 1.00000E+20 * d + Task = Minimize * d + Stats Time = No * d + Time Limit = 1.00000E+06 * d + Verify Derivatives = No * d + + Foas Estimate Derivatives = No * d + Foas Finite Diff Interval = 1.05367E-08 * d + Foas Iteration Limit = 10000000 * d + Foas Memory = 11 * d + Foas Progress Tolerance = 1.08158E-12 * d + Foas Rel Stop Tolerance = 1.08158E-12 * d + Foas Restart Factor = 6.00000E+00 * d + Foas Slow Tolerance = 1.01316E-02 * d + Foas Stop Tolerance = 1.00000E-06 * d + Foas Tolerance Norm = Infinity * d + End of Options + + + Status: converged, an optimal solution was found + Value of the objective 2.12807E-15 + Norm of gradient 3.67342E-08 + + Primal variables: + idx Lower bound Value Upper bound + 1 -inf 1.00000E+00 inf + 2 -inf 1.00000E+00 inf +``` diff --git a/FOAS/migration/output.txt b/FOAS/migration/output.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d9fdcc59830280b622c45a6264123918bee0329 GIT binary patch literal 6180 zcmdT|+invv5S?cv{$ZbiqHIH(fW!k;Q>mf_MA}L`ZZ9c;CMnw+@bSPoo*3JS({*-> z6tqg#UXRDebGLv0>dQnf^zikCypLJcdwlMeH@Fc1MzPtxtE16|^E{C9+ zS}|I>57;kvPYF_*+_xR8dcRJj-1O+4piMd7|18G12Yk2qT~u(e{8KUJ9zS9{^!k=p z_+E^0S#76a{DeLGmeUmDtiOhPoA0Gyd;_icdZ~kP-}vPa_DFxGWu8M5X_lFSF@x{V z>UvpwjAKl*%ruM{Vw}@K9iQ2O{0d_+AzI3^ge`qTBs_z3PvnQUlCGJGvE|KdhB1sn zRrrW96=Pjphu*ylNezrO(lQw#w;*55C7JXw^3!~EI&-ZU(l9gj`<-2WP>-L=EWJTt~meSF(UnDra|pWjNzwg_@u45MmX>(~w|);0Kc7hLR9 zN8=9T?i30ANNep(?zhw!M#Yi?ng3XXnKZ+=4_S>&2A|I^ZVkV+7^6>>H_qKoj?6g| zR2R%PSJQ~ZGYqv{n9MjEn_?JM*InS+fR3r_9I@PCZYIZ%K*NfPadUz*1f%9EVx(sm zkei+&3RD$Zzd1Sht(Y7)gR>$tBJI-6Y9_}%q&Shg1o_z&V;EJ}Jfr4_;Of^8r|Wbb zS7Wq3tr(kT8|O1I>tm)U;q4Yx_>Rd@DZ-k{j}y!2x(82X{l0qVZ0<75g`s3trT0Hz zOqG@Hg`ULhc!Q|Udnmo@;jKZ5c+Yzt-W@T<({A);hE)k8?G?WG_gERChMuDa7_k+9 zDxM~Ex|bt^i)S@!-m!c^i?LQ~zQwDpBf2s#brDmwB4NH-O#jd$x)&EI)LWT* z3ut4AUFZ!|%DQdrg|~=poRQZf)l~|QCN%$pzbHmMRa?tu<;pWdF}>YX-)JIU~Q)}FVm)*f0c#G@qYr~a%pYTTx;mem5bA9^iw!=tT|1N?3HAs{90<(N#CqBQH VQTq7YSzgus5Tjp@aPI10`~xP)Iidgn literal 0 HcmV?d00001 diff --git a/README.md b/README.md index e46ac6f..a8ae330 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ This repository contains examples and demonstrations using the [NAG Library for * [Quadratically constrained quadratic programming and its applications in portfolio optimization](./QCQP) * [Fast Implied Volatilities](./opt_imp_vol) * [Nonlinear Least-Squares Trust-Region Method (BXNL)](./BXNL) +* [First-order active-set method (FOAS)](./FOAS) ## Examples that ship with the product From 339d9e3dc2a8f442860aa43699ab8b79e4ea2307 Mon Sep 17 00:00:00 2001 From: Christos Date: Tue, 4 May 2021 15:32:38 +0300 Subject: [PATCH 174/196] Small doc fixes --- FOAS/Readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FOAS/Readme.md b/FOAS/Readme.md index 0e83ef4..4149d65 100644 --- a/FOAS/Readme.md +++ b/FOAS/Readme.md @@ -16,7 +16,7 @@ FOAS is a [first-order nonlinear conjugate method](https://en.wikipedia.org/wiki e04kf is also part of the [NAG Optimization Modelling Suite](https://www.nag.co.uk/numeric/nl/nagdoc_latest/flhtml/e04/e04intro.html#optsuite) common handle interface. It offers clarity and consistency of the interface of the solvers within the suite, making it trivial to switch among compatible solvers. -The following example illustrates the simple usage of FOAS to solve the bound-constrained 2D version of the [Rosenbrock function](https://en.wikipedia.org/wiki/Rosenbrock_function) which is a classical test function to measure and profile performance of solvers. Source of this example is avaible in [Rosenbrock2d.java](example/Rosenbrock2d.java). +The following example illustrates the simple usage of FOAS to solve the bound-constrained 2D version of the [Rosenbrock function](https://en.wikipedia.org/wiki/Rosenbrock_function) which is a classical test function to measure and profile performance of solvers. Source of this example is avaible in [Rosenbrock2d.java](https://github.com/numericalalgorithmsgroup/NAGJavaExamples/tree/main/FOAS/example/Rosenbrock2d.java). It is also adviced to read this [page](./example) that explains the example.

    v$z>7lwD889LiZ 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∈M^PJc;SvSvWXnlG8&lOt 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 z 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

    +
    +

    {{ site.title | default: site.github.repository_name }}

    + + {% if site.logo %} + Logo + {% endif %} + +

    {{ site.description | default: site.github.project_tagline }}

    + + {% if site.github.is_project_page %} +

    View the Project on GitHub {{ site.github.repository_nwo }}

    + {% endif %} + + {% if site.github.is_user_page %} +

    View My GitHub Profile

    + {% endif %} + + {% if site.show_downloads %} + + {% endif %} +
    +
    + + {{ content }} + +
    + +